diff --git a/dist/assets/comfyui-majoor-assetsmanager.css b/dist/assets/comfyui-majoor-assetsmanager.css
index 4e5dbca7..bfdc9b7a 100644
--- a/dist/assets/comfyui-majoor-assetsmanager.css
+++ b/dist/assets/comfyui-majoor-assetsmanager.css
@@ -1,2 +1,2 @@
-.mjr-rating-badge[data-v-730159ba]{letter-spacing:1px;pointer-events:none;z-index:10;text-shadow:0 2px 6px #0009;background:#0000008c;border:1px solid #ffffff1f;border-radius:6px;justify-content:center;align-items:center;padding:2px 6px;font-size:13px;animation:.2s ease-out mjr-fade-in-730159ba;display:inline-flex;position:absolute;top:6px;right:6px;box-shadow:0 6px 18px #00000040}@keyframes mjr-fade-in-730159ba{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.mjr-tags-badge[data-v-2b45d539]{text-overflow:ellipsis;white-space:nowrap;pointer-events:none;z-index:10;background:#000c;border-radius:4px;max-width:calc(100% - 56px);padding:3px 6px;font-size:9px;animation:.2s ease-out mjr-fade-in-2b45d539;position:absolute;bottom:6px;left:6px;overflow:hidden;box-shadow:0 2px 4px #0000004d}@keyframes mjr-fade-in-2b45d539{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.mjr-gentime-badge[data-v-e8aef14a]{letter-spacing:.015em;pointer-events:none;z-index:10;text-shadow:0 1px 2px #000000e6, 0 0 10px color-mix(in srgb, currentColor 35%, transparent);-webkit-backdrop-filter:blur(2px);background:#0000008c;border:1px solid #ffffff1f;border-radius:4px;padding:2px 6px;font-size:10px;font-weight:800;line-height:1.1;position:absolute;bottom:6px;right:6px;box-shadow:0 2px 4px #0000004d}.mjr-grid-skeleton-layout[data-v-ddf2bbab]{grid-template-columns:repeat(auto-fill,minmax(132px,1fr));gap:12px;display:grid}.mjr-grid-skeleton-card[data-v-ddf2bbab]{background:#c0c6ce33;border:1px solid #ffffff38;border-radius:12px;min-height:146px;overflow:hidden;box-shadow:0 6px 18px #0000003d}.mjr-grid-skeleton-thumb[data-v-ddf2bbab]{aspect-ratio:1;background:linear-gradient(90deg,#9ca2ab85 0%,#dce1e8b8 45%,#9ca2ab85 100%) 0 0/240% 100%;width:100%;animation:1.2s linear infinite mjr-grid-skeleton-shimmer-ddf2bbab}.mjr-grid-skeleton-line[data-v-ddf2bbab]{background:linear-gradient(90deg,#a4aab37a 0%,#d6dbe2b3 45%,#a4aab37a 100%) 0 0/240% 100%;border-radius:8px;height:10px;margin:8px 10px;animation:1.2s linear infinite mjr-grid-skeleton-shimmer-ddf2bbab}.mjr-grid-skeleton-line--title[data-v-ddf2bbab]{width:72%}.mjr-grid-skeleton-line--meta[data-v-ddf2bbab]{width:48%;margin-top:2px;margin-bottom:10px}@keyframes mjr-grid-skeleton-shimmer-ddf2bbab{0%{background-position:100% 0}to{background-position:-100% 0}}.mjr-popover-row[data-v-fee77a92]{grid-template-columns:110px 1fr;align-items:center;gap:8px;margin-bottom:8px;display:grid}.mjr-popover-row--3col[data-v-fee77a92]{grid-template-columns:110px 1fr 1fr}.mjr-popover-label[data-v-fee77a92]{color:var(--mjr-muted,var(--descrip-text,#ffffffa6));white-space:nowrap;font-size:12px}.mjr-popover-toggle[data-v-fee77a92]{cursor:pointer;color:var(--fg-color,#e6edf7);align-items:center;gap:6px;font-size:12px;display:flex}.mjr-filter-group-toggle[data-v-fee77a92]{width:100%;color:inherit;cursor:pointer;text-align:left;background:0 0;border:0;justify-content:space-between;align-items:center;gap:10px;margin:0 0 10px;padding:0;display:flex}.mjr-filter-group[data-v-fee77a92]{--mjr-filter-group-accent:var(--mjr-accent,#7aa2ff)}.mjr-filter-group--core[data-v-fee77a92]{--mjr-filter-group-accent:#56a8ff}.mjr-filter-group--media[data-v-fee77a92]{--mjr-filter-group-accent:#35d08b}.mjr-filter-group--time[data-v-fee77a92]{--mjr-filter-group-accent:#f0b84f}.mjr-filter-group-title[data-v-fee77a92]{color:color-mix(in srgb, var(--mjr-filter-group-accent) 62%, var(--content-fg,#ddd));letter-spacing:.08em;text-transform:uppercase;align-items:center;gap:6px;font-size:11px;font-weight:700;display:inline-flex}.mjr-filter-group-title[data-v-fee77a92]:before{content:"";background:var(--mjr-filter-group-accent);border-radius:999px;flex:0 0 6px;width:6px;height:6px}.mjr-filter-group-chevron[data-v-fee77a92]{color:color-mix(in srgb, var(--mjr-filter-group-accent) 78%, var(--mjr-muted,#ffffffa6));font-size:12px;line-height:1}.mjr-filter-group-body[data-v-fee77a92]{padding-top:2px}.mjr-filter-group[data-v-fee77a92]:not(.is-open){padding-bottom:8px}.mjr-filter-group:not(.is-open) .mjr-filter-group-toggle[data-v-fee77a92]{margin-bottom:0}.mjr-pinned-folders-menu[data-v-7d86b0ee]{gap:6px;display:grid}.mjr-pinned-folders-empty[data-v-7d86b0ee]{opacity:.75;padding:10px 12px}.mjr-pinned-folder-row[data-v-7d86b0ee]{align-items:stretch;width:100%;display:flex}.mjr-pinned-folder-open[data-v-7d86b0ee]{background:linear-gradient(135deg,#ffffff08,#ffffff03);border:1px solid #78beff2e;border-radius:9px;flex:1;justify-content:space-between;align-items:center;gap:10px;width:100%;padding:9px 10px;transition:border-color .12s,background .12s;display:flex}.mjr-pinned-folder-open[data-v-7d86b0ee]:hover,.mjr-pinned-folder-open[data-v-7d86b0ee]:focus-visible{background:linear-gradient(135deg,#508cff2e,#2064c824);border-color:#91cdff66}.mjr-pinned-folder-label[data-v-7d86b0ee]{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--fg-color,#e6edf7);font-weight:600;overflow:hidden}.mjr-pinned-folder-path[data-v-7d86b0ee]{text-overflow:ellipsis;white-space:nowrap;opacity:.68;flex:0 auto;min-width:0;max-width:220px;font-size:11px;overflow:hidden}.mjr-pinned-folder-unpin[data-v-7d86b0ee]{background:linear-gradient(135deg,#ff464629,#a014141f);border:1px solid #ff5f5f59;border-radius:9px;justify-content:center;width:42px;margin-left:6px;padding:0}.mjr-pinned-folder-unpin .pi[data-v-7d86b0ee]{opacity:.88;color:#ff8282f5}.mjr-folder-breadcrumb[data-v-0bf75dfa]{--mjr-breadcrumb-accent:#56a8ff;--mjr-breadcrumb-current:#35d08b;opacity:.78;white-space:nowrap;border:1px solid color-mix(in srgb, var(--mjr-breadcrumb-accent) 22%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 9%, transparent);border-radius:8px;align-items:center;gap:4px;margin:1px 0 3px;padding:3px 6px;font-size:11px;display:none;overflow:auto}.mjr-folder-breadcrumb.is-visible[data-v-0bf75dfa]{display:flex}.mjr-folder-breadcrumb-action[data-v-0bf75dfa]{border:1px solid color-mix(in srgb, var(--mjr-breadcrumb-accent) 42%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 16%, transparent);color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 78%, #fff);font:inherit;border-radius:6px;padding:2px 8px}.mjr-folder-breadcrumb-action[data-v-0bf75dfa]:not(:disabled):hover{border-color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 62%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 24%, transparent)}.mjr-folder-breadcrumb-segment[data-v-0bf75dfa]{background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 8%, transparent);min-width:0;max-width:220px;color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 76%, #fff);font:inherit;text-overflow:ellipsis;border:1px solid #0000;border-radius:5px;padding:1px 5px;overflow:hidden}.mjr-folder-breadcrumb-segment[data-v-0bf75dfa]:not(:disabled):hover{border-color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 38%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 16%, transparent)}.mjr-folder-breadcrumb-segment.is-current[data-v-0bf75dfa],.mjr-folder-breadcrumb-segment[data-v-0bf75dfa]:disabled{border-color:color-mix(in srgb, var(--mjr-breadcrumb-current) 38%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-current) 14%, transparent);color:color-mix(in srgb, var(--mjr-breadcrumb-current) 74%, #fff);cursor:default}.mjr-folder-breadcrumb-separator[data-v-0bf75dfa]{color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 58%, var(--mjr-muted,#ffffff9e));opacity:.9}.mjr-rating-star[data-v-d6a0ab11]{outline:none}.mjr-rating-star[data-v-d6a0ab11]:hover:not(:disabled){transform:scale(1.2)}.mjr-rating-star[data-v-d6a0ab11]:focus-visible{outline:2px solid var(--focus-outline-color,#4dabf7);outline-offset:2px;border-radius:2px}
+.mjr-rating-badge[data-v-730159ba]{letter-spacing:1px;pointer-events:none;z-index:10;text-shadow:0 2px 6px #0009;background:#0000008c;border:1px solid #ffffff1f;border-radius:6px;justify-content:center;align-items:center;padding:2px 6px;font-size:13px;animation:.2s ease-out mjr-fade-in-730159ba;display:inline-flex;position:absolute;top:6px;right:6px;box-shadow:0 6px 18px #00000040}@keyframes mjr-fade-in-730159ba{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.mjr-tags-badge[data-v-2b45d539]{text-overflow:ellipsis;white-space:nowrap;pointer-events:none;z-index:10;background:#000c;border-radius:4px;max-width:calc(100% - 56px);padding:3px 6px;font-size:9px;animation:.2s ease-out mjr-fade-in-2b45d539;position:absolute;bottom:6px;left:6px;overflow:hidden;box-shadow:0 2px 4px #0000004d}@keyframes mjr-fade-in-2b45d539{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.mjr-gentime-badge[data-v-e8aef14a]{letter-spacing:.015em;pointer-events:none;z-index:10;text-shadow:0 1px 2px #000000e6, 0 0 10px color-mix(in srgb, currentColor 35%, transparent);-webkit-backdrop-filter:blur(2px);background:#0000008c;border:1px solid #ffffff1f;border-radius:4px;padding:2px 6px;font-size:10px;font-weight:800;line-height:1.1;position:absolute;bottom:6px;right:6px;box-shadow:0 2px 4px #0000004d}.mjr-grid-skeleton-layout[data-v-ddf2bbab]{grid-template-columns:repeat(auto-fill,minmax(132px,1fr));gap:12px;display:grid}.mjr-grid-skeleton-card[data-v-ddf2bbab]{background:#c0c6ce33;border:1px solid #ffffff38;border-radius:12px;min-height:146px;overflow:hidden;box-shadow:0 6px 18px #0000003d}.mjr-grid-skeleton-thumb[data-v-ddf2bbab]{aspect-ratio:1;background:linear-gradient(90deg,#9ca2ab85 0%,#dce1e8b8 45%,#9ca2ab85 100%) 0 0/240% 100%;width:100%;animation:1.2s linear infinite mjr-grid-skeleton-shimmer-ddf2bbab}.mjr-grid-skeleton-line[data-v-ddf2bbab]{background:linear-gradient(90deg,#a4aab37a 0%,#d6dbe2b3 45%,#a4aab37a 100%) 0 0/240% 100%;border-radius:8px;height:10px;margin:8px 10px;animation:1.2s linear infinite mjr-grid-skeleton-shimmer-ddf2bbab}.mjr-grid-skeleton-line--title[data-v-ddf2bbab]{width:72%}.mjr-grid-skeleton-line--meta[data-v-ddf2bbab]{width:48%;margin-top:2px;margin-bottom:10px}@keyframes mjr-grid-skeleton-shimmer-ddf2bbab{0%{background-position:100% 0}to{background-position:-100% 0}}.mjr-filter-head[data-v-5ab0b6db]{border-bottom:1px solid color-mix(in srgb, var(--mjr-border) 85%, transparent);justify-content:space-between;align-items:flex-start;gap:10px;margin:0 0 10px;padding:4px 2px 10px;display:flex}.mjr-filter-head-left[data-v-5ab0b6db]{min-width:0}.mjr-filter-kicker[data-v-5ab0b6db]{letter-spacing:.09em;text-transform:uppercase;color:color-mix(in srgb, var(--mjr-accent,#5fb3ff) 65%, var(--content-fg,#ddd));font-size:11px;font-weight:800}.mjr-filter-subtitle[data-v-5ab0b6db]{color:color-mix(in srgb, var(--content-fg,#ddd) 62%, var(--mjr-muted,#ffffffa6));margin-top:2px;font-size:11px}.mjr-filter-head-actions[data-v-5ab0b6db]{flex:none;align-items:center;gap:8px;display:inline-flex}.mjr-filter-active-count[data-v-5ab0b6db]{border:1px solid color-mix(in srgb, var(--mjr-accent,#5fb3ff) 55%, var(--mjr-border));background:color-mix(in srgb, var(--mjr-accent,#5fb3ff) 18%, var(--mjr-surface-2));min-width:22px;height:22px;color:var(--content-fg,#fff);border-radius:999px;justify-content:center;align-items:center;padding:0 6px;font-size:11px;font-weight:700;line-height:1;display:inline-flex}.mjr-filter-clear-all[data-v-5ab0b6db]{border:1px solid color-mix(in srgb, var(--mjr-border) 75%, transparent);border-radius:999px;height:24px;padding:0 8px;font-size:11px;font-weight:700}.mjr-popover-row[data-v-5ab0b6db]{grid-template-columns:1fr;align-items:start;gap:8px;margin-bottom:10px;display:grid}.mjr-popover-row--3col[data-v-5ab0b6db]{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:8px}.mjr-popover-row--3col .mjr-popover-label[data-v-5ab0b6db]{grid-column:1/-1}.mjr-popover-label[data-v-5ab0b6db]{color:color-mix(in srgb, var(--content-fg,#ddd) 70%, var(--mjr-muted,#ffffffa6));white-space:normal;font-size:12px;font-weight:600}.mjr-popover-toggle[data-v-5ab0b6db]{cursor:pointer;color:var(--fg-color,#e6edf7);border:1px solid color-mix(in srgb, var(--mjr-border) 80%, transparent);background:color-mix(in srgb, var(--mjr-surface-2) 66%, transparent);border-radius:8px;align-items:center;gap:6px;padding:6px 8px;font-size:12px;display:flex}.mjr-filter-group-toggle[data-v-5ab0b6db]{width:100%;color:inherit;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:8px;justify-content:space-between;align-items:center;gap:10px;margin:0 0 10px;padding:2px 4px;display:flex}.mjr-filter-group[data-v-5ab0b6db]{--mjr-filter-group-accent:var(--mjr-accent,#7aa2ff)}.mjr-filter-group--core[data-v-5ab0b6db]{--mjr-filter-group-accent:#56a8ff}.mjr-filter-group--media[data-v-5ab0b6db]{--mjr-filter-group-accent:#35d08b}.mjr-filter-group--time[data-v-5ab0b6db]{--mjr-filter-group-accent:#f0b84f}.mjr-filter-group-title[data-v-5ab0b6db]{color:color-mix(in srgb, var(--mjr-filter-group-accent) 62%, var(--content-fg,#ddd));letter-spacing:.08em;text-transform:uppercase;align-items:center;gap:6px;font-size:11px;font-weight:700;display:inline-flex}.mjr-filter-group-title[data-v-5ab0b6db]:before{content:"";background:var(--mjr-filter-group-accent);border-radius:999px;flex:0 0 6px;width:6px;height:6px}.mjr-filter-group-chevron[data-v-5ab0b6db]{color:color-mix(in srgb, var(--mjr-filter-group-accent) 78%, var(--mjr-muted,#ffffffa6));font-size:12px;line-height:1}.mjr-filter-group-body[data-v-5ab0b6db]{padding-top:4px}.mjr-filter-card[data-v-5ab0b6db]{border:1px solid color-mix(in srgb, var(--mjr-border) 88%, transparent);background:linear-gradient(180deg, color-mix(in srgb, var(--mjr-surface-2) 86%, transparent), color-mix(in srgb, var(--mjr-surface-1) 88%, transparent));border-radius:10px;margin-bottom:8px;padding:10px}.mjr-filter-card[data-v-5ab0b6db]:last-child{margin-bottom:0}.mjr-filter-card--agenda[data-v-5ab0b6db]{background:linear-gradient(180deg, color-mix(in srgb, #f0b84f 9%, var(--mjr-surface-2)), color-mix(in srgb, var(--mjr-surface-1) 92%, transparent))}.mjr-filter-group[data-v-5ab0b6db]:not(.is-open){padding-bottom:8px}.mjr-filter-group:not(.is-open) .mjr-filter-group-toggle[data-v-5ab0b6db]{margin-bottom:0}@media (width<=440px){.mjr-filter-head[data-v-5ab0b6db]{flex-direction:column;align-items:stretch}.mjr-filter-head-actions[data-v-5ab0b6db]{justify-content:space-between}}.mjr-pinned-folders-menu[data-v-7d86b0ee]{gap:6px;display:grid}.mjr-pinned-folders-empty[data-v-7d86b0ee]{opacity:.75;padding:10px 12px}.mjr-pinned-folder-row[data-v-7d86b0ee]{align-items:stretch;width:100%;display:flex}.mjr-pinned-folder-open[data-v-7d86b0ee]{background:linear-gradient(135deg,#ffffff08,#ffffff03);border:1px solid #78beff2e;border-radius:9px;flex:1;justify-content:space-between;align-items:center;gap:10px;width:100%;padding:9px 10px;transition:border-color .12s,background .12s;display:flex}.mjr-pinned-folder-open[data-v-7d86b0ee]:hover,.mjr-pinned-folder-open[data-v-7d86b0ee]:focus-visible{background:linear-gradient(135deg,#508cff2e,#2064c824);border-color:#91cdff66}.mjr-pinned-folder-label[data-v-7d86b0ee]{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--fg-color,#e6edf7);font-weight:600;overflow:hidden}.mjr-pinned-folder-path[data-v-7d86b0ee]{text-overflow:ellipsis;white-space:nowrap;opacity:.68;flex:0 auto;min-width:0;max-width:220px;font-size:11px;overflow:hidden}.mjr-pinned-folder-unpin[data-v-7d86b0ee]{background:linear-gradient(135deg,#ff464629,#a014141f);border:1px solid #ff5f5f59;border-radius:9px;justify-content:center;width:42px;margin-left:6px;padding:0}.mjr-pinned-folder-unpin .pi[data-v-7d86b0ee]{opacity:.88;color:#ff8282f5}.mjr-folder-breadcrumb[data-v-0bf75dfa]{--mjr-breadcrumb-accent:#56a8ff;--mjr-breadcrumb-current:#35d08b;opacity:.78;white-space:nowrap;border:1px solid color-mix(in srgb, var(--mjr-breadcrumb-accent) 22%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 9%, transparent);border-radius:8px;align-items:center;gap:4px;margin:1px 0 3px;padding:3px 6px;font-size:11px;display:none;overflow:auto}.mjr-folder-breadcrumb.is-visible[data-v-0bf75dfa]{display:flex}.mjr-folder-breadcrumb-action[data-v-0bf75dfa]{border:1px solid color-mix(in srgb, var(--mjr-breadcrumb-accent) 42%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 16%, transparent);color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 78%, #fff);font:inherit;border-radius:6px;padding:2px 8px}.mjr-folder-breadcrumb-action[data-v-0bf75dfa]:not(:disabled):hover{border-color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 62%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 24%, transparent)}.mjr-folder-breadcrumb-segment[data-v-0bf75dfa]{background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 8%, transparent);min-width:0;max-width:220px;color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 76%, #fff);font:inherit;text-overflow:ellipsis;border:1px solid #0000;border-radius:5px;padding:1px 5px;overflow:hidden}.mjr-folder-breadcrumb-segment[data-v-0bf75dfa]:not(:disabled):hover{border-color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 38%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 16%, transparent)}.mjr-folder-breadcrumb-segment.is-current[data-v-0bf75dfa],.mjr-folder-breadcrumb-segment[data-v-0bf75dfa]:disabled{border-color:color-mix(in srgb, var(--mjr-breadcrumb-current) 38%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-current) 14%, transparent);color:color-mix(in srgb, var(--mjr-breadcrumb-current) 74%, #fff);cursor:default}.mjr-folder-breadcrumb-separator[data-v-0bf75dfa]{color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 58%, var(--mjr-muted,#ffffff9e));opacity:.9}.mjr-rating-star[data-v-d6a0ab11]{outline:none}.mjr-rating-star[data-v-d6a0ab11]:hover:not(:disabled){transform:scale(1.2)}.mjr-rating-star[data-v-d6a0ab11]:focus-visible{outline:2px solid var(--focus-outline-color,#4dabf7);outline-offset:2px;border-radius:2px}
/*$vite$:1*/
\ No newline at end of file
diff --git a/dist/chunks/FloatingViewer-CY901ToM.js b/dist/chunks/FloatingViewer-A8uTs2JS.js
similarity index 72%
rename from dist/chunks/FloatingViewer-CY901ToM.js
rename to dist/chunks/FloatingViewer-A8uTs2JS.js
index 87345be9..34078f74 100644
--- a/dist/chunks/FloatingViewer-CY901ToM.js
+++ b/dist/chunks/FloatingViewer-A8uTs2JS.js
@@ -1,27 +1,27 @@
-import { Bt as e, Dt as t, Ht as n, a as r, f as i, h as a, o } from "./hostAdapter-D6BwD-lN.js";
-import { a as s, m as c, t as l } from "./config-dvcltBqE.js";
-import { a as u, c as d, i as f, n as p, o as m, r as h, v as g, y as _ } from "./SidebarWorkflowSection-CxD2u7Bb.js";
-import { r as v } from "./events-BnkL6-b6.js";
-import { a as y, i as b, o as x, s as S } from "./graphTraversal-HdtD9lDa.js";
-import { _ as C, c as w, f as ee, g as T, h as te, i as E, l as D, n as O, r as k, s as ne, t as A, v as j, y as M } from "./openMajoorSettings-CGhSTA_W.js";
-import { a as N, n as re, r as ie } from "./model3dRenderer-DtGg_3hW.js";
-import { i as ae, o as P, r as oe, t as se } from "./geninfoParser-BE5lWeGw.js";
-import { t as F } from "./genInfo-DPkTyDKA.js";
+import { _t as e, a as t, n } from "./client-DZE_lzdb.js";
+import { D as r, E as i, M as a, O as o, S as s, T as c, _ as l, g as u, j as d, k as f, l as p, nt as m, p as h, q as g, t as _, v } from "./config-Cxv7acF8.js";
+import { a as y, i as b, o as x, s as S } from "./graphTraversal-CjIZsRsP.js";
+import { a as C, b as w, c as T, i as E, n as D, o as O, r as k, y as A } from "./SidebarWorkflowSection-na0bq_pe.js";
+import { r as j } from "./events-BnkL6-b6.js";
+import { _ as M, c as N, f as ee, g as P, h as F, i as te, l as ne, n as re, r as ie, s as ae, t as oe, v as se, y as I } from "./openMajoorSettings-BeNfIQfY.js";
+import { a as L, n as ce, r as le } from "./model3dRenderer-BtzSm2ZA.js";
+import { i as ue, o as R, r as de, t as fe } from "./geninfoParser-5vKgjqjD.js";
+import { t as pe } from "./genInfo-oNZ5Okna.js";
//#region ui/features/viewer/floatingViewerConstants.ts
-var I = Object.freeze({
+var z = Object.freeze({
SIMPLE: "simple",
AB: "ab",
SIDE: "side",
GRID: "grid",
GRAPH: "graph"
-}), L = .25, R = 8e-4, z = 30;
-function B(e) {
+}), me = .25, he = 8e-4, ge = 30;
+function _e(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 ce(e) {
+function ve(e) {
try {
let t = e?.play?.();
t && typeof t.catch == "function" && t.catch(() => {});
@@ -29,40 +29,40 @@ function ce(e) {
console.debug?.(e);
}
}
-function le(e, t) {
+function ye(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 ue(e, t) {
- let n = Number(e?.currentTime || 0), r = Number(t) > 0 ? Number(t) : z;
+function be(e, t) {
+ let n = Number(e?.currentTime || 0), r = Number(t) > 0 ? Number(t) : ge;
return Math.max(0, Math.floor(n * r));
}
-function de(e, t) {
- let n = Number(e?.duration || 0), r = Number(t) > 0 ? Number(t) : z;
+function xe(e, t) {
+ let n = Number(e?.duration || 0), r = Number(t) > 0 ? Number(t) : ge;
return !Number.isFinite(n) || n <= 0 ? 0 : Math.max(0, Math.floor(n * r));
}
-function fe(e, t, n) {
- let r = Number(n) > 0 ? Number(n) : z, i = le(t, de(e, r)) / r;
+function Se(e, t, n) {
+ let r = Number(n) > 0 ? Number(n) : ge, i = ye(t, xe(e, r)) / r;
try {
e.currentTime = Math.max(0, i);
} catch (e) {
console.debug?.(e);
}
}
-function pe(e) {
+function Ce(e) {
return e instanceof HTMLMediaElement;
}
-function me(e, t) {
+function we(e, t) {
return String(e || "").toLowerCase() === "video" ? !0 : t instanceof HTMLVideoElement;
}
-function he(e, t) {
+function Te(e, t) {
return String(e || "").toLowerCase() === "audio" ? !0 : t instanceof HTMLAudioElement;
}
-function ge(e) {
+function Ee(e) {
let t = String(e || "").toLowerCase();
return t === "gif" || t === "animated-image";
}
-function _e(e) {
+function De(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 +74,10 @@ function _e(e) {
return console.debug?.(e), "";
}
}
-function ve(e, t = null, { kind: n = "" } = {}) {
+function Oe(e, t = null, { kind: n = "" } = {}) {
if (!e || e._mjrSimplePlayerMounted) return e?.parentElement || null;
e._mjrSimplePlayerMounted = !0;
- let r = g(t) || z, i = pe(e), a = me(n, e), o = he(n, e), s = ge(n), c = document.createElement("div");
+ let r = A(t) || ge, i = Ce(e), a = we(n, e), o = Te(n, e), s = Ee(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";
@@ -93,18 +93,18 @@ function ve(e, t = null, { kind: n = "" } = {}) {
m.type = "button", m.className = "mjr-icon-btn mjr-mfv-simple-player-btn", m.setAttribute("aria-label", "Step back");
let h = document.createElement("i");
h.className = "pi pi-step-backward", h.setAttribute("aria-hidden", "true"), m.appendChild(h);
- let _ = document.createElement("button");
- _.type = "button", _.className = "mjr-icon-btn mjr-mfv-simple-player-btn", _.setAttribute("aria-label", "Step forward");
- let v = document.createElement("i");
- v.className = "pi pi-step-forward", v.setAttribute("aria-hidden", "true"), _.appendChild(v);
+ let g = document.createElement("button");
+ g.type = "button", g.className = "mjr-icon-btn mjr-mfv-simple-player-btn", g.setAttribute("aria-label", "Step forward");
+ let _ = document.createElement("i");
+ _.className = "pi pi-step-forward", _.setAttribute("aria-hidden", "true"), g.appendChild(_);
+ let v = document.createElement("div");
+ v.className = "mjr-mfv-simple-player-time", v.textContent = "0:00 / 0:00";
let y = document.createElement("div");
- y.className = "mjr-mfv-simple-player-time", y.textContent = "0:00 / 0:00";
- let b = document.createElement("div");
- b.className = "mjr-mfv-simple-player-frame", b.textContent = "F: 0", a || (b.style.display = "none");
- let x = document.createElement("button");
- x.type = "button", x.className = "mjr-icon-btn mjr-mfv-simple-player-btn", x.setAttribute("aria-label", "Mute/Unmute");
- let S = document.createElement("i");
- if (S.className = "pi pi-volume-up", S.setAttribute("aria-hidden", "true"), x.appendChild(S), a || (m.disabled = !0, _.disabled = !0, m.classList.add("is-disabled"), _.classList.add("is-disabled")), d.appendChild(m), d.appendChild(f), d.appendChild(_), d.appendChild(y), d.appendChild(b), d.appendChild(x), l.appendChild(u), l.appendChild(d), c.appendChild(e), o) {
+ y.className = "mjr-mfv-simple-player-frame", y.textContent = "F: 0", a || (y.style.display = "none");
+ let b = document.createElement("button");
+ b.type = "button", b.className = "mjr-icon-btn mjr-mfv-simple-player-btn", b.setAttribute("aria-label", "Mute/Unmute");
+ let x = document.createElement("i");
+ if (x.className = "pi pi-volume-up", x.setAttribute("aria-hidden", "true"), b.appendChild(x), a || (m.disabled = !0, g.disabled = !0, m.classList.add("is-disabled"), g.classList.add("is-disabled")), d.appendChild(m), d.appendChild(f), d.appendChild(g), d.appendChild(v), d.appendChild(y), d.appendChild(b), l.appendChild(u), l.appendChild(d), c.appendChild(e), o) {
let e = document.createElement("div");
e.className = "mjr-mfv-simple-player-audio-backdrop", e.textContent = String(t?.filename || "Audio"), c.appendChild(e);
}
@@ -114,73 +114,73 @@ function ve(e, t = null, { kind: n = "" } = {}) {
} catch (e) {
console.debug?.(e);
}
- let C = s ? String(e?.src || "") : "", w = !1, ee = "", T = () => {
+ let S = s ? String(e?.src || "") : "", C = !1, w = "", T = () => {
if (i) {
p.className = e.paused ? "pi pi-play" : "pi pi-pause";
return;
}
if (s) {
- p.className = w ? "pi pi-play" : "pi pi-pause";
+ p.className = C ? "pi pi-play" : "pi pi-pause";
return;
}
p.className = "pi pi-play";
- }, te = () => {
+ }, E = () => {
if (e instanceof HTMLMediaElement) {
- S.className = e.muted ? "pi pi-volume-off" : "pi pi-volume-up";
+ x.className = e.muted ? "pi pi-volume-off" : "pi pi-volume-up";
return;
}
- S.className = "pi pi-volume-off", x.disabled = !0, x.classList.add("is-disabled");
- }, E = () => {
- if (!a || !(e instanceof HTMLVideoElement)) return;
- let t = ue(e, r), n = de(e, r);
- b.textContent = n > 0 ? `F: ${t}/${n}` : `F: ${t}`;
+ x.className = "pi pi-volume-off", b.disabled = !0, b.classList.add("is-disabled");
}, D = () => {
+ if (!a || !(e instanceof HTMLVideoElement)) return;
+ let t = be(e, r), n = xe(e, r);
+ y.textContent = n > 0 ? `F: ${t}/${n}` : `F: ${t}`;
+ }, O = () => {
let e = Math.max(0, Math.min(100, Number(u.value) / 1e3 * 100));
u.style.setProperty("--mjr-seek-pct", `${e}%`);
- }, O = () => {
+ }, k = () => {
if (!i) {
- y.textContent = s ? "Animated" : "Preview", u.value = "0", D();
+ v.textContent = s ? "Animated" : "Preview", u.value = "0", O();
return;
}
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)), y.textContent = `${B(t)} / ${B(n)}`;
- } else u.value = "0", y.textContent = `${B(t)} / 0:00`;
- D();
- }, k = (e) => {
+ u.value = String(Math.round(e * 1e3)), v.textContent = `${_e(t)} / ${_e(n)}`;
+ } else u.value = "0", v.textContent = `${_e(t)} / 0:00`;
+ O();
+ }, j = (e) => {
try {
e?.stopPropagation?.();
} catch {}
- }, ne = (t) => {
- k(t);
+ }, M = (t) => {
+ j(t);
try {
- i ? e.paused ? ce(e) : e.pause?.() : s && (w ? (e.src = C ? `${C}${C.includes("?") ? "&" : "?"}mjr_anim=${Date.now()}` : e.src, w = !1) : (ee ||= _e(e), ee && (e.src = ee), w = !0));
+ i ? e.paused ? ve(e) : e.pause?.() : s && (C ? (e.src = S ? `${S}${S.includes("?") ? "&" : "?"}mjr_anim=${Date.now()}` : e.src, C = !1) : (w ||= De(e), w && (e.src = w), C = !0));
} catch (e) {
console.debug?.(e);
}
T();
- }, A = (t, n) => {
- if (k(n), !(!a || !(e instanceof HTMLVideoElement))) {
+ }, N = (t, n) => {
+ if (j(n), !(!a || !(e instanceof HTMLVideoElement))) {
try {
e.pause?.();
} catch (e) {
console.debug?.(e);
}
- fe(e, ue(e, r) + t, r), T(), E(), O();
+ Se(e, be(e, r) + t, r), T(), D(), k();
}
- }, j = (t) => {
- if (k(t), e instanceof HTMLMediaElement) {
+ }, ee = (t) => {
+ if (j(t), e instanceof HTMLMediaElement) {
try {
e.muted = !e.muted;
} catch (e) {
console.debug?.(e);
}
- te();
+ E();
}
- }, M = (t) => {
- if (k(t), !i) return;
- D();
+ }, P = (t) => {
+ if (j(t), !i) return;
+ O();
let n = Number(e.duration || 0);
if (!Number.isFinite(n) || n <= 0) return;
let r = Math.max(0, Math.min(1, Number(u.value) / 1e3));
@@ -189,9 +189,9 @@ function ve(e, t = null, { kind: n = "" } = {}) {
} catch (e) {
console.debug?.(e);
}
- E(), O();
- }, N = (e) => k(e);
- return f.addEventListener("click", ne), m.addEventListener("click", (e) => A(-1, e)), _.addEventListener("click", (e) => A(1, e)), x.addEventListener("click", j), u.addEventListener("input", M), l.addEventListener("pointerdown", N), l.addEventListener("click", N), l.addEventListener("dblclick", N), c.addEventListener("pointerdown", (e) => {
+ D(), k();
+ }, F = (e) => j(e);
+ return f.addEventListener("click", M), m.addEventListener("click", (e) => N(-1, e)), g.addEventListener("click", (e) => N(1, e)), b.addEventListener("click", ee), u.addEventListener("input", P), l.addEventListener("pointerdown", F), l.addEventListener("click", F), l.addEventListener("dblclick", F), c.addEventListener("pointerdown", (e) => {
try {
if (e?.target?.closest?.("button, input, textarea, select")) return;
c.focus?.({ preventScroll: !0 });
@@ -202,36 +202,36 @@ function ve(e, t = null, { kind: n = "" } = {}) {
let t = String(e?.key || "");
if (!(!t || e?.altKey || e?.ctrlKey || e?.metaKey)) {
if (t === " " || t === "Spacebar") {
- e.preventDefault?.(), ne(e);
+ e.preventDefault?.(), M(e);
return;
}
if (t === "ArrowLeft") {
if (!a) return;
- e.preventDefault?.(), A(-1, e);
+ e.preventDefault?.(), N(-1, e);
return;
}
if (t === "ArrowRight") {
if (!a) return;
- e.preventDefault?.(), A(1, e);
+ e.preventDefault?.(), N(1, e);
}
}
}), e instanceof HTMLMediaElement && (e.addEventListener("play", T, { passive: !0 }), e.addEventListener("pause", T, { passive: !0 }), e.addEventListener("timeupdate", () => {
- E(), O();
+ D(), k();
}, { passive: !0 }), e.addEventListener("seeked", () => {
- E(), O();
+ D(), k();
}, { passive: !0 }), e.addEventListener("loadedmetadata", () => {
- E(), O();
- }, { passive: !0 })), ce(e), T(), te(), E(), O(), c;
+ D(), k();
+ }, { passive: !0 })), ve(e), T(), E(), D(), k(), c;
}
//#endregion
//#region ui/features/viewer/floatingViewerMedia.ts
-var ye = new Set([
+var ke = new Set([
".mp4",
".webm",
".mov",
".avi",
".mkv"
-]), be = new Set([
+]), Ae = new Set([
".mp3",
".wav",
".flac",
@@ -241,7 +241,7 @@ var ye = new Set([
".opus",
".wma"
]);
-function xe(e) {
+function je(e) {
try {
let t = String(e || "").trim(), n = t.lastIndexOf(".");
return n >= 0 ? t.slice(n).toLowerCase() : "";
@@ -249,7 +249,7 @@ function xe(e) {
return "";
}
}
-function V(e) {
+function B(e) {
let t = String(e?.kind || "").toLowerCase();
if (t === "video") return "video";
if (t === "audio") return "audio";
@@ -258,21 +258,21 @@ function V(e) {
if (r === "video") return "video";
if (r === "audio") return "audio";
if (r === "model3d") return "model3d";
- let i = xe(e?.filename || "");
- return i === ".gif" ? "gif" : ye.has(i) ? "video" : be.has(i) ? "audio" : re.has(i) ? "model3d" : "image";
+ let i = je(e?.filename || "");
+ return i === ".gif" ? "gif" : ke.has(i) ? "video" : Ae.has(i) ? "audio" : ce.has(i) ? "model3d" : "image";
}
-function Se(e) {
- return e ? e.url ? String(e.url) : e.filename && e.id == null ? c(e.filename, e.subfolder || "", e.type || "output") : e.filename && s(e) || "" : "";
+function Me(e) {
+ return e ? e.url ? String(e.url) : e.filename && e.id == null ? m(e.filename, e.subfolder || "", e.type || "output") : e.filename && g(e) || "" : "";
}
-function H(e = "No media - select assets in the grid") {
+function V(e = "No media - select assets in the grid") {
let t = document.createElement("div");
return t.className = "mjr-mfv-empty", t.textContent = e, t;
}
-function U(e, t) {
+function H(e, t) {
let n = document.createElement("div");
return n.className = `mjr-mfv-label label-${t}`, n.textContent = e, n;
}
-function Ce(e) {
+function Ne(e) {
if (!(!e || typeof e.play != "function")) try {
let t = e.play();
t && typeof t.catch == "function" && t.catch(() => {});
@@ -280,7 +280,7 @@ function Ce(e) {
console.debug?.(e);
}
}
-function we(e, t) {
+function Pe(e, t) {
let n = e && e.nodeType === 1 ? e : e?.parentElement || null;
for (; n && n !== t;) {
try {
@@ -293,7 +293,7 @@ function we(e, t) {
}
return null;
}
-function Te(e, t, n) {
+function Fe(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));
@@ -302,7 +302,7 @@ function Te(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 Ee(e) {
+function Ie(e) {
if (e) try {
let t = e.querySelectorAll?.("video, audio");
if (!t || !t.length) return;
@@ -315,10 +315,10 @@ function Ee(e) {
console.debug?.(e);
}
}
-function W(e, { fill: t = !1, controls: n = !0 } = {}) {
- let r = Se(e);
+function U(e, { fill: t = !1, controls: n = !0 } = {}) {
+ let r = Me(e);
if (!r) return null;
- let i = V(e), a = `mjr-mfv-media mjr-mfv-media--fit-height${t ? " mjr-mfv-media--fill" : ""}`, o = xe(e?.filename || "") === ".webp" && Number(e?.duration ?? e?.metadata_raw?.duration ?? 0) > 0, s = (r, i) => {
+ let i = B(e), a = `mjr-mfv-media mjr-mfv-media--fit-height${t ? " mjr-mfv-media--fill" : ""}`, o = je(e?.filename || "") === ".webp" && Number(e?.duration ?? e?.metadata_raw?.duration ?? 0) > 0, s = (r, i) => {
if (!n) return r;
let a = document.createElement("div");
a.className = `mjr-mfv-player-host${t ? " mjr-mfv-player-host--fill" : ""}`, a.appendChild(r);
@@ -326,8 +326,8 @@ function W(e, { fill: t = !1, controls: n = !0 } = {}) {
variant: "viewer",
hostEl: a,
mediaKind: i,
- initialFps: g(e) || void 0,
- initialFrameCount: _(e, g(e)) || void 0
+ initialFps: A(e) || void 0,
+ initialFrameCount: w(e, A(e)) || void 0
});
try {
o && (a._mjrMediaControlsHandle = o);
@@ -340,45 +340,45 @@ function W(e, { fill: t = !1, controls: n = !0 } = {}) {
let e = document.createElement("audio");
e.className = a, e.src = r, e.controls = !1, e.autoplay = !0, e.preload = "metadata", e.loop = !0, e.muted = !0;
try {
- e.addEventListener("loadedmetadata", () => Ce(e), { once: !0 });
+ e.addEventListener("loadedmetadata", () => Ne(e), { once: !0 });
} catch (e) {
console.debug?.(e);
}
- return Ce(e), s(e, "audio");
+ return Ne(e), s(e, "audio");
}
if (i === "video") {
let e = document.createElement("video");
return e.className = a, e.src = r, e.controls = !1, e.loop = !0, e.muted = !0, e.autoplay = !0, e.playsInline = !0, s(e, "video");
}
- if (i === "model3d") return ie(e, r, {
+ if (i === "model3d") return le(e, r, {
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: !!l.FLOATING_VIEWER_PAUSE_DURING_EXECUTION
+ pauseDuringExecution: !!_.FLOATING_VIEWER_PAUSE_DURING_EXECUTION
});
let c = document.createElement("img");
- return c.className = a, c.src = r, c.alt = String(e?.filename || ""), c.draggable = !1, (i === "gif" || o) && ve(c, e, { kind: i === "gif" ? "gif" : "animated-image" }) || c;
+ return c.className = a, c.src = r, c.alt = String(e?.filename || ""), c.draggable = !1, (i === "gif" || o) && Oe(c, e, { kind: i === "gif" ? "gif" : "animated-image" }) || c;
}
-function De(e, t, n, r, i, a) {
+function Le(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 G(e, t, n, r) {
+function W(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)", De(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)", Le(e, n, r, i + 10, 18, 4), e.fill(), e.fillStyle = "#fff", e.fillText(t, n + 5, r + 13), e.restore();
}
//#endregion
//#region ui/features/viewer/workflowSidebar/NodeWidgetRenderer.ts
-var Oe = new Set([
+var Re = new Set([
"imageupload",
"button",
"hidden"
-]), ke = /\bnote\b|markdown/i;
-function Ae(e) {
- return ke.test(String(e?.type || ""));
+]), ze = /\bnote\b|markdown/i;
+function Be(e) {
+ return ze.test(String(e?.type || ""));
}
-function je(e) {
+function Ve(e) {
let t = e?.properties ?? {};
if (typeof t.text == "string") return t.text;
if (typeof t.value == "string") return t.value;
@@ -386,35 +386,35 @@ function je(e) {
let n = e?.widgets?.[0];
return n != null && n.value != null ? String(n.value) : "";
}
-function Me(e, t) {
+function He(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 Ne = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, Pe = /^[0-9a-f]{20,}$/i;
-function Fe(...e) {
+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) {
for (let t of e) {
let e = String(t || "").trim();
if (e) return e;
}
return "";
}
-function Ie(e) {
- return Ne.test(e) || Pe.test(e);
+function Ke(e) {
+ return Ue.test(e) || We.test(e);
}
-function Le(e) {
- return Fe(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name);
+function qe(e) {
+ return Ge(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name);
}
-function Re(e, { isSubgraph: t = !1 } = {}) {
- let n = String(e?.type || "").trim(), r = Le(e);
- return (t || Ie(n)) && r ? r : Ie(n) ? "Subgraph" : n || r || `Node #${e?.id}`;
+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 ze(e, t, { isSubgraph: n = !1 } = {}) {
- let r = String(e?.type || "").trim(), i = Le(e);
- return n && r && !Ie(r) && r !== t ? r : i && i !== r && i !== t ? i : "";
+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 : "";
}
-var Be = class {
+var Xe = class {
_node;
_onLocate;
_onToggle;
@@ -441,7 +441,7 @@ var Be = class {
syncFromGraph() {
if (this._noteTextarea) {
if ((this._el?.ownerDocument || document)?.activeElement !== this._noteTextarea) {
- let e = je(this._node);
+ let e = Ve(this._node);
this._noteTextarea.value !== e && (this._noteTextarea.value = e, this._noteTextarea._mjrAutoFit?.());
}
return;
@@ -449,7 +449,7 @@ var Be = 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 = Ve(n);
+ let n = this._inputMap.get(t.name), r = Ze(n);
if (!r) continue;
if (r.type === "checkbox") {
let e = !!t.value;
@@ -485,12 +485,12 @@ var Be = class {
r.className = "mjr-ws-node-title-wrap";
let i = document.createElement("span");
i.className = "mjr-ws-node-type";
- let a = Re(e, { isSubgraph: this._isSubgraph });
+ let a = Je(e, { isSubgraph: this._isSubgraph });
i.textContent = a, r.appendChild(i);
- let s = ze(e, a, { isSubgraph: this._isSubgraph });
- if (s) {
+ let o = Ye(e, a, { isSubgraph: this._isSubgraph });
+ if (o) {
let e = document.createElement("span");
- e.className = "mjr-ws-node-title", e.textContent = s, r.appendChild(e);
+ e.className = "mjr-ws-node-title", e.textContent = o, r.appendChild(e);
}
if (n.appendChild(r), this._isSubgraph) {
let e = document.createElement("span");
@@ -502,50 +502,47 @@ var Be = class {
let i = document.createElement("span");
i.className = "mjr-ws-node-kind-count", i.textContent = String(this._childCount), e.appendChild(i), n.appendChild(e), this._subgraphHeaderTitle = `${a} · Subgraph · ${this._childCount} inner node${this._childCount === 1 ? "" : "s"}`, n.title = this._subgraphHeaderTitle;
}
- let c = document.createElement("button");
- c.type = "button", c.className = "mjr-icon-btn mjr-ws-locate", c.title = "Locate on canvas", c.innerHTML = "", c.addEventListener("click", (e) => {
+ let s = document.createElement("button");
+ s.type = "button", s.className = "mjr-icon-btn mjr-ws-locate", s.title = "Locate on canvas", s.innerHTML = "", s.addEventListener("click", (e) => {
e.stopPropagation(), this._locateNode();
- }), n.appendChild(c), t.appendChild(n);
- let l = document.createElement("div");
- if (l.className = "mjr-ws-node-body", Ae(e)) {
+ }), n.appendChild(s), t.appendChild(n);
+ let c = document.createElement("div");
+ if (c.className = "mjr-ws-node-body", Be(e)) {
let n = document.createElement("textarea");
- n.className = "mjr-ws-input mjr-ws-textarea mjr-ws-note-textarea", n.value = je(e), n.rows = 4;
+ n.className = "mjr-ws-input mjr-ws-textarea mjr-ws-note-textarea", n.value = Ve(e), n.rows = 4;
let r = () => {
n.style.height = "auto", n.style.height = n.scrollHeight + "px";
};
return n.addEventListener("input", () => {
- Me(e, n.value);
+ He(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 {
- let t = o(), n = t?.canvas ?? null;
- n?.setDirty?.(!0, !0), n?.draw?.(!0, !0);
- let r = e?.graph ?? null;
- r && r !== t?.graph && (r.setDirtyCanvas?.(!0, !0), r.change?.()), t?.graph?.change?.();
+ f(e);
} catch {}
- }), n._mjrAutoFit = r, this._noteTextarea = n, this._autoFits.push(r), l.appendChild(n), this._body = l, t.appendChild(l), this._el = t, this._applyExpandedState(), requestAnimationFrame(r), t;
+ }), n._mjrAutoFit = r, this._noteTextarea = n, this._autoFits.push(r), c.appendChild(n), this._body = c, t.appendChild(c), this._el = t, this._applyExpandedState(), requestAnimationFrame(r), t;
}
- let u = e.widgets ?? [], d = !1;
- for (let t of u) {
+ let l = e.widgets ?? [], u = !1;
+ for (let t of l) {
let n = String(t.type || "").toLowerCase();
- if (Oe.has(n) || t.hidden || t.options?.hidden) continue;
- d = !0;
+ if (Re.has(n) || t.hidden || t.options?.hidden) continue;
+ u = !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";
let a = document.createElement("label");
a.className = "mjr-ws-widget-label", a.textContent = t.name || "";
let o = document.createElement("div");
o.className = "mjr-ws-widget-input";
- let s = O(t, () => {}, e);
+ let s = re(t, () => {}, e);
o.appendChild(s), this._inputMap.set(t.name, s);
- let c = s._mjrAutoFit ?? s.querySelector?.("textarea")?._mjrAutoFit;
- c && this._autoFits.push(c), i.appendChild(a), i.appendChild(o), l.appendChild(i);
+ let l = s._mjrAutoFit ?? s.querySelector?.("textarea")?._mjrAutoFit;
+ l && this._autoFits.push(l), i.appendChild(a), i.appendChild(o), c.appendChild(i);
}
- if (!d) {
+ if (!u) {
let e = document.createElement("div");
- e.className = "mjr-ws-node-empty", e.textContent = "No editable parameters", l.appendChild(e);
+ e.className = "mjr-ws-node-empty", e.textContent = "No editable parameters", c.appendChild(e);
}
- return this._body = l, t.appendChild(l), this._el = t, this._applyExpandedState(), t;
+ return this._body = c, t.appendChild(c), this._el = t, this._applyExpandedState(), t;
}
_applyExpandedState() {
if (!(!this._el || !this._body)) {
@@ -568,24 +565,21 @@ var Be = class {
}
let e = this._node;
if (e) try {
- let t = o()?.canvas;
- if (!t) return;
- if (typeof t.centerOnNode == "function") t.centerOnNode(e);
- else if (t.ds && e.pos) {
- let n = t.canvas?.width || t.element?.width || 800, r = t.canvas?.height || t.element?.height || 600;
- t.ds.offset[0] = -e.pos[0] - (e.size?.[0] || 0) / 2 + n / 2, t.ds.offset[1] = -e.pos[1] - (e.size?.[1] || 0) / 2 + r / 2, t.setDirty?.(!0, !0);
- }
+ l(e, {
+ select: !1,
+ focusCanvas: !1
+ });
} catch (e) {
console.debug?.("[MFV sidebar] locateNode error", e);
}
}
};
-function Ve(e) {
+function Ze(e) {
return e ? e.classList?.contains?.("mjr-ws-text-wrapper") ? e.querySelector?.("textarea") ?? e : e : null;
}
//#endregion
//#region ui/features/viewer/workflowSidebar/WorkflowNodesTab.ts
-var He = () => o(), Ue = class {
+var Qe = class {
_searchQuery;
_expandedNodeIds;
_expandedChildrenIds;
@@ -627,7 +621,7 @@ var He = () => o(), Ue = 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 = Ze()[0] || "", t = null;
+ let e = ot()[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);
@@ -652,7 +646,7 @@ var He = () => o(), Ue = class {
}
}
_maybeRebuildList() {
- let e = Ke(We()), t = (this._searchQuery || "").toLowerCase().trim(), n = t ? qe(e, t) : e, r = Je(n);
+ let e = tt($e()), t = (this._searchQuery || "").toLowerCase().trim(), n = t ? nt(e, t) : e, r = rt(n);
if (r === this._lastNodeSig) {
this._syncCanvasSelection();
return;
@@ -670,13 +664,13 @@ var He = () => o(), Ue = 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 Be(i, {
+ let c = new Xe(i, {
collapsible: !0,
expanded: this._expandedNodeIds.has(e),
depth: n,
isSubgraph: o > 0,
childCount: o,
- onLocate: () => Xe(i),
+ onLocate: () => at(i),
onToggle: (t) => {
if (t) {
this._expandedNodeIds = new Set([e]);
@@ -686,7 +680,7 @@ var He = () => o(), Ue = 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"), Ye(r, o, t);
+ r.type = "button", r.className = "mjr-ws-children-toggle", n > 0 && r.classList.add("mjr-ws-children-toggle--nested"), it(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);
@@ -698,7 +692,7 @@ var He = () => o(), Ue = 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)), Ye(e._mjrChildrenToggle, Number(e._mjrChildCount) || 0, t);
+ e._mjrChildrenEl.hidden = !t, n && (t ? this._expandedChildrenIds.add(n) : this._expandedChildrenIds.delete(n)), it(e._mjrChildrenToggle, Number(e._mjrChildCount) || 0, t);
}
_openTreeBranch(e) {
let t = e || null;
@@ -709,23 +703,23 @@ var He = () => o(), Ue = class {
this._setTreeItemChildrenOpen(e, !0);
}
};
-function We() {
+function $e() {
try {
- return y(He());
+ return y();
} catch {
return null;
}
}
-function Ge(e) {
+function et(e) {
return x(e);
}
-function Ke(e, t = /* @__PURE__ */ new Set()) {
+function tt(e, t = /* @__PURE__ */ new Set()) {
if (!e || t.has(e)) return [];
t.add(e);
let n = b(e), r = [];
for (let e of n) {
if (!e) continue;
- let n = Ge(e).flatMap((e) => Ke(e, t));
+ let n = et(e).flatMap((e) => tt(e, t));
r.push({
node: e,
children: n
@@ -733,10 +727,10 @@ function Ke(e, t = /* @__PURE__ */ new Set()) {
}
return r;
}
-function qe(e, t) {
+function nt(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 = qe(i, t);
+ let e = (r.type || "").toLowerCase().includes(t) || (r.title || "").toLowerCase().includes(t), a = nt(i, t);
(e || a.length > 0) && n.push({
node: r,
children: a
@@ -744,14 +738,14 @@ function qe(e, t) {
}
return n;
}
-function Je(e) {
+function rt(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 Ye(e, t, n) {
+function it(e, t, n) {
let r = n ? "pi-chevron-down" : "pi-chevron-right";
e.textContent = "";
let i = document.createElement("i");
@@ -759,27 +753,16 @@ function Ye(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 Xe(e) {
+function at(e) {
try {
- let t = He()?.canvas;
- if (!t) return;
- if (t.selectNode?.(e, !1), typeof t.centerOnNode == "function") t.centerOnNode(e);
- else if (e.pos && t.ds) {
- let n = t.canvas, r = n?.width ?? 800, i = n?.height ?? 600, a = t.ds.scale ?? 1;
- t.ds.offset = [-e.pos[0] + r / (2 * a) - (e.size?.[0] ?? 100) / 2, -e.pos[1] + i / (2 * a) - (e.size?.[1] ?? 80) / 2], t.setDirty?.(!0, !0);
- }
- t.canvas?.focus?.();
+ l(e);
} catch (e) {
console.debug?.("[MFV] _focusNode", e);
}
}
-function Ze() {
+function ot() {
try {
- let e = He(), t = e?.canvas?.selected_nodes ?? e?.canvas?.selectedNodes ?? null;
- if (!t) return [];
- if (Array.isArray(t)) return t.map((e) => String(e?.id ?? "")).filter(Boolean);
- if (t instanceof Map) return Array.from(t.values()).map((e) => String(e?.id ?? "")).filter(Boolean);
- if (typeof t == "object") return Object.values(t).map((e) => String(e?.id ?? "")).filter(Boolean);
+ return i();
} catch (e) {
console.debug?.("[MFV] _getSelectedNodeIds", e);
}
@@ -787,90 +770,105 @@ function Ze() {
}
//#endregion
//#region ui/features/viewer/workflowGraphMap/workflowGraphMapData.ts
-var Qe = /* @__PURE__ */ new Map(), $e = null;
-async function et(e) {
- let t = Array.from(new Set(nt(e).map((e) => K(e)).filter(Boolean)));
- if (t.length && t.filter((e) => !Qe.has(e)).length) try {
- $e ||= 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)) Qe.set(String(t), n);
+var st = /* @__PURE__ */ new Map(), ct = null;
+async function lt(e) {
+ let t = Array.from(new Set(dt(e).map((e) => G(e)).filter(Boolean)));
+ if (t.length && t.filter((e) => !st.has(e)).length) try {
+ ct ||= u("/object_info").then((e) => e?.ok ? e.json() : null).then((e) => {
+ if (e && typeof e == "object") for (let [t, n] of Object.entries(e)) st.set(String(t), n);
return e;
- }).catch(() => null), await $e;
+ }).catch(() => null), await ct;
} catch {}
}
-function tt(e) {
- let t = bt(e);
+function ut(e) {
+ let t = Mt(e);
for (let e of t) {
- let t = St(xt(e));
- if (t) return wt(t), t;
+ let t = Pt(Nt(e));
+ if (t) return It(t), t;
}
return null;
}
-function nt(e) {
- let t = Array.isArray(e?.nodes) ? e.nodes.filter(Boolean) : [], n = [...t], r = J(e);
- for (let i of t) {
- let t = Nt(e, i, r);
- t && n.push(...nt(t));
+function dt(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 = q(e);
+ for (let n of r) {
+ let r = Gt(e, n, a);
+ r && i.push(...dt(r, t));
}
- return n;
+ return i;
}
-function rt(e, t) {
- let n = String(t ?? "");
- if (!n) return null;
- if (n.includes("::")) {
- let [t, ...r] = n.split("::"), i = r.join("::"), a = rt(e, t), o = a ? Nt(e, a, J(e)) : null;
- return o ? rt(o, i) : null;
- }
- let r = (Array.isArray(e?.nodes) ? e.nodes : []).find((e) => String(e?.id ?? e?.ID ?? "") === n) || null;
- if (r) return r;
+function ft(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 Kt(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 r = Nt(e, t, J(e)), i = r ? rt(r, n) : null;
- if (i) return i;
+ let n = Gt(e, t, q(e)), r = n ? ft(n, i) : null;
+ if (r) return r;
}
return null;
}
-function it(e) {
- return f(e);
+function pt(e) {
+ return E(e);
}
-function K(e) {
- return u(e);
+function G(e) {
+ return C(e);
}
-function at(e) {
- return m(e);
+function mt(e) {
+ return O(e);
}
-function ot(e) {
- let t = st(e), n = e?.properties && typeof e.properties == "object" ? e.properties : null;
+function ht(e) {
+ let t = gt(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)) dt(e) || r == null || typeof r == "object" || t.push([e, r]);
+ if (n) for (let [e, r] of Object.entries(n)) Ct(e) || r == null || typeof r == "object" || t.push([e, r]);
return t.slice(0, 160);
}
-function st(e) {
+function gt(e) {
let t = [], n = e?.inputs && typeof e.inputs == "object" ? e.inputs : null;
- if (n && !Array.isArray(n)) for (let [e, r] of Object.entries(n)) ut(r) || t.push([e, r]);
- for (let { label: n, value: r } of ct(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)) St(r) || t.push([e, r]);
+ for (let { label: n, value: r } of _t(e)) t.some(([e]) => String(e) === String(n)) || t.push([n, r]);
return t;
}
-function ct(e) {
+function _t(e) {
let t = e?.widgets_values;
- if (t && typeof t == "object" && !Array.isArray(t)) return Object.entries(t).map(([e, t], n) => ({
+ if (vt(t)) return Object.entries(t).map(([e, t], n) => ({
label: e,
value: t,
index: n
}));
- let n = Array.isArray(t) ? t : [], r = Array.isArray(e?.widgets) ? e.widgets : [], i = mt(ft(e)), a = lt(e);
+ let n = yt(t), r = Array.isArray(e?.widgets) ? e.widgets : [], i = Et(wt(e)), a = xt(e);
return n.map((t, n) => {
- let o = yt(e, n, t);
+ let o = jt(e, n, t);
return {
- label: r[n]?.name || r[n]?.label || i[n] || a[n] || o || `param ${n + 1}`,
+ label: i[n] || a[n] || r[n]?.name || r[n]?.label || o || `param ${n + 1}`,
value: t,
index: n
};
});
}
-function lt(e) {
- let t = Array.isArray(e?.inputs) ? e.inputs : [], n = t.filter(ht), r = t.filter((e) => !gt(e) && vt(e?.type)), i = [], a = /* @__PURE__ */ new Set(), o = (e) => {
+function vt(e) {
+ return !!(e && typeof e == "object" && !Array.isArray(e) && !bt(e));
+}
+function yt(e) {
+ if (Array.isArray(e)) return e;
+ if (!bt(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 bt(e) {
+ if (!e || typeof e != "object" || Array.isArray(e)) return !1;
+ let t = Number(e.length);
+ return !(!Number.isFinite(t) || t < 0);
+}
+function xt(e) {
+ let t = Array.isArray(e?.inputs) ? e.inputs : [], n = t.filter(Dt), r = t.filter((e) => !Ot(e) && At(e?.type)), i = [], a = /* @__PURE__ */ new Set(), o = (e) => {
let t = `${String(e?.name || "")}\u0000${String(e?.label || "")}\u0000${String(e?.link ?? "")}`;
a.has(t) || (a.add(t), i.push(e));
};
@@ -878,50 +876,50 @@ function lt(e) {
for (let e of r) o(e);
return i.map((e) => String(e?.label || e?.localized_name || e?.name || e?.widget?.name || e?.widget?.label || "").trim());
}
-function ut(e) {
+function St(e) {
return Array.isArray(e) && e.length === 2 && String(e[0] ?? "").trim() !== "" && Number.isFinite(Number(e[1]));
}
-function dt(e) {
- let t = q(String(e ?? "").trim());
+function Ct(e) {
+ let t = K(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_") : !0;
}
-function ft(e) {
- let t = K(e);
- return t && Qe.get(t) || null;
+function wt(e) {
+ let t = G(e);
+ return t && st.get(t) || null;
}
-function pt(e) {
+function Tt(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 mt(e) {
+function Et(e) {
let t = e?.input;
- if (!t || typeof t != "object") return pt(e);
+ if (!t || typeof t != "object") return Tt(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)) _t(t) && n.push(e);
+ if (!(!r || typeof r != "object")) for (let [e, t] of Object.entries(r)) kt(t) && n.push(e);
}
- return n.length ? n : pt(e);
+ return n.length ? n : Tt(e);
}
-function ht(e) {
+function Dt(e) {
return !e || typeof e != "object" ? !1 : !!(e.widget === !0 || e.widget && typeof e.widget == "object" || typeof e.widget == "string" && e.widget.trim());
}
-function gt(e) {
+function Ot(e) {
return !e || typeof e != "object" ? !1 : !!(e.link != null || Array.isArray(e.links) && e.links.length);
}
-function _t(e) {
+function kt(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 : vt(n);
+ return r?.forceInput === !0 || r?.rawLink === !0 ? !1 : r?.widgetType && String(r.widgetType).trim() ? !0 : At(n);
}
-function vt(e) {
+function At(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 yt(e, t, n) {
- let r = K(e), i = it(e), a = `${r} ${i}`.toLowerCase(), o = String(n ?? "").toLowerCase();
+function jt(e, t, n) {
+ let r = G(e), i = pt(e), a = `${r} ${i}`.toLowerCase(), o = String(n ?? "").toLowerCase();
if (a.includes("ksamplerselect")) return "sampler_name";
if (a.includes("manualsigmas")) return "sigmas";
if (a.includes("randomnoise")) return t === 0 ? "noise_seed" : t === 1 ? "control_after_generate" : null;
@@ -940,8 +938,8 @@ function yt(e, t, n) {
if (t === 2) return "device";
}
if (/primitive(?:int|float|string|boolean)|constant/.test(a) && t === 0) {
- let e = q(i);
- return e && e !== q(r) ? e : "value";
+ let e = K(i);
+ return e && e !== K(r) ? e : "value";
}
if (a.includes("cliptext") || a.includes("prompt")) return t === 0 ? "text" : null;
if (o.includes(".safetensors") || o.includes(".ckpt")) return "model";
@@ -953,8 +951,8 @@ function yt(e, t, n) {
}
return null;
}
-function bt(e) {
- let t = xt(e?.metadata_raw), n = xt(e?.metadata);
+function Mt(e) {
+ let t = Nt(e?.metadata_raw), n = Nt(e?.metadata);
return [
e?.workflow,
e?.Workflow,
@@ -995,7 +993,7 @@ function bt(e) {
n?.Prompt
].filter((e) => e != null);
}
-function xt(e) {
+function Nt(e) {
if (!e) return null;
if (typeof e == "object") return e;
if (typeof e != "string") return null;
@@ -1007,16 +1005,16 @@ function xt(e) {
return null;
}
}
-function St(e) {
+function Pt(e) {
if (!e || typeof e != "object") return null;
if (Array.isArray(e.nodes)) return e;
- let t = Ct(e);
+ let t = Ft(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 k(e.prompt);
+ let n = k(e);
return n && Array.isArray(n.nodes) ? n : null;
}
-function Ct(e) {
+function Ft(e) {
for (let t of [
"workflow",
"Workflow",
@@ -1032,38 +1030,38 @@ function Ct(e) {
}
return null;
}
-function wt(e, t = /* @__PURE__ */ new WeakSet()) {
+function It(e, t = /* @__PURE__ */ new WeakSet()) {
if (!e || typeof e != "object" || t.has(e)) return;
t.add(e);
- let n = J(e);
+ let n = q(e);
for (let r of Array.isArray(e?.nodes) ? e.nodes : []) {
- Tt(r, n);
- let i = Nt(e, r, n);
- i && (Et(r, i), wt(i, t));
+ Lt(r, n);
+ let i = Gt(e, r, n);
+ i && (Rt(r, i), It(i, t));
}
}
-function Tt(e, t) {
+function Lt(e, t) {
if (!e || typeof e != "object") return;
- let n = Mt(e).find((e) => t.has(String(e)));
+ let n = Wt(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 Et(e, t) {
+function Rt(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 = Dt(e), a = Ot(t), o = [];
+ let r = new Map(t.nodes.filter(Boolean).map((e) => [String(e?.id ?? e?.ID ?? ""), e])), i = zt(e), a = Bt(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 = ot(l);
+ let u = ht(l);
if (!u.length) continue;
- let d = u.find(([e]) => q(e) === q(c)) || u.find(([e]) => q(e) === "value") || (u.length === 1 ? u[0] : null);
+ let d = u.find(([e]) => K(e) === K(c)) || u.find(([e]) => K(e) === "value") || (u.length === 1 ? u[0] : null);
if (!d) continue;
- let f = `${String(s)}:${kt(t, c, d[0])}`, p = a.get(f) || a.get(String(s)) || At(l, d[0], c);
- i.size && !i.has(q(p)) || o.push({
+ let f = `${String(s)}:${Vt(t, c, d[0])}`, p = a.get(f) || a.get(String(s)) || Ht(l, d[0], c);
+ i.size && !i.has(K(p)) || o.push({
label: p,
value: d[1],
innerNodeId: s,
@@ -1072,49 +1070,49 @@ function Et(e, t) {
}
o.length && (e._mjrSubgraphProxyParams = o);
}
-function Dt(e) {
+function zt(e) {
let t = Array.isArray(e?.inputs) ? e.inputs : [], n = /* @__PURE__ */ new Set();
for (let e of t) {
- if (!ht(e)) continue;
+ if (!Dt(e)) continue;
let t = String(e?.label || e?.localized_name || e?.name || "").trim();
- t && n.add(q(t));
+ t && n.add(K(t));
}
return n;
}
-function Ot(e) {
+function Bt(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 || q(c) !== "value" && (r.set(String(a), c), Number.isFinite(o) && r.set(`${String(a)}:${o}`, c));
+ !c || a == null || K(c) !== "value" && (r.set(String(a), c), Number.isFinite(o) && r.set(`${String(a)}:${o}`, c));
}
return r;
}
-function kt(e, t, n) {
+function Vt(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 At(e, t, n) {
- let r = String(it(e) || "").trim(), i = String(t || n || "").trim();
- return r && i && q(i) !== "value" ? `${r} ${i}` : r || i || "param";
+function Ht(e, t, n) {
+ let r = String(pt(e) || "").trim(), i = String(t || n || "").trim();
+ return r && i && K(i) !== "value" ? `${r} ${i}` : r || i || "param";
}
-function q(e) {
+function K(e) {
return String(e ?? "").trim().toLowerCase().replace(/\s+/g, "_");
}
-function J(e) {
+function q(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 jt(e)) t != null && n.set(String(t), e);
+ for (let e of t) for (let t of Ut(e)) t != null && n.set(String(t), e);
return n;
}
-function jt(e) {
+function Ut(e) {
let t = e?.properties && typeof e.properties == "object" ? e.properties : {};
return [
e?.id,
@@ -1128,7 +1126,7 @@ function jt(e) {
t.subgraphId
].filter((e) => e != null && String(e).trim());
}
-function Mt(e) {
+function Wt(e) {
let t = e?.properties && typeof e.properties == "object" ? e.properties : {};
return [
e?.type,
@@ -1140,7 +1138,7 @@ function Mt(e) {
t.subgraph_name
].filter((e) => e != null && String(e).trim());
}
-function Nt(e, t, n = J(e)) {
+function Gt(e, t, n = q(e)) {
let r = [
t?.subgraph,
t?._subgraph,
@@ -1151,20 +1149,32 @@ function Nt(e, t, n = J(e)) {
t?.subgraph_instance?.graph,
t?.inner_graph,
t?.subgraph_graph,
- ...Mt(t).map((e) => n.get(String(e)))
+ ...Wt(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 Kt(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 = Gt(n, r, q(n));
+ if (!a) return null;
+ n = a;
+ }
+ return r;
+}
//#endregion
//#region ui/features/viewer/workflowGraphMap/workflowGraphMapActions.ts
-async function Pt(e) {
- return e ? E(JSON.stringify(e, null, 2)) : !1;
+async function qt(e) {
+ return e ? te(JSON.stringify(e, null, 2)) : !1;
}
-async function Ft(e) {
- return E(It(e));
+async function Jt(e) {
+ return te(Yt(e));
}
-function It(e) {
+function Yt(e) {
if (e == null) return "";
if (typeof e == "string") return e;
if (typeof e == "number" || typeof e == "boolean") return String(e);
@@ -1174,85 +1184,83 @@ function It(e) {
return String(e);
}
}
-function Lt(e) {
- let t = o();
- return !e || typeof e != "object" ? !1 : typeof t?.loadGraphData == "function" ? (t.loadGraphData(e), !0) : typeof t?.canvas?.graph?.configure == "function" ? (t.canvas.graph.configure(e), t.canvas.graph.setDirtyCanvas?.(!0, !0), !0) : typeof t?.graph?.configure == "function" ? (t.graph.configure(e), t.graph.setDirtyCanvas?.(!0, !0), !0) : !1;
+function Xt(e) {
+ return r(e);
}
-function Rt(e) {
- let t = o(), n = t?.graph ?? t?.canvas?.graph ?? null;
- if (!e || !n || typeof n.add != "function") return !1;
- let r = String(e?.type || e?.class_type || e?.comfyClass || "").trim(), i = globalThis, a = i?.LiteGraph || i?.window?.LiteGraph || null, s = null;
+function Zt(e) {
+ let t = s();
+ if (!e || !t || typeof t.add != "function") return !1;
+ let n = String(e?.type || e?.class_type || e?.comfyClass || "").trim(), r = globalThis, i = r?.LiteGraph || r?.window?.LiteGraph || null, a = null;
try {
- a && typeof a.createNode == "function" && r && (s = a.createNode(r));
+ i && typeof i.createNode == "function" && n && (a = i.createNode(n));
} catch (e) {
console.debug?.("[MFV Graph Map] createNode failed", e);
}
- if (!s) return !1;
+ if (!a) return !1;
try {
- let r = typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e));
- return delete r.id, Array.isArray(r.pos) && (r.pos = [Number(r.pos[0] || 0) + 32, Number(r.pos[1] || 0) + 32]), typeof s.configure == "function" ? s.configure(r) : Object.assign(s, r), n.add(s), n.setDirtyCanvas?.(!0, !0), t?.canvas?.setDirty?.(!0, !0), !0;
+ let t = typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e));
+ return delete t.id, Array.isArray(t.pos) && (t.pos = [Number(t.pos[0] || 0) + 32, Number(t.pos[1] || 0) + 32]), typeof a.configure == "function" ? a.configure(t) : Object.assign(a, t), h(a);
} catch (e) {
return console.debug?.("[MFV Graph Map] import node failed", e), !1;
}
}
-function zt(e) {
- let t = o(), n = Bt(t);
- if (!e || !n) return {
+function Qt(e) {
+ let t = $t();
+ if (!e || !t) return {
ok: !1,
count: 0,
reason: "no-target"
};
- let r = ct(e), i = Array.isArray(n.widgets) ? n.widgets : [];
- if (!r.length || !i.length) return {
+ let n = _t(e), r = Array.isArray(t.widgets) ? t.widgets : [];
+ if (!n.length || !r.length) return {
ok: !1,
count: 0,
reason: "no-widgets"
};
- let a = /* @__PURE__ */ new Map();
- i.forEach((e, t) => {
- for (let n of Vt(e)) a.has(n) || a.set(n, {
+ let i = /* @__PURE__ */ new Map();
+ r.forEach((e, t) => {
+ for (let n of en(e)) i.has(n) || i.set(n, {
widget: e,
index: t
});
});
- let s = Ut(K(e)), c = Ut(n?.type || n?.comfyClass || n?.class_type), l = !!(s && c && s === c), u = /* @__PURE__ */ new Set(), d = 0;
- for (let e of r) {
- let t = Ht(e.label), r = t ? a.get(t) : null;
- if ((!r || u.has(r.index)) && l) {
- let t = i[e.index];
- t && (r = {
+ let o = nn(G(e)), s = nn(t?.type || t?.comfyClass || t?.class_type), c = !!(o && s && o === s), l = /* @__PURE__ */ new Set(), u = 0;
+ for (let e of n) {
+ let n = tn(e.label), a = n ? i.get(n) : null;
+ if ((!a || l.has(a.index)) && c) {
+ let t = r[e.index];
+ t && (a = {
widget: t,
index: e.index
});
}
- !r || u.has(r.index) || k(r.widget, Wt(e.value), n) && (u.add(r.index), d += 1);
+ !a || l.has(a.index) || ie(a.widget, rn(e.value), t) && (l.add(a.index), u += 1);
}
- return t?.canvas?.setDirty?.(!0, !0), t?.canvas?.draw?.(!0, !0), t?.graph?.setDirtyCanvas?.(!0, !0), t?.graph?.change?.(), {
- ok: d > 0,
- count: d,
- reason: d > 0 ? "ok" : "no-match",
- targetNode: n
+ return a(), {
+ ok: u > 0,
+ count: u,
+ reason: u > 0 ? "ok" : "no-match",
+ targetNode: t
};
}
-function Bt(e = o()) {
- let t = e?.canvas?.selected_nodes ?? e?.canvas?.selectedNodes ?? null;
- return t ? Array.isArray(t) ? t.filter(Boolean)[0] || null : t instanceof Map ? Array.from(t.values()).filter(Boolean)[0] || null : typeof t == "object" && Object.values(t).filter(Boolean)[0] || null : null;
+function $t() {
+ return v() || null;
}
-function Vt(e) {
+function en(e) {
return [
e?.name,
e?.label,
e?.options?.name,
e?.options?.label
- ].map(Ht).filter(Boolean);
+ ].map(tn).filter(Boolean);
}
-function Ht(e) {
+function tn(e) {
return String(e ?? "").trim().toLowerCase().replace(/\s+/g, "_");
}
-function Ut(e) {
+function nn(e) {
return String(e ?? "").trim().toLowerCase();
}
-function Wt(e) {
+function rn(e) {
if (typeof e != "object" || !e) return e;
try {
return typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e));
@@ -1262,23 +1270,23 @@ function Wt(e) {
}
//#endregion
//#region ui/features/viewer/workflowGraphMap/WorkflowGraphMapPanel.ts
-var Gt = class {
+var an = 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,
centerX: null,
centerY: null
- }, this._drag = null, this._previewMedia = null, this._previewKey = "", this._el = this._build();
+ }, this._drag = null, this._previewMedia = null, this._previewKey = "", this._subgraphDisplayMode = "expand", this._modeButtons = /* @__PURE__ */ new Map(), this._el = this._build();
}
get el() {
return this._el;
}
setAsset(e) {
- this._asset !== e && (this._asset = e || null, this._workflow = tt(this._asset), this._selectedNodeId = "", this._view = {
+ this._asset !== e && (this._asset = e || null, this._workflow = ut(this._asset), this._selectedNodeId = "", this._view = {
zoom: 1,
centerX: null,
centerY: null
- }, this.refresh(), et(this._workflow).then(() => this.refresh()).catch(() => {}));
+ }, this.refresh(), lt(this._workflow).then(() => this.refresh()).catch(() => {}));
}
refresh() {
this._ensureResizeObserver(), this._el?.isConnected && (this._renderCanvas(), this._renderDetails());
@@ -1290,12 +1298,12 @@ var Gt = class {
let e = document.createElement("div");
e.className = "mjr-wgm", this._large && (e.className += " mjr-wgm--large");
let t = document.createElement("div");
- return t.className = "mjr-wgm-map-wrap", this._mapWrap = t, this._large ? (this._canvas = document.createElement("canvas"), this._canvas.className = "mjr-wgm-canvas", this._canvas.addEventListener?.("click", (e) => this._handleCanvasClick(e)), this._canvas.addEventListener?.("wheel", (e) => this._handleWheel(e), { passive: !1 }), this._canvas.addEventListener?.("dblclick", (e) => this._handleCanvasDblClick(e)), this._canvas.addEventListener?.("pointerdown", (e) => this._handlePointerDown(e)), t.appendChild(this._canvas)) : (this._preview = document.createElement("div"), this._preview.className = "mjr-wgm-preview", t.appendChild(this._preview)), e.appendChild(t), this._status = document.createElement("div"), this._status.className = "mjr-wgm-status", e.appendChild(this._status), this._details = document.createElement("div"), this._details.className = "mjr-wgm-details", e.appendChild(this._details), this._ensureResizeObserver(), e;
+ return t.className = "mjr-wgm-map-wrap", this._mapWrap = t, this._large ? (this._canvas = document.createElement("canvas"), this._canvas.className = "mjr-wgm-canvas", this._canvas.addEventListener?.("click", (e) => this._handleCanvasClick(e)), this._canvas.addEventListener?.("wheel", (e) => this._handleWheel(e), { passive: !1 }), this._canvas.addEventListener?.("dblclick", (e) => this._handleCanvasDblClick(e)), this._canvas.addEventListener?.("pointerdown", (e) => this._handlePointerDown(e)), t.appendChild(this._canvas)) : (this._preview = document.createElement("div"), this._preview.className = "mjr-wgm-preview", t.appendChild(this._preview)), e.appendChild(t), this._status = document.createElement("div"), this._status.className = "mjr-wgm-status", e.appendChild(this._status), this._large && (this._toolbar = document.createElement("div"), this._toolbar.className = "mjr-wgm-toolbar", this._toolbar.appendChild(this._makeModeButton("Expand subgraphs", "expand")), this._toolbar.appendChild(this._makeModeButton("Host nodes only", "host")), e.appendChild(this._toolbar), this._syncModeButtons()), this._details = document.createElement("div"), this._details.className = "mjr-wgm-details", e.appendChild(this._details), this._ensureResizeObserver(), e;
}
_ensureResizeObserver() {
let e = this._mapWrap;
if (!e) return;
- let t = Y(e), n = t?.ResizeObserver || globalThis.ResizeObserver;
+ let t = J(e), n = t?.ResizeObserver || globalThis.ResizeObserver;
if (typeof n == "function" && !(this._resizeObserver && this._resizeObservedTarget === e && this._resizeObserverWindow === t)) {
try {
this._resizeObserver?.disconnect?.();
@@ -1316,16 +1324,17 @@ var Gt = class {
}
let e = this._canvas;
if (!e) return;
- 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 = Y(e), a = Math.max(1, Math.min(2, Number(i?.devicePixelRatio) || 1)), o = Math.floor(n * a), s = Math.floor(r * a);
+ 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 = J(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");
if (c && c.setTransform(a, 0, 0, a, 0, 0), !this._workflow) {
c?.clearRect?.(0, 0, n, r), this._renderInfo = null;
return;
}
- this._renderInfo = p(e, this._workflow, {
+ this._renderInfo = D(e, this._workflow, {
showNodeLabels: !0,
showViewport: !1,
+ expandSubgraphs: this._subgraphDisplayMode !== "host",
view: {
hoveredNodeId: this._selectedNodeId || null,
zoom: this._view.zoom,
@@ -1335,48 +1344,114 @@ var Gt = 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);
}
_renderDetails() {
- let e = nt(this._workflow).length;
+ let e = this._subgraphDisplayMode !== "host", t = dt(this._workflow, { includeSubgraphs: e }).length;
if (!this._workflow) {
- this._status.textContent = this._large ? "No workflow graph in selected image" : "Selected asset - no workflow graph", X(this._details);
+ this._status.textContent = this._large ? "No workflow graph in selected image" : "Selected asset - no workflow graph", Y(this._details);
return;
}
- this._status.textContent = this._large ? this._selectedNodeId ? `${e} nodes - selected #${this._selectedNodeId}` : `${e} nodes - select a node` : `${e} nodes - graph opened in viewer`;
- let t = rt(this._workflow, this._selectedNodeId);
- if (!t) {
+ 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 = ft(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", X(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", Y(this._details, e);
return;
}
- let n = document.createElement("div");
- n.className = "mjr-wgm-node-title", n.textContent = it(t);
let r = document.createElement("div");
- r.className = "mjr-wgm-node-meta", r.textContent = `#${this._selectedNodeId} ${at(t) || K(t) || "Node"}`;
+ r.className = "mjr-wgm-node-title", r.textContent = pt(n);
let i = document.createElement("div");
- i.className = "mjr-wgm-actions", i.appendChild(this._makeAction("Copy node", "pi pi-copy", () => Pt(t))), i.appendChild(this._makeAction("Import node", "pi pi-plus-circle", () => Rt(t))), i.appendChild(this._makeAction("Import workflow", "pi pi-download", () => Lt(this._workflow))), i.appendChild(this._makeAction("Transfer params to selected canvas node", "pi pi-arrow-right-arrow-left", () => zt(t)?.ok));
+ i.className = "mjr-wgm-node-meta", i.textContent = `#${this._selectedNodeId} ${mt(n) || G(n) || "Node"}`;
let a = document.createElement("div");
- a.className = "mjr-wgm-params";
- for (let [e, n] of ot(t)) {
- let t = document.createElement("div");
- t.className = "mjr-wgm-param", t.tabIndex = 0, t.role = "button", t.title = `Copy ${String(e)}`;
- let r = document.createElement("span");
- r.className = "mjr-wgm-param-key", r.textContent = String(e);
- let i = document.createElement("span");
- i.className = "mjr-wgm-param-value", i.textContent = Kt(n), t.appendChild(r), t.appendChild(i), t.addEventListener("click", () => this._copyParam(t, n)), t.addEventListener("keydown", (e) => {
- e.key !== "Enter" && e.key !== " " || (e.preventDefault?.(), this._copyParam(t, n));
- }), a.appendChild(t);
- }
- if (!a.childElementCount) {
+ a.className = "mjr-wgm-actions", a.appendChild(this._makeAction("Copy node", "pi pi-copy", () => qt(n))), a.appendChild(this._makeAction("Import node", "pi pi-plus-circle", () => Zt(n))), a.appendChild(this._makeAction("Import workflow", "pi pi-download", () => Xt(this._workflow))), a.appendChild(this._makeAction("Transfer params to selected canvas node", "pi pi-arrow-right-arrow-left", () => Qt(n)?.ok));
+ let o = this._buildNodeVisual(n);
+ Y(this._details, r, i, o, a);
+ }
+ _makeModeButton(e, t) {
+ let n = document.createElement("button");
+ return n.type = "button", n.className = "mjr-wgm-mode", n.textContent = String(e), n.addEventListener("click", () => this._setSubgraphDisplayMode(t)), this._modeButtons.set(t, n), n;
+ }
+ _setSubgraphDisplayMode(e) {
+ e !== "expand" && e !== "host" || this._subgraphDisplayMode !== e && (this._subgraphDisplayMode = e, e === "host" && String(this._selectedNodeId || "").includes("::") && (this._selectedNodeId = ""), this._syncModeButtons(), this.refresh());
+ }
+ _syncModeButtons() {
+ for (let [e, t] of this._modeButtons.entries()) t.classList.toggle("is-active", e === this._subgraphDisplayMode);
+ }
+ _buildNodeVisual(e) {
+ let t = document.createElement("section");
+ t.className = "mjr-wgm-node-visual", t.classList.add(`is-${mn(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 = mt(e) || G(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");
+ a.className = "mjr-wgm-node-ports";
+ let o = this._buildPortColumn("Inputs", e?.inputs, "in"), s = this._buildPortColumn("Outputs", e?.outputs, "out");
+ a.append(o, s);
+ let c = document.createElement("div");
+ 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 = pn(e);
+ if (u.length) {
+ for (let e of u.slice(0, 12)) {
+ let t = document.createElement("div");
+ t.className = "mjr-wgm-node-widget", t.tabIndex = 0, t.role = "button";
+ let n = String(e?.label || e?.key || "value");
+ t.title = `Copy ${n}`;
+ let r = document.createElement("span");
+ r.className = "mjr-wgm-node-widget-key", r.textContent = n;
+ let i = document.createElement("span");
+ i.className = "mjr-wgm-node-widget-value";
+ let a = sn(e?.value);
+ i.textContent = a, cn(e?.value, a) && t.classList.add("is-multiline"), ln(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);
+ }
+ if (u.length > 12) {
+ let e = document.createElement("div");
+ e.className = "mjr-wgm-node-widget-more", e.textContent = `+${u.length - 12} more values`, c.appendChild(e);
+ }
+ } else {
let e = document.createElement("div");
- e.className = "mjr-ws-node-empty", e.textContent = "No simple parameters found", a.appendChild(e);
+ e.className = "mjr-wgm-node-widget-empty", e.textContent = "No widget values", c.appendChild(e);
}
- X(this._details, n, r, i, a);
+ return t.append(n, a, c), t;
+ }
+ _buildPortColumn(e, t, n) {
+ let r = document.createElement("div");
+ r.className = "mjr-wgm-node-ports-col";
+ let i = document.createElement("div");
+ 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 = un(t).slice(0, 8);
+ if (o.length) for (let e of o) {
+ let t = document.createElement("div");
+ t.className = "mjr-wgm-node-port";
+ let r = document.createElement("span");
+ r.className = `mjr-wgm-node-port-dot is-${n}`;
+ let i = document.createElement("span");
+ i.className = "mjr-wgm-node-port-name";
+ let o = dn(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);
+ }
+ a.appendChild(t);
+ }
+ else {
+ let e = document.createElement("div");
+ e.className = "mjr-wgm-node-port-empty", e.textContent = "-", a.appendChild(e);
+ }
+ return r.appendChild(a), r;
}
_makeAction(e, t, n) {
let r = document.createElement("button");
return r.type = "button", r.className = "mjr-wgm-action", r.title = e, r.innerHTML = `${e}`, r.addEventListener("click", async () => {
try {
let e = await n();
- r.classList.toggle("is-ok", !!e), Y(r).setTimeout(() => r.classList.remove("is-ok"), 700);
+ r.classList.toggle("is-ok", !!e), J(r).setTimeout(() => r.classList.remove("is-ok"), 700);
} catch (e) {
console.debug?.("[MFV Graph Map] action failed", e);
}
@@ -1384,29 +1459,29 @@ var Gt = class {
}
async _copyParam(e, t) {
try {
- let n = await Ft(t);
- e.classList.toggle("is-ok", !!n), e.classList.toggle("is-error", !n), Y(e).setTimeout(() => {
+ let n = await Jt(t);
+ e.classList.toggle("is-ok", !!n), e.classList.toggle("is-error", !n), J(e).setTimeout(() => {
e.classList.remove("is-ok"), e.classList.remove("is-error");
}, 750);
} catch (t) {
- e.classList.add("is-error"), Y(e).setTimeout(() => e.classList.remove("is-error"), 750), console.debug?.("[MFV Graph Map] param copy failed", t);
+ e.classList.add("is-error"), J(e).setTimeout(() => e.classList.remove("is-error"), 750), console.debug?.("[MFV Graph Map] param copy failed", t);
}
}
_renderPreview() {
if (!this._preview) return;
- let e = qt(this._asset), t = Jt(e);
+ let e = hn(this._asset), t = gn(e);
if (this._previewMedia && t && t === this._previewKey) {
- (this._preview.firstChild !== this._previewMedia || this._preview.childNodes.length !== 1) && X(this._preview, this._previewMedia);
+ (this._preview.firstChild !== this._previewMedia || this._preview.childNodes.length !== 1) && Y(this._preview, this._previewMedia);
return;
}
this._disposePreviewMedia();
- let n = W(e, { fill: !0 });
+ let n = U(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", X(this._preview, r);
+ r.className = "mjr-wgm-preview-empty", r.textContent = "No preview", Y(this._preview, r);
}
_disposePreviewMedia() {
let e = this._previewMedia;
@@ -1477,24 +1552,24 @@ var Gt = class {
}, r = (e) => {
if (!this._drag || e.pointerId !== this._drag.pointerId) return;
this._canvas.releasePointerCapture?.(e.pointerId);
- let t = Y(this._canvas);
+ let t = J(this._canvas);
t.removeEventListener("pointermove", n), t.removeEventListener("pointerup", r), t.removeEventListener("pointercancel", r), t.setTimeout(() => {
this._drag = null;
}, 0);
- }, i = Y(this._canvas);
+ }, i = J(this._canvas);
i.addEventListener("pointermove", n), i.addEventListener("pointerup", r), i.addEventListener("pointercancel", r);
}
};
-function Y(e) {
+function J(e) {
return e?.ownerDocument?.defaultView || window;
}
-function X(e, ...t) {
+function Y(e, ...t) {
if (e) {
for (; e.firstChild;) e.removeChild(e.firstChild);
for (let n of t) e.appendChild(n);
}
}
-function Kt(e) {
+function on(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);
@@ -1504,7 +1579,52 @@ function Kt(e) {
return String(e);
}
}
-function qt(e) {
+function sn(e) {
+ return e == null ? "" : typeof e == "string" ? e.replace(/\r\n?/g, "\n").trim() : on(e);
+}
+function cn(e, t) {
+ if (typeof e != "string") return !1;
+ let n = String(t || "");
+ return n.includes("\n") || n.length > 120;
+}
+function ln(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 un(e) {
+ return Array.isArray(e) ? e.filter(Boolean).map((e) => ({
+ name: String(e?.name || e?.label || "").trim(),
+ type: String(e?.type || e?.slot_type || e?.data_type || "").trim()
+ })) : [];
+}
+function dn(e) {
+ let t = String(e?.name || e?.label || e?.type || "port").trim() || "port", n = String(e?.type || "").trim(), r = fn(t), i = fn(n);
+ return {
+ label: t,
+ type: i && i !== r ? n : ""
+ };
+}
+function fn(e) {
+ return String(e || "").toLowerCase().replace(/[^a-z0-9]/g, "");
+}
+function pn(e) {
+ let t = _t(e);
+ if (Array.isArray(t) && t.length) return t.map((e) => ({
+ label: e?.label,
+ key: e?.key,
+ value: e?.value
+ }));
+ let n = ht(e);
+ return (Array.isArray(n) ? n.map(([e, t]) => ({
+ label: e,
+ value: t
+ })) : []).slice(0, 160);
+}
+function mn(e) {
+ let t = `${String(G(e) || "").toLowerCase()} ${String(mt(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 hn(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 {
@@ -1516,7 +1636,7 @@ function qt(e) {
} : null
};
}
-function Jt(e) {
+function gn(e) {
return !e || typeof e != "object" ? "" : JSON.stringify({
url: String(e.url || ""),
filename: String(e.filename || e.name || ""),
@@ -1527,7 +1647,7 @@ function Jt(e) {
}
//#endregion
//#region ui/features/viewer/workflowSidebar/WorkflowSidebar.ts
-var Yt = 16, Xt = 250, Zt = class {
+var _n = 16, vn = 250, yn = class {
_hostEl;
_onClose;
_onOpenGraphMap;
@@ -1546,7 +1666,7 @@ var Yt = 16, Xt = 250, Zt = 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 Ue(), this._graphMapPanel = new Gt(), 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 Qe(), this._graphMapPanel = new an(), this._activeMode = "nodes", this._asset = null, this._body = null, this._nodesModeBtn = null, this._graphModeBtn = null, this._el = this._build();
}
get el() {
return this._el;
@@ -1555,7 +1675,7 @@ var Yt = 16, Xt = 250, Zt = class {
return this._visible;
}
show() {
- this._visible = !0, this._el.classList.add("open"), this.refresh(), this._lastLiveSyncAt = $t(this._el), this._startLiveSync();
+ this._visible = !0, this._el.classList.add("open"), this.refresh(), this._lastLiveSyncAt = xn(this._el), this._startLiveSync();
}
hide() {
this._visible = !1, this._el.classList.remove("open"), this._stopLiveSync();
@@ -1584,14 +1704,14 @@ var Yt = 16, Xt = 250, Zt = 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 = "Nodes", t.appendChild(n);
+ n.className = "mjr-ws-sidebar-title", n.textContent = p("workflowSidebar.nodes", "Nodes"), t.appendChild(n);
let r = document.createElement("button");
- r.type = "button", r.className = "mjr-icon-btn", r.title = "Close sidebar", r.innerHTML = "", r.addEventListener("click", () => {
+ r.type = "button", r.className = "mjr-icon-btn", r.title = p("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("Nodes", "pi pi-sliders-h", "nodes"), this._graphModeBtn = this._makeModeButton("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(p("workflowSidebar.nodes", "Nodes"), "pi pi-sliders-h", "nodes"), this._graphModeBtn = this._makeModeButton(p("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;
}
@@ -1614,20 +1734,20 @@ var Yt = 16, Xt = 250, Zt = class {
}
_startLiveSync() {
if (this._liveSyncHandle != null) return;
- let e = Qt(this._el), t = (e) => {
+ let e = bn(this._el), t = (e) => {
if (this._liveSyncHandle = null, this._liveSyncMode = "", !this._visible) return;
- let t = Number.isFinite(Number(e)) ? Number(e) : $t(this._el);
- t - this._lastLiveSyncAt >= Xt && (this._lastLiveSyncAt = t, this.syncFromGraph()), this._startLiveSync();
+ let t = Number.isFinite(Number(e)) ? Number(e) : xn(this._el);
+ t - this._lastLiveSyncAt >= vn && (this._lastLiveSyncAt = t, this.syncFromGraph()), this._startLiveSync();
};
if (typeof e.requestAnimationFrame == "function") {
this._liveSyncMode = "raf", this._liveSyncHandle = e.requestAnimationFrame(t);
return;
}
- this._liveSyncMode = "timeout", this._liveSyncHandle = e.setTimeout(t, Yt);
+ this._liveSyncMode = "timeout", this._liveSyncHandle = e.setTimeout(t, _n);
}
_stopLiveSync() {
if (this._liveSyncHandle == null) return;
- let e = Qt(this._el);
+ let e = bn(this._el);
try {
this._liveSyncMode === "raf" && typeof e.cancelAnimationFrame == "function" ? e.cancelAnimationFrame(this._liveSyncHandle) : typeof e.clearTimeout == "function" && e.clearTimeout(this._liveSyncHandle);
} catch (e) {
@@ -1663,11 +1783,11 @@ var Yt = 16, Xt = 250, Zt = class {
this._resizeCleanup = null;
}
};
-function Qt(e) {
+function bn(e) {
return e?.ownerDocument?.defaultView || (typeof window < "u" ? window : globalThis);
}
-function $t(e) {
- let t = Qt(e), n = t?.performance?.now;
+function xn(e) {
+ let t = bn(e), n = t?.performance?.now;
if (typeof n == "function") try {
return Number(n.call(t.performance)) || Date.now();
} catch {
@@ -1677,48 +1797,48 @@ function $t(e) {
}
//#endregion
//#region ui/features/viewer/workflowSidebar/sidebarRunButton.ts
-var Z = Object.freeze({
+var X = Object.freeze({
IDLE: "idle",
RUNNING: "running",
STOPPING: "stopping",
ERROR: "error"
-}), en = new Set([
+}), Sn = new Set([
"default",
"auto",
"latent2rgb",
"taesd",
"none"
-]), tn = "progress-update", nn = (t, n = "") => e(t, n, void 0);
-function rn() {
+]), Cn = "progress-update", wn = (e, t = "") => p(e, t, void 0);
+function Tn() {
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 = nn("tooltip.queuePrompt", "Queue Prompt (Run)");
+ let n = wn("tooltip.queuePrompt", "Queue Prompt (Run)");
t.title = n, t.setAttribute("aria-label", n);
- let i = document.createElement("i");
- i.className = "pi pi-play", i.setAttribute("aria-hidden", "true"), t.appendChild(i);
- let a = document.createElement("button");
- a.type = "button", a.className = "mjr-icon-btn mjr-mfv-stop-btn";
- let s = document.createElement("i");
- s.className = "pi pi-stop", s.setAttribute("aria-hidden", "true"), a.appendChild(s), e.appendChild(t), e.appendChild(a);
- let c = Z.IDLE, l = !1, u = !1, d = null;
+ 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";
+ let a = document.createElement("i");
+ a.className = "pi pi-stop", a.setAttribute("aria-hidden", "true"), i.appendChild(a), e.appendChild(t), e.appendChild(i);
+ let s = X.IDLE, l = !1, u = !1, d = null;
function f() {
d != null && (clearTimeout(d), d = null);
}
function p(e, { canStop: n = !1 } = {}) {
- c = e, t.classList.toggle("running", c === Z.RUNNING), t.classList.toggle("stopping", c === Z.STOPPING), t.classList.toggle("error", c === Z.ERROR), t.disabled = c === Z.RUNNING || c === Z.STOPPING, a.disabled = !n || c === Z.STOPPING, a.classList.toggle("active", n && c !== Z.STOPPING), a.classList.toggle("stopping", c === Z.STOPPING), c === Z.RUNNING || c === Z.STOPPING ? i.className = "pi pi-spin pi-spinner" : i.className = "pi pi-play";
+ s = e, t.classList.toggle("running", s === X.RUNNING), t.classList.toggle("stopping", s === X.STOPPING), t.classList.toggle("error", s === X.ERROR), t.disabled = s === X.RUNNING || s === X.STOPPING, i.disabled = !n || s === X.STOPPING, i.classList.toggle("active", n && s !== X.STOPPING), i.classList.toggle("stopping", s === X.STOPPING), s === X.RUNNING || s === X.STOPPING ? r.className = "pi pi-spin pi-spinner" : r.className = "pi pi-play";
}
function m() {
- let e = nn("tooltip.queueStop", "Stop Generation");
- a.title = e, a.setAttribute("aria-label", e);
+ let e = wn("tooltip.queueStop", "Stop Generation");
+ i.title = e, i.setAttribute("aria-label", e);
}
- function h(e = M.getSnapshot(), { authoritative: t = !1 } = {}) {
+ function h(e = I.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 && (l = !1, u = !1);
let c = l || u || i || n > 0;
if ((i || o || n > 0) && (l = !1), s) {
- u = !1, f(), p(Z.ERROR, { canStop: !1 });
+ u = !1, f(), p(X.ERROR, { canStop: !1 });
return;
}
if (u) {
@@ -1726,47 +1846,35 @@ function rn() {
u = !1, h(e);
return;
}
- p(Z.STOPPING, { canStop: !1 });
+ p(X.STOPPING, { canStop: !1 });
return;
}
if (l || i || o || n > 0) {
- f(), p(Z.RUNNING, { canStop: !0 });
+ f(), p(X.RUNNING, { canStop: !0 });
return;
}
- f(), p(Z.IDLE, { canStop: !1 });
+ f(), p(X.IDLE, { canStop: !1 });
}
function g() {
- l = !1, u = !1, f(), p(Z.ERROR, { canStop: !1 }), d = setTimeout(() => {
+ l = !1, u = !1, f(), p(X.ERROR, { canStop: !1 }), d = setTimeout(() => {
d = null, h();
}, 1500);
}
async function _() {
- let e = o(), t = (e?.api && typeof e.api.interrupt == "function" ? e.api : null) ?? r(e);
- if (t && typeof t.interrupt == "function") return await t.interrupt(), { tracked: !0 };
- if (t && typeof t.fetchApi == "function") {
- let e = await t.fetchApi("/interrupt", { method: "POST" });
- if (!e?.ok) throw Error(`POST /interrupt failed (${e?.status})`);
- return { tracked: !0 };
- }
- let n = await fetch("/interrupt", {
- method: "POST",
- credentials: "include"
- });
- if (!n.ok) throw Error(`POST /interrupt failed (${n.status})`);
- return { tracked: !1 };
+ return { tracked: await o(c()) };
}
async function v() {
- if (!(c === Z.RUNNING || c === Z.STOPPING)) {
+ if (!(s === X.RUNNING || s === X.STOPPING)) {
l = !0, u = !1, h();
try {
- (await hn())?.tracked || (l = !1), h();
+ (await jn())?.tracked || (l = !1), h();
} catch (e) {
console.error?.("[MFV Run]", e), g();
}
}
}
async function y() {
- if (c === Z.RUNNING) {
+ if (s === X.RUNNING) {
u = !0, h();
try {
(await _())?.tracked || (u = !1, l = !1), h();
@@ -1775,25 +1883,25 @@ function rn() {
}
}
}
- m(), a.disabled = !0, t.addEventListener("click", v), a.addEventListener("click", y);
+ m(), i.disabled = !0, t.addEventListener("click", v), i.addEventListener("click", y);
let b = (e) => {
- h(e?.detail || M.getSnapshot(), { authoritative: !0 });
+ h(e?.detail || I.getSnapshot(), { authoritative: !0 });
};
- return M.addEventListener(tn, b), j({ timeoutMs: 4e3 }).catch((e) => {
+ return I.addEventListener(Cn, b), se({ timeoutMs: 4e3 }).catch((e) => {
console.debug?.(e);
}), h(), {
el: e,
dispose() {
- f(), t.removeEventListener("click", v), a.removeEventListener("click", y), M.removeEventListener(tn, b);
+ f(), t.removeEventListener("click", v), i.removeEventListener("click", y), I.removeEventListener(Cn, b);
}
};
}
-function an(e = l.MFV_PREVIEW_METHOD) {
+function En(e = _.MFV_PREVIEW_METHOD) {
let t = String(e || "").trim().toLowerCase();
- return en.has(t) ? t : l.MFV_PREVIEW_METHOD || "auto";
+ return Sn.has(t) ? t : _.MFV_PREVIEW_METHOD || "auto";
}
-function on(e, t = l.MFV_PREVIEW_METHOD) {
- let n = an(t), r = {
+function Dn(e, t = _.MFV_PREVIEW_METHOD) {
+ let n = En(t), r = {
...e?.extra_data || {},
extra_pnginfo: { ...e?.extra_data?.extra_pnginfo || {} }
};
@@ -1802,74 +1910,14 @@ function on(e, t = l.MFV_PREVIEW_METHOD) {
extra_data: r
};
}
-function sn(e, { previewMethod: t = l.MFV_PREVIEW_METHOD, clientId: n = null } = {}) {
- let r = on(e, t), i = {
+function On(e, { previewMethod: t = _.MFV_PREVIEW_METHOD, clientId: n = null } = {}) {
+ let r = Dn(e, t), i = {
prompt: r?.output,
extra_data: r?.extra_data || {}
}, a = String(n || "").trim();
return a && (i.client_id = a), i;
}
-function cn(e, t) {
- let n = [
- e?.clientId,
- e?.clientID,
- e?.client_id,
- t?.clientId,
- t?.clientID,
- t?.client_id
- ];
- for (let e of n) {
- let t = String(e || "").trim();
- if (t) return t;
- }
- return "";
-}
-function ln(e, t) {
- S(e, ({ node: e }) => {
- t(e);
- });
-}
-function un(e) {
- if (typeof e != "object" || !e) return e;
- try {
- return typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e));
- } catch {
- return e;
- }
-}
-function dn(e) {
- let t = [];
- return ln(e, (e) => {
- for (let n of e.widgets ?? []) t.push({
- widget: n,
- value: un(n?.value)
- });
- }), t;
-}
-function fn(e, t) {
- for (let e of Array.isArray(t) ? t : []) {
- let t = e?.widget;
- if (!t || typeof t != "object") continue;
- let n = un(e?.value);
- try {
- t.value = n;
- } catch (e) {
- console.debug?.(e);
- continue;
- }
- try {
- t.callback?.(n);
- } catch (e) {
- console.debug?.(e);
- }
- }
- try {
- e?.canvas?.draw?.(!0, !0);
- } catch (e) {
- console.debug?.(e);
- }
-}
-function pn(e) {
+function kn(e) {
let t = e?.constructor;
return [
e?.type,
@@ -1878,54 +1926,32 @@ function pn(e) {
t?.type
].some((e) => /Api$/i.test(String(e || "").trim()));
}
-function mn(e) {
+function An(e) {
let t = !1;
- return ln(e, (e) => {
- t ||= pn(e);
+ return S(e, ({ node: e }) => {
+ t ||= kn(e);
}), t;
}
-async function hn() {
- let e = o();
+async function jn() {
+ let e = c();
if (!e) throw Error("ComfyUI app not available");
- let t = (e?.api && typeof e.api.queuePrompt == "function" ? e.api : null) ?? r(e), n = !!(t && typeof t.queuePrompt == "function" || t && typeof t.fetchApi == "function"), i = y(e);
- if ((mn(i) || !n) && typeof e.queuePrompt == "function") return await e.queuePrompt(0), { tracked: !0 };
- let a = null;
- try {
- a = dn(i), ln(i, (e) => {
- for (let t of e.widgets ?? []) t.beforeQueued?.({ isPartialExecution: !1 });
- });
- let n = typeof e.graphToPrompt == "function" ? await e.graphToPrompt() : null;
- if (!n?.output) throw Error("graphToPrompt returned empty output");
- let r;
- if (t && typeof t.queuePrompt == "function") await t.queuePrompt(0, on(n)), r = { tracked: !0 };
- else if (t && typeof t.fetchApi == "function") {
- let i = await t.fetchApi("/prompt", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify(sn(n, { clientId: cn(t, e) }))
- });
- if (!i?.ok) throw Error(`POST /prompt failed (${i?.status})`);
- r = { tracked: !0 };
- } else {
- let t = await fetch("/prompt", {
- method: "POST",
- credentials: "include",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify(sn(n, { clientId: cn(null, e) }))
- });
- if (!t.ok) throw Error(`POST /prompt failed (${t.status})`);
- r = { tracked: !1 };
+ return { tracked: await d({
+ app: e,
+ forceNativeQueue: An(y(e)),
+ resolvePromptData(e) {
+ return typeof e?.graphToPrompt == "function" ? e.graphToPrompt() : null;
+ },
+ enrichPromptData(e) {
+ return Dn(e);
+ },
+ buildPromptRequestBody(e, t) {
+ return On(e, { clientId: t.clientId });
}
- return ln(i, (e) => {
- for (let t of e.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 });
- }), e.canvas?.draw?.(!0, !0), r;
- } catch (t) {
- throw fn(e, a), t;
- }
+ }) };
}
//#endregion
//#region ui/features/viewer/floatingViewerUi.ts
-function gn(e) {
+function Mn(e) {
let t = e?.models;
if (!t || typeof t != "object") return "";
let n = [
@@ -1938,16 +1964,16 @@ function gn(e) {
["VAE", t.vae]
], r = /* @__PURE__ */ new Set(), i = [];
for (let [e, t] of n) {
- let n = oe(t?.name || t?.value || t || "");
+ let n = de(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 _n(e) {
- let t = se(e);
+function Nn(e) {
+ let t = fe(e);
return t.workflowLabel ? t.workflowBadge ? `${t.workflowLabel} • ${t.workflowBadge}` : t.workflowLabel : "";
}
-function vn(e, t, n, r) {
+function Pn(e, t, n, r) {
let i = document.createElement("div");
i.className = "mjr-mfv-idrop";
let a = document.createElement("button");
@@ -1995,21 +2021,21 @@ function vn(e, t, n, r) {
}
};
}
-var yn = {
+var Fn = {
rgb: "#e0e0e0",
r: "#ff5555",
g: "#44dd66",
b: "#5599ff",
a: "#ffffff",
l: "#bbbbbb"
-}, bn = {
+}, In = {
rgb: "RGB",
r: "R",
g: "G",
b: "B",
a: "A",
l: "L"
-}, xn = {
+}, Ln = {
rgb: "500",
r: "700",
g: "700",
@@ -2017,35 +2043,35 @@ var yn = {
a: "700",
l: "400"
};
-function Sn(e) {
+function Rn(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(T(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(te(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 Zt({
+ 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(P(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(F(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 yn({
hostEl: t,
onClose: () => e._updateSettingsBtnState(!1),
- onOpenGraphMap: () => e.setMode?.(I.GRAPH),
+ onOpenGraphMap: () => e.setMode?.(z.GRAPH),
onCloseGraphMap: () => {
- e._mode === I.GRAPH && e.setMode?.(I.SIMPLE);
+ e._mode === z.GRAPH && e.setMode?.(z.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 Cn(t) {
- let n = document.createElement("div");
- n.className = "mjr-mfv-header";
- let r = document.createElement("span");
- r.className = "mjr-mfv-header-title", r.id = t._titleId;
- let i = document.createElement("i");
- i.className = "mjr-mfv-header-title-icon pi pi-eye", i.setAttribute("aria-hidden", "true");
- let a = document.createElement("span");
- a.textContent = "Majoor Floating Viewer", r.append(i, a);
- let o = document.createElement("button");
- t._closeBtn = o, o.type = "button", o.className = "mjr-icon-btn mjr-mfv-close-btn", D(o, e("tooltip.closeViewer", "Close viewer"), "Esc");
- let s = document.createElement("i");
- return s.className = "pi pi-times", s.setAttribute("aria-hidden", "true"), o.appendChild(s), n.appendChild(r), n.appendChild(o), n;
+function zn(e) {
+ let t = document.createElement("div");
+ t.className = "mjr-mfv-header";
+ let n = document.createElement("span");
+ n.className = "mjr-mfv-header-title", n.id = e._titleId;
+ let r = document.createElement("i");
+ r.className = "mjr-mfv-header-title-icon pi pi-eye", r.setAttribute("aria-hidden", "true");
+ 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", ne(a, p("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 wn(t) {
- let n = (e, { min: t, max: n, step: r, value: i } = {}) => {
+function Bn(e) {
+ let t = (e, { min: t, max: n, step: r, value: i } = {}) => {
let a = document.createElement("div");
a.className = "mjr-mfv-toolbar-range";
let o = document.createElement("input");
@@ -2056,70 +2082,70 @@ function wn(t) {
input: o,
out: s
};
- }, r = document.createElement("div");
- r.className = "mjr-mfv-toolbar";
- let i = vn("", "Viewer mode", [
+ }, n = document.createElement("div");
+ n.className = "mjr-mfv-toolbar";
+ let r = Pn("", p("viewer.mode", "Viewer mode"), [
{
- value: I.SIMPLE,
- html: "Simple"
+ value: z.SIMPLE,
+ html: `${p("viewer.mode.simple", "Simple")}`
},
{
- value: I.AB,
- html: "A/B Compare"
+ value: z.AB,
+ html: `${p("viewer.mode.abCompare", "A/B Compare")}`
},
{
- value: I.SIDE,
- html: "Side-by-side"
+ value: z.SIDE,
+ html: `${p("viewer.mode.sideBySide", "Side-by-side")}`
},
{
- value: I.GRID,
- html: "Grid"
+ value: z.GRID,
+ html: `${p("viewer.mode.grid", "Grid")}`
},
{
- value: I.GRAPH,
- html: "Graph Map"
+ value: z.GRAPH,
+ html: `${p("workflowSidebar.graphMap", "Graph Map")}`
}
- ], t);
- t._modeDrop = i, t._modeBtn = i.trigger, t._modeSelect = i.select, t._updateModeBtnUI(), r.appendChild(i.wrap);
- let a = document.createElement("button");
- a.type = "button", a.className = "mjr-icon-btn mjr-mfv-pin-trigger", a.title = "Pin slots A/B/C/D", a.setAttribute("aria-haspopup", "dialog"), a.setAttribute("aria-expanded", "false"), a.innerHTML = "", r.appendChild(a);
+ ], 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 = p("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");
- o.className = "mjr-mfv-pin-popover", t.element.appendChild(o);
- let s = document.createElement("div");
- s.className = "mjr-menu", s.style.cssText = "display:grid;gap:4px;", s.setAttribute("role", "group"), s.setAttribute("aria-label", "Pin References"), o.appendChild(s), t._pinGroup = s, t._pinBtns = {};
- for (let e of [
+ o.className = "mjr-menu", o.style.cssText = "display:grid;gap:4px;", o.setAttribute("role", "group"), o.setAttribute("aria-label", "Pin References"), a.appendChild(o), e._pinGroup = o, e._pinBtns = {};
+ for (let t of [
"A",
"B",
"C",
"D"
]) {
let n = document.createElement("button");
- n.type = "button", n.className = "mjr-menu-item mjr-mfv-pin-btn", n.dataset.slot = e, n.title = `Pin Asset ${e}`, n.setAttribute("aria-pressed", "false");
+ n.type = "button", n.className = "mjr-menu-item mjr-mfv-pin-btn", n.dataset.slot = t, n.title = `Pin Asset ${t}`, n.setAttribute("aria-pressed", "false");
let r = document.createElement("span");
- r.className = "mjr-menu-item-label", r.textContent = `Asset ${e}`;
+ r.className = "mjr-menu-item-label", r.textContent = `Asset ${t}`;
let i = document.createElement("i");
- i.className = "pi pi-map-marker mjr-menu-item-check", i.style.opacity = "0", n.appendChild(r), n.appendChild(i), s.appendChild(n), t._pinBtns[e] = n;
+ 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;
}
- t._updatePinUI(), t._pinBtn = a, t._pinPopover = o;
- let c = () => {
- let e = a.getBoundingClientRect(), n = t.element.getBoundingClientRect();
- o.style.left = `${e.left - n.left}px`, o.style.top = `${e.bottom - n.top + 4}px`, o.classList.add("is-open"), a.setAttribute("aria-expanded", "true");
+ e._updatePinUI(), e._pinBtn = i, e._pinPopover = a;
+ let s = () => {
+ 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");
};
- t._closePinPopover = () => {
- o.classList.remove("is-open"), a.setAttribute("aria-expanded", "false");
- }, a.addEventListener("click", (e) => {
- e.stopPropagation(), o.classList.contains("is-open") ? t._closePinPopover() : (t._closeAllToolbarPopovers?.(), c());
+ 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());
});
- 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), r.appendChild(l);
+ 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 d = document.createElement("div");
- d.className = "mjr-mfv-guides-popover", t.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;", d.appendChild(p);
+ d.className = "mjr-menu", d.style.cssText = "display:grid;gap:4px;", u.appendChild(d);
+ let f = document.createElement("select");
+ f.style.cssText = "position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;", u.appendChild(f);
let m = [
{
value: "0",
@@ -2137,52 +2163,52 @@ function wn(t) {
value: "3",
label: "Safe"
}
- ], h = String(t._gridMode || 0), g = [];
+ ], h = String(e._gridMode || 0), g = [];
for (let e of m) {
let t = document.createElement("option");
- t.value = e.value, p.appendChild(t);
+ t.value = e.value, f.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 === h ? "1" : "0", n.appendChild(r), n.appendChild(i), f.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), d.appendChild(n), g.push(n), e.value === h && n.classList.add("is-active");
}
- p.value = h, l.classList.toggle("is-on", h !== "0"), t._guidesSelect = p, t._guideBtn = l, t._guidePopover = d;
+ f.value = h, c.classList.toggle("is-on", h !== "0"), e._guidesSelect = f, e._guideBtn = c, e._guidePopover = u;
let _ = () => {
- let e = l.getBoundingClientRect(), n = t.element.getBoundingClientRect();
- d.style.left = `${e.left - n.left}px`, d.style.top = `${e.bottom - n.top + 4}px`, d.classList.add("is-open"), l.setAttribute("aria-expanded", "true");
+ 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");
};
- t._closeGuidePopover = () => {
- d.classList.remove("is-open"), l.setAttribute("aria-expanded", "false");
- }, l.addEventListener("click", (e) => {
- e.stopPropagation(), d.classList.contains("is-open") ? t._closeGuidePopover() : (t._closeAllToolbarPopovers?.(), _());
- }), f.addEventListener("click", (e) => {
- let n = e.target.closest(".mjr-menu-item");
+ 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) => {
+ 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) => {
+ f.value = r ?? "", f.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";
- }), l.classList.toggle("is-on", r !== "0"), t._closeGuidePopover();
+ }), c.classList.toggle("is-on", r !== "0"), e._closeGuidePopover();
});
- let v = String(t._channel || "rgb"), y = document.createElement("button");
+ 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");
let b = document.createElement("img");
- b.src = new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAQ4ElEQVR4nO2deVRTd97Gb52tM++c875dpkpxQ7QKCChYBUEjhC2QhAQEJCyO044zPfPO9NQuc+ZMfSNLgABhcWydtmpLXQapRTZBsS6Qm5vF3aq1rkfFahbXakWFfN9z700QkST3JvcSojznPCf/gp/zub/k4eaKICMZyUhGMpKRPAMxpSV5G9Li003pfKkhI3GDKSNptzGdpzFmJH5rSk88akzjqU3pCbsMabwNJnH8cr04eqFBHO/l7p/7qQkgyHPG1ASuMZO/1iQRnDJKhGaTRABEM/lkFyWRzbA0PZGoMZ1H1JCWYDakxp00imM+MaTFcNz9O3lkbqbFvWiUJMpMkuQLpqxkICoRWtoPiAMYxrQEsgvjyabGgTEl7pw+mbviRjLnf9z9e3oGiExBtTFL+KMpWwR2YdAFgsPoV4OYe8sgipGPgLERQwYvw5SdfNWUIwICBlUgdOzo35RYogYRV28URS3FL4/u/jcYFjFkxXuZsoR7TTlioA3DWSAWGEZxDFkRFwzJUe0/JET+DnmWY1okjjXmiPR9MHKG1o7+QAgooqjL10ULns2D/7qEL7mWk9JNwhgAJGto7SCaHE3UIIi6r+dzcpBnKdckye+ZclN6B4WRTRMIQ3ZYgRiTo8AgjOrR8+f9BXkWYswWLCVg5KaAXSCSobcDh0FUuAAMwgXma/x5byJPc/SZ/FRjrvihQxhZ9IAwaYcVCAGFz3lg4M/nIU9j9LkiX1Ou+CYBwx12pMbRgyGwNGnezatJkZOQpymQlvZLY7b4ECUYWU4CYdoOHAafQ9TIn7cfQkN/gTwtMWUJy64tTgV6QATM22EFQtUOCxADfz5uynLkaYg+WzDZlJtyrw8IG3ak85i3ow/IfLKJkT/pE+b6Ip4eY1ZyO307hOzZYQVCxw7SEDAkRmxFPDmmTNFs0+JU85NAPMUOziMYSfNAnxhp1idFBCOeGlO2qMVpOyQuTOyUgdCwgzAkEvSJEbWIJ8aUJR5rzBX3DIkdaQns2dF3uYokgfAiHhri53neXyGvZQlWuGxHJn9Y2UGUFwGG+LnLEE+LMVt8wiYQN03sRmftsALBYRBAwvchnhTjIuGr+GE+fO2Idt4OXgToEyJ6r8SGv4J4SkxZwj84vFx5qh0JlsaHpSOekmuS5C8YnUnSWbDDuurStMMK5Gp82EeIp+RaTorabSNiCgt2WIFY7UiYC/r4sF2Ip8SUk6L3mIldQN8OEkj4RcQTcn4x53lTborZrSOimAU7+oDMtQLpBQ7n54hH3EXiSRO7YAFtO4jGh8PFuLAXkeEeYyZ/msdO7HyKQOLDiV6JnzMRGe7RZycFe+zEnkTdDrymmDl+yHDPlTSBj0dP7EkUgcSFgSk62BvxhPtzPXliN1C0Awei5/j/FhnugTTkZ6Yc8QNPntgNFOzQx8zp9pj7gU2S5HO2YOglqXA8+y3oWPwh7FhcCM2/L4Wm35dBa24x7MzJA3X2+3A+Ixv06QLWJnZj6ny4vjQcbv0jFG4XzYA7FYFwp3I63FEEwG1ZENz6MBhuvBUKxpRw23bEhp1APCXGjKR2K5DzubnQ9kYRbP7D59CQtQl2pG+CHWkbH+/CDbA91dIUsq3i9bA5swa2ZK8EbNG7YFiY5LwdCzlwa/nr8NMGP3iI+oD59KtgPovXy9IxZM+MtvQVS38HPQe84F6tD9zOCwDToll9QK7EzGlAPCVd6Qurt78pg81LNsKOjE3QnmEBYQPGYEC2i9cTbbO0OWU9bJashgMZf6YGQxQNN98Lg3v1ftB7chyYz44F81lvS+0BeQSD7MuWvgTm0y9Bd5s33FruD5fTQhTIcI+/9Ngvgyq1b2Us/8bUvmgTEKUAxBGMNtGXZJPJ1qbVAJrxLhhSBvlknsKF23mz4aF6MpjPWkFQheEACNEXibY1z71XgvHLi7Sil5DhmMDKfZkzK7VdM6t0MKtSC01ZtZRgOAOkVVgDrYIa2LxwHRxNXdIH48Y7EfBQOQXMZ8dbYDgLxD6MniMvgwIVQKlaCKWY4Gapmr+sri7tZ8hwiFeJcnygQrszpFoHOAy8M6p0UPaXJnpA6MAQkkDwbhPUQNMbVXCnLhzMZydYYAwEwqwdxlYfKFUnE0DkagFZjH+wBOMFuhXGtDJN0oxKrRGHMRBIpnQPe3YIHwHZ9+Ea6LlzCuDBGTBfimHdDvOZF2BPUxhpx+NA8N4rxhLfcQuMwApNSUi11jwYDLwhFVrYkrOZHhAxPRinPq8B6L0Dfen9EcxXcm0AYcaOB/tfAYVK+DgQEgaUWFqsSlwtBemoIUIBzwVWaP8dWq0DvLaABFdq4Z33d7Bmx4WtXwKYH8ITMT8Es2GZi4e5bTu+qw+0ZUcfkBIsCYpVvEbpHs7z7MNQaGqpwMA7u0wDDZJaWkDaqMBo2Ijr8CSMR6qA2fDXQYC4Zgd+mH+8N8muHTgMAgiWCCWqxCZWD/uZFZqPZq3cB1SBBFVo4W/v7WDUjlNr1wGYH9iB0c+UK1kuXK6etONEfRAlO6xAiKp4GwBYmFj8ytVv4zCsQKjAwDuzXAMbcuvoARENDmP//60F6L3rGEb/M+XifEbs6MbGQIX1re4AIHZgEJVhvA8YhTFNjoWEVOnu0bUDb2CFFpKle2G7i3bszKyBnrungHbufwfmc75OArHYceoF2N4U6YwdRItUvIcyNH4eIzBCP9n/m9Aq3bn+doTSgEFUoYV/vL3NJTtundgOTufWGpfsONfo1/e5wzYQmzCIytD4C9I9HNfn+pAqjWIwGHSBBJVr4OMl9U7ZcaT8cwDocR4Ifsh3JToF5PY346Bi4NtcenZYmgAyNLbMJRgBlWq/16t19121A+90hQZmyzHYJNnsGEhyPztENdBz+yS4nO4DpCU0YHRrx8CnuxIo2MF3CIMEEv8gXxkf4DSQ0GpdPRN2WIEElGtgvgyF2kW1lO04t+lLYCrmKzmUgTzYPxrWfxNLGQYlIKp4KFTGf+UUjMBK3dRZ1boee0DowLACwcspUMJ/MmvtAmnF7UiugZ4fv2cMCHQfpgTjvm4M1O6IscCgCcQODKLK2F6ZKnY6bSAhlfvWMWmHFYi/pXNkKKzJ/squHcdXfQFMx3yZbxfIT0pvWLs7AcqcgUEFCBoHRWjcGlowOJ/vef71lbobVIDQtcMKxK9MA8ElGOQvbbAJ5O753YwDgVsbbcLQb5sC/0L5/WAwbAcaR1YZe0uBhf2aMpAZCk0um3bgMPBOK1MTzfqgHb5O3fj45w7JF/Q+BFJN7x1yeOwH5OGRMaBtfB3K1CICxkAgTNqBt5C0JIMykNAq7VY6QJyxoz+QqaVqCJWhsOKPDdAqIoGcxpdclmK+nEbCOPUyXG15DT7bk2gTBl0gVGCQjd1IHUi17irTdgTYgYH3NUvnreiA4iX1cPN4G3tArn8C11unwNetXCjXiC0wHABh0A68BWjsD5Q2rqAy3XRnLleu2NEfyBQ52b83aeH8iTbovX+ZMRC99y/B2RPN8H5jBwGCMgzaQBzaQVSq4kxzCGRGleYNtuywAnEEY7Icg7iWyxDX+gMktnbBJ7s74MyxVui+cQig50fqBHpuQ/f1g3DqWBOsbN8LCxq7ILKpCyIbL0GpeqHb7LACyVfFLnIIZGaVtszddvhXHyBg4I3dRjZm22WyLV3wwbYDUNfRDqhmGxw60ALfH22Fk0e3waFDzaDUNUPt3nZ4t00HUS0XYX7zZaLzmsgSQJq64J/K/2XJDh4lGAVoDOR3xkkdA6kgD3S27LACsWdH0OrDNoFwLY1uIRvVrwuayXIstQUD75/a5bSAMG0HDqSgM8bxwR5aret06nLFkB2T5RjM/PToY0CowKALJHfbatbs6ANiDwZuiDK6zTGQlfsOujoiUgUyGIzJcgxCPvuWth1WIFRg4E1v+tIJIAzaQRalcIbovnP2csWEHZPlGMxad/wJIEzagVe0dUsfEHfYUaDk4q9HHAOp1H7L1IjojB2+JRiErDnmlB0LKMKIaOyChU0bnbpcMWaHkgv5aIyWiiFqVyd2V+zwLSHPkMGAMGUHDiSz5TP27LAAsWsHDkQZvZOKITvZtmOqHRi+JRgEfnzY5cPcHgy8S1orWR8RHQEp6OR+7RBIcIV2DVsjIhU7fEsw8F95gFU78C7b/XdWJ3aZQzu4UIhyHf9JN1CheZ/Jid0RkIEwJuGvcg3EtLj+VtcWjLkNXVCkynCrHTiQ/I5ox0/ODlJoE9xpxyRLOVsvPAGEKTvCt5wekondCmRQGEou5HUuiHAIxH/Vnt/OrNLdZ2NitwVkIAyfYgzCNp1mx47GLojagg3VxG4TSEFn9N3q1oRfOQRCnCOVun1sTuyO7PApxiD406OMzSQDgWQ2rxnSEXFwO6J3IFQzXaGVDcWIaAuGTzEGvqUaiG7pYuQw7w8jvOESrOhcPGQTu+3LFZf6cxv9FdjkGVVaM9sTuz0gE4tUEFF3jnE7Ir86MvQj4gAY+Z1RvYVYNL2nQARVaHRsj4hWIIPBmFikgsB/H2XUDvJy9dmQTuwuX64eWaJewubE7siOiXjxd1sNl1waEfsDCas/D8Wq1KG1wzqT9DUa8pTRAtpAONI9Pw+u0J5j2w5fGzAmWDpjzTGXL1dWO4Rb69wzIj5ux2Gnvy/iV6b9M5sjoj07Jlg6sUQNnIaLjNhRqJIM/cT+GJBoyFdGpSBORyodNV2hOcjGxD4YkIkDYIyXkQ1YfcTlwzy9aY377VBGOR4THWW6XDsrUKHpcYcd4y1AxhWpIKz2LO2J3Qojou5bkKtFbpnY+9nRnY9GTUWYyLRSdSnTE7stIBMGwrB0UrkO5jdeoj+T1F+A93a97caJve+tLoPfX5dKRwWUazuZnNgp2yEjO7YQhan/OgScJuoTOz4iSpo/cvuIWKCMaWH8i59TFJi3f5n6ItMjIhU7xhaiRL0LUQhae5yyHXFft7l9Yi/o5B4rVka+gLCRiXJ0qn+5xsDExE7XjrEWIGNlKphR873DEZFTp4FStdi9I2Int0uqjBmPsJkphdhsv1K1kWk7JlKA4V2IwqsF+CsJxRaQ+XUakGNiN0/s0RcZO8QdZZL84BS/Muw8EyMiHTu8LUCIFqog+IuTT8CI/movyFVPwhhSO1DuiYKOuHHIUGZ8YYfX1FJ1J5N2TCiiBsPL0jH5Snht1SGY23AJIhougXjrRrfdp9sHo5PbyNqZ4TBS6ajJclXRVLm6x5URka4dXv2AjM5XwkQF9sOf2vJM7rqLnbSD213QyV3GymM06Ma3WBk6Ra7WMfZBUEYZxr3R+R0y5K+tvyo7nP1fpWqRrEwtvD/U9+nmK7l7pZ3R/sjwCjznU4y9+VoJdoZ1O/KVD0bnddb8t3TPE89eL8GSA+UqQX0pJuxle2IvUMYcKUS5qciwjlQ6yqcYzZ5UgmGT5epeVw5z7wEwxuR1msbko6sGAzEwJVpBgBwTrJNjgltM2lGAxvYUorHt+WiMcFhcnuhkXAHqO6FYtcKnGFP5FKm6nbHj1QLlJa8C1XqvPKUYWbqf9v/YrMDSfi3XCDJLsKTaEkxwxckR8a4Mjd0pU8a9W4glDf/nvVOJl3T/b8bLVNzxRaq/TShCV00owlrGy9COcTLVYbKodmwh+o13gfI/3oXKPK8CVebL+XunMP1zlCgFATKMLylSJeUVY7xNxSreziIVT12E8g7KVLz9MjRhlwyNr5cp4xSFyoSl+FN8KN8dMpKRjGQkIxkJ4r78Pwv259NnjlZFAAAAAElFTkSuQmCC", "" + import.meta.url).href, b.className = "mjr-mfv-ch-icon", b.alt = "", b.setAttribute("aria-hidden", "true"), y.appendChild(b), r.appendChild(y);
+ b.src = new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAQ4ElEQVR4nO2deVRTd97Gb52tM++c875dpkpxQ7QKCChYBUEjhC2QhAQEJCyO044zPfPO9NQuc+ZMfSNLgABhcWydtmpLXQapRTZBsS6Qm5vF3aq1rkfFahbXakWFfN9z700QkST3JvcSojznPCf/gp/zub/k4eaKICMZyUhGMpKRPAMxpSV5G9Li003pfKkhI3GDKSNptzGdpzFmJH5rSk88akzjqU3pCbsMabwNJnH8cr04eqFBHO/l7p/7qQkgyHPG1ASuMZO/1iQRnDJKhGaTRABEM/lkFyWRzbA0PZGoMZ1H1JCWYDakxp00imM+MaTFcNz9O3lkbqbFvWiUJMpMkuQLpqxkICoRWtoPiAMYxrQEsgvjyabGgTEl7pw+mbviRjLnf9z9e3oGiExBtTFL+KMpWwR2YdAFgsPoV4OYe8sgipGPgLERQwYvw5SdfNWUIwICBlUgdOzo35RYogYRV28URS3FL4/u/jcYFjFkxXuZsoR7TTlioA3DWSAWGEZxDFkRFwzJUe0/JET+DnmWY1okjjXmiPR9MHKG1o7+QAgooqjL10ULns2D/7qEL7mWk9JNwhgAJGto7SCaHE3UIIi6r+dzcpBnKdckye+ZclN6B4WRTRMIQ3ZYgRiTo8AgjOrR8+f9BXkWYswWLCVg5KaAXSCSobcDh0FUuAAMwgXma/x5byJPc/SZ/FRjrvihQxhZ9IAwaYcVCAGFz3lg4M/nIU9j9LkiX1Ou+CYBwx12pMbRgyGwNGnezatJkZOQpymQlvZLY7b4ECUYWU4CYdoOHAafQ9TIn7cfQkN/gTwtMWUJy64tTgV6QATM22EFQtUOCxADfz5uynLkaYg+WzDZlJtyrw8IG3ak85i3ow/IfLKJkT/pE+b6Ip4eY1ZyO307hOzZYQVCxw7SEDAkRmxFPDmmTNFs0+JU85NAPMUOziMYSfNAnxhp1idFBCOeGlO2qMVpOyQuTOyUgdCwgzAkEvSJEbWIJ8aUJR5rzBX3DIkdaQns2dF3uYokgfAiHhri53neXyGvZQlWuGxHJn9Y2UGUFwGG+LnLEE+LMVt8wiYQN03sRmftsALBYRBAwvchnhTjIuGr+GE+fO2Idt4OXgToEyJ6r8SGv4J4SkxZwj84vFx5qh0JlsaHpSOekmuS5C8YnUnSWbDDuurStMMK5Gp82EeIp+RaTorabSNiCgt2WIFY7UiYC/r4sF2Ip8SUk6L3mIldQN8OEkj4RcQTcn4x53lTborZrSOimAU7+oDMtQLpBQ7n54hH3EXiSRO7YAFtO4jGh8PFuLAXkeEeYyZ/msdO7HyKQOLDiV6JnzMRGe7RZycFe+zEnkTdDrymmDl+yHDPlTSBj0dP7EkUgcSFgSk62BvxhPtzPXliN1C0Awei5/j/FhnugTTkZ6Yc8QNPntgNFOzQx8zp9pj7gU2S5HO2YOglqXA8+y3oWPwh7FhcCM2/L4Wm35dBa24x7MzJA3X2+3A+Ixv06QLWJnZj6ny4vjQcbv0jFG4XzYA7FYFwp3I63FEEwG1ZENz6MBhuvBUKxpRw23bEhp1APCXGjKR2K5DzubnQ9kYRbP7D59CQtQl2pG+CHWkbH+/CDbA91dIUsq3i9bA5swa2ZK8EbNG7YFiY5LwdCzlwa/nr8NMGP3iI+oD59KtgPovXy9IxZM+MtvQVS38HPQe84F6tD9zOCwDToll9QK7EzGlAPCVd6Qurt78pg81LNsKOjE3QnmEBYQPGYEC2i9cTbbO0OWU9bJashgMZf6YGQxQNN98Lg3v1ftB7chyYz44F81lvS+0BeQSD7MuWvgTm0y9Bd5s33FruD5fTQhTIcI+/9Ngvgyq1b2Us/8bUvmgTEKUAxBGMNtGXZJPJ1qbVAJrxLhhSBvlknsKF23mz4aF6MpjPWkFQheEACNEXibY1z71XgvHLi7Sil5DhmMDKfZkzK7VdM6t0MKtSC01ZtZRgOAOkVVgDrYIa2LxwHRxNXdIH48Y7EfBQOQXMZ8dbYDgLxD6MniMvgwIVQKlaCKWY4Gapmr+sri7tZ8hwiFeJcnygQrszpFoHOAy8M6p0UPaXJnpA6MAQkkDwbhPUQNMbVXCnLhzMZydYYAwEwqwdxlYfKFUnE0DkagFZjH+wBOMFuhXGtDJN0oxKrRGHMRBIpnQPe3YIHwHZ9+Ea6LlzCuDBGTBfimHdDvOZF2BPUxhpx+NA8N4rxhLfcQuMwApNSUi11jwYDLwhFVrYkrOZHhAxPRinPq8B6L0Dfen9EcxXcm0AYcaOB/tfAYVK+DgQEgaUWFqsSlwtBemoIUIBzwVWaP8dWq0DvLaABFdq4Z33d7Bmx4WtXwKYH8ITMT8Es2GZi4e5bTu+qw+0ZUcfkBIsCYpVvEbpHs7z7MNQaGqpwMA7u0wDDZJaWkDaqMBo2Ijr8CSMR6qA2fDXQYC4Zgd+mH+8N8muHTgMAgiWCCWqxCZWD/uZFZqPZq3cB1SBBFVo4W/v7WDUjlNr1wGYH9iB0c+UK1kuXK6etONEfRAlO6xAiKp4GwBYmFj8ytVv4zCsQKjAwDuzXAMbcuvoARENDmP//60F6L3rGEb/M+XifEbs6MbGQIX1re4AIHZgEJVhvA8YhTFNjoWEVOnu0bUDb2CFFpKle2G7i3bszKyBnrungHbufwfmc75OArHYceoF2N4U6YwdRItUvIcyNH4eIzBCP9n/m9Aq3bn+doTSgEFUoYV/vL3NJTtundgOTufWGpfsONfo1/e5wzYQmzCIytD4C9I9HNfn+pAqjWIwGHSBBJVr4OMl9U7ZcaT8cwDocR4Ifsh3JToF5PY346Bi4NtcenZYmgAyNLbMJRgBlWq/16t19121A+90hQZmyzHYJNnsGEhyPztENdBz+yS4nO4DpCU0YHRrx8CnuxIo2MF3CIMEEv8gXxkf4DSQ0GpdPRN2WIEElGtgvgyF2kW1lO04t+lLYCrmKzmUgTzYPxrWfxNLGQYlIKp4KFTGf+UUjMBK3dRZ1boee0DowLACwcspUMJ/MmvtAmnF7UiugZ4fv2cMCHQfpgTjvm4M1O6IscCgCcQODKLK2F6ZKnY6bSAhlfvWMWmHFYi/pXNkKKzJ/squHcdXfQFMx3yZbxfIT0pvWLs7AcqcgUEFCBoHRWjcGlowOJ/vef71lbobVIDQtcMKxK9MA8ElGOQvbbAJ5O753YwDgVsbbcLQb5sC/0L5/WAwbAcaR1YZe0uBhf2aMpAZCk0um3bgMPBOK1MTzfqgHb5O3fj45w7JF/Q+BFJN7x1yeOwH5OGRMaBtfB3K1CICxkAgTNqBt5C0JIMykNAq7VY6QJyxoz+QqaVqCJWhsOKPDdAqIoGcxpdclmK+nEbCOPUyXG15DT7bk2gTBl0gVGCQjd1IHUi17irTdgTYgYH3NUvnreiA4iX1cPN4G3tArn8C11unwNetXCjXiC0wHABh0A68BWjsD5Q2rqAy3XRnLleu2NEfyBQ52b83aeH8iTbovX+ZMRC99y/B2RPN8H5jBwGCMgzaQBzaQVSq4kxzCGRGleYNtuywAnEEY7Icg7iWyxDX+gMktnbBJ7s74MyxVui+cQig50fqBHpuQ/f1g3DqWBOsbN8LCxq7ILKpCyIbL0GpeqHb7LACyVfFLnIIZGaVtszddvhXHyBg4I3dRjZm22WyLV3wwbYDUNfRDqhmGxw60ALfH22Fk0e3waFDzaDUNUPt3nZ4t00HUS0XYX7zZaLzmsgSQJq64J/K/2XJDh4lGAVoDOR3xkkdA6kgD3S27LACsWdH0OrDNoFwLY1uIRvVrwuayXIstQUD75/a5bSAMG0HDqSgM8bxwR5aret06nLFkB2T5RjM/PToY0CowKALJHfbatbs6ANiDwZuiDK6zTGQlfsOujoiUgUyGIzJcgxCPvuWth1WIFRg4E1v+tIJIAzaQRalcIbovnP2csWEHZPlGMxad/wJIEzagVe0dUsfEHfYUaDk4q9HHAOp1H7L1IjojB2+JRiErDnmlB0LKMKIaOyChU0bnbpcMWaHkgv5aIyWiiFqVyd2V+zwLSHPkMGAMGUHDiSz5TP27LAAsWsHDkQZvZOKITvZtmOqHRi+JRgEfnzY5cPcHgy8S1orWR8RHQEp6OR+7RBIcIV2DVsjIhU7fEsw8F95gFU78C7b/XdWJ3aZQzu4UIhyHf9JN1CheZ/Jid0RkIEwJuGvcg3EtLj+VtcWjLkNXVCkynCrHTiQ/I5ox0/ODlJoE9xpxyRLOVsvPAGEKTvCt5wekondCmRQGEou5HUuiHAIxH/Vnt/OrNLdZ2NitwVkIAyfYgzCNp1mx47GLojagg3VxG4TSEFn9N3q1oRfOQRCnCOVun1sTuyO7PApxiD406OMzSQDgWQ2rxnSEXFwO6J3IFQzXaGVDcWIaAuGTzEGvqUaiG7pYuQw7w8jvOESrOhcPGQTu+3LFZf6cxv9FdjkGVVaM9sTuz0gE4tUEFF3jnE7Ir86MvQj4gAY+Z1RvYVYNL2nQARVaHRsj4hWIIPBmFikgsB/H2XUDvJy9dmQTuwuX64eWaJewubE7siOiXjxd1sNl1waEfsDCas/D8Wq1KG1wzqT9DUa8pTRAtpAONI9Pw+u0J5j2w5fGzAmWDpjzTGXL1dWO4Rb69wzIj5ux2Gnvy/iV6b9M5sjoj07Jlg6sUQNnIaLjNhRqJIM/cT+GJBoyFdGpSBORyodNV2hOcjGxD4YkIkDYIyXkQ1YfcTlwzy9aY377VBGOR4THWW6XDsrUKHpcYcd4y1AxhWpIKz2LO2J3Qojou5bkKtFbpnY+9nRnY9GTUWYyLRSdSnTE7stIBMGwrB0UrkO5jdeoj+T1F+A93a97caJve+tLoPfX5dKRwWUazuZnNgp2yEjO7YQhan/OgScJuoTOz4iSpo/cvuIWKCMaWH8i59TFJi3f5n6ItMjIhU7xhaiRL0LUQhae5yyHXFft7l9Yi/o5B4rVka+gLCRiXJ0qn+5xsDExE7XjrEWIGNlKphR873DEZFTp4FStdi9I2Int0uqjBmPsJkphdhsv1K1kWk7JlKA4V2IwqsF+CsJxRaQ+XUakGNiN0/s0RcZO8QdZZL84BS/Muw8EyMiHTu8LUCIFqog+IuTT8CI/movyFVPwhhSO1DuiYKOuHHIUGZ8YYfX1FJ1J5N2TCiiBsPL0jH5Snht1SGY23AJIhougXjrRrfdp9sHo5PbyNqZ4TBS6ajJclXRVLm6x5URka4dXv2AjM5XwkQF9sOf2vJM7rqLnbSD213QyV3GymM06Ma3WBk6Ra7WMfZBUEYZxr3R+R0y5K+tvyo7nP1fpWqRrEwtvD/U9+nmK7l7pZ3R/sjwCjznU4y9+VoJdoZ1O/KVD0bnddb8t3TPE89eL8GSA+UqQX0pJuxle2IvUMYcKUS5qciwjlQ6yqcYzZ5UgmGT5epeVw5z7wEwxuR1msbko6sGAzEwJVpBgBwTrJNjgltM2lGAxvYUorHt+WiMcFhcnuhkXAHqO6FYtcKnGFP5FKm6nbHj1QLlJa8C1XqvPKUYWbqf9v/YrMDSfi3XCDJLsKTaEkxwxckR8a4Mjd0pU8a9W4glDf/nvVOJl3T/b8bLVNzxRaq/TShCV00owlrGy9COcTLVYbKodmwh+o13gfI/3oXKPK8CVebL+XunMP1zlCgFATKMLylSJeUVY7xNxSreziIVT12E8g7KVLz9MjRhlwyNr5cp4xSFyoSl+FN8KN8dMpKRjGQkIxkJ4r78Pwv259NnjlZFAAAAAElFTkSuQmCC", "" + import.meta.url).href, b.className = "mjr-mfv-ch-icon", b.alt = "", b.setAttribute("aria-hidden", "true"), y.appendChild(b), n.appendChild(y);
let x = (e) => {
if (!e || e === "rgb") y.replaceChildren(b);
else {
- let t = yn[e] || "#e0e0e0", n = xn[e] || "500", r = bn[e] || e.toUpperCase(), i = document.createElement("span");
+ let t = Fn[e] || "#e0e0e0", n = Ln[e] || "500", r = In[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", t.element.appendChild(S);
+ S.className = "mjr-mfv-ch-popover", e.element.appendChild(S);
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 = [
+ let T = [
{
value: "rgb",
color: "#e0e0e0",
@@ -2219,8 +2245,8 @@ function wn(t) {
weight: "400",
label: "L"
}
- ], T = [];
- for (let e of ee) {
+ ], E = [];
+ for (let e of T) {
let t = document.createElement("option");
t.value = e.value, w.appendChild(t);
let n = document.createElement("button");
@@ -2230,40 +2256,40 @@ function wn(t) {
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), C.appendChild(n), T.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), E.push(n), e.value === v && n.classList.add("is-active");
}
- w.value = v, x(v), y.classList.toggle("is-on", v !== "rgb"), t._channelSelect = w, t._chBtn = y, t._chPopover = S;
- let te = () => {
- let e = y.getBoundingClientRect(), n = t.element.getBoundingClientRect();
- S.style.left = `${e.left - n.left}px`, S.style.top = `${e.bottom - n.top + 4}px`, S.classList.add("is-open"), y.setAttribute("aria-expanded", "true");
+ w.value = v, x(v), y.classList.toggle("is-on", v !== "rgb"), e._channelSelect = w, e._chBtn = y, e._chPopover = S;
+ let D = () => {
+ 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");
};
- t._closeChPopover = () => {
+ e._closeChPopover = () => {
S.classList.remove("is-open"), y.setAttribute("aria-expanded", "false");
- }, y.addEventListener("click", (e) => {
- e.stopPropagation(), S.classList.contains("is-open") ? t._closeChPopover() : (t._closeAllToolbarPopovers?.(), te());
- }), C.addEventListener("click", (e) => {
- let n = e.target.closest(".mjr-menu-item");
+ }, y.addEventListener("click", (t) => {
+ t.stopPropagation(), S.classList.contains("is-open") ? e._closeChPopover() : (e._closeAllToolbarPopovers?.(), D());
+ }), C.addEventListener("click", (t) => {
+ let n = t.target.closest(".mjr-menu-item");
if (!n) return;
let r = n.dataset.value;
- w.value = r ?? "", w.dispatchEvent(new Event("change", { bubbles: !0 })), T.forEach((e) => {
+ w.value = r ?? "", w.dispatchEvent(new Event("change", { bubbles: !0 })), E.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"), t._closeChPopover();
- }), t._closeAllToolbarPopovers = () => {
- t._closeChPopover?.(), t._closeGuidePopover?.(), t._closePinPopover?.(), t._closeFormatPopover?.(), t._closeGenDropdown?.();
- }, t._exposureCtl = n("Exposure (EV)", {
+ }), x(r), y.classList.toggle("is-on", r !== "rgb"), e._closeChPopover();
+ }), e._closeAllToolbarPopovers = () => {
+ e._closeChPopover?.(), e._closeGuidePopover?.(), e._closePinPopover?.(), e._closeFormatPopover?.(), e._closeGenDropdown?.();
+ }, e._exposureCtl = t("Exposure (EV)", {
min: -10,
max: 10,
step: .1,
- value: Number(t._exposureEV || 0)
- }), t._exposureCtl.out.textContent = `${Number(t._exposureEV || 0).toFixed(1)}EV`, t._exposureCtl.out.title = "Click to reset to 0 EV", t._exposureCtl.out.style.cursor = "pointer", t._exposureCtl.wrap.classList.toggle("is-active", (t._exposureEV || 0) !== 0), r.appendChild(t._exposureCtl.wrap), t._formatToggle = document.createElement("button"), t._formatToggle.type = "button", t._formatToggle.className = "mjr-icon-btn mjr-mfv-format-trigger", t._formatToggle.setAttribute("aria-haspopup", "dialog"), t._formatToggle.setAttribute("aria-expanded", "false"), t._formatToggle.setAttribute("aria-pressed", "false"), t._formatToggle.title = "Format mask", t._formatToggle.innerHTML = "", r.appendChild(t._formatToggle);
- let E = document.createElement("div");
- E.className = "mjr-mfv-format-popover", t.element.appendChild(E);
+ 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 O = document.createElement("div");
- O.className = "mjr-menu", O.style.cssText = "display:grid;gap:4px;", E.appendChild(O);
- let k = document.createElement("select");
- k.style.cssText = "position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;", E.appendChild(k);
- let ne = [
+ 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 = [
{
value: "off",
label: "Off"
@@ -2292,73 +2318,73 @@ function wn(t) {
value: "2.39",
label: "2.39"
}
- ], A = [], j = t._overlayMaskEnabled ? String(t._overlayFormat || "image") : "off";
- for (let e of ne) {
+ ], M = [], N = e._overlayMaskEnabled ? String(e._overlayFormat || "image") : "off";
+ for (let e of j) {
let t = document.createElement("option");
- t.value = e.value, k.appendChild(t);
+ t.value = e.value, A.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 === j ? "1" : "0", n.appendChild(r), n.appendChild(i), O.appendChild(n), A.push(n), e.value === j && n.classList.add("is-active");
+ 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");
}
- k.value = j;
- let M = document.createElement("div");
- M.className = "mjr-mfv-format-sep", E.appendChild(M);
- let N = document.createElement("div");
- N.className = "mjr-mfv-format-slider-row", E.appendChild(N);
- let re = document.createElement("span");
- re.className = "mjr-mfv-format-slider-label", re.textContent = "Opacity", N.appendChild(re), t._maskOpacityCtl = n("Mask opacity", {
+ A.value = N;
+ let ee = document.createElement("div");
+ ee.className = "mjr-mfv-format-sep", O.appendChild(ee);
+ let P = document.createElement("div");
+ P.className = "mjr-mfv-format-slider-row", O.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(t._overlayMaskOpacity ?? .65)
- }), N.appendChild(t._maskOpacityCtl.input), N.appendChild(t._maskOpacityCtl.out), t._formatSelect = k, t._formatPopover = E;
- let ie = () => {
- let e = t._formatToggle.getBoundingClientRect(), n = t.element.getBoundingClientRect();
- E.style.left = `${e.left - n.left}px`, E.style.top = `${e.bottom - n.top + 4}px`, E.classList.add("is-open"), t._formatToggle.setAttribute("aria-expanded", "true");
+ value: Number(e._overlayMaskOpacity ?? .65)
+ }), P.appendChild(e._maskOpacityCtl.input), P.appendChild(e._maskOpacityCtl.out), e._formatSelect = A, e._formatPopover = O;
+ let te = () => {
+ 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");
};
- t._closeFormatPopover = () => {
- E.classList.remove("is-open"), t._formatToggle.setAttribute("aria-expanded", "false");
- }, t._formatToggle.addEventListener("click", (e) => {
- e.stopPropagation(), E.classList.contains("is-open") ? t._closeFormatPopover() : (t._closeAllToolbarPopovers?.(), ie());
- }), O.addEventListener("click", (e) => {
- let n = e.target.closest(".mjr-menu-item");
+ e._closeFormatPopover = () => {
+ O.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?.(), te());
+ }), k.addEventListener("click", (t) => {
+ let n = t.target.closest(".mjr-menu-item");
if (!n) return;
let r = n.dataset.value;
- k.value = r ?? "", k.dispatchEvent(new Event("change", { bubbles: !0 })), A.forEach((e) => {
+ A.value = r ?? "", A.dispatchEvent(new Event("change", { bubbles: !0 })), M.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";
- }), t._closeFormatPopover();
+ }), e._closeFormatPopover();
});
- let ae = document.createElement("div");
- ae.className = "mjr-mfv-toolbar-sep", ae.setAttribute("aria-hidden", "true"), r.appendChild(ae), t._liveBtn = document.createElement("button"), t._liveBtn.type = "button", t._liveBtn.className = "mjr-icon-btn", t._liveBtn.innerHTML = "", t._liveBtn.setAttribute("aria-pressed", "false"), D(t._liveBtn, e("tooltip.liveStreamOff", "Live Stream: OFF - click to follow final generation outputs"), "L"), r.appendChild(t._liveBtn), t._previewBtn = document.createElement("button"), t._previewBtn.type = "button", t._previewBtn.className = "mjr-icon-btn", t._previewBtn.innerHTML = "", t._previewBtn.setAttribute("aria-pressed", "false"), D(t._previewBtn, e("tooltip.previewStreamOff", "KSampler Preview: OFF - click to stream sampler denoising frames"), "K"), r.appendChild(t._previewBtn), t._nodeStreamBtn = document.createElement("button"), t._nodeStreamBtn.type = "button", t._nodeStreamBtn.className = "mjr-icon-btn", t._nodeStreamBtn.innerHTML = "", t._nodeStreamBtn.setAttribute("aria-pressed", "false"), D(t._nodeStreamBtn, e("tooltip.nodeStreamOff", "Node Stream: OFF - click to follow selected node previews, including ImageOps live canvases"), "N"), r.appendChild(t._nodeStreamBtn), t._genBtn = document.createElement("button"), t._genBtn.type = "button", t._genBtn.className = "mjr-icon-btn", t._genBtn.setAttribute("aria-pressed", String(!!t._genSidebarEnabled));
- let P = document.createElement("i");
- P.className = "pi pi-info-circle", P.setAttribute("aria-hidden", "true"), t._genBtn.appendChild(P), r.appendChild(t._genBtn), t._updateGenBtnUI(), t._popoutBtn = document.createElement("button"), t._popoutBtn.type = "button", t._popoutBtn.className = "mjr-icon-btn";
- let oe = e("tooltip.popOutViewer", "Pop out viewer to separate window");
- t._popoutBtn.title = oe, t._popoutBtn.setAttribute("aria-label", oe), t._popoutBtn.setAttribute("aria-pressed", "false");
- let se = document.createElement("i");
- se.className = "pi pi-external-link", se.setAttribute("aria-hidden", "true"), t._popoutBtn.appendChild(se), r.appendChild(t._popoutBtn), t._captureBtn = document.createElement("button"), t._captureBtn.type = "button", t._captureBtn.className = "mjr-icon-btn";
- let F = e("tooltip.captureView", "Save view as image");
- t._captureBtn.title = F, t._captureBtn.setAttribute("aria-label", F);
- let L = document.createElement("i");
- L.className = "pi pi-download", L.setAttribute("aria-hidden", "true"), t._captureBtn.appendChild(L), r.appendChild(t._captureBtn);
- let R = document.createElement("div");
- R.className = "mjr-mfv-toolbar-sep", R.style.marginLeft = "auto", R.setAttribute("aria-hidden", "true"), r.appendChild(R), t._settingsBtn = document.createElement("button"), t._settingsBtn.type = "button", t._settingsBtn.className = "mjr-icon-btn mjr-mfv-settings-btn";
- let z = e("tooltip.nodeParams", "Node Parameters");
- t._settingsBtn.title = z, t._settingsBtn.setAttribute("aria-label", z), t._settingsBtn.setAttribute("aria-pressed", "false");
- let B = document.createElement("i");
- B.className = "pi pi-sliders-h", B.setAttribute("aria-hidden", "true"), t._settingsBtn.appendChild(B), r.appendChild(t._settingsBtn), t._runHandle = rn(), r.appendChild(t._runHandle.el), t._majoorSettingsBtn = document.createElement("button"), t._majoorSettingsBtn.type = "button", t._majoorSettingsBtn.className = "mjr-icon-btn mjr-mfv-majoor-settings-btn";
- let ce = e("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings");
- t._majoorSettingsBtn.title = ce, t._majoorSettingsBtn.setAttribute("aria-label", ce);
+ let re = document.createElement("div");
+ re.className = "mjr-mfv-toolbar-sep", re.setAttribute("aria-hidden", "true"), n.appendChild(re), e._liveBtn = document.createElement("button"), e._liveBtn.type = "button", e._liveBtn.className = "mjr-icon-btn", e._liveBtn.innerHTML = "", e._liveBtn.setAttribute("aria-pressed", "false"), ne(e._liveBtn, p("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"), ne(e._previewBtn, p("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"), ne(e._nodeStreamBtn, p("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 ie = document.createElement("i");
+ ie.className = "pi pi-info-circle", ie.setAttribute("aria-hidden", "true"), e._genBtn.appendChild(ie), n.appendChild(e._genBtn), e._updateGenBtnUI(), e._popoutBtn = document.createElement("button"), e._popoutBtn.type = "button", e._popoutBtn.className = "mjr-icon-btn";
+ let ae = p("tooltip.popOutViewer", "Pop out viewer to separate window");
+ e._popoutBtn.title = ae, e._popoutBtn.setAttribute("aria-label", ae), e._popoutBtn.setAttribute("aria-pressed", "false");
+ let oe = document.createElement("i");
+ oe.className = "pi pi-external-link", oe.setAttribute("aria-hidden", "true"), e._popoutBtn.appendChild(oe), n.appendChild(e._popoutBtn), e._captureBtn = document.createElement("button"), e._captureBtn.type = "button", e._captureBtn.className = "mjr-icon-btn";
+ let se = p("tooltip.captureView", "Save view as image");
+ e._captureBtn.title = se, e._captureBtn.setAttribute("aria-label", se);
+ let I = document.createElement("i");
+ I.className = "pi pi-download", I.setAttribute("aria-hidden", "true"), e._captureBtn.appendChild(I), n.appendChild(e._captureBtn);
+ let L = document.createElement("div");
+ L.className = "mjr-mfv-toolbar-sep", L.style.marginLeft = "auto", L.setAttribute("aria-hidden", "true"), n.appendChild(L), e._settingsBtn = document.createElement("button"), e._settingsBtn.type = "button", e._settingsBtn.className = "mjr-icon-btn mjr-mfv-settings-btn";
+ let ce = p("tooltip.nodeParams", "Node Parameters");
+ e._settingsBtn.title = ce, e._settingsBtn.setAttribute("aria-label", ce), e._settingsBtn.setAttribute("aria-pressed", "false");
let le = document.createElement("i");
- return le.className = "pi pi-cog", le.setAttribute("aria-hidden", "true"), t._majoorSettingsBtn.appendChild(le), r.appendChild(t._majoorSettingsBtn), t._handleDocClick = (e) => {
- let n = e?.target;
- t._chPopover?.classList?.contains("is-open") && !t._chBtn?.contains?.(n) && !t._chPopover.contains(n) && t._closeChPopover?.(), t._guidePopover?.classList?.contains("is-open") && !t._guideBtn?.contains?.(n) && !t._guidePopover.contains(n) && t._closeGuidePopover?.(), t._pinPopover?.classList?.contains("is-open") && !t._pinBtn?.contains?.(n) && !t._pinPopover.contains(n) && t._closePinPopover?.(), t._formatPopover?.classList?.contains("is-open") && !t._formatToggle?.contains?.(n) && !t._formatPopover.contains(n) && t._closeFormatPopover?.(), n?.closest?.(".mjr-mfv-idrop") || t.element?.querySelectorAll?.(".mjr-mfv-idrop-menu.is-open").forEach((e) => e.classList.remove("is-open"));
- }, t._bindDocumentUiHandlers(), r;
+ le.className = "pi pi-sliders-h", le.setAttribute("aria-hidden", "true"), e._settingsBtn.appendChild(le), n.appendChild(e._settingsBtn), e._runHandle = Tn(), 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 ue = p("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings");
+ e._majoorSettingsBtn.title = ue, e._majoorSettingsBtn.setAttribute("aria-label", ue);
+ let R = document.createElement("i");
+ return R.className = "pi pi-cog", R.setAttribute("aria-hidden", "true"), e._majoorSettingsBtn.appendChild(R), 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 Tn(e) {
+function Vn(e) {
try {
e._btnAC?.abort();
} catch (e) {
@@ -2367,7 +2393,7 @@ function Tn(e) {
e._btnAC = new AbortController();
let t = e._btnAC.signal;
e._closeBtn?.addEventListener("click", () => {
- e._dispatchControllerAction("close", v.MFV_CLOSE);
+ e._dispatchControllerAction("close", j.MFV_CLOSE);
}, { signal: t }), e._modeSelect?.addEventListener("change", () => {
let t = e._modeSelect?.value;
t && e.setMode(t);
@@ -2375,21 +2401,21 @@ function Tn(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 !== I.GRID && e.setMode(I.GRID) : e._pinnedSlots.size > 0 && e._mode === I.SIMPLE && e.setMode(I.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 !== z.GRID && e.setMode(z.GRID) : e._pinnedSlots.size > 0 && e._mode === z.SIMPLE && e.setMode(z.AB), e._updatePinUI());
}, { signal: t }), e._liveBtn?.addEventListener("click", () => {
- e._dispatchControllerAction("toggleLive", v.MFV_LIVE_TOGGLE);
+ e._dispatchControllerAction("toggleLive", j.MFV_LIVE_TOGGLE);
}, { signal: t }), e._previewBtn?.addEventListener("click", () => {
- e._dispatchControllerAction("togglePreview", v.MFV_PREVIEW_TOGGLE);
+ e._dispatchControllerAction("togglePreview", j.MFV_PREVIEW_TOGGLE);
}, { signal: t }), e._nodeStreamBtn?.addEventListener("click", () => {
- e._dispatchControllerAction("toggleNodeStream", v.MFV_NODESTREAM_TOGGLE);
+ e._dispatchControllerAction("toggleNodeStream", j.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", v.MFV_POPOUT);
+ e._dispatchControllerAction("popOut", j.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?.(), A();
+ t.stopPropagation(), e._closeAllToolbarPopovers?.(), oe();
}, { 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", () => {
@@ -2407,15 +2433,15 @@ function Tn(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 En(e, t) {
+function Hn(e, t) {
e._settingsBtn && (e._settingsBtn.classList.toggle("active", !!t), e._settingsBtn.setAttribute("aria-pressed", String(!!t)));
}
-function Dn(e) {
+function Un(e) {
if (!e._contentWrapper) return;
- let t = l.MFV_SIDEBAR_POSITION || "right";
+ let t = _.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 On(e) {
+function Wn(e) {
if (!e._handleDocClick) return;
let t = e.element?.ownerDocument || document;
if (e._docClickHost !== t) {
@@ -2428,7 +2454,7 @@ function On(e) {
e._docAC = new AbortController(), t.addEventListener("click", e._handleDocClick, { signal: e._docAC.signal }), e._docClickHost = t;
}
}
-function kn(e) {
+function Gn(e) {
try {
e._docAC?.abort();
} catch (e) {
@@ -2436,18 +2462,18 @@ function kn(e) {
}
e._docAC = new AbortController(), e._docClickHost = null;
}
-function An(e) {
+function Kn(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 jn(e) {
+function qn(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 Jn(e) {
let t = String(e || "").trim().toLowerCase();
if (!t) return 0;
if (t.endsWith("m")) {
@@ -2461,10 +2487,10 @@ function Mn(e) {
let n = Number.parseFloat(t);
return Number.isFinite(n) ? n : 0;
}
-function Nn(e, t) {
+function Yn(e, t) {
if (!t) return {};
try {
- let e = t.geninfo ? { geninfo: t.geninfo } : t.metadata || t.metadata_raw || t, n = ae(e) || null, r = {
+ let e = t.geninfo ? { geninfo: t.geninfo } : t.metadata || t.metadata_raw || t, n = ue(e) || null, r = {
prompt: "",
seed: "",
model: "",
@@ -2476,17 +2502,17 @@ function Nn(e, t) {
genTime: ""
};
if (n && typeof n == "object") {
- n.prompt && (r.prompt = P(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 = _n(n), a = gn(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 = P(String(e.prompt || "")));
+ n.prompt && (r.prompt = R(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 = Nn(n), a = Mn(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 = R(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 = jn(Number(o) / 1e3)), r;
+ return o && Number.isFinite(Number(o)) && o > 0 && o < 864e5 && (r.genTime = qn(Number(o) / 1e3)), r;
}
} catch (e) {
console.debug?.("[MFV] geninfo normalize failed", e);
}
let n = t?.metadata || t?.metadata_raw || t || {}, r = {
- prompt: P(String(n?.prompt || n?.positive || "")),
+ prompt: R(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 || "",
@@ -2496,9 +2522,9 @@ function Nn(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 = jn(Number(i) / 1e3)), r;
+ return i && Number.isFinite(Number(i)) && i > 0 && i < 864e5 && (r.genTime = qn(Number(i) / 1e3)), r;
}
-function Pn(e, t) {
+function Xn(e, t) {
let n = e._getGenFields(t);
if (!n) return null;
let r = document.createDocumentFragment();
@@ -2523,7 +2549,7 @@ function Pn(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 = Jn(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);
@@ -2534,30 +2560,30 @@ function Pn(e, t) {
}
//#endregion
//#region ui/features/viewer/floatingViewerMode.ts
-function Fn(e) {
+function Zn(e) {
try {
e._controller?.onModeChanged?.(e._mode);
} catch (e) {
console.debug?.(e);
}
}
-function In(e) {
+function Qn(e) {
let t = [
- I.SIMPLE,
- I.AB,
- I.SIDE,
- I.GRID,
- I.GRAPH
+ z.SIMPLE,
+ z.AB,
+ z.SIDE,
+ z.GRID,
+ z.GRAPH
];
e._mode = t[(t.indexOf(e._mode) + 1) % t.length], e._updateModeBtnUI(), e._refresh(), e._notifyModeChanged();
}
-function Ln(e, t) {
- Object.values(I).includes(t) && (e._mode = t, e._updateModeBtnUI(), e._refresh(), e._notifyModeChanged());
+function $n(e, t) {
+ Object.values(z).includes(t) && (e._mode = t, e._updateModeBtnUI(), e._refresh(), e._notifyModeChanged());
}
-function Rn(e) {
+function er(e) {
return e._pinnedSlots;
}
-function zn(e) {
+function tr(e) {
if (e._pinBtns) {
for (let t of [
"A",
@@ -2573,50 +2599,50 @@ function zn(e) {
e._pinBtn?.classList.toggle("is-on", (e._pinnedSlots?.size ?? 0) > 0);
}
}
-function Bn(e) {
+function nr(e) {
if (!e._modeBtn) return;
let { icon: t = "pi-image", label: n = "" } = {
- [I.SIMPLE]: {
+ [z.SIMPLE]: {
icon: "pi-image",
label: "Mode: Simple - click to switch"
},
- [I.AB]: {
+ [z.AB]: {
icon: "pi-clone",
label: "Mode: A/B Compare - click to switch"
},
- [I.SIDE]: {
+ [z.SIDE]: {
icon: "pi-table",
label: "Mode: Side-by-Side - click to switch"
},
- [I.GRID]: {
+ [z.GRID]: {
icon: "pi-th-large",
label: "Mode: Grid Compare (up to 4) - click to switch"
},
- [I.GRAPH]: {
+ [z.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 !== I.SIMPLE), e._modeDrop?.selectItem?.(e._mode);
+ }[e._mode] || {}, r = N(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 !== z.SIMPLE), e._modeDrop?.selectItem?.(e._mode);
}
-function Vn(t, n) {
- if (!t._liveBtn) return;
- let r = !!n;
- t._liveBtn.classList.toggle("mjr-live-active", r);
- let i = w(r ? e("tooltip.liveStreamOn", "Live Stream: ON - follows final generation outputs after execution") : e("tooltip.liveStreamOff", "Live Stream: OFF - click to follow final generation outputs"), "L");
- t._liveBtn.setAttribute("aria-pressed", String(r)), t._liveBtn.setAttribute("aria-label", i);
- let a = document.createElement("i");
- a.className = r ? "pi pi-circle-fill" : "pi pi-circle", a.setAttribute("aria-hidden", "true"), t._liveBtn.replaceChildren(a), t._liveBtn.title = i;
-}
-function Hn(t, n) {
- if (t._previewActive = !!n, !t._previewBtn) return;
- t._previewBtn.classList.toggle("mjr-preview-active", t._previewActive);
- let r = w(t._previewActive ? e("tooltip.previewStreamOn", "KSampler Preview: ON - streams sampler denoising frames during execution") : e("tooltip.previewStreamOff", "KSampler Preview: OFF - click to stream sampler denoising frames"), "K");
- t._previewBtn.setAttribute("aria-pressed", String(t._previewActive)), t._previewBtn.setAttribute("aria-label", r);
+function rr(e, t) {
+ if (!e._liveBtn) return;
+ let n = !!t;
+ e._liveBtn.classList.toggle("mjr-live-active", n);
+ let r = N(n ? p("tooltip.liveStreamOn", "Live Stream: ON - follows final generation outputs after execution") : p("tooltip.liveStreamOff", "Live Stream: OFF - click to follow final generation outputs"), "L");
+ e._liveBtn.setAttribute("aria-pressed", String(n)), e._liveBtn.setAttribute("aria-label", r);
let i = document.createElement("i");
- i.className = t._previewActive ? "pi pi-eye" : "pi pi-eye-slash", i.setAttribute("aria-hidden", "true"), t._previewBtn.replaceChildren(i), t._previewBtn.title = r, t._previewActive || t._revokePreviewBlob();
+ i.className = n ? "pi pi-circle-fill" : "pi pi-circle", i.setAttribute("aria-hidden", "true"), e._liveBtn.replaceChildren(i), e._liveBtn.title = r;
}
-function Un(e, t, n = {}) {
+function ir(e, t) {
+ if (e._previewActive = !!t, !e._previewBtn) return;
+ e._previewBtn.classList.toggle("mjr-preview-active", e._previewActive);
+ let n = N(e._previewActive ? p("tooltip.previewStreamOn", "KSampler Preview: ON - streams sampler denoising frames during execution") : p("tooltip.previewStreamOff", "KSampler Preview: OFF - click to stream sampler denoising frames"), "K");
+ e._previewBtn.setAttribute("aria-pressed", String(e._previewActive)), e._previewBtn.setAttribute("aria-label", n);
+ let r = document.createElement("i");
+ r.className = e._previewActive ? "pi pi-eye" : "pi pi-eye-slash", r.setAttribute("aria-hidden", "true"), e._previewBtn.replaceChildren(r), e._previewBtn.title = n, e._previewActive || e._revokePreviewBlob();
+}
+function ar(e, t, n = {}) {
if (!t || !(t instanceof Blob)) return;
e._revokePreviewBlob();
let r = URL.createObjectURL(t);
@@ -2628,9 +2654,9 @@ function Un(e, t, n = {}) {
_isPreview: !0,
_sourceLabel: n?.sourceLabel || null
};
- if (e._mode === I.AB || e._mode === I.SIDE || e._mode === I.GRID) {
+ if (e._mode === z.AB || e._mode === z.SIDE || e._mode === z.GRID) {
let t = e.getPinnedSlots();
- if (e._mode === I.GRID) {
+ if (e._mode === z.GRID) {
let n = [
"A",
"B",
@@ -2639,10 +2665,10 @@ function Un(e, t, n = {}) {
].find((e) => !t.has(e)) || "A";
e[`_media${n}`] = i;
} else t.has("B") ? e._mediaA = i : e._mediaB = i;
- } else e._mediaA = i, e._resetMfvZoom(), e._mode !== I.SIMPLE && (e._mode = I.SIMPLE, e._updateModeBtnUI());
+ } else e._mediaA = i, e._resetMfvZoom(), e._mode !== z.SIMPLE && (e._mode = z.SIMPLE, e._updateModeBtnUI());
++e._refreshGen, e._refresh();
}
-function Wn(e) {
+function or(e) {
if (e._previewBlobUrl) {
try {
URL.revokeObjectURL(e._previewBlobUrl);
@@ -2650,18 +2676,18 @@ function Wn(e) {
e._previewBlobUrl = null;
}
}
-function Gn(t, n) {
- if (t._nodeStreamActive = !!n, t._nodeStreamActive || t.setNodeStreamSelection?.(null), !t._nodeStreamBtn) return;
- t._nodeStreamBtn.classList.toggle("mjr-nodestream-active", t._nodeStreamActive);
- let r = w(t._nodeStreamActive ? e("tooltip.nodeStreamOn", "Node Stream: ON - follows the selected node preview when frontend media exists") : e("tooltip.nodeStreamOff", "Node Stream: OFF - click to follow selected node previews, including ImageOps live canvases"), "N");
- t._nodeStreamBtn.setAttribute("aria-pressed", String(t._nodeStreamActive)), t._nodeStreamBtn.setAttribute("aria-label", r);
- let i = document.createElement("i");
- i.className = "pi pi-sitemap", i.setAttribute("aria-hidden", "true"), t._nodeStreamBtn.replaceChildren(i), t._nodeStreamBtn.title = r;
+function sr(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 = N(e._nodeStreamActive ? p("tooltip.nodeStreamOn", "Node Stream: ON - follows the selected node preview when frontend media exists") : p("tooltip.nodeStreamOff", "Node Stream: OFF - click to follow selected node previews, including ImageOps live canvases"), "N");
+ e._nodeStreamBtn.setAttribute("aria-pressed", String(e._nodeStreamActive)), e._nodeStreamBtn.setAttribute("aria-label", n);
+ let r = document.createElement("i");
+ r.className = "pi pi-sitemap", r.setAttribute("aria-hidden", "true"), e._nodeStreamBtn.replaceChildren(r), e._nodeStreamBtn.title = n;
}
//#endregion
//#region ui/features/viewer/floatingViewerPopout.ts
-var Kn = /* @__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 qn() {
+var cr = /* @__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 lr() {
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;
@@ -2672,7 +2698,7 @@ function qn() {
}
return !1;
}
-function Q(e, t = null, n = "info") {
+function Z(e, t = null, n = "info") {
let r = {
stage: String(e || "unknown"),
detail: t,
@@ -2690,10 +2716,10 @@ function Q(e, t = null, n = "info") {
console.debug?.(e);
}
}
-function Jn(e, ...t) {
+function ur(e, ...t) {
return Array.from(new Set([String(e || ""), ...t].join(" ").split(/\s+/).filter(Boolean))).join(" ");
}
-function Yn(e, t) {
+function dr(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 {
@@ -2703,7 +2729,7 @@ function Yn(e, t) {
}
}
}
-function Xn(e, t) {
+function fr(e, t) {
if (!e || !t?.style) return;
let n = typeof window < "u" && window?.getComputedStyle || globalThis?.getComputedStyle;
if (typeof n != "function") return;
@@ -2714,7 +2740,7 @@ function Xn(e, t) {
console.debug?.(e);
}
if (r) {
- for (let e of Kn) try {
+ for (let e of cr) try {
let n = String(r.getPropertyValue?.(e) || "").trim();
n && t.style.setProperty(e, n);
} catch (e) {
@@ -2728,12 +2754,12 @@ function Xn(e, t) {
}
}
}
-function Zn(e) {
+function pr(e) {
if (!e?.documentElement || !e?.body || !document?.documentElement) return;
let t = document.documentElement, n = document.body, r = e.documentElement, i = e.body;
- r.className = Jn(t.className, "mjr-mfv-popout-document"), i.className = Jn(n?.className, "mjr-mfv-popout-body"), Yn(t, r), Yn(n, i), Xn(t, r), Xn(n, i), t?.lang && (r.lang = t.lang), t?.dir && (r.dir = t.dir);
+ r.className = ur(t.className, "mjr-mfv-popout-document"), i.className = ur(n?.className, "mjr-mfv-popout-body"), dr(t, r), dr(n, i), fr(t, r), fr(n, i), t?.lang && (r.lang = t.lang), t?.dir && (r.dir = t.dir);
}
-function Qn(e) {
+function mr(e) {
if (!e?.body) return null;
try {
(e.getElementById?.("mjr-mfv-popout-root"))?.remove?.();
@@ -2743,10 +2769,10 @@ function Qn(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 $(e) {
+function Q(e) {
e._resetGenDropdownForCurrentDocument(), e._rebindControlHandlers(), e._bindPanelInteractions(), e._bindDocumentUiHandlers(), e._unbindLayoutObserver?.(), e._bindLayoutObserver?.(), e._refresh?.(), e._updatePopoutBtnUI();
}
-function $n(e, t) {
+function hr(e, t) {
if (!e.element) return;
let n = !!t;
if (e._desktopExpanded === n) return;
@@ -2756,29 +2782,29 @@ function $n(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, $(e), Q("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, Q(e), Z("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, $(e), Q("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, Q(e), Z("electron-in-app-restored", null);
}
-function er(n, r) {
- n._desktopPopoutUnsupported = !0, Q("electron-in-app-fallback", { message: r?.message || String(r || "unknown error") }, "warn"), n._setDesktopExpanded(!0);
+function gr(t, n) {
+ t._desktopPopoutUnsupported = !0, Z("electron-in-app-fallback", { message: n?.message || String(n || "unknown error") }, "warn"), t._setDesktopExpanded(!0);
try {
- t(e("toast.popoutElectronInAppFallback", "Desktop PiP is unavailable here. Viewer expanded inside the app instead."), "warning", 4500);
+ e(p("toast.popoutElectronInAppFallback", "Desktop PiP is unavailable here. Viewer expanded inside the app instead."), "warning", 4500);
} catch (e) {
console.debug?.(e);
}
}
-function tr(e, t, n, r, i) {
- return Q("electron-popup-fallback-attempt", { reason: i?.message || String(i || "unknown") }, "warn"), e._fallbackPopout(t, n, r), e._popoutWindow ? (e._desktopPopoutUnsupported = !1, Q("electron-popup-fallback-opened", null), !0) : !1;
+function _r(e, t, n, r, i) {
+ return Z("electron-popup-fallback-attempt", { reason: i?.message || String(i || "unknown") }, "warn"), e._fallbackPopout(t, n, r), e._popoutWindow ? (e._desktopPopoutUnsupported = !1, Z("electron-popup-fallback-opened", null), !0) : !1;
}
-function nr(e) {
+function vr(e) {
if (e._isPopped || !e.element) return;
let t = e.element;
e._stopEdgeResize();
- let n = qn(), 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);
- if (Q("start", {
+ let n = lr(), 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);
+ if (Z("start", {
isElectronHost: n,
hasDocumentPiP: r,
userAgent: i,
@@ -2786,22 +2812,22 @@ function nr(e) {
height: o,
desktopPopoutUnsupported: e._desktopPopoutUnsupported
}), n && e._desktopPopoutUnsupported) {
- Q("electron-in-app-fallback-reuse", null), e._setDesktopExpanded(!0);
+ Z("electron-in-app-fallback-reuse", null), e._setDesktopExpanded(!0);
return;
}
- if (!(n && (Q("electron-popup-request", {
+ if (!(n && (Z("electron-popup-request", {
width: a,
height: o
}), e._tryElectronPopupFallback(t, a, o, /* @__PURE__ */ Error("Desktop popup requested"))))) {
if (n && "documentPictureInPicture" in window) {
- Q("electron-pip-request", {
+ Z("electron-pip-request", {
width: a,
height: o
}), window.documentPictureInPicture.requestWindow({
width: a,
height: o
}).then((n) => {
- Q("electron-pip-opened", { hasDocument: !!n?.document }), e._popoutWindow = n, e._isPopped = !0, e._popoutRestoreGuard = !1;
+ Z("electron-pip-opened", { hasDocument: !!n?.document }), e._popoutWindow = n, e._isPopped = !0, e._popoutRestoreGuard = !1;
try {
e._popoutAC?.abort();
} catch (e) {
@@ -2812,16 +2838,16 @@ function nr(e) {
e._popoutCloseHandler = i;
let a = n.document;
a.title = "Majoor Viewer", e._installPopoutStyles(a);
- let o = Qn(a);
+ let o = mr(a);
if (!o) {
e._activateDesktopExpandedFallback(/* @__PURE__ */ Error("Popup root creation failed"));
return;
}
try {
let e = typeof a.adoptNode == "function" ? a.adoptNode(t) : t;
- o.appendChild(e), Q("electron-pip-adopted", { usedAdoptNode: typeof a.adoptNode == "function" });
+ o.appendChild(e), Z("electron-pip-adopted", { usedAdoptNode: typeof a.adoptNode == "function" });
} catch (t) {
- Q("electron-pip-adopt-failed", { message: t?.message || String(t) }, "warn"), console.warn("[MFV] PiP adoptNode failed", t), e._isPopped = !1, e._popoutWindow = null;
+ Z("electron-pip-adopt-failed", { message: t?.message || String(t) }, "warn"), console.warn("[MFV] PiP adoptNode failed", t), e._isPopped = !1, e._popoutWindow = null;
try {
n.close();
} catch (e) {
@@ -2830,36 +2856,36 @@ function nr(e) {
e._activateDesktopExpandedFallback(t);
return;
}
- t.classList.add("is-visible"), e.isVisible = !0, $(e), Q("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, Q(e), Z("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 });
}).catch((t) => {
- Q("electron-pip-request-failed", { message: t?.message || String(t) }, "warn"), e._activateDesktopExpandedFallback(t);
+ Z("electron-pip-request-failed", { message: t?.message || String(t) }, "warn"), e._activateDesktopExpandedFallback(t);
});
return;
}
if (n) {
- Q("electron-no-pip-api", { hasDocumentPiP: r }), e._activateDesktopExpandedFallback(/* @__PURE__ */ Error("Document Picture-in-Picture unavailable after popup failure"));
+ Z("electron-no-pip-api", { hasDocumentPiP: r }), e._activateDesktopExpandedFallback(/* @__PURE__ */ Error("Document Picture-in-Picture unavailable after popup failure"));
return;
}
- Q("browser-fallback-popup", {
+ Z("browser-fallback-popup", {
width: a,
height: o
}), e._fallbackPopout(t, a, o);
}
}
-function rr(e, t, n, r) {
- Q("browser-popup-open", {
+function yr(e, t, n, r) {
+ Z("browser-popup-open", {
width: n,
height: r
});
let i = `width=${n},height=${r},left=${(window.screenX || window.screenLeft) + Math.round((window.outerWidth - n) / 2)},top=${(window.screenY || window.screenTop) + Math.round((window.outerHeight - r) / 2)},resizable=yes,scrollbars=no,toolbar=no,menubar=no,location=no,status=no`, a = window.open("about:blank", "_mjr_viewer", i);
if (!a) {
- Q("browser-popup-blocked", null, "warn"), console.warn("[MFV] Pop-out blocked - allow popups for this site.");
+ Z("browser-popup-blocked", null, "warn"), console.warn("[MFV] Pop-out blocked - allow popups for this site.");
return;
}
- Q("browser-popup-opened", { hasDocument: !!a?.document }), e._popoutWindow = a, e._isPopped = !0, e._popoutRestoreGuard = !1;
+ Z("browser-popup-opened", { hasDocument: !!a?.document }), e._popoutWindow = a, e._isPopped = !0, e._popoutRestoreGuard = !1;
try {
e._popoutAC?.abort();
} catch (e) {
@@ -2877,7 +2903,7 @@ function rr(e, t, n, r) {
}
if (!n) return;
n.title = "Majoor Viewer", e._installPopoutStyles(n);
- let r = Qn(n);
+ let r = mr(n);
if (r) {
try {
r.appendChild(n.adoptNode(t));
@@ -2885,7 +2911,7 @@ function rr(e, t, n, r) {
console.warn("[MFV] adoptNode failed", e);
return;
}
- t.classList.add("is-visible"), e.isVisible = !0, $(e);
+ t.classList.add("is-visible"), e.isVisible = !0, Q(e);
}
};
try {
@@ -2903,7 +2929,7 @@ function rr(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 ir(e) {
+function br(e) {
if (e._popoutCloseTimer != null) {
try {
window.clearInterval(e._popoutCloseTimer);
@@ -2913,7 +2939,7 @@ function ir(e) {
e._popoutCloseTimer = null;
}
}
-function ar(e) {
+function xr(e) {
e._clearPopoutCloseWatch(), e._popoutCloseTimer = window.setInterval(() => {
if (!e._isPopped) {
e._clearPopoutCloseWatch();
@@ -2923,7 +2949,7 @@ function ar(e) {
(!t || t.closed) && (e._clearPopoutCloseWatch(), e._schedulePopInFromPopupClose());
}, 250);
}
-function or(e) {
+function Sr(e) {
!e._isPopped || e._popoutRestoreGuard || (e._popoutRestoreGuard = !0, window.setTimeout(() => {
try {
e.popIn({ closePopupWindow: !1 });
@@ -2932,14 +2958,14 @@ function or(e) {
}
}, 0));
}
-function sr(e, t) {
+function Cr(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);
}
- Zn(t);
+ pr(t);
try {
let e = document.documentElement.style.cssText;
if (e) {
@@ -2963,7 +2989,7 @@ function sr(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 cr(e, { closePopupWindow: t = !0 } = {}) {
+function wr(e, { closePopupWindow: t = !0 } = {}) {
if (e._desktopExpanded) {
e._setDesktopExpanded(!1);
return;
@@ -2983,23 +3009,23 @@ function cr(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, $(e), t) try {
+ if (document.body.appendChild(r), r.classList.add("is-visible"), r.setAttribute("aria-hidden", "false"), e.isVisible = !0, Q(e), t) try {
n?.close();
} catch (e) {
console.debug?.(e);
}
e._popoutWindow = null;
}
-function lr(t) {
- if (!t._popoutBtn) return;
- let n = t._isPopped || t._desktopExpanded;
- t.element && t.element.classList.toggle("mjr-mfv--popped", n), t._popoutBtn.classList.toggle("mjr-popin-active", n);
- let r = t._popoutBtn.querySelector("i") || document.createElement("i"), i = n ? e("tooltip.popInViewer", "Return to floating panel") : e("tooltip.popOutViewer", "Pop out viewer to separate window");
- r.className = n ? "pi pi-sign-in" : "pi pi-external-link", t._popoutBtn.title = i, t._popoutBtn.setAttribute("aria-label", i), t._popoutBtn.setAttribute("aria-pressed", String(n)), t._popoutBtn.contains(r) || t._popoutBtn.replaceChildren(r);
+function Tr(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 ? p("tooltip.popInViewer", "Return to floating panel") : p("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);
}
//#endregion
//#region ui/features/viewer/floatingViewerPanel.ts
-function ur(e) {
+function Er(e) {
return {
n: "ns-resize",
s: "ns-resize",
@@ -3011,12 +3037,12 @@ function ur(e) {
sw: "nesw-resize"
}[e] || "";
}
-function dr(e, t, n) {
+function Dr(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 fr(e) {
+function Or(e) {
if (e.element) {
try {
e._resizeWindowCleanup?.();
@@ -3031,7 +3057,7 @@ function fr(e) {
e._resizeState = null, e.element.classList.remove("mjr-mfv--resizing"), e.element.style.cursor = "";
}
}
-function pr(e) {
+function kr(e) {
if (e.element) {
e._stopEdgeResize();
try {
@@ -3042,7 +3068,7 @@ function pr(e) {
e._panelAC = new AbortController(), e._initEdgeResize(e.element), e._initDrag(e.element.querySelector(".mjr-mfv-header"));
}
}
-function mr(e, t) {
+function Ar(e, t) {
if (!t) return;
let n = (t) => {
if (!e.element || e._isPopped) return "";
@@ -3108,7 +3134,7 @@ function mr(e, t) {
!e._resizeState && e.element && (e.element.style.cursor = "");
}, { signal: r });
}
-function hr(e, t) {
+function jr(e, t) {
if (!t) return;
let n = e._panelAC?.signal, r = null;
t.addEventListener("pointerdown", (n) => {
@@ -3136,15 +3162,15 @@ function hr(e, t) {
}
//#endregion
//#region ui/features/viewer/floatingViewerCapture.ts
-async function gr(e, t, n, r, i, a, o, s) {
+async function Mr(e, t, n, r, i, a, o, s) {
if (!n) return;
- let c = V(n), l = null;
+ let c = B(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 = Se(n);
+ let e = Me(n);
if (!e) return;
l = await new Promise((t) => {
let n = new Image();
@@ -3157,7 +3183,7 @@ async function gr(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 _r(e, t, n, r) {
+function Nr(e, t, n, r) {
if (!t || !n || !e._genInfoSelections.size) return 0;
let i = e._getGenFields(n), a = [
"prompt",
@@ -3189,7 +3215,7 @@ function _r(e, t, n, r) {
}
return s > 0 ? s * 16 + 16 : 0;
}
-function vr(e, t, n, r, i, a, o) {
+function Pr(e, t, n, r, i, a, o) {
if (!n || !e._genInfoSelections.size) return;
let s = e._getGenFields(n), c = {
prompt: "#7ec8ff",
@@ -3244,126 +3270,126 @@ function vr(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", De(t, m, h, d, p, 6), t.fill(), t.globalAlpha = 1;
+ t.globalAlpha = .72, t.fillStyle = "#000", Le(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 yr(t) {
- if (!t._contentEl) return;
- t._captureBtn && (t._captureBtn.disabled = !0, t._captureBtn.setAttribute("aria-label", e("tooltip.capturingView", "Capturing...")));
- let n = t._contentEl.clientWidth || 480, r = t._contentEl.clientHeight || 360, i = r;
- if (t._mode === I.SIMPLE && t._mediaA && t._genInfoSelections.size) {
- let e = document.createElement("canvas");
- e.width = n, e.height = r;
- let a = e.getContext("2d"), o = t._estimateGenInfoOverlayHeight(a, t._mediaA, n);
+async function Fr(e) {
+ if (!e._contentEl) return;
+ e._captureBtn && (e._captureBtn.disabled = !0, e._captureBtn.setAttribute("aria-label", p("tooltip.capturingView", "Capturing...")));
+ let t = e._contentEl.clientWidth || 480, n = e._contentEl.clientHeight || 360, r = n;
+ if (e._mode === z.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);
if (o > 0) {
- let e = Math.max(r, o + 24);
- i = Math.min(e, r * 4);
+ let e = Math.max(n, o + 24);
+ r = Math.min(e, n * 4);
}
}
- let a = document.createElement("canvas");
- a.width = n, a.height = i;
- let o = a.getContext("2d");
- o.fillStyle = "#0d0d0d", o.fillRect(0, 0, n, i);
+ let i = document.createElement("canvas");
+ i.width = t, i.height = r;
+ let a = i.getContext("2d");
+ a.fillStyle = "#0d0d0d", a.fillRect(0, 0, t, r);
try {
- if (t._mode === I.SIMPLE) t._mediaA && (await t._drawMediaFit(o, t._mediaA, 0, 0, n, r), t._drawGenInfoOverlay(o, t._mediaA, 0, 0, n, i));
- else if (t._mode === I.AB) {
- let e = Math.round(t._abDividerX * n), r = t._contentEl.querySelector(".mjr-mfv-ab-layer:not(.mjr-mfv-ab-layer--b) video"), a = t._contentEl.querySelector(".mjr-mfv-ab-layer--b video");
- t._mediaA && await t._drawMediaFit(o, t._mediaA, 0, 0, n, i, r), t._mediaB && (o.save(), o.beginPath(), o.rect(e, 0, n - e, i), o.clip(), await t._drawMediaFit(o, t._mediaB, 0, 0, n, i, a), o.restore()), o.save(), o.strokeStyle = "rgba(255,255,255,0.88)", o.lineWidth = 2, o.beginPath(), o.moveTo(e, 0), o.lineTo(e, i), o.stroke(), o.restore(), G(o, "A", 8, 8), G(o, "B", e + 8, 8), t._mediaA && t._drawGenInfoOverlay(o, t._mediaA, 0, 0, e, i), t._mediaB && t._drawGenInfoOverlay(o, t._mediaB, e, 0, n - e, i);
- } else if (t._mode === I.SIDE) {
- let e = Math.floor(n / 2), r = t._contentEl.querySelector(".mjr-mfv-side-panel:first-child video"), a = t._contentEl.querySelector(".mjr-mfv-side-panel:last-child video");
- t._mediaA && (await t._drawMediaFit(o, t._mediaA, 0, 0, e, i, r), t._drawGenInfoOverlay(o, t._mediaA, 0, 0, e, i)), o.fillStyle = "#111", o.fillRect(e, 0, 2, i), t._mediaB && (await t._drawMediaFit(o, t._mediaB, e, 0, e, i, a), t._drawGenInfoOverlay(o, t._mediaB, e, 0, e, i)), G(o, "A", 8, 8), G(o, "B", e + 8, 8);
- } else if (t._mode === I.GRID) {
- let e = Math.floor(n / 2), r = Math.floor(i / 2), a = [
+ if (e._mode === z.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 === z.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(), W(a, "A", 8, 8), W(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 === z.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)), W(a, "A", 8, 8), W(a, "B", n + 8, 8);
+ } else if (e._mode === z.GRID) {
+ let n = Math.floor(t / 2), i = Math.floor(r / 2), o = [
{
- media: t._mediaA,
+ media: e._mediaA,
label: "A",
x: 0,
y: 0,
- w: e - 1,
- h: r - 1
+ w: n - 1,
+ h: i - 1
},
{
- media: t._mediaB,
+ media: e._mediaB,
label: "B",
- x: e + 1,
+ x: n + 1,
y: 0,
- w: e - 1,
- h: r - 1
+ w: n - 1,
+ h: i - 1
},
{
- media: t._mediaC,
+ media: e._mediaC,
label: "C",
x: 0,
- y: r + 1,
- w: e - 1,
- h: r - 1
+ y: i + 1,
+ w: n - 1,
+ h: i - 1
},
{
- media: t._mediaD,
+ media: e._mediaD,
label: "D",
- x: e + 1,
- y: r + 1,
- w: e - 1,
- h: r - 1
+ x: n + 1,
+ y: i + 1,
+ w: n - 1,
+ h: i - 1
}
- ], s = t._contentEl.querySelectorAll(".mjr-mfv-grid-cell");
- for (let e = 0; e < a.length; e++) {
- let n = a[e], r = s[e]?.querySelector("video") || null;
- n.media && (await t._drawMediaFit(o, n.media, n.x, n.y, n.w, n.h, r), t._drawGenInfoOverlay(o, n.media, n.x, n.y, n.w, n.h)), G(o, n.label, n.x + 8, n.y + 8);
+ ], 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)), W(a, n.label, n.x + 8, n.y + 8);
}
- o.save(), o.fillStyle = "#111", o.fillRect(e - 1, 0, 2, i), o.fillRect(0, r - 1, n, 2), o.restore();
+ a.save(), a.fillStyle = "#111", a.fillRect(n - 1, 0, 2, r), a.fillRect(0, i - 1, t, 2), a.restore();
}
} catch (e) {
console.debug("[MFV] capture error:", e);
}
- let s = `${{
- [I.AB]: "mfv-ab",
- [I.SIDE]: "mfv-side",
- [I.GRID]: "mfv-grid"
- }[t._mode] ?? "mfv"}-${Date.now()}.png`;
+ let o = `${{
+ [z.AB]: "mfv-ab",
+ [z.SIDE]: "mfv-side",
+ [z.GRID]: "mfv-grid"
+ }[e._mode] ?? "mfv"}-${Date.now()}.png`;
try {
- let e = a.toDataURL("image/png"), t = document.createElement("a");
- t.href = e, t.download = s, document.body.appendChild(t), t.click(), setTimeout(() => document.body.removeChild(t), 100);
+ let e = i.toDataURL("image/png"), t = document.createElement("a");
+ t.href = e, t.download = o, document.body.appendChild(t), t.click(), setTimeout(() => document.body.removeChild(t), 100);
} catch (e) {
console.warn("[MFV] download failed:", e);
} finally {
- t._captureBtn && (t._captureBtn.disabled = !1, t._captureBtn.setAttribute("aria-label", e("tooltip.captureView", "Save view as image")));
+ e._captureBtn && (e._captureBtn.disabled = !1, e._captureBtn.setAttribute("aria-label", p("tooltip.captureView", "Save view as image")));
}
}
//#endregion
//#region ui/features/viewer/floatingViewerLoader.ts
-var br = "imageops-live-preview";
-function xr(e) {
- return String(e?._source || "") === br;
+var Ir = "imageops-live-preview";
+function Lr(e) {
+ return String(e?._source || "") === Ir;
}
-function Sr(e, t, { autoMode: n = !1 } = {}) {
- let r = e._mediaA || null, o = xr(t), s = o && xr(r) && String(r?._nodeId || "") === String(t?._nodeId || "");
- if (e._mediaA = t || null, s || e._resetMfvZoom(), n && e._mode !== I.SIMPLE && e._mode !== I.GRAPH && (e._mode = I.SIMPLE, e._updateModeBtnUI()), e._mediaA && !o && typeof F == "function") {
- let t = ++e._refreshGen;
+function Rr(e, r, { autoMode: i = !1 } = {}) {
+ let a = e._mediaA || null, o = Lr(r), s = o && Lr(a) && String(a?._nodeId || "") === String(r?._nodeId || "");
+ if (e._mediaA = r || null, s || e._resetMfvZoom(), i && e._mode !== z.SIMPLE && e._mode !== z.GRAPH && (e._mode = z.SIMPLE, e._updateModeBtnUI()), e._mediaA && !o && typeof pe == "function") {
+ let r = ++e._refreshGen;
(async () => {
try {
- let n = await F(e._mediaA, {
- getAssetMetadata: i,
- getFileMetadataScoped: a
+ let i = await pe(e._mediaA, {
+ getAssetMetadata: n,
+ getFileMetadataScoped: t
});
- if (e._refreshGen !== t) return;
- n && typeof n == "object" && (e._mediaA = n, e._refresh());
+ if (e._refreshGen !== r) return;
+ i && typeof i == "object" && (e._mediaA = i, e._refresh());
} catch (e) {
console.debug?.("[MFV] metadata enrich error", e);
}
})();
} else e._refresh();
}
-function Cr(e, t, n) {
- e._mediaA = t || null, e._mediaB = n || null, e._resetMfvZoom(), e._mode === I.SIMPLE && (e._mode = I.AB, e._updateModeBtnUI());
- let r = ++e._refreshGen, o = async (e) => {
+function zr(e, r, i) {
+ e._mediaA = r || null, e._mediaB = i || null, e._resetMfvZoom(), e._mode === z.SIMPLE && (e._mode = z.AB, e._updateModeBtnUI());
+ let a = ++e._refreshGen, o = async (e) => {
if (!e) return e;
try {
- return await F(e, {
- getAssetMetadata: i,
- getFileMetadataScoped: a
+ return await pe(e, {
+ getAssetMetadata: n,
+ getFileMetadataScoped: t
}) || e;
} catch {
return e;
@@ -3371,17 +3397,17 @@ function Cr(e, t, n) {
};
(async () => {
let [t, n] = await Promise.all([o(e._mediaA), o(e._mediaB)]);
- e._refreshGen === r && (e._mediaA = t || null, e._mediaB = n || null, e._refresh());
+ e._refreshGen === a && (e._mediaA = t || null, e._mediaB = n || null, e._refresh());
})();
}
-function wr(e, t, n, r, o) {
- e._mediaA = t || null, e._mediaB = n || null, e._mediaC = r || null, e._mediaD = o || null, e._resetMfvZoom(), e._mode !== I.GRID && (e._mode = I.GRID, e._updateModeBtnUI());
+function Br(e, r, i, a, o) {
+ e._mediaA = r || null, e._mediaB = i || null, e._mediaC = a || null, e._mediaD = o || null, e._resetMfvZoom(), e._mode !== z.GRID && (e._mode = z.GRID, e._updateModeBtnUI());
let s = ++e._refreshGen, c = async (e) => {
if (!e) return e;
try {
- return await F(e, {
- getAssetMetadata: i,
- getFileMetadataScoped: a
+ return await pe(e, {
+ getAssetMetadata: n,
+ getFileMetadataScoped: t
}) || e;
} catch {
return e;
@@ -3399,16 +3425,16 @@ function wr(e, t, n, r, o) {
}
//#endregion
//#region ui/features/viewer/FloatingViewer.impl.ts
-function Tr(e) {
+function $(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 Er = 0, Dr = class {
+var Vr = 0, Hr = class {
constructor({ controller: e = null } = {}) {
- this._instanceId = ++Er, 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 = !0, this._captureBtn = null, this._genInfoSelections = new Set([
+ this._instanceId = ++Vr, 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 = !0, this._captureBtn = null, this._genInfoSelections = new Set([
"prompt",
"seed",
"model",
@@ -3418,7 +3444,7 @@ var Er = 0, Dr = class {
"cfg",
"step",
"genTime"
- ]), this._mode = I.SIMPLE, this._mediaA = null, this._mediaB = null, this._mediaC = null, this._mediaD = null, this._pinnedSlots = /* @__PURE__ */ new Set(), this._abDividerX = .5, 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 Gt({ large: !0 });
+ ]), this._mode = z.SIMPLE, this._mediaA = null, this._mediaB = null, this._mediaC = null, this._mediaD = null, this._pinnedSlots = /* @__PURE__ */ new Set(), this._abDividerX = .5, 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 an({ large: !0 });
}
_dispatchControllerAction(e, t) {
try {
@@ -3458,32 +3484,32 @@ var Er = 0, Dr = class {
}
}
render() {
- return Sn(this);
+ return Rn(this);
}
_buildHeader() {
- return Cn(this);
+ return zn(this);
}
_buildToolbar() {
- return wn(this);
+ return Bn(this);
}
_rebindControlHandlers() {
- return Tn(this);
+ return Vn(this);
}
_updateSettingsBtnState(e) {
- return En(this, e);
+ return Hn(this, e);
}
_applySidebarPosition() {
- return Dn(this);
+ return Un(this);
}
refreshSidebar() {
this._sidebar?.refresh();
}
_resetGenDropdownForCurrentDocument() {}
_bindDocumentUiHandlers() {
- return On(this);
+ return Wn(this);
}
_unbindDocumentUiHandlers() {
- return kn(this);
+ return Gn(this);
}
_isGenDropdownOpen() {
return !1;
@@ -3491,49 +3517,49 @@ var Er = 0, Dr = class {
_openGenDropdown() {}
_closeGenDropdown() {}
_updateGenBtnUI() {
- return An(this);
+ return Kn(this);
}
_buildGenDropdown() {
return null;
}
_getGenFields(e) {
- return Nn(this, e);
+ return Yn(this, e);
}
_buildGenInfoDOM(e) {
- return Pn(this, e);
+ return Xn(this, e);
}
_notifyModeChanged() {
- return Fn(this);
+ return Zn(this);
}
_cycleMode() {
- return In(this);
+ return Qn(this);
}
setMode(e) {
- return Ln(this, e);
+ return $n(this, e);
}
getPinnedSlots() {
- return Rn(this);
+ return er(this);
}
_updatePinUI() {
- return zn(this);
+ return tr(this);
}
_updateModeBtnUI() {
- return Bn(this);
+ return nr(this);
}
setLiveActive(e) {
- return Vn(this, e);
+ return rr(this, e);
}
setPreviewActive(e) {
- return Hn(this, e);
+ return ir(this, e);
}
loadPreviewBlob(e, t = {}) {
- return Un(this, e, t);
+ return ar(this, e, t);
}
_revokePreviewBlob() {
- return Wn(this);
+ return or(this);
}
setNodeStreamActive(e) {
- return Gn(this, e);
+ return sr(this, e);
}
setNodeStreamSelection(e) {
e && (e.nodeId != null || e.classType) ? this._nodeStreamSelection = {
@@ -3559,17 +3585,17 @@ var Er = 0, Dr = class {
this._nodeStreamOverlayEl.textContent = `${n} - ${r}${i}`.trim();
}
loadMediaA(e, { autoMode: t = !1 } = {}) {
- return Sr(this, e, { autoMode: t });
+ return Rr(this, e, { autoMode: t });
}
loadMediaPair(e, t) {
- return Cr(this, e, t);
+ return zr(this, e, t);
}
loadMediaQuad(e, t, n, r) {
- return wr(this, e, t, n, r);
+ return Br(this, e, t, n, r);
}
_applyTransform() {
if (!this._contentEl) return;
- let e = Math.max(L, 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(me, 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");
@@ -3690,7 +3716,7 @@ var Er = 0, Dr = 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 !== I.SIMPLE || !this._gridMode) return;
+ if (this._mode !== z.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));
@@ -3700,7 +3726,7 @@ var Er = 0, Dr = 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(L, Math.min(8, this._zoom)), i = Math.max(L, Math.min(8, Number(e) || 1));
+ let r = Math.max(me, Math.min(8, this._zoom)), i = Math.max(me, 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;
@@ -3734,11 +3760,11 @@ var Er = 0, Dr = 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") || N(t.target)) return;
- let n = we(t.target, e);
- if (n && Te(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") || L(t.target)) return;
+ let n = Pe(t.target, e);
+ if (n && Fe(n, Number(t.deltaX || 0), Number(t.deltaY || 0))) return;
t.preventDefault();
- let r = 1 - (t.deltaY || t.deltaX || 0) * R;
+ let r = 1 - (t.deltaY || t.deltaX || 0) * he;
this._setMfvZoom(this._zoom * r, t.clientX, t.clientY);
}, {
...t,
@@ -3746,7 +3772,7 @@ var Er = 0, Dr = 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") && !N(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") && !L(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);
@@ -3770,7 +3796,7 @@ var Er = 0, Dr = 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") || N(e.target)) return;
+ if (e.target?.closest?.("video") || e.target?.closest?.("audio") || e.target?.closest?.(".mjr-video-controls, .mjr-mfv-simple-player-controls") || L(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);
@@ -3810,12 +3836,12 @@ var Er = 0, Dr = class {
return e;
}
_initCompareSync() {
- if (this._destroyCompareSync(), this._contentEl && this._mode !== I.SIMPLE) try {
+ if (this._destroyCompareSync(), this._contentEl && this._mode !== z.SIMPLE) try {
let e = Array.from(this._contentEl.querySelectorAll("video"));
if (e.length < 2) return;
let t = e[0] || null, n = e.slice(1);
if (!t || !n.length) return;
- this._compareSyncAC = ne(t, n, { threshold: .08 });
+ this._compareSyncAC = ae(t, n, { threshold: .08 });
} catch (e) {
console.debug?.(e);
}
@@ -3825,30 +3851,30 @@ var Er = 0, Dr = class {
this._sidebar?.setAsset?.(this._mediaA || null), this._destroyPanZoom(), this._destroyCompareSync(), this._destroyMediaControls();
let e = this._overlayCanvas || null;
switch (this._contentEl.replaceChildren(), this._contentEl.style.overflow = "hidden", this._mode) {
- case I.SIMPLE:
+ case z.SIMPLE:
this._renderSimple();
break;
- case I.AB:
+ case z.AB:
this._renderAB();
break;
- case I.SIDE:
+ case z.SIDE:
this._renderSide();
break;
- case I.GRID:
+ case z.GRID:
this._renderGrid();
break;
- case I.GRAPH:
+ case z.GRAPH:
this._renderGraphMap();
break;
}
- e && this._contentEl.appendChild(e), this._nodeStreamSelection && this._updateNodeStreamOverlay(), this._mediaProgressEl && this._contentEl.appendChild(this._mediaProgressEl), this._applyMediaToneControls(), this._applyTransform(), this._mode !== I.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 !== z.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 === I.GRAPH || !this._genSidebarEnabled || t.length === 0) {
+ if (this._mode === z.GRAPH || !this._genSidebarEnabled || t.length === 0) {
e.classList.remove("open"), e.setAttribute("hidden", ""), this._updateGenBtnUI?.();
return;
}
@@ -3856,7 +3882,7 @@ var Er = 0, Dr = class {
n.className = "mjr-mfv-gen-sidebar-title", n.textContent = "Gen Info", e.appendChild(n);
let r = 0;
for (let n of t) {
- if (V(n.media) === "audio") continue;
+ if (B(n.media) === "audio") continue;
let i = this._buildGenInfoSidebarContent(n.media);
if (!i) continue;
let a = document.createElement("section");
@@ -3886,17 +3912,17 @@ var Er = 0, Dr = class {
media: this._mediaD,
label: "D"
};
- return (this._mode === I.GRID ? [
+ return (this._mode === z.GRID ? [
e,
t,
n,
r
- ] : this._mode === I.AB || this._mode === I.SIDE ? [e, t] : [e]).filter((e) => e.media);
+ ] : this._mode === z.AB || this._mode === z.SIDE ? [e, t] : [e]).filter((e) => e.media);
}
_buildGenInfoSidebarContent(e) {
let t = this._getGenFields(e)?.genTime || "", n = null;
try {
- n = d(e);
+ n = T(e);
} catch (e) {
console.debug?.(e);
}
@@ -4023,24 +4049,24 @@ var Er = 0, Dr = class {
}
_renderSimple() {
if (!this._mediaA) {
- this._contentEl.appendChild(H());
+ this._contentEl.appendChild(V());
return;
}
- let e = W(this._mediaA), t = this._trackMediaControls?.(e) || e;
+ let e = U(this._mediaA), t = this._trackMediaControls?.(e) || e;
if (!t) {
- this._contentEl.appendChild(H("Could not load media"));
+ this._contentEl.appendChild(V("Could not load media"));
return;
}
let n = document.createElement("div");
n.className = "mjr-mfv-simple-container", n.appendChild(t), this._contentEl.appendChild(n);
}
_renderAB() {
- let e = this._mediaA ? W(this._mediaA, { fill: !0 }) : null, t = this._mediaB ? W(this._mediaB, {
+ let e = this._mediaA ? U(this._mediaA, { fill: !0 }) : null, t = this._mediaB ? U(this._mediaB, {
fill: !0,
controls: !1
- }) : null, n = this._trackMediaControls?.(e) || e, r = this._trackMediaControls?.(t) || t, i = this._mediaA ? V(this._mediaA) : "", a = this._mediaB ? V(this._mediaB) : "";
+ }) : null, n = this._trackMediaControls?.(e) || e, r = this._trackMediaControls?.(t) || t, i = this._mediaA ? B(this._mediaA) : "", a = this._mediaB ? B(this._mediaB) : "";
if (!n && !r) {
- this._contentEl.appendChild(H("Select 2 assets for A/B compare"));
+ this._contentEl.appendChild(V("Select 2 assets for A/B compare"));
return;
}
if (!r) {
@@ -4062,9 +4088,9 @@ var Er = 0, Dr = class {
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", Tr(n) && f.classList.add("mjr-mfv-geninfo--above-player"), f.appendChild(d), f.style.right = `calc(${100 - l}% + 8px)`);
+ d && (f = document.createElement("div"), f.className = "mjr-mfv-geninfo-a", $(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", Tr(r) && m.classList.add("mjr-mfv-geninfo--above-player"), m.appendChild(p), m.style.left = `calc(${l}% + 8px)`);
+ p && (m = document.createElement("div"), m.className = "mjr-mfv-geninfo-b", $(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);
@@ -4083,29 +4109,29 @@ var Er = 0, Dr = class {
h?.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(U("A", "left")), o.appendChild(U("B", "right")), this._contentEl.appendChild(o);
+ }, 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(H("A", "left")), o.appendChild(H("B", "right")), this._contentEl.appendChild(o);
}
_renderSide() {
- let e = this._mediaA ? W(this._mediaA) : null, t = this._mediaB ? W(this._mediaB, { controls: !1 }) : null, n = this._trackMediaControls?.(e) || e, r = this._trackMediaControls?.(t) || t, i = this._mediaA ? V(this._mediaA) : "", a = this._mediaB ? V(this._mediaB) : "";
+ let e = this._mediaA ? U(this._mediaA) : null, t = this._mediaB ? U(this._mediaB, { controls: !1 }) : null, n = this._trackMediaControls?.(e) || e, r = this._trackMediaControls?.(t) || t, i = this._mediaA ? B(this._mediaA) : "", a = this._mediaB ? B(this._mediaB) : "";
if (!n && !r) {
- this._contentEl.appendChild(H("Select 2 assets for Side-by-Side"));
+ this._contentEl.appendChild(V("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(H(" - ")), s.appendChild(U("A", "left"));
+ s.className = "mjr-mfv-side-panel", n ? s.appendChild(n) : s.appendChild(V(" - ")), s.appendChild(H("A", "left"));
let c = i === "audio" ? null : this._buildGenInfoDOM(this._mediaA);
if (c) {
let e = document.createElement("div");
- e.className = "mjr-mfv-geninfo-a", Tr(n) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(c), s.appendChild(e);
+ e.className = "mjr-mfv-geninfo-a", $(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(H(" - ")), l.appendChild(U("B", "right"));
+ l.className = "mjr-mfv-side-panel", r ? l.appendChild(r) : l.appendChild(V(" - ")), l.appendChild(H("B", "right"));
let u = a === "audio" ? null : this._buildGenInfoDOM(this._mediaB);
if (u) {
let e = document.createElement("div");
- e.className = "mjr-mfv-geninfo-b", Tr(r) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(u), l.appendChild(e);
+ e.className = "mjr-mfv-geninfo-b", $(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);
}
@@ -4129,7 +4155,7 @@ var Er = 0, Dr = class {
}
];
if (!e.filter((e) => e.media).length) {
- this._contentEl.appendChild(H("Select up to 4 assets for Grid Compare"));
+ this._contentEl.appendChild(V("Select up to 4 assets for Grid Compare"));
return;
}
let t = document.createElement("div");
@@ -4137,15 +4163,15 @@ var Er = 0, Dr = class {
for (let { media: n, label: r } of e) {
let e = document.createElement("div");
if (e.className = "mjr-mfv-grid-cell", n) {
- let t = V(n), i = W(n, { controls: r === "A" }), a = this._trackMediaControls?.(i) || i;
- if (a ? e.appendChild(a) : e.appendChild(H(" - ")), e.appendChild(U(r, r === "A" || r === "C" ? "left" : "right")), t !== "audio") {
+ let t = B(n), i = U(n, { controls: r === "A" }), a = this._trackMediaControls?.(i) || i;
+ if (a ? e.appendChild(a) : e.appendChild(V(" - ")), e.appendChild(H(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()}`, Tr(a) && n.classList.add("mjr-mfv-geninfo--above-player"), n.appendChild(t), e.appendChild(n);
+ n.className = `mjr-mfv-geninfo-${r.toLowerCase()}`, $(a) && n.classList.add("mjr-mfv-geninfo--above-player"), n.appendChild(t), e.appendChild(n);
}
}
- } else e.appendChild(H(" - ")), e.appendChild(U(r, r === "A" || r === "C" ? "left" : "right"));
+ } else e.appendChild(V(" - ")), e.appendChild(H(r, r === "A" || r === "C" ? "left" : "right"));
t.appendChild(e);
}
this._contentEl.appendChild(t);
@@ -4154,76 +4180,76 @@ var Er = 0, Dr = 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(), Ee(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(), Ie(this.element), this.element.classList.remove("is-visible"), this.element.setAttribute("aria-hidden", "true"), this.isVisible = !1);
}
_setDesktopExpanded(e) {
- return $n(this, e);
+ return hr(this, e);
}
_activateDesktopExpandedFallback(e) {
- return er(this, e);
+ return gr(this, e);
}
_tryElectronPopupFallback(e, t, n, r) {
- return tr(this, e, t, n, r);
+ return _r(this, e, t, n, r);
}
popOut() {
- return nr(this);
+ return vr(this);
}
_fallbackPopout(e, t, n) {
- return rr(this, e, t, n);
+ return yr(this, e, t, n);
}
_clearPopoutCloseWatch() {
- return ir(this);
+ return br(this);
}
_startPopoutCloseWatch() {
- return ar(this);
+ return xr(this);
}
_schedulePopInFromPopupClose() {
- return or(this);
+ return Sr(this);
}
_installPopoutStyles(e) {
- return sr(this, e);
+ return Cr(this, e);
}
popIn(e) {
- return cr(this, e);
+ return wr(this, e);
}
_updatePopoutBtnUI() {
- return lr(this);
+ return Tr(this);
}
get isPopped() {
return this._isPopped || this._desktopExpanded;
}
_resizeCursorForDirection(e) {
- return ur(e);
+ return Er(e);
}
_getResizeDirectionFromPoint(e, t, n) {
- return dr(e, t, n);
+ return Dr(e, t, n);
}
_stopEdgeResize() {
- return fr(this);
+ return Or(this);
}
_bindPanelInteractions() {
- return pr(this);
+ return kr(this);
}
_initEdgeResize(e) {
- return mr(this, e);
+ return Ar(this, e);
}
_initDrag(e) {
- return hr(this, e);
+ return jr(this, e);
}
async _drawMediaFit(e, t, n, r, i, a, o) {
- return gr(this, e, t, n, r, i, a, o);
+ return Mr(this, e, t, n, r, i, a, o);
}
_estimateGenInfoOverlayHeight(e, t, n) {
- return _r(this, e, t, n);
+ return Nr(this, e, t, n);
}
_drawGenInfoOverlay(e, t, n, r, i, a) {
- return vr(this, e, t, n, r, i, a);
+ return Pr(this, e, t, n, r, i, a);
}
async _captureView() {
- return yr(this);
+ return Fr(this);
}
dispose() {
- C(this), this._destroyPanZoom(), this._destroyCompareSync(), this._destroyMediaControls(), this._unbindLayoutObserver(), this._stopEdgeResize(), this._clearPopoutCloseWatch();
+ M(this), this._destroyPanZoom(), this._destroyCompareSync(), this._destroyMediaControls(), this._unbindLayoutObserver(), this._stopEdgeResize(), this._clearPopoutCloseWatch();
try {
this._panelAC?.abort(), this._panelAC = null;
} catch (e) {
@@ -4280,4 +4306,4 @@ var Er = 0, Dr = class {
}
};
//#endregion
-export { Dr as FloatingViewer };
+export { Hr as FloatingViewer };
diff --git a/dist/chunks/LiveStreamTracker-FHT3u-OV.js b/dist/chunks/LiveStreamTracker-mAm9Jo6q.js
similarity index 96%
rename from dist/chunks/LiveStreamTracker-FHT3u-OV.js
rename to dist/chunks/LiveStreamTracker-mAm9Jo6q.js
index 5e0223bd..bdf85026 100644
--- a/dist/chunks/LiveStreamTracker-FHT3u-OV.js
+++ b/dist/chunks/LiveStreamTracker-mAm9Jo6q.js
@@ -1,5 +1,5 @@
-import { u as e } from "./hostAdapter-D6BwD-lN.js";
-import { t } from "./floatingViewerManager-Oat0dyM2.js";
+import { R as e } from "./config-Cxv7acF8.js";
+import { t } from "./floatingViewerManager-BSQ_h48I.js";
import { r as n } from "./events-BnkL6-b6.js";
//#region ui/features/viewer/LiveStreamTracker.ts
var r = !1, i = null, a = null, o = null, s = null, c = null, l = 0, u = 0, d = 400, f = new Set([
diff --git a/dist/chunks/NodeStreamController-_rtriits.js b/dist/chunks/NodeStreamController-EQygLyLg.js
similarity index 99%
rename from dist/chunks/NodeStreamController-_rtriits.js
rename to dist/chunks/NodeStreamController-EQygLyLg.js
index 96a8a425..3ac2a587 100644
--- a/dist/chunks/NodeStreamController-_rtriits.js
+++ b/dist/chunks/NodeStreamController-EQygLyLg.js
@@ -1,4 +1,4 @@
-import { a as e, n as t, r as n, s as r } from "./graphTraversal-HdtD9lDa.js";
+import { a as e, n as t, r as n, s as r } from "./graphTraversal-CjIZsRsP.js";
import { KnownNodesAdapter as i, t as a } from "./KnownNodesAdapter-Csi3_LhH.js";
//#region ui/features/viewer/nodeStream/NodeStreamRegistry.ts
var o = [], s = !1;
diff --git a/dist/chunks/SidebarWorkflowSection-CxD2u7Bb.js b/dist/chunks/SidebarWorkflowSection-na0bq_pe.js
similarity index 58%
rename from dist/chunks/SidebarWorkflowSection-CxD2u7Bb.js
rename to dist/chunks/SidebarWorkflowSection-na0bq_pe.js
index 6d8b9f8d..376d23be 100644
--- a/dist/chunks/SidebarWorkflowSection-CxD2u7Bb.js
+++ b/dist/chunks/SidebarWorkflowSection-na0bq_pe.js
@@ -1,10 +1,10 @@
-import { $t as e, B as t, Bt as n, Dt as r, Et as i, F as a, Ft as o, G as s, Gt as c, I as l, It as u, Kt as d, L as f, Lt as p, M as m, N as h, Ot as g, P as _, Pt as v, R as y, Rt as b, S as x, U as S, V as C, Vt as w, W as T, Wt as E, Yt as ee, _t as D, at as te, bt as ne, ct as re, dt as ie, en as ae, ft as oe, gt as se, i as ce, it as O, k, lt as le, nt as ue, ot as de, pt as fe, r as pe, rt as me, st as he, ut as ge, vt as _e, wt as ve, xt as ye, z as be, zt as xe } from "./hostAdapter-D6BwD-lN.js";
-import { m as Se, n as A, t as j } from "./config-dvcltBqE.js";
-import { B as Ce, C as we, D as Te, E as Ee, F as M, H as De, L as N, M as Oe, N as ke, S as P, T as F, U as Ae, Z as I, _ as je, a as Me, at as L, c as Ne, d as Pe, f as Fe, g as Ie, h as Le, i as Re, it as ze, l as Be, m as Ve, n as He, o as Ue, ot as R, p as We, r as Ge, rt as Ke, s as qe, t as Je, u as Ye, v as Xe, w as z, x as B, y as V, z as Ze } from "./mjr-primevue-DeVPqKdl.js";
-import { n as Qe, r as $e, t as et } from "./mjr-vue-vendor--o0qJuos.js";
-import { a as tt, i as nt, n as rt, o as it, r as at, t as ot } from "./geninfoParser-BE5lWeGw.js";
+import { $ as e, A as t, C as n, D as r, E as i, Et as a, F as o, J as s, K as c, N as l, O as u, P as d, Q as f, S as p, T as m, Tt as h, X as g, Y as _, Z as v, _t as y, ct as b, dt as x, et as S, f as C, gt as w, j as T, k as E, mt as ee, nt as te, ot as ne, q as re, rt as ie, st as ae, t as oe, tt as se, ut as ce, vt as D, w as O, y as le } from "./client-DZE_lzdb.js";
+import { C as ue, I as de, T as fe, a as pe, c as me, i as he, l as k, m as ge, n as A, nt as _e, o as ve, r as ye, s as be, t as j, u as xe, x as Se, y as Ce } from "./config-Cxv7acF8.js";
+import { B as we, C as Te, D as Ee, E as De, F as M, H as Oe, L as N, M as ke, N as Ae, S as P, T as F, U as je, Y as Me, Z as I, _ as Ne, a as Pe, at as L, c as Fe, d as Ie, f as Le, g as Re, h as ze, i as Be, it as Ve, l as He, m as Ue, n as We, o as Ge, ot as R, p as Ke, r as qe, rt as z, s as Je, t as Ye, u as Xe, v as Ze, w as B, x as V, y as H, z as Qe } from "./mjr-primevue-DeVPqKdl.js";
+import { n as $e, r as et, t as tt } from "./mjr-vue-vendor--o0qJuos.js";
+import { a as nt, i as rt, n as it, o as at, r as ot, t as st } from "./geninfoParser-5vKgjqjD.js";
//#region ui/utils/events.ts
-function st(e, t, { target: n = null, warnPrefix: r = "[Majoor]" } = {}) {
+function ct(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 {
@@ -20,7 +20,7 @@ function st(e, t, { target: n = null, warnPrefix: r = "[Majoor]" } = {}) {
}
//#endregion
//#region ui/app/settings/settingsUtils.ts
-var H = (e, t) => {
+var U = (e, t) => {
if (typeof e == "boolean") return e;
if (typeof e == "string") {
let t = e.trim().toLowerCase();
@@ -38,39 +38,39 @@ var H = (e, t) => {
].includes(t)) return !1;
}
return !!t;
-}, U = (e, t) => {
+}, W = (e, t) => {
let n = Number(e);
return Number.isFinite(n) ? n : Number(t);
-}, ct = (e, t, n) => {
+}, lt = (e, t, n) => {
let r = typeof e == "string" ? e.trim() : String(e ?? "");
return t.includes(r) ? r : n;
-}, lt = (e) => e === "__proto__" || e === "prototype" || e === "constructor", ut = (e, t) => {
+}, ut = (e) => e === "__proto__" || e === "prototype" || e === "constructor", dt = (e, t) => {
let n = { ...e };
return !t || typeof t != "object" || Object.keys(t).forEach((r) => {
- if (lt(r)) return;
+ if (ut(r)) return;
let i = t[r];
- i && typeof i == "object" && !Array.isArray(i) ? n[r] = ut(e[r] || {}, i) : i !== void 0 && (n[r] = i);
+ i && typeof i == "object" && !Array.isArray(i) ? n[r] = dt(e[r] || {}, i) : i !== void 0 && (n[r] = i);
}), n;
-}, dt = Object.freeze({
+}, ft = Object.freeze({
small: 80,
medium: 120,
large: 180
-}), ft = Object.freeze([
+}), pt = Object.freeze([
"small",
"medium",
"large"
-]), pt = (e, t) => Math.max(60, Math.min(600, Math.round(U(e, t)))), mt = (e = {}) => {
+]), mt = (e, t) => Math.max(60, Math.min(600, Math.round(W(e, t)))), ht = (e = {}) => {
let t = Number(e?.minSize);
- if (Number.isFinite(t)) return pt(t, A.GRID_MIN_SIZE);
- let n = ct(String(e?.minSizePreset || "").toLowerCase(), ft, "");
- return n ? dt[n] : pt(e?.minSize, A.GRID_MIN_SIZE);
-}, ht = (e = {}) => pt(e?.minSize, A.FEED_GRID_MIN_SIZE), gt = (e) => {
- let t = Math.round(U(e, A.GRID_MIN_SIZE));
+ if (Number.isFinite(t)) return mt(t, A.GRID_MIN_SIZE);
+ let n = lt(String(e?.minSizePreset || "").toLowerCase(), pt, "");
+ return n ? ft[n] : mt(e?.minSize, A.GRID_MIN_SIZE);
+}, gt = (e = {}) => mt(e?.minSize, A.FEED_GRID_MIN_SIZE), _t = (e) => {
+ let t = Math.round(W(e, A.GRID_MIN_SIZE));
return t <= 100 ? "small" : t >= 150 ? "large" : "medium";
-}, _t = async (e, t = "Majoor", r = {}) => {
- let i = xt();
- if (i && typeof i.alert == "function") try {
- await i.alert({
+}, vt = async (e, t = "Majoor", n = {}) => {
+ let r = St();
+ if (r && typeof r.alert == "function") try {
+ await r.alert({
title: String(t || "Majoor"),
message: String(e || "")
});
@@ -78,10 +78,10 @@ var H = (e, t) => {
} catch (e) {
console.debug?.(e);
}
- let a = St();
- if (a) try {
+ let i = Ct();
+ if (i) try {
let n = String(e || "");
- typeof a.addAlert == "function" ? a.addAlert(n) : a.add({
+ typeof i.addAlert == "function" ? i.addAlert(n) : i.add({
severity: "info",
summary: String(t || "Majoor"),
detail: n,
@@ -91,10 +91,10 @@ var H = (e, t) => {
} catch (e) {
console.debug?.(e);
}
- if (r?.native !== !1) {
- let n = Ct();
+ if (n?.native !== !1) {
+ let n = wt();
if (n) try {
- n.show(wt(e, t));
+ n.show(Tt(e, t));
try {
n.element?.style?.setProperty?.("z-index", "1100");
} catch (e) {
@@ -105,8 +105,8 @@ var H = (e, t) => {
console.debug?.(e);
}
}
- let o = kt();
- if (!o) {
+ let a = At();
+ if (!a) {
try {
window.alert(e);
} catch (e) {
@@ -114,20 +114,20 @@ var H = (e, t) => {
}
return;
}
- return new Promise((r) => {
- let i = new o();
- Nt(i);
- let a = W("div", { style: {
+ return new Promise((n) => {
+ let r = new a();
+ Pt(r);
+ let i = G("div", { style: {
display: "flex",
flexDirection: "column",
gap: "18px",
padding: "18px 20px 18px 20px"
} }, [
- W("div", { style: {
+ G("div", { style: {
display: "flex",
alignItems: "center",
justifyContent: "flex-start"
- } }, [W("div", {
+ } }, [G("div", {
textContent: t,
style: {
fontWeight: "700",
@@ -136,7 +136,7 @@ var H = (e, t) => {
lineHeight: "1.2"
}
})]),
- W("div", {
+ G("div", {
textContent: String(e || ""),
style: {
fontSize: "22px",
@@ -145,19 +145,19 @@ var H = (e, t) => {
lineHeight: "1.45"
}
}),
- W("div", { style: {
+ G("div", { style: {
display: "flex",
justifyContent: "flex-end",
gap: "10px"
- } }, [W("button", {
- textContent: n("dialog.confirm", "Confirm"),
+ } }, [G("button", {
+ textContent: k("dialog.confirm", "Confirm"),
onclick: () => {
try {
- i.close();
+ r.close();
} catch (e) {
console.debug?.(e);
}
- r();
+ n();
},
style: {
padding: "10px 16px",
@@ -171,54 +171,54 @@ var H = (e, t) => {
})])
]);
try {
- i.show(a), setTimeout(() => Pt(i), 0);
+ r.show(i), setTimeout(() => Ft(r), 0);
} catch {
try {
window.alert(e);
} catch (e) {
console.debug?.(e);
}
- r();
+ n();
}
});
-}, vt = async (e, t = "Majoor") => {
- let r = xt();
- if (r) try {
- let i = {
- title: String(t || n("dialog.confirm", "Confirm")),
+}, yt = async (e, t = "Majoor") => {
+ let n = St();
+ if (n) try {
+ let r = {
+ title: String(t || k("dialog.confirm", "Confirm")),
message: String(e || "")
};
- return !!(typeof r.confirm == "function" && await r.confirm(i));
+ return !!(typeof n.confirm == "function" && await n.confirm(r));
} catch (e) {
console.debug?.(e);
}
- let i = kt();
- if (!i) try {
+ let r = At();
+ if (!r) try {
return window.confirm(e);
} catch {
return !1;
}
- return new Promise((r) => {
- let a = new i();
- Nt(a);
- let o = (e) => {
+ return new Promise((n) => {
+ let i = new r();
+ Pt(i);
+ let a = (e) => {
try {
- a.close();
+ i.close();
} catch (e) {
console.debug?.(e);
}
- r(!!e);
- }, s = W("div", { style: {
+ n(!!e);
+ }, o = G("div", { style: {
display: "flex",
flexDirection: "column",
gap: "18px",
padding: "18px 20px 18px 20px"
} }, [
- W("div", { style: {
+ G("div", { style: {
display: "flex",
alignItems: "center",
justifyContent: "flex-start"
- } }, [W("div", {
+ } }, [G("div", {
textContent: t,
style: {
fontWeight: "700",
@@ -227,7 +227,7 @@ var H = (e, t) => {
lineHeight: "1.2"
}
})]),
- W("div", {
+ G("div", {
textContent: String(e || ""),
style: {
fontSize: "22px",
@@ -236,13 +236,13 @@ var H = (e, t) => {
lineHeight: "1.45"
}
}),
- W("div", { style: {
+ G("div", { style: {
display: "flex",
justifyContent: "flex-end",
gap: "10px"
- } }, [W("button", {
- textContent: n("dialog.cancel", "Cancel"),
- onclick: () => o(!1),
+ } }, [G("button", {
+ textContent: k("dialog.cancel", "Cancel"),
+ onclick: () => a(!1),
style: {
padding: "10px 16px",
borderRadius: "10px",
@@ -252,9 +252,9 @@ var H = (e, t) => {
fontWeight: "600",
cursor: "pointer"
}
- }), W("button", {
- textContent: n("dialog.confirm", "Confirm"),
- onclick: () => o(!0),
+ }), G("button", {
+ textContent: k("dialog.confirm", "Confirm"),
+ onclick: () => a(!0),
style: {
padding: "10px 16px",
borderRadius: "10px",
@@ -267,44 +267,44 @@ var H = (e, t) => {
})])
]);
try {
- a.show(s), setTimeout(() => Pt(a), 0);
+ i.show(o), setTimeout(() => Ft(i), 0);
} catch {
try {
- r(!!window.confirm(e));
+ n(!!window.confirm(e));
} catch {
- r(!1);
+ n(!1);
}
}
});
-}, yt = async (e, t = "", r = "Majoor") => {
- let i = xt();
- if (i) try {
- let a = {
- title: String(r || n("dialog.prompt", "Prompt")),
+}, bt = async (e, t = "", n = "Majoor") => {
+ let r = St();
+ if (r) try {
+ let i = {
+ title: String(n || k("dialog.prompt", "Prompt")),
message: String(e || ""),
defaultValue: String(t ?? "")
- }, o = typeof i.prompt == "function" ? await i.prompt(a) : null;
- return o == null ? null : String(o);
+ }, a = typeof r.prompt == "function" ? await r.prompt(i) : null;
+ return a == null ? null : String(a);
} catch (e) {
console.debug?.(e);
}
- let a = kt();
- if (!a) try {
+ let i = At();
+ if (!i) try {
return window.prompt(e, t);
} catch {
return null;
}
- return new Promise((i) => {
- let o = new a();
- Nt(o);
- let s = (e) => {
+ return new Promise((r) => {
+ let a = new i();
+ Pt(a);
+ let o = (e) => {
try {
- o.close();
+ a.close();
} catch (e) {
console.debug?.(e);
}
- i(e ?? null);
- }, c = W("input", {
+ r(e ?? null);
+ }, s = G("input", {
type: "text",
value: String(t ?? ""),
style: {
@@ -318,23 +318,23 @@ var H = (e, t) => {
boxSizing: "border-box"
},
onkeydown: (e) => {
- e.key === "Enter" && s(c.value), e.key === "Escape" && s(null), e.stopPropagation();
+ e.key === "Enter" && o(s.value), e.key === "Escape" && o(null), e.stopPropagation();
}
- }), l = W("div", { style: {
+ }), c = G("div", { style: {
display: "flex",
flexDirection: "column",
gap: "12px",
padding: "16px"
} }, [
- W("div", {
- textContent: r,
+ G("div", {
+ textContent: n,
style: {
fontWeight: "600",
fontSize: "14px",
color: "rgba(255,255,255,0.95)"
}
}),
- W("div", {
+ G("div", {
textContent: String(e || ""),
style: {
fontSize: "13px",
@@ -343,14 +343,14 @@ var H = (e, t) => {
lineHeight: "1.4"
}
}),
- c,
- W("div", { style: {
+ s,
+ G("div", { style: {
display: "flex",
justifyContent: "flex-end",
gap: "10px"
- } }, [W("button", {
- textContent: n("dialog.cancel", "Cancel"),
- onclick: () => s(null),
+ } }, [G("button", {
+ textContent: k("dialog.cancel", "Cancel"),
+ onclick: () => o(null),
style: {
padding: "8px 12px",
borderRadius: "8px",
@@ -359,9 +359,9 @@ var H = (e, t) => {
color: "rgba(255,255,255,0.85)",
cursor: "pointer"
}
- }), W("button", {
- textContent: n("dialog.ok", "OK"),
- onclick: () => s(c.value),
+ }), G("button", {
+ textContent: k("dialog.ok", "OK"),
+ onclick: () => o(s.value),
style: {
padding: "8px 12px",
borderRadius: "8px",
@@ -373,68 +373,56 @@ var H = (e, t) => {
})])
]);
try {
- o.show(l), setTimeout(() => Pt(o), 0), setTimeout(() => {
+ a.show(c), setTimeout(() => Ft(a), 0), setTimeout(() => {
try {
- c.focus(), c.select();
+ s.focus(), s.select();
} catch (e) {
console.debug?.(e);
}
}, 0);
} catch {
try {
- i(window.prompt(e, t));
+ r(window.prompt(e, t));
} catch {
- i(null);
+ r(null);
}
}
});
-}, bt = () => {
+}, xt = () => {
try {
- return E()?.ui || null;
+ return fe()?.ui || null;
} catch {
return null;
}
-}, xt = () => {
+}, St = () => {
let e = (e) => !!e && (typeof e.alert == "function" || typeof e.confirm == "function" || typeof e.prompt == "function");
try {
- let t = c(E());
+ let t = Se();
if (e(t)) return t;
} catch (e) {
console.debug?.(e);
}
- try {
- let t = (typeof window < "u" ? window?.app : null)?.extensionManager?.dialog || null;
- if (e(t)) return t;
- } catch (e) {
- console.debug?.(e);
- }
- return null;
-}, St = () => {
- try {
- let e = d(E());
- if (e && typeof e.add == "function") return e;
- } catch (e) {
- console.debug?.(e);
- }
- try {
- let e = (typeof window < "u" ? window?.app : null)?.extensionManager?.toast || null;
- if (e && typeof e.add == "function") return e;
- } catch (e) {
- console.debug?.(e);
- }
return null;
}, Ct = () => {
try {
- let e = bt();
+ let e = ue();
+ if (e && typeof e.add == "function") return e;
+ } catch (e) {
+ console.debug?.(e);
+ }
+ return null;
+}, wt = () => {
+ try {
+ let e = xt();
if (e?.dialog && typeof e.dialog.show == "function") return e.dialog;
} catch (e) {
console.debug?.(e);
}
return null;
-}, wt = (e, t = "Majoor") => {
+}, Tt = (e, t = "Majoor") => {
let n = String(e ?? ""), r = String(t ?? "").trim();
return !r || r.toLowerCase() === "majoor" ? n : `${r}
${n}`;
-}, Tt = 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(".")), Et = new Set([
+}, Et = 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(".")), Dt = new Set([
"__proto__",
"constructor",
"prototype",
@@ -445,7 +433,7 @@ var H = (e, t) => {
"__defineSetter__",
"__lookupGetter__",
"__lookupSetter__"
-]), Dt = new Set([
+]), Ot = new Set([
"id",
"name",
"value",
@@ -458,11 +446,11 @@ var H = (e, t) => {
"htmlFor",
"role",
"tabIndex"
-]), Ot = (e, t = {}, n = []) => {
+]), kt = (e, t = {}, n = []) => {
let r = document.createElement(e);
return Object.entries(t || {}).forEach(([e, t]) => {
let n = String(e || "");
- if (!(!n || Et.has(n))) {
+ if (!(!n || Dt.has(n))) {
if (e === "style" && t && typeof t == "object") {
Object.assign(r.style, t);
return;
@@ -474,11 +462,11 @@ var H = (e, t) => {
if (n.startsWith("on")) {
if (typeof t == "function") {
let e = n.slice(2).toLowerCase();
- Tt.has(e) && r.addEventListener(e, t);
+ Et.has(e) && r.addEventListener(e, t);
}
return;
}
- if (Dt.has(n)) try {
+ if (Ot.has(n)) try {
r[n] = t;
return;
} catch (e) {
@@ -497,19 +485,19 @@ var H = (e, t) => {
r.appendChild(document.createTextNode(String(e)));
}
}), r;
-}, W = (e, t, n) => {
- let r = bt();
+}, G = (e, t, n) => {
+ let r = xt();
if (r?.$el) try {
return r.$el(e, t, n);
} catch {}
- return Ot(e, t, n);
-}, kt = () => bt()?.ComfyDialog || null, At = 999999, jt = 560, Mt = 12, Nt = (e) => {
+ return kt(e, t, n);
+}, At = () => xt()?.ComfyDialog || null, jt = 999999, Mt = 560, Nt = 12, Pt = (e) => {
try {
- e.element.style.zIndex = String(At), e.element.style.width = `${jt}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 = `${Mt}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)";
+ e.element.style.zIndex = String(jt), e.element.style.width = `${Mt}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 = `${Nt}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);
}
-}, Pt = (e) => {
+}, Ft = (e) => {
try {
let t = e?.element;
if (!t) return;
@@ -525,7 +513,7 @@ var H = (e, t) => {
} catch (e) {
console.debug?.(e);
}
-}, G = {
+}, K = {
debug: {
safeCall: A.DEBUG_SAFE_CALL,
safeListeners: A.DEBUG_SAFE_LISTENERS,
@@ -672,26 +660,26 @@ var H = (e, t) => {
tokenConfigured: !1,
tokenHint: ""
}
-}, K = () => {
+}, q = () => {
try {
- let e = w.get(ae);
- if (!e) return { ...G };
+ let e = xe.get(a);
+ if (!e) return { ...K };
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 = 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 = ut(G, a);
+ if (!n && !(t && typeof t == "object" && !Array.isArray(t))) return { ...K };
+ if (n && Number(t.version) > 1) return console.warn("[Majoor] settings schema version is newer than this build, using defaults"), { ...K };
+ let r = n ? t.data : t, i = 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(".")), o = {};
+ if (r && typeof r == "object") for (let [e, t] of Object.entries(r)) i.has(e) && (o[e] = t);
+ let s = dt(K, o);
if (!n) try {
- q(o);
+ J(s);
} catch (e) {
console.debug?.(e);
}
- return o;
+ return s;
} catch (e) {
- return console.warn("[Majoor] settings load failed, using defaults", e), { ...G };
+ return console.warn("[Majoor] settings load failed, using defaults", e), { ...K };
}
-}, q = (e) => {
+}, J = (e) => {
try {
let t = JSON.parse(JSON.stringify(e || {}));
t?.security && typeof t.security == "object" && (t.security.apiToken = "");
@@ -699,24 +687,24 @@ var H = (e, t) => {
version: 1,
data: t
};
- if (!w.set("mjrSettings", JSON.stringify(n))) throw Error("SettingsStore rejected the write");
+ if (!xe.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, _t(n("dialog.settingsSaveFailed", "Majoor: Failed to save settings (browser storage full or blocked).")));
+ e - (Number(window?._mjrSettingsSaveFailAt || 0) || 0) > 3e4 && (window._mjrSettingsSaveFailAt = e, vt(k("dialog.settingsSaveFailed", "Majoor: Failed to save settings (browser storage full or blocked).")));
} catch (e) {
console.debug?.(e);
}
try {
- st("mjr-settings-save-failed", { error: String(e?.message || e || "") }, { warnPrefix: "[Majoor]" });
+ ct("mjr-settings-save-failed", { error: String(e?.message || e || "") }, { warnPrefix: "[Majoor]" });
} catch (e) {
console.debug?.(e);
}
}
-}, J = (e) => {
+}, Y = (e) => {
let t = Number(A.MAX_PAGE_SIZE) || 2e3;
- j.DEFAULT_PAGE_SIZE = Math.max(50, Math.min(t, Number(e.grid?.pageSize) || A.DEFAULT_PAGE_SIZE)), j.AUTO_SCAN_ON_STARTUP = !!e.autoScan?.onStartup, j.EXECUTION_GROUPING_ENABLED = !!(e.executionGrouping?.enabled ?? A.EXECUTION_GROUPING_ENABLED), j.STATUS_POLL_INTERVAL = Math.max(1e3, Number(e.status?.pollInterval) || A.STATUS_POLL_INTERVAL), j.DEBUG_SAFE_CALL = !!e.debug?.safeCall, j.DEBUG_SAFE_LISTENERS = !!e.debug?.safeListeners, j.DEBUG_VIEWER = !!e.debug?.viewer, j.GRID_MIN_SIZE = mt(e.grid), j.FEED_GRID_MIN_SIZE = ht(e.feed), j.GRID_GAP = Math.max(0, Math.min(40, Math.round(U(e.grid?.gap, A.GRID_GAP)))), j.GRID_SHOW_BADGES_EXTENSION = !!(e.grid?.showExtBadge ?? A.GRID_SHOW_BADGES_EXTENSION), j.GRID_SHOW_BADGES_RATING = !!(e.grid?.showRatingBadge ?? A.GRID_SHOW_BADGES_RATING), j.GRID_SHOW_BADGES_TAGS = !!(e.grid?.showTagsBadge ?? A.GRID_SHOW_BADGES_TAGS), j.GRID_SHOW_DETAILS = !!(e.grid?.showDetails ?? A.GRID_SHOW_DETAILS), j.GRID_SHOW_DETAILS_FILENAME = !!(e.grid?.showFilename ?? A.GRID_SHOW_DETAILS_FILENAME), j.GRID_SHOW_DETAILS_DATE = !!(e.grid?.showDate ?? A.GRID_SHOW_DETAILS_DATE), j.GRID_SHOW_DETAILS_DIMENSIONS = !!(e.grid?.showDimensions ?? A.GRID_SHOW_DETAILS_DIMENSIONS), j.GRID_SHOW_DETAILS_GENTIME = !!(e.grid?.showGenTime ?? A.GRID_SHOW_DETAILS_GENTIME), j.GRID_SHOW_HOVER_INFO = !!(e.grid?.showHoverInfo ?? A.GRID_SHOW_HOVER_INFO), j.GRID_SHOW_WORKFLOW_DOT = !!(e.grid?.showWorkflowDot ?? A.GRID_SHOW_WORKFLOW_DOT), j.FEED_SHOW_INFO = !!(e.feed?.showInfo ?? A.FEED_SHOW_INFO), j.FEED_SHOW_FILENAME = !!(e.feed?.showFilename ?? A.FEED_SHOW_FILENAME), j.FEED_SHOW_DIMENSIONS = !!(e.feed?.showDimensions ?? A.FEED_SHOW_DIMENSIONS), j.FEED_SHOW_DATE = !!(e.feed?.showDate ?? A.FEED_SHOW_DATE), j.FEED_SHOW_GENTIME = !!(e.feed?.showGenTime ?? A.FEED_SHOW_GENTIME), j.FEED_SHOW_WORKFLOW_DOT = !!(e.feed?.showWorkflowDot ?? A.FEED_SHOW_WORKFLOW_DOT), j.FEED_SHOW_BADGES_EXTENSION = !!(e.feed?.showExtBadge ?? A.FEED_SHOW_BADGES_EXTENSION), j.FEED_SHOW_BADGES_RATING = !!(e.feed?.showRatingBadge ?? A.FEED_SHOW_BADGES_RATING), j.FEED_SHOW_BADGES_TAGS = !!(e.feed?.showTagsBadge ?? A.FEED_SHOW_BADGES_TAGS);
+ j.DEFAULT_PAGE_SIZE = Math.max(50, Math.min(t, Number(e.grid?.pageSize) || A.DEFAULT_PAGE_SIZE)), j.AUTO_SCAN_ON_STARTUP = !!e.autoScan?.onStartup, j.EXECUTION_GROUPING_ENABLED = !!(e.executionGrouping?.enabled ?? A.EXECUTION_GROUPING_ENABLED), j.STATUS_POLL_INTERVAL = Math.max(1e3, Number(e.status?.pollInterval) || A.STATUS_POLL_INTERVAL), j.DEBUG_SAFE_CALL = !!e.debug?.safeCall, j.DEBUG_SAFE_LISTENERS = !!e.debug?.safeListeners, j.DEBUG_VIEWER = !!e.debug?.viewer, j.GRID_MIN_SIZE = ht(e.grid), j.FEED_GRID_MIN_SIZE = gt(e.feed), j.GRID_GAP = Math.max(0, Math.min(40, Math.round(W(e.grid?.gap, A.GRID_GAP)))), j.GRID_SHOW_BADGES_EXTENSION = !!(e.grid?.showExtBadge ?? A.GRID_SHOW_BADGES_EXTENSION), j.GRID_SHOW_BADGES_RATING = !!(e.grid?.showRatingBadge ?? A.GRID_SHOW_BADGES_RATING), j.GRID_SHOW_BADGES_TAGS = !!(e.grid?.showTagsBadge ?? A.GRID_SHOW_BADGES_TAGS), j.GRID_SHOW_DETAILS = !!(e.grid?.showDetails ?? A.GRID_SHOW_DETAILS), j.GRID_SHOW_DETAILS_FILENAME = !!(e.grid?.showFilename ?? A.GRID_SHOW_DETAILS_FILENAME), j.GRID_SHOW_DETAILS_DATE = !!(e.grid?.showDate ?? A.GRID_SHOW_DETAILS_DATE), j.GRID_SHOW_DETAILS_DIMENSIONS = !!(e.grid?.showDimensions ?? A.GRID_SHOW_DETAILS_DIMENSIONS), j.GRID_SHOW_DETAILS_GENTIME = !!(e.grid?.showGenTime ?? A.GRID_SHOW_DETAILS_GENTIME), j.GRID_SHOW_HOVER_INFO = !!(e.grid?.showHoverInfo ?? A.GRID_SHOW_HOVER_INFO), j.GRID_SHOW_WORKFLOW_DOT = !!(e.grid?.showWorkflowDot ?? A.GRID_SHOW_WORKFLOW_DOT), j.FEED_SHOW_INFO = !!(e.feed?.showInfo ?? A.FEED_SHOW_INFO), j.FEED_SHOW_FILENAME = !!(e.feed?.showFilename ?? A.FEED_SHOW_FILENAME), j.FEED_SHOW_DIMENSIONS = !!(e.feed?.showDimensions ?? A.FEED_SHOW_DIMENSIONS), j.FEED_SHOW_DATE = !!(e.feed?.showDate ?? A.FEED_SHOW_DATE), j.FEED_SHOW_GENTIME = !!(e.feed?.showGenTime ?? A.FEED_SHOW_GENTIME), j.FEED_SHOW_WORKFLOW_DOT = !!(e.feed?.showWorkflowDot ?? A.FEED_SHOW_WORKFLOW_DOT), j.FEED_SHOW_BADGES_EXTENSION = !!(e.feed?.showExtBadge ?? A.FEED_SHOW_BADGES_EXTENSION), j.FEED_SHOW_BADGES_RATING = !!(e.feed?.showRatingBadge ?? A.FEED_SHOW_BADGES_RATING), j.FEED_SHOW_BADGES_TAGS = !!(e.feed?.showTagsBadge ?? A.FEED_SHOW_BADGES_TAGS);
{
let t = e.grid?.videoAutoplayMode ?? A.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"), j.GRID_VIDEO_AUTOPLAY_MODE = t;
@@ -732,7 +720,7 @@ var H = (e, t) => {
} catch (e) {
console.debug?.(e);
}
- j.INFINITE_SCROLL_ENABLED = !!e.infiniteScroll?.enabled, j.INFINITE_SCROLL_ROOT_MARGIN = String(e.infiniteScroll?.rootMargin || A.INFINITE_SCROLL_ROOT_MARGIN), j.INFINITE_SCROLL_THRESHOLD = Math.max(0, Math.min(1, U(e.infiniteScroll?.threshold, A.INFINITE_SCROLL_THRESHOLD))), j.BOTTOM_GAP_PX = Math.max(0, Math.min(5e3, Math.round(U(e.infiniteScroll?.bottomGapPx, A.BOTTOM_GAP_PX)))), j.VIEWER_ALLOW_PAN_AT_ZOOM_1 = !!e.viewer?.allowPanAtZoom1, j.VIEWER_DISABLE_WEBGL_VIDEO = !!e.viewer?.disableWebGL, j.VIEWER_PAUSE_DURING_EXECUTION = !!(e.viewer?.pauseDuringExecution ?? A.VIEWER_PAUSE_DURING_EXECUTION), j.FLOATING_VIEWER_PAUSE_DURING_EXECUTION = !!(e.viewer?.floatingPauseDuringExecution ?? A.FLOATING_VIEWER_PAUSE_DURING_EXECUTION), j.MFV_LIVE_DEFAULT = e.viewer?.mfvLiveDefault ?? A.MFV_LIVE_DEFAULT, j.MFV_PREVIEW_DEFAULT = e.viewer?.mfvPreviewDefault ?? A.MFV_PREVIEW_DEFAULT, j.MFV_LIVE_AUTO_OPEN = !1, j.MFV_PREVIEW_AUTO_OPEN = !1, j.MFV_NODE_STREAM_AUTO_OPEN = !1;
+ j.INFINITE_SCROLL_ENABLED = !!e.infiniteScroll?.enabled, j.INFINITE_SCROLL_ROOT_MARGIN = String(e.infiniteScroll?.rootMargin || A.INFINITE_SCROLL_ROOT_MARGIN), j.INFINITE_SCROLL_THRESHOLD = Math.max(0, Math.min(1, W(e.infiniteScroll?.threshold, A.INFINITE_SCROLL_THRESHOLD))), j.BOTTOM_GAP_PX = Math.max(0, Math.min(5e3, Math.round(W(e.infiniteScroll?.bottomGapPx, A.BOTTOM_GAP_PX)))), j.VIEWER_ALLOW_PAN_AT_ZOOM_1 = !!e.viewer?.allowPanAtZoom1, j.VIEWER_DISABLE_WEBGL_VIDEO = !!e.viewer?.disableWebGL, j.VIEWER_PAUSE_DURING_EXECUTION = !!(e.viewer?.pauseDuringExecution ?? A.VIEWER_PAUSE_DURING_EXECUTION), j.FLOATING_VIEWER_PAUSE_DURING_EXECUTION = !!(e.viewer?.floatingPauseDuringExecution ?? A.FLOATING_VIEWER_PAUSE_DURING_EXECUTION), j.MFV_LIVE_DEFAULT = e.viewer?.mfvLiveDefault ?? A.MFV_LIVE_DEFAULT, j.MFV_PREVIEW_DEFAULT = e.viewer?.mfvPreviewDefault ?? A.MFV_PREVIEW_DEFAULT, j.MFV_LIVE_AUTO_OPEN = !1, j.MFV_PREVIEW_AUTO_OPEN = !1, j.MFV_NODE_STREAM_AUTO_OPEN = !1;
{
let t = String(e.viewer?.mfvPreviewMethod || A.MFV_PREVIEW_METHOD).toLowerCase();
j.MFV_PREVIEW_METHOD = [
@@ -751,56 +739,56 @@ var H = (e, t) => {
"bottom"
].includes(t) ? t : "right";
}
- j.VIEWER_VIDEO_GRADE_THROTTLE_FPS = Math.max(1, Math.min(60, Math.round(U(e.viewer?.videoGradeThrottleFps, A.VIEWER_VIDEO_GRADE_THROTTLE_FPS)))), j.VIEWER_SCOPES_FPS = Math.max(1, Math.min(60, Math.round(U(e.viewer?.scopesFps, A.VIEWER_SCOPES_FPS)))), j.VIEWER_META_TTL_MS = Math.max(1e3, Math.min(10 * 6e4, Math.round(U(e.viewer?.metaTtlMs, A.VIEWER_META_TTL_MS)))), j.VIEWER_META_MAX_ENTRIES = Math.max(50, Math.min(5e3, Math.round(U(e.viewer?.metaMaxEntries, A.VIEWER_META_MAX_ENTRIES)))), j.WORKFLOW_MINIMAP_ENABLED = !!(e.workflowMinimap?.enabled ?? !1), j.RT_HYDRATE_CONCURRENCY = Math.max(1, Math.min(16, Math.round(U(e.rtHydrate?.concurrency, A.RT_HYDRATE_CONCURRENCY)))), j.RT_HYDRATE_QUEUE_MAX = Math.max(10, Math.min(5e3, Math.round(U(e.rtHydrate?.queueMax, A.RT_HYDRATE_QUEUE_MAX)))), j.RT_HYDRATE_SEEN_MAX = Math.max(1e3, Math.min(2e5, Math.round(U(e.rtHydrate?.seenMax, A.RT_HYDRATE_SEEN_MAX)))), j.RT_HYDRATE_PRUNE_BUDGET = Math.max(10, Math.min(1e4, Math.round(U(e.rtHydrate?.pruneBudget, A.RT_HYDRATE_PRUNE_BUDGET)))), j.RT_HYDRATE_SEEN_TTL_MS = Math.max(5e3, Math.min(360 * 6e4, Math.round(U(e.rtHydrate?.seenTtlMs, A.RT_HYDRATE_SEEN_TTL_MS)))), j.DELETE_CONFIRMATION = !!e.safety?.confirmDeletion, j.DEBUG_VERBOSE_ERRORS = !!e.observability?.verboseErrors, j.WATCHER_MAX_PENDING = Math.max(10, Math.min(5e3, Math.round(U(e.watcher?.maxPending, 500)))), j.WATCHER_MIN_SIZE = Math.max(0, Math.min(1e6, Math.round(U(e.watcher?.minSize, 100)))), j.WATCHER_MAX_SIZE = Math.max(1e5, Math.min(17179869184, Math.round(U(e.watcher?.maxSize, 4294967296)))), j.DB_TIMEOUT_MS = Math.max(1e3, Math.min(3e4, Math.round(U(e.db?.timeoutMs, 5e3)))), j.DB_MAX_CONNECTIONS = Math.max(1, Math.min(100, Math.round(U(e.db?.maxConnections, 10)))), j.DB_QUERY_TIMEOUT_MS = Math.max(500, Math.min(1e4, Math.round(U(e.db?.queryTimeoutMs, 1e3)))), j.SEARCH_REQUEST_LIMIT = Math.max(10, Math.min(A.MAX_PAGE_SIZE || 2e3, Math.round(U(e.search?.maxResults, A.SEARCH_DEFAULT_LIMIT))));
+ j.VIEWER_VIDEO_GRADE_THROTTLE_FPS = Math.max(1, Math.min(60, Math.round(W(e.viewer?.videoGradeThrottleFps, A.VIEWER_VIDEO_GRADE_THROTTLE_FPS)))), j.VIEWER_SCOPES_FPS = Math.max(1, Math.min(60, Math.round(W(e.viewer?.scopesFps, A.VIEWER_SCOPES_FPS)))), j.VIEWER_META_TTL_MS = Math.max(1e3, Math.min(10 * 6e4, Math.round(W(e.viewer?.metaTtlMs, A.VIEWER_META_TTL_MS)))), j.VIEWER_META_MAX_ENTRIES = Math.max(50, Math.min(5e3, Math.round(W(e.viewer?.metaMaxEntries, A.VIEWER_META_MAX_ENTRIES)))), j.WORKFLOW_MINIMAP_ENABLED = !!(e.workflowMinimap?.enabled ?? !1), j.RT_HYDRATE_CONCURRENCY = Math.max(1, Math.min(16, Math.round(W(e.rtHydrate?.concurrency, A.RT_HYDRATE_CONCURRENCY)))), j.RT_HYDRATE_QUEUE_MAX = Math.max(10, Math.min(5e3, Math.round(W(e.rtHydrate?.queueMax, A.RT_HYDRATE_QUEUE_MAX)))), j.RT_HYDRATE_SEEN_MAX = Math.max(1e3, Math.min(2e5, Math.round(W(e.rtHydrate?.seenMax, A.RT_HYDRATE_SEEN_MAX)))), j.RT_HYDRATE_PRUNE_BUDGET = Math.max(10, Math.min(1e4, Math.round(W(e.rtHydrate?.pruneBudget, A.RT_HYDRATE_PRUNE_BUDGET)))), j.RT_HYDRATE_SEEN_TTL_MS = Math.max(5e3, Math.min(360 * 6e4, Math.round(W(e.rtHydrate?.seenTtlMs, A.RT_HYDRATE_SEEN_TTL_MS)))), j.DELETE_CONFIRMATION = !!e.safety?.confirmDeletion, j.DEBUG_VERBOSE_ERRORS = !!e.observability?.verboseErrors, j.WATCHER_MAX_PENDING = Math.max(10, Math.min(5e3, Math.round(W(e.watcher?.maxPending, 500)))), j.WATCHER_MIN_SIZE = Math.max(0, Math.min(1e6, Math.round(W(e.watcher?.minSize, 100)))), j.WATCHER_MAX_SIZE = Math.max(1e5, Math.min(17179869184, Math.round(W(e.watcher?.maxSize, 4294967296)))), j.DB_TIMEOUT_MS = Math.max(1e3, Math.min(3e4, Math.round(W(e.db?.timeoutMs, 5e3)))), j.DB_MAX_CONNECTIONS = Math.max(1, Math.min(100, Math.round(W(e.db?.maxConnections, 10)))), j.DB_QUERY_TIMEOUT_MS = Math.max(500, Math.min(1e4, Math.round(W(e.db?.queryTimeoutMs, 1e3)))), j.SEARCH_REQUEST_LIMIT = Math.max(10, Math.min(A.MAX_PAGE_SIZE || 2e3, Math.round(W(e.search?.maxResults, A.SEARCH_DEFAULT_LIMIT))));
};
-async function Ft() {
+async function It() {
try {
let e = await t();
if (!e?.ok) return;
let n = e.data?.prefs;
if (!n || typeof n != "object") return;
- let r = K();
- if (r.security = r.security || {}, r.security.safeMode = H(n.safe_mode, r.security.safeMode), r.security.allowWrite = H(n.allow_write, r.security.allowWrite), r.security.requireAuth = H(n.require_auth, r.security.requireAuth), r.security.allowRemoteWrite = H(n.allow_remote_write, r.security.allowRemoteWrite), r.security.allowInsecureTokenTransport = H(n.allow_insecure_token_transport, r.security.allowInsecureTokenTransport), r.security.allowDelete = H(n.allow_delete, r.security.allowDelete), r.security.allowRename = H(n.allow_rename, r.security.allowRename), r.security.allowOpenInFolder = H(n.allow_open_in_folder, r.security.allowOpenInFolder), r.security.allowResetIndex = H(n.allow_reset_index, r.security.allowResetIndex), r.security.tokenConfigured = H(n.token_configured, r.security.tokenConfigured), r.security.tokenHint = String(n.token_hint || "").trim(), !String(r.security.apiToken || "").trim()) try {
- let e = await x(), t = String(e?.data?.token || "").trim();
+ let r = q();
+ 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 C(), t = String(e?.data?.token || "").trim();
e?.ok && t && (r.security.apiToken = t);
} catch (e) {
console.debug?.(e);
}
- q(r), J(r), st("mjr-settings-changed", { key: "security" }, { warnPrefix: "[Majoor]" });
+ J(r), Y(r), ct("mjr-settings-changed", { key: "security" }, { warnPrefix: "[Majoor]" });
} catch (e) {
console.warn("[Majoor] failed to sync backend security settings", e);
}
}
-async function It() {
+async function Lt() {
try {
- let e = await S();
+ let e = await l();
if (!e?.ok) return;
let t = e.data?.prefs;
if (!t || typeof t != "object") return;
- let n = K();
- n.ai = n.ai || {}, n.ai.vectorSearchEnabled = H(t.enabled, n.ai.vectorSearchEnabled ?? !0), n.ai.vectorCaptionOnIndex = H(t.caption_on_index ?? t.captionOnIndex, n.ai.vectorCaptionOnIndex ?? !1), q(n), J(n), st("mjr-settings-changed", { key: "ai.vectorSearch" }, { warnPrefix: "[Majoor]" });
+ let n = q();
+ 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), J(n), Y(n), ct("mjr-settings-changed", { key: "ai.vectorSearch" }, { warnPrefix: "[Majoor]" });
} catch (e) {
console.warn("[Majoor] failed to sync backend vector search settings", e);
}
}
-async function Lt() {
+async function Rt() {
try {
- let e = await m();
+ let e = await p();
if (!e?.ok) return;
let t = e.data?.prefs;
if (!t || typeof t != "object") return;
- let n = K();
- n.executionGrouping = n.executionGrouping || {}, n.executionGrouping.enabled = H(t.enabled, n.executionGrouping.enabled ?? A.EXECUTION_GROUPING_ENABLED), q(n), J(n), st("mjr-settings-changed", { key: "executionGrouping.enabled" }, { warnPrefix: "[Majoor]" });
+ let n = q();
+ n.executionGrouping = n.executionGrouping || {}, n.executionGrouping.enabled = U(t.enabled, n.executionGrouping.enabled ?? A.EXECUTION_GROUPING_ENABLED), J(n), Y(n), ct("mjr-settings-changed", { key: "executionGrouping.enabled" }, { warnPrefix: "[Majoor]" });
} catch (e) {
console.warn("[Majoor] failed to sync backend execution grouping settings", e);
}
}
//#endregion
//#region ui/app/settings/settingsRuntime.ts
-var Rt = "mjr-runtime-status-dashboard", zt = "__mjr_write_token", Bt = 3e4;
-function Vt() {
+var zt = "mjr-runtime-status-dashboard", Bt = "__mjr_write_token", Vt = 3e4;
+function Ht() {
try {
- let e = K(), t = String(e?.observability?.runtimeDashboardMode || G.observability.runtimeDashboardMode);
+ let e = q(), t = String(e?.observability?.runtimeDashboardMode || K.observability.runtimeDashboardMode);
return [
"autoHide30",
"always",
@@ -810,59 +798,59 @@ function Vt() {
return "autoHide30";
}
}
-function Ht() {
- try {
- document.getElementById(Rt)?.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);
+ document.getElementById(zt)?.remove?.();
} catch (e) {
console.debug?.(e);
}
}
function Wt() {
try {
- return String(sessionStorage?.getItem?.(zt) || "").trim();
+ 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 Gt() {
+ try {
+ return String(sessionStorage?.getItem?.(Bt) || "").trim();
} catch {
return "";
}
}
-function Gt(e, t) {
+function Kt(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 Kt(e) {
- let t = Wt(), r = String(e?.token_hint || "").trim() || (t ? `...${t.slice(-4)}` : ""), i = e?.allow_write !== !1, a = e?.require_auth === !0, o = e?.token_configured === !0;
- return i ? t ? {
- text: n("runtime.writeAuthActive", "Write auth: active {tokenHint}", { tokenHint: r || "(session)" }),
+function qt(e) {
+ let t = Gt(), n = String(e?.token_hint || "").trim() || (t ? `...${t.slice(-4)}` : ""), r = e?.allow_write !== !1, i = e?.require_auth === !0, a = e?.token_configured === !0;
+ return r ? t ? {
+ text: k("runtime.writeAuthActive", "Write auth: active {tokenHint}", { tokenHint: n || "(session)" }),
color: "#7ee0a0"
- } : a && o ? {
- text: n("runtime.writeAuthMissing", "Write auth: missing in this browser {tokenHint}", { tokenHint: r || "(server token configured)" }),
+ } : i && a ? {
+ text: k("runtime.writeAuthMissing", "Write auth: missing in this browser {tokenHint}", { tokenHint: n || "(server token configured)" }),
color: "#f1c36d"
- } : a ? {
- text: n("runtime.writeAuthRequired", "Write auth: required"),
+ } : i ? {
+ text: k("runtime.writeAuthRequired", "Write auth: required"),
color: "#f1c36d"
} : e && typeof e == "object" ? {
- text: n("runtime.writeAuthNotRequired", "Write auth: not required"),
+ text: k("runtime.writeAuthNotRequired", "Write auth: not required"),
color: "#8fd0ff"
} : {
- text: n("runtime.writeAuthUnknown", "Write auth: unknown"),
+ text: k("runtime.writeAuthUnknown", "Write auth: unknown"),
color: "#c8ced8"
} : {
- text: n("runtime.writeAuthBlocked", "Write auth: writes blocked by server"),
+ text: k("runtime.writeAuthBlocked", "Write auth: writes blocked by server"),
color: "#ff9b9b"
};
}
-function qt() {
+function Jt() {
try {
- if (Vt() === "hidden" || window.__MJR_RUNTIME_STATUS_HIDDEN__) return Ht(), null;
- let e = document.querySelector(".mjr-assets-manager.mjr-am-container"), t = document.getElementById(Rt);
+ if (Ht() === "hidden" || window.__MJR_RUNTIME_STATUS_HIDDEN__) return Ut(), null;
+ let e = document.querySelector(".mjr-assets-manager.mjr-am-container"), t = document.getElementById(zt);
if (!e) {
try {
t?.remove?.();
@@ -877,52 +865,52 @@ function qt() {
} catch (e) {
console.debug?.(e);
}
- let n = document.getElementById(Rt);
- return n ? n.parentElement !== e && e.appendChild(n) : (n = document.createElement("div"), n.id = Rt, 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;
+ let n = document.getElementById(zt);
+ return n ? n.parentElement !== e && e.appendChild(n) : (n = document.createElement("div"), n.id = zt, 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 Jt() {
- let e = qt();
+async function Yt() {
+ let e = Jt();
if (!e) return !1;
- let r = Gt(e, "metrics"), i = Gt(e, "auth");
+ let n = Kt(e, "metrics"), r = Kt(e, "auth");
try {
- let [a, o] = await Promise.all([be(), t()]), s = n("runtime.unavailable", "Runtime: unavailable");
- if (!a?.ok || !a?.data) r.textContent = s;
+ let [i, a] = await Promise.all([E(), t()]), o = k("runtime.unavailable", "Runtime: unavailable");
+ if (!i?.ok || !i?.data) n.textContent = o;
else {
- let e = a.data.db || {}, t = a.data.index || {}, i = a.data.watcher || {}, o = Number(e.active_connections || 0), c = Number(t.enrichment_queue_length || 0), l = Number(i.pending_files || 0);
- r.textContent = n("runtime.metricsLine", "DB active: {active} | Enrich Q: {enrichQ} | Watcher pending: {pending}", {
- active: o,
- enrichQ: c,
- pending: l
- }), s = n("runtime.metricsTitle", "Runtime Metrics\nDB active connections: {active}\nEnrichment queue: {enrichQ}\nWatcher pending files: {pending}", {
- active: o,
- enrichQ: c,
- pending: l
+ let e = i.data.db || {}, t = i.data.index || {}, r = i.data.watcher || {}, a = Number(e.active_connections || 0), s = Number(t.enrichment_queue_length || 0), c = Number(r.pending_files || 0);
+ n.textContent = k("runtime.metricsLine", "DB active: {active} | Enrich Q: {enrichQ} | Watcher pending: {pending}", {
+ active: a,
+ enrichQ: s,
+ pending: c
+ }), o = k("runtime.metricsTitle", "Runtime Metrics\nDB active connections: {active}\nEnrichment queue: {enrichQ}\nWatcher pending files: {pending}", {
+ active: a,
+ enrichQ: s,
+ pending: c
});
}
- let c = Kt(o?.data?.prefs || null);
- return i.textContent = c.text, i.style.color = c.color, e.title = `${s}\n${c.text}`, !0;
+ let s = qt(a?.data?.prefs || null);
+ return r.textContent = s.text, r.style.color = s.color, e.title = `${o}\n${s.text}`, !0;
} catch {
- return r.textContent = n("runtime.unavailable", "Runtime: unavailable"), i.textContent = n("runtime.writeAuthUnknown", "Write auth: unknown"), i.style.color = "#c8ced8", e.title = `${n("runtime.unavailable", "Runtime: unavailable")}\n${i.textContent}`, !0;
+ return n.textContent = k("runtime.unavailable", "Runtime: unavailable"), r.textContent = k("runtime.writeAuthUnknown", "Write auth: unknown"), r.style.color = "#c8ced8", e.title = `${k("runtime.unavailable", "Runtime: unavailable")}\n${r.textContent}`, !0;
}
}
-function Yt() {
+function Xt() {
try {
- let e = Vt();
+ let e = Ht();
if (e === "hidden") {
- window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, Ut(), Ht();
+ window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, Wt(), Ut();
return;
}
window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__ || (window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__ = (e) => {
if (e?.detail?.key !== "observability.runtimeDashboardMode") return;
- let t = Vt();
- window.__MJR_RUNTIME_STATUS_HIDDEN__ = t === "hidden", Ut(), Ht(), t !== "hidden" && Yt();
- }, 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, Ht();
- }, Bt)), Jt().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, Jt().then((e) => {
+ let t = Ht();
+ window.__MJR_RUNTIME_STATUS_HIDDEN__ = t === "hidden", Wt(), Ut(), t !== "hidden" && Xt();
+ }, window.addEventListener?.("mjr-settings-changed", window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__)), window.__MJR_RUNTIME_STATUS_HIDDEN__ = !1, Wt(), e === "autoHide30" && (window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = setTimeout(() => {
+ window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, Ut();
+ }, Vt)), Yt().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, Yt().then((e) => {
if (e) {
window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = 0;
return;
@@ -938,8 +926,8 @@ function Yt() {
}
//#endregion
//#region ui/utils/debounce.ts
-var Xt = 300;
-function Zt(e, t = Xt) {
+var Zt = 300;
+function Qt(e, t = Zt) {
let n, r = (...r) => {
clearTimeout(n), n = setTimeout(() => e(...r), t);
};
@@ -951,54 +939,54 @@ function Zt(e, t = Xt) {
}
//#endregion
//#region ui/app/settings/settingsGrid.ts
-var Y = "Majoor", Qt = "Majoor Assets Manager";
-function $t(e, t, r) {
- let i = (e, t) => [
- Qt,
+var X = "Majoor", $t = "Majoor Assets Manager";
+function en(e, t, n) {
+ let r = (e, t) => [
+ $t,
e,
t
+ ], i = (e) => [
+ $t,
+ k("cat.cards", "Cards"),
+ e
], a = (e) => [
- Qt,
- n("cat.cards", "Cards"),
+ $t,
+ k("cat.badges", "Badges"),
e
], o = (e) => [
- Qt,
- n("cat.badges", "Badges"),
+ $t,
+ k("cat.badges", "Badges"),
e
- ], s = (e) => [
- Qt,
- n("cat.badges", "Badges"),
- e
- ], c = (e, t) => {
+ ], 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), q(t)), e({
- id: `${Y}.Cards.ThumbSize`,
- category: a(n("setting.grid.cardSize.group", "Card size")),
- name: n("setting.grid.cardSize.name", "Majoor: Card Size"),
- tooltip: n("setting.grid.cardSize.desc", "Choose the card size preset used by the grid layout."),
+ t.grid?.minSizePreset || (t.grid = t.grid || {}, t.grid.minSizePreset = _t(t.grid.minSize), J(t)), e({
+ id: `${X}.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 = ct(String(t.grid?.minSizePreset || "").toLowerCase(), ft, gt(t.grid?.minSize)), r = {
- small: n("setting.grid.cardSize.small", "Small"),
- medium: n("setting.grid.cardSize.medium", "Medium"),
- large: n("setting.grid.cardSize.large", "Large")
+ let e = lt(String(t.grid?.minSizePreset || "").toLowerCase(), pt, _t(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 r[e] || r.medium;
+ return n[e] || n.medium;
})(),
options: [
- n("setting.grid.cardSize.small", "Small"),
- n("setting.grid.cardSize.medium", "Medium"),
- n("setting.grid.cardSize.large", "Large")
+ k("setting.grid.cardSize.small", "Small"),
+ k("setting.grid.cardSize.medium", "Medium"),
+ k("setting.grid.cardSize.large", "Large")
],
onChange: (e) => {
- let i = String(e || "").trim().toLowerCase(), a = n("setting.grid.cardSize.small", "Small").toLowerCase(), o = n("setting.grid.cardSize.medium", "Medium").toLowerCase(), s = n("setting.grid.cardSize.large", "Large").toLowerCase(), c = "medium";
- i === a || i === "small" || i === "petit" ? c = "small" : i === s || i === "large" || i === "grand" ? c = "large" : (i === o || i === "medium" || i === "moyen") && (c = "medium"), t.grid.minSizePreset = c, t.grid.minSize = dt[c], q(t), J(t), r("grid.minSizePreset");
+ 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 = ft[s], J(t), Y(t), n("grid.minSizePreset");
}
}), e({
- id: `${Y}.Cards.CustomThumbSize`,
- category: a(n("setting.grid.cardSize.group", "Card size")),
+ id: `${X}.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",
@@ -1009,174 +997,174 @@ function $t(e, t, r) {
step: 10
},
onChange: (e) => {
- let n = Math.max(60, Math.min(600, Math.round(Number(e) || 120)));
- t.grid.minSize = n, t.grid.minSizePreset = gt(n), q(t), J(t), r("grid.minSize");
+ let r = Math.max(60, Math.min(600, Math.round(Number(e) || 120)));
+ t.grid.minSize = r, t.grid.minSizePreset = _t(r), J(t), Y(t), n("grid.minSize");
}
}), e({
- id: `${Y}.Grid.ShowDetails`,
- category: a("Show card details"),
+ id: `${X}.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, q(t), J(t), r("grid.showDetails");
+ t.grid.showDetails = !!e, J(t), Y(t), n("grid.showDetails");
}
}), e({
- id: `${Y}.Grid.ShowFilename`,
- category: a("Show filename"),
+ id: `${X}.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, q(t), J(t), r("grid.showFilename");
+ t.grid.showFilename = !!e, J(t), Y(t), n("grid.showFilename");
}
}), e({
- id: `${Y}.Grid.ShowDate`,
- category: a("Show date/time"),
+ id: `${X}.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, q(t), J(t), r("grid.showDate");
+ t.grid.showDate = !!e, J(t), Y(t), n("grid.showDate");
}
}), e({
- id: `${Y}.Grid.ShowDimensions`,
- category: a("Show dimensions"),
+ id: `${X}.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, q(t), J(t), r("grid.showDimensions");
+ t.grid.showDimensions = !!e, J(t), Y(t), n("grid.showDimensions");
}
}), e({
- id: `${Y}.Grid.ShowGenTime`,
- category: a("Show generation time"),
+ id: `${X}.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 ?? A.GRID_SHOW_DETAILS_GENTIME),
onChange: (e) => {
- t.grid.showGenTime = !!e, q(t), J(t), r("grid.showGenTime");
+ t.grid.showGenTime = !!e, J(t), Y(t), n("grid.showGenTime");
}
}), e({
- id: `${Y}.Grid.ShowHoverInfo`,
- category: a("Show prompt on hover"),
+ id: `${X}.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 ?? A.GRID_SHOW_HOVER_INFO),
onChange: (e) => {
- t.grid.showHoverInfo = !!e, q(t), J(t), r("grid.showHoverInfo");
+ t.grid.showHoverInfo = !!e, J(t), Y(t), n("grid.showHoverInfo");
}
}), e({
- id: `${Y}.Grid.ShowWorkflowDot`,
- category: a("Show workflow dot"),
+ id: `${X}.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, q(t), J(t), r("grid.showWorkflowDot");
+ t.grid.showWorkflowDot = !!e, J(t), Y(t), n("grid.showWorkflowDot");
}
}), e({
- id: `${Y}.Grid.ShowExtBadge`,
- category: o("Show format badges"),
+ id: `${X}.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, q(t), J(t), r("grid.showExtBadge");
+ t.grid.showExtBadge = !!e, J(t), Y(t), n("grid.showExtBadge");
}
}), e({
- id: `${Y}.Grid.ShowRatingBadge`,
- category: o("Show rating badges"),
+ id: `${X}.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, q(t), J(t), r("grid.showRatingBadge");
+ t.grid.showRatingBadge = !!e, J(t), Y(t), n("grid.showRatingBadge");
}
}), e({
- id: `${Y}.Grid.ShowTagsBadge`,
- category: o("Show tags badges"),
+ id: `${X}.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, q(t), J(t), r("grid.showTagsBadge");
+ t.grid.showTagsBadge = !!e, J(t), Y(t), n("grid.showTagsBadge");
}
}), e({
- id: `${Y}.Badges.StarColor`,
- category: s(n("setting.starColor", "Star color")),
- name: n("setting.starColor", "Majoor: Star color"),
- tooltip: n("setting.starColor.tooltip", "Color of rating stars on thumbnails (hex, e.g. #FFD45A)"),
+ id: `${X}.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: c(t.grid?.starColor, A.BADGE_STAR_COLOR),
+ defaultValue: s(t.grid?.starColor, A.BADGE_STAR_COLOR),
onChange: (e) => {
- t.grid.starColor = c(e, A.BADGE_STAR_COLOR), q(t), J(t), r("grid.starColor");
+ t.grid.starColor = s(e, A.BADGE_STAR_COLOR), J(t), Y(t), n("grid.starColor");
}
}), e({
- id: `${Y}.Badges.ImageColor`,
- category: s(n("setting.badgeImageColor", "Image badge color")),
- name: n("setting.badgeImageColor", "Majoor: Image badge color"),
- tooltip: n("setting.badgeImageColor.tooltip", "Color for image badges: PNG, JPG, WEBP, GIF, BMP, TIF (hex)"),
+ id: `${X}.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: c(t.grid?.badgeImageColor, A.BADGE_IMAGE_COLOR),
+ defaultValue: s(t.grid?.badgeImageColor, A.BADGE_IMAGE_COLOR),
onChange: (e) => {
- t.grid.badgeImageColor = c(e, A.BADGE_IMAGE_COLOR), q(t), J(t), r("grid.badgeImageColor");
+ t.grid.badgeImageColor = s(e, A.BADGE_IMAGE_COLOR), J(t), Y(t), n("grid.badgeImageColor");
}
}), e({
- id: `${Y}.Badges.VideoColor`,
- category: s(n("setting.badgeVideoColor", "Video badge color")),
- name: n("setting.badgeVideoColor", "Majoor: Video badge color"),
- tooltip: n("setting.badgeVideoColor.tooltip", "Color for video badges: MP4, WEBM, MOV, AVI, MKV (hex)"),
+ id: `${X}.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: c(t.grid?.badgeVideoColor, A.BADGE_VIDEO_COLOR),
+ defaultValue: s(t.grid?.badgeVideoColor, A.BADGE_VIDEO_COLOR),
onChange: (e) => {
- t.grid.badgeVideoColor = c(e, A.BADGE_VIDEO_COLOR), q(t), J(t), r("grid.badgeVideoColor");
+ t.grid.badgeVideoColor = s(e, A.BADGE_VIDEO_COLOR), J(t), Y(t), n("grid.badgeVideoColor");
}
}), e({
- id: `${Y}.Badges.AudioColor`,
- category: s(n("setting.badgeAudioColor", "Audio badge color")),
- name: n("setting.badgeAudioColor", "Majoor: Audio badge color"),
- tooltip: n("setting.badgeAudioColor.tooltip", "Color for audio badges: MP3, WAV, OGG, FLAC (hex)"),
+ id: `${X}.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: c(t.grid?.badgeAudioColor, A.BADGE_AUDIO_COLOR),
+ defaultValue: s(t.grid?.badgeAudioColor, A.BADGE_AUDIO_COLOR),
onChange: (e) => {
- t.grid.badgeAudioColor = c(e, A.BADGE_AUDIO_COLOR), q(t), J(t), r("grid.badgeAudioColor");
+ t.grid.badgeAudioColor = s(e, A.BADGE_AUDIO_COLOR), J(t), Y(t), n("grid.badgeAudioColor");
}
}), e({
- id: `${Y}.Badges.Model3dColor`,
- category: s(n("setting.badgeModel3dColor", "3D model badge color")),
- name: n("setting.badgeModel3dColor", "Majoor: 3D model badge color"),
- tooltip: n("setting.badgeModel3dColor.tooltip", "Color for 3D model badges: OBJ, FBX, GLB, GLTF (hex)"),
+ id: `${X}.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: c(t.grid?.badgeModel3dColor, A.BADGE_MODEL3D_COLOR),
+ defaultValue: s(t.grid?.badgeModel3dColor, A.BADGE_MODEL3D_COLOR),
onChange: (e) => {
- t.grid.badgeModel3dColor = c(e, A.BADGE_MODEL3D_COLOR), q(t), J(t), r("grid.badgeModel3dColor");
+ t.grid.badgeModel3dColor = s(e, A.BADGE_MODEL3D_COLOR), J(t), Y(t), n("grid.badgeModel3dColor");
}
}), e({
- id: `${Y}.Badges.DuplicateAlertColor`,
- category: s(n("setting.badgeDuplicateAlertColor", "Duplicate alert badge color")),
- name: n("setting.badgeDuplicateAlertColor", "Majoor: Duplicate alert badge color"),
- tooltip: n("setting.badgeDuplicateAlertColor.tooltip", "Color for duplicate extension badges (PNG+, JPG+, etc)."),
+ id: `${X}.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: c(t.grid?.badgeDuplicateAlertColor, A.BADGE_DUPLICATE_ALERT_COLOR),
+ defaultValue: s(t.grid?.badgeDuplicateAlertColor, A.BADGE_DUPLICATE_ALERT_COLOR),
onChange: (e) => {
- t.grid.badgeDuplicateAlertColor = c(e, A.BADGE_DUPLICATE_ALERT_COLOR), q(t), J(t), r("grid.badgeDuplicateAlertColor");
+ t.grid.badgeDuplicateAlertColor = s(e, A.BADGE_DUPLICATE_ALERT_COLOR), J(t), Y(t), n("grid.badgeDuplicateAlertColor");
}
}), e({
- id: `${Y}.Grid.PageSize`,
- category: i(n("cat.grid"), n("setting.grid.pagesize.name").replace("Majoor: ", "")),
- name: n("setting.grid.pagesize.name"),
- tooltip: n("setting.grid.pagesize.desc"),
+ id: `${X}.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: {
@@ -1185,43 +1173,43 @@ function $t(e, t, r) {
step: 50
},
onChange: (e) => {
- let n = Number(j.MAX_PAGE_SIZE) || 2e3;
- t.grid.pageSize = Math.max(50, Math.min(n, Number(e) || A.DEFAULT_PAGE_SIZE)), q(t), J(t), r("grid.pageSize");
+ let r = Number(j.MAX_PAGE_SIZE) || 2e3;
+ t.grid.pageSize = Math.max(50, Math.min(r, Number(e) || A.DEFAULT_PAGE_SIZE)), J(t), Y(t), n("grid.pageSize");
}
}), e({
- id: `${Y}.InfiniteScroll.Enabled`,
- category: i(n("cat.grid"), n("setting.nav.infinite.name").replace("Majoor: ", "")),
- name: n("setting.nav.infinite.name"),
- tooltip: n("setting.nav.infinite.desc"),
+ id: `${X}.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, q(t), J(t), r("infiniteScroll.enabled");
+ t.infiniteScroll = t.infiniteScroll || {}, t.infiniteScroll.enabled = !!e, J(t), Y(t), n("infiniteScroll.enabled");
}
}), e({
- id: `${Y}.Sidebar.Position`,
- category: i(n("cat.grid"), n("setting.sidebar.pos.name").replace("Majoor: ", "")),
- name: n("setting.sidebar.pos.name"),
- tooltip: n("setting.sidebar.pos.desc"),
+ id: `${X}.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", q(t), r("sidebar.position");
+ t.sidebar = t.sidebar || {}, t.sidebar.position = e === "left" ? "left" : "right", J(t), n("sidebar.position");
}
}), e({
- id: `${Y}.Sidebar.ShowPreviewThumb`,
- category: i(n("cat.grid"), "Sidebar preview"),
+ id: `${X}.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, q(t), r("sidebar.showPreviewThumb");
+ t.sidebar = t.sidebar || {}, t.sidebar.showPreviewThumb = !!e, J(t), n("sidebar.showPreviewThumb");
}
}), e({
- id: `${Y}.Sidebar.WidthPx`,
- category: i(n("cat.grid"), "Sidebar width"),
+ id: `${X}.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",
@@ -1232,161 +1220,161 @@ function $t(e, t, r) {
step: 10
},
onChange: (e) => {
- t.sidebar = t.sidebar || {}, t.sidebar.widthPx = Math.max(240, Math.min(640, Math.round(Number(e) || 360))), q(t), r("sidebar.widthPx");
+ t.sidebar = t.sidebar || {}, t.sidebar.widthPx = Math.max(240, Math.min(640, Math.round(Number(e) || 360))), J(t), n("sidebar.widthPx");
}
}), e({
- id: `${Y}.General.HideSiblings`,
- category: i(n("cat.grid"), n("setting.siblings.hide.name").replace("Majoor: ", "")),
- name: n("setting.siblings.hide.name"),
- tooltip: n("setting.siblings.hide.desc"),
+ id: `${X}.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, q(t), r("siblings.hidePngSiblings");
+ t.siblings = t.siblings || {}, t.siblings.hidePngSiblings = !!e, J(t), n("siblings.hidePngSiblings");
}
}), e({
- id: `${Y}.Grid.VideoAutoplayMode`,
- category: i(n("cat.grid"), n("setting.grid.videoAutoplayMode.name", "Video autoplay").replace("Majoor: ", "")),
- name: n("setting.grid.videoAutoplayMode.name", "Majoor: Video autoplay"),
- tooltip: n("setting.grid.videoAutoplayMode.desc", "Controls video thumbnail playback in the grid. Off: static frame. Hover: play on mouse hover. Always: loop while visible."),
+ id: `${X}.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 r = {
- off: n("setting.grid.videoAutoplayMode.off", "Off"),
- hover: n("setting.grid.videoAutoplayMode.hover", "Hover"),
- always: n("setting.grid.videoAutoplayMode.always", "Always")
+ let n = {
+ off: k("setting.grid.videoAutoplayMode.off", "Off"),
+ hover: k("setting.grid.videoAutoplayMode.hover", "Hover"),
+ always: k("setting.grid.videoAutoplayMode.always", "Always")
};
- return r[e] || r.off;
+ return n[e] || n.off;
})(),
options: [
- n("setting.grid.videoAutoplayMode.off", "Off"),
- n("setting.grid.videoAutoplayMode.hover", "Hover"),
- n("setting.grid.videoAutoplayMode.always", "Always")
+ k("setting.grid.videoAutoplayMode.off", "Off"),
+ k("setting.grid.videoAutoplayMode.hover", "Hover"),
+ k("setting.grid.videoAutoplayMode.always", "Always")
],
onChange: (e) => {
- let i = {
- [n("setting.grid.videoAutoplayMode.off", "Off")]: "off",
- [n("setting.grid.videoAutoplayMode.hover", "Hover")]: "hover",
- [n("setting.grid.videoAutoplayMode.always", "Always")]: "always"
+ 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 = i, delete t.grid.videoHoverAutoplay, q(t), J(t), r("grid.videoAutoplayMode");
+ t.grid = t.grid || {}, t.grid.videoAutoplayMode = r, delete t.grid.videoHoverAutoplay, J(t), Y(t), n("grid.videoAutoplayMode");
}
}), e({
- id: `${Y}.Cards.HoverColor`,
- category: a("Hover color"),
+ id: `${X}.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: c(t.ui?.cardHoverColor, A.UI_CARD_HOVER_COLOR),
+ defaultValue: s(t.ui?.cardHoverColor, A.UI_CARD_HOVER_COLOR),
onChange: (e) => {
- t.ui = t.ui || {}, t.ui.cardHoverColor = c(e, A.UI_CARD_HOVER_COLOR), q(t), J(t), r("ui.cardHoverColor");
+ t.ui = t.ui || {}, t.ui.cardHoverColor = s(e, A.UI_CARD_HOVER_COLOR), J(t), Y(t), n("ui.cardHoverColor");
}
}), e({
- id: `${Y}.Cards.SelectionColor`,
- category: a("Selection color"),
+ id: `${X}.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: c(t.ui?.cardSelectionColor, A.UI_CARD_SELECTION_COLOR),
+ defaultValue: s(t.ui?.cardSelectionColor, A.UI_CARD_SELECTION_COLOR),
onChange: (e) => {
- t.ui = t.ui || {}, t.ui.cardSelectionColor = c(e, A.UI_CARD_SELECTION_COLOR), q(t), J(t), r("ui.cardSelectionColor");
+ t.ui = t.ui || {}, t.ui.cardSelectionColor = s(e, A.UI_CARD_SELECTION_COLOR), J(t), Y(t), n("ui.cardSelectionColor");
}
}), e({
- id: `${Y}.Badges.RatingColor`,
- category: o("Rating color"),
+ id: `${X}.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: c(t.ui?.ratingColor, A.UI_RATING_COLOR),
+ defaultValue: s(t.ui?.ratingColor, A.UI_RATING_COLOR),
onChange: (e) => {
- t.ui = t.ui || {}, t.ui.ratingColor = c(e, A.UI_RATING_COLOR), q(t), J(t), r("ui.ratingColor");
+ t.ui = t.ui || {}, t.ui.ratingColor = s(e, A.UI_RATING_COLOR), J(t), Y(t), n("ui.ratingColor");
}
}), e({
- id: `${Y}.Badges.TagColor`,
- category: o("Tag color"),
+ id: `${X}.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: c(t.ui?.tagColor, A.UI_TAG_COLOR),
+ defaultValue: s(t.ui?.tagColor, A.UI_TAG_COLOR),
onChange: (e) => {
- t.ui = t.ui || {}, t.ui.tagColor = c(e, A.UI_TAG_COLOR), q(t), J(t), r("ui.tagColor");
+ t.ui = t.ui || {}, t.ui.tagColor = s(e, A.UI_TAG_COLOR), J(t), Y(t), n("ui.tagColor");
}
});
}
//#endregion
//#region ui/app/settings/settingsViewer.ts
-var en = "Majoor", tn = "Majoor Assets Manager";
-function nn(e, t, i) {
- let o = (e, t) => [
- tn,
+var tn = "Majoor", nn = "Majoor Assets Manager";
+function rn(e, t, n) {
+ let r = (e, t) => [
+ nn,
e,
t
- ], s = (e) => o(n("cat.viewer", "Viewer"), e), c = (e) => o(n("cat.floatingViewer", "Floating Viewer"), e);
+ ], i = (e) => r(k("cat.viewer", "Viewer"), e), a = (e) => r(k("cat.floatingViewer", "Floating Viewer"), e);
e({
- id: `${en}.Viewer.AllowPanAtZoom1`,
- category: s(n("setting.viewer.pan.name").replace("Majoor: ", "")),
- name: n("setting.viewer.pan.name"),
- tooltip: n("setting.viewer.pan.desc"),
+ id: `${tn}.Viewer.AllowPanAtZoom1`,
+ category: i(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, q(t), J(t), i("viewer.allowPanAtZoom1");
+ t.viewer = t.viewer || {}, t.viewer.allowPanAtZoom1 = !!e, J(t), Y(t), n("viewer.allowPanAtZoom1");
}
}), e({
- id: `${en}.Viewer.DisableWebGL`,
- category: s("Disable WebGL Video"),
+ id: `${tn}.Viewer.DisableWebGL`,
+ category: i("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, q(t), J(t), i("viewer.disableWebGL");
+ t.viewer = t.viewer || {}, t.viewer.disableWebGL = !!e, J(t), Y(t), n("viewer.disableWebGL");
}
}), e({
- id: `${en}.Viewer.PauseDuringExecution`,
- category: s(n("setting.viewer.pauseExecution.name").replace("Majoor: ", "")),
- name: n("setting.viewer.pauseExecution.name"),
- tooltip: n("setting.viewer.pauseExecution.desc"),
+ id: `${tn}.Viewer.PauseDuringExecution`,
+ category: i(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, q(t), J(t), i("viewer.pauseDuringExecution");
+ t.viewer = t.viewer || {}, t.viewer.pauseDuringExecution = !!e, J(t), Y(t), n("viewer.pauseDuringExecution");
}
}), e({
- id: `${en}.Viewer.FloatingPauseDuringExecution`,
- category: c(n("setting.viewer.floatingPauseExecution.name").replace("Majoor: ", "")),
- name: n("setting.viewer.floatingPauseExecution.name"),
- tooltip: n("setting.viewer.floatingPauseExecution.desc"),
+ id: `${tn}.Viewer.FloatingPauseDuringExecution`,
+ category: a(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, q(t), J(t), i("viewer.floatingPauseDuringExecution");
+ t.viewer = t.viewer || {}, t.viewer.floatingPauseDuringExecution = !!e, J(t), Y(t), n("viewer.floatingPauseDuringExecution");
}
}), e({
- id: `${en}.Viewer.MfvLiveDefault`,
- category: c(n("setting.viewer.mfvLiveDefault.name").replace("Majoor: ", "")),
- name: n("setting.viewer.mfvLiveDefault.name"),
- tooltip: n("setting.viewer.mfvLiveDefault.desc"),
+ id: `${tn}.Viewer.MfvLiveDefault`,
+ category: a(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 ?? A.MFV_LIVE_DEFAULT),
onChange: (e) => {
- t.viewer = t.viewer || {}, t.viewer.mfvLiveDefault = !!e, q(t), J(t), i("viewer.mfvLiveDefault");
+ t.viewer = t.viewer || {}, t.viewer.mfvLiveDefault = !!e, J(t), Y(t), n("viewer.mfvLiveDefault");
}
}), e({
- id: `${en}.Viewer.MfvPreviewDefault`,
- category: c(n("setting.viewer.mfvPreviewDefault.name").replace("Majoor: ", "")),
- name: n("setting.viewer.mfvPreviewDefault.name"),
- tooltip: n("setting.viewer.mfvPreviewDefault.desc"),
+ id: `${tn}.Viewer.MfvPreviewDefault`,
+ category: a(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 ?? A.MFV_PREVIEW_DEFAULT),
onChange: (e) => {
- t.viewer = t.viewer || {}, t.viewer.mfvPreviewDefault = !!e, q(t), J(t), i("viewer.mfvPreviewDefault");
+ t.viewer = t.viewer || {}, t.viewer.mfvPreviewDefault = !!e, J(t), Y(t), n("viewer.mfvPreviewDefault");
}
}), e({
- id: `${en}.Viewer.MfvSidebarPosition`,
- category: c("Node Parameters sidebar position"),
+ id: `${tn}.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",
@@ -1397,18 +1385,18 @@ function nn(e, t, i) {
"bottom"
],
onChange: (e) => {
- let n = [
+ let r = [
"left",
"right",
"bottom"
].includes(e) ? e : "right";
- t.viewer = t.viewer || {}, t.viewer.mfvSidebarPosition = n, q(t), J(t), i("viewer.mfvSidebarPosition");
+ t.viewer = t.viewer || {}, t.viewer.mfvSidebarPosition = r, J(t), Y(t), n("viewer.mfvSidebarPosition");
}
}), e({
- id: `${en}.Viewer.MfvPreviewMethod`,
- category: c(n("setting.viewer.mfvPreviewMethod.name").replace("Majoor: ", "")),
- name: n("setting.viewer.mfvPreviewMethod.name"),
- tooltip: n("setting.viewer.mfvPreviewMethod.desc"),
+ id: `${tn}.Viewer.MfvPreviewMethod`,
+ category: a(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 || A.MFV_PREVIEW_METHOD,
options: [
@@ -1419,106 +1407,106 @@ function nn(e, t, i) {
"none"
],
onChange: (e) => {
- let n = [
+ let r = [
"taesd",
"latent2rgb",
"auto",
"default",
"none"
].includes(e) ? e : A.MFV_PREVIEW_METHOD;
- t.viewer = t.viewer || {}, t.viewer.mfvPreviewMethod = n, q(t), J(t), i("viewer.mfvPreviewMethod");
+ t.viewer = t.viewer || {}, t.viewer.mfvPreviewMethod = r, J(t), Y(t), n("viewer.mfvPreviewMethod");
}
}), e({
- id: `${en}.Viewer.LtxavRgbFallback`,
- category: c("LTXAV preview fallback"),
+ id: `${tn}.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 n = !!e, a = !!t.viewer?.ltxavRgbFallback;
- t.viewer = t.viewer || {}, t.viewer.ltxavRgbFallback = n, q(t), J(t), i("viewer.ltxavRgbFallback");
+ let r = !!e, i = !!t.viewer?.ltxavRgbFallback;
+ t.viewer = t.viewer || {}, t.viewer.ltxavRgbFallback = r, J(t), Y(t), n("viewer.ltxavRgbFallback");
try {
- let e = await de(n);
+ let e = await g(r);
if (!e?.ok) throw Error(e?.error || "Failed to update LTXAV RGB preview fallback setting");
} catch (e) {
- t.viewer.ltxavRgbFallback = a, q(t), J(t), i("viewer.ltxavRgbFallback"), r(e?.message || "Failed to update LTXAV RGB preview fallback setting", "error");
+ t.viewer.ltxavRgbFallback = i, J(t), Y(t), n("viewer.ltxavRgbFallback"), y(e?.message || "Failed to update LTXAV RGB preview fallback setting", "error");
}
}
});
try {
- a().then((e) => {
+ m().then((e) => {
if (!e?.ok) return;
- let n = !!e?.data?.prefs?.enabled, r = K();
- r.viewer = r.viewer || {}, !!r.viewer.ltxavRgbFallback !== n && (r.viewer.ltxavRgbFallback = n, Object.assign(t, r), q(r), J(r), i("viewer.ltxavRgbFallback"));
+ let r = !!e?.data?.prefs?.enabled, i = q();
+ i.viewer = i.viewer || {}, !!i.viewer.ltxavRgbFallback !== r && (i.viewer.ltxavRgbFallback = r, Object.assign(t, i), J(i), Y(i), n("viewer.ltxavRgbFallback"));
}).catch(() => {});
} catch (e) {
console.debug?.(e);
}
- ((r, a, o, c) => {
+ ((r, a, o, s) => {
e({
- id: `${en}.WorkflowMinimap.${r}`,
- category: s(n(o).replace("Majoor: ", "")),
- name: n(o),
- tooltip: n(c),
+ id: `${tn}.WorkflowMinimap.${r}`,
+ category: i(k(o).replace("Majoor: ", "")),
+ name: k(o),
+ tooltip: k(s),
type: "boolean",
defaultValue: !!t.workflowMinimap?.[a],
onChange: (e) => {
- t.workflowMinimap = t.workflowMinimap || {}, t.workflowMinimap[a] = !!e, q(t), i(`workflowMinimap.${a}`);
+ t.workflowMinimap = t.workflowMinimap || {}, t.workflowMinimap[a] = !!e, J(t), n(`workflowMinimap.${a}`);
}
});
})("Enabled", "enabled", "setting.minimap.enabled.name", "setting.minimap.enabled.desc");
}
//#endregion
//#region ui/app/settings/settingsScanning.ts
-var rn = "Majoor", an = "Majoor Assets Manager";
-function on(e, t, i) {
- let a = (e, t) => [
- an,
+var an = "Majoor", on = "Majoor Assets Manager";
+function sn(e, t, n) {
+ let r = (e, t) => [
+ on,
e,
t
];
e({
- id: `${rn}.ExecutionGrouping.Enabled`,
- category: a(n("cat.scanning"), "Execution grouping"),
+ id: `${an}.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 ?? A.EXECUTION_GROUPING_ENABLED),
onChange: async (e) => {
- let n = !!(t.executionGrouping?.enabled ?? A.EXECUTION_GROUPING_ENABLED), a = !!e;
- t.executionGrouping = t.executionGrouping || {}, t.executionGrouping.enabled = a, q(t), J(t), i("executionGrouping.enabled");
+ let r = !!(t.executionGrouping?.enabled ?? A.EXECUTION_GROUPING_ENABLED), i = !!e;
+ t.executionGrouping = t.executionGrouping || {}, t.executionGrouping.enabled = i, J(t), Y(t), n("executionGrouping.enabled");
try {
- let e = await me(a);
+ let e = await re(i);
if (!e?.ok) throw Error(e?.error || "Failed to update execution grouping setting");
- t.executionGrouping.enabled = !!e?.data?.prefs?.enabled, q(t), J(t), i("executionGrouping.enabled");
+ t.executionGrouping.enabled = !!e?.data?.prefs?.enabled, J(t), Y(t), n("executionGrouping.enabled");
} catch (e) {
- t.executionGrouping.enabled = n, q(t), J(t), i("executionGrouping.enabled"), r(e?.message || "Failed to update execution grouping setting", "error");
+ t.executionGrouping.enabled = r, J(t), Y(t), n("executionGrouping.enabled"), y(e?.message || "Failed to update execution grouping setting", "error");
}
}
}), e({
- id: `${rn}.AutoScan.OnStartup`,
- category: a(n("cat.scanning"), n("setting.scan.startup.name").replace("Majoor: ", "")),
- name: n("setting.scan.startup.name"),
- tooltip: n("setting.scan.startup.desc"),
+ id: `${an}.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, q(t), J(t), i("autoScan.onStartup");
+ t.autoScan = t.autoScan || {}, t.autoScan.onStartup = !!e, J(t), Y(t), n("autoScan.onStartup");
}
}), e({
- id: `${rn}.Scan.FastMode`,
- category: a(n("cat.scanning"), "Scan mode"),
+ id: `${an}.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, q(t), i("scan.fastMode");
+ t.scan = t.scan || {}, t.scan.fastMode = !!e, J(t), n("scan.fastMode");
}
}), e({
- id: `${rn}.RtHydrate.Concurrency`,
- category: a(n("cat.scanning"), "Hydration"),
+ id: `${an}.RtHydrate.Concurrency`,
+ category: r(k("cat.scanning"), "Hydration"),
name: "Hydrate Concurrency",
tooltip: "Maximum concurrent hydration requests for rating/tags.",
type: "number",
@@ -1529,53 +1517,53 @@ function on(e, t, i) {
step: 1
},
onChange: (e) => {
- t.rtHydrate = t.rtHydrate || {}, t.rtHydrate.concurrency = Math.max(1, Math.min(20, Math.round(U(e, A.RT_HYDRATE_CONCURRENCY || 5)))), q(t), J(t), i("rtHydrate.concurrency");
+ t.rtHydrate = t.rtHydrate || {}, t.rtHydrate.concurrency = Math.max(1, Math.min(20, Math.round(W(e, A.RT_HYDRATE_CONCURRENCY || 5)))), J(t), Y(t), n("rtHydrate.concurrency");
}
});
- let o = (e, t, n, r) => {
- let i = Math.round(U(e, t));
+ let i = (e, t, n, r) => {
+ let i = Math.round(W(e, t));
return Math.max(n, Math.min(r, i));
- }, s = (e = {}) => {
- let n = [];
+ }, a = (e = {}) => {
+ let r = [];
if (t.watcher = t.watcher || {}, typeof e.debounce_ms == "number") {
- let r = Math.max(50, Math.min(5e3, Math.round(e.debounce_ms)));
- t.watcher.debounceMs !== r && (t.watcher.debounceMs = r, n.push("watcher.debounceMs"));
+ 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 r = Math.max(100, Math.min(3e4, Math.round(e.dedupe_ttl_ms)));
- t.watcher.dedupeTtlMs !== r && (t.watcher.dedupeTtlMs = r, n.push("watcher.dedupeTtlMs"));
+ 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"));
}
- n.length && (q(t), n.forEach((e) => i(e)));
- }, c = async () => {
+ r.length && (J(t), r.forEach((e) => n(e)));
+ }, o = async () => {
try {
- let e = await T();
+ let e = await d();
if (!e?.ok) return;
- s(e.data || {});
+ a(e.data || {});
} catch (e) {
console.debug?.(e);
}
};
e({
- id: `${rn}.Watcher.Enabled`,
- category: a(n("cat.scanning"), n("setting.watcher.enabled.label", "Enable watcher")),
- name: n("setting.watcher.name"),
- tooltip: n("setting.watcher.desc") + " (env: MJR_ENABLE_WATCHER)",
+ id: `${an}.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, q(t), i("watcher.enabled");
+ t.watcher = t.watcher || {}, t.watcher.enabled = !!e, J(t), n("watcher.enabled");
try {
- let a = await se(!!e);
- a?.ok || (t.watcher.enabled = !e, q(t), i("watcher.enabled"), r(a?.error || n("toast.failedToggleWatcher", "Failed to toggle watcher"), "error"));
+ let r = await ne(!!e);
+ r?.ok || (t.watcher.enabled = !e, J(t), n("watcher.enabled"), y(r?.error || k("toast.failedToggleWatcher", "Failed to toggle watcher"), "error"));
} catch {
- t.watcher.enabled = !e, q(t), i("watcher.enabled");
+ t.watcher.enabled = !e, J(t), n("watcher.enabled");
}
}
}), e({
- id: `${rn}.Watcher.DebounceDelay`,
- category: a(n("cat.scanning"), n("setting.watcher.debounce.label", "Watcher debounce delay")),
- name: n("setting.watcher.debounce.name"),
- tooltip: n("setting.watcher.debounce.desc") + " (env: MJR_WATCHER_DEBOUNCE_MS)",
+ id: `${an}.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 ?? A.WATCHER_DEBOUNCE_MS,
attrs: {
@@ -1584,24 +1572,24 @@ function on(e, t, i) {
step: 50
},
onChange: async (e) => {
- let a = A.WATCHER_DEBOUNCE_MS, s = o(e, a, 50, 6e4), c = t.watcher?.debounceMs ?? a;
- if (s !== c) {
- t.watcher = t.watcher || {}, t.watcher.debounceMs = s, q(t);
+ let r = A.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, J(t);
try {
- let e = await D({ debounce_ms: s });
- if (!e?.ok) throw Error(e?.error || n("setting.watcher.debounce.error"));
- let r = Math.round(Number(e?.data?.debounce_ms ?? s));
- t.watcher.debounceMs = r, q(t), i("watcher.debounceMs");
+ let e = await ae({ 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, J(t), n("watcher.debounceMs");
} catch (e) {
- t.watcher.debounceMs = c, q(t), i("watcher.debounceMs"), r(e?.message || n("setting.watcher.debounce.error"), "error");
+ t.watcher.debounceMs = o, J(t), n("watcher.debounceMs"), y(e?.message || k("setting.watcher.debounce.error"), "error");
}
}
}
}), e({
- id: `${rn}.Watcher.DedupeWindow`,
- category: a(n("cat.scanning"), n("setting.watcher.dedupe.label", "Watcher dedupe window")),
- name: n("setting.watcher.dedupe.name"),
- tooltip: n("setting.watcher.dedupe.desc") + " (env: MJR_WATCHER_DEDUPE_TTL_MS)",
+ id: `${an}.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 ?? A.WATCHER_DEDUPE_TTL_MS,
attrs: {
@@ -1610,22 +1598,22 @@ function on(e, t, i) {
step: 100
},
onChange: async (e) => {
- let a = A.WATCHER_DEDUPE_TTL_MS, s = o(e, a, 100, 12e4), c = t.watcher?.dedupeTtlMs ?? a;
- if (s !== c) {
- t.watcher = t.watcher || {}, t.watcher.dedupeTtlMs = s, q(t);
+ let r = A.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, J(t);
try {
- let e = await D({ dedupe_ttl_ms: s });
- if (!e?.ok) throw Error(e?.error || n("setting.watcher.dedupe.error"));
- let r = Math.round(Number(e?.data?.dedupe_ttl_ms ?? s));
- t.watcher.dedupeTtlMs = r, q(t), i("watcher.dedupeTtlMs");
+ let e = await ae({ 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, J(t), n("watcher.dedupeTtlMs");
} catch (e) {
- t.watcher.dedupeTtlMs = c, q(t), i("watcher.dedupeTtlMs"), r(e?.message || n("setting.watcher.dedupe.error"), "error");
+ t.watcher.dedupeTtlMs = o, J(t), n("watcher.dedupeTtlMs"), y(e?.message || k("setting.watcher.dedupe.error"), "error");
}
}
}
}), e({
- id: `${rn}.Watcher.MaxPending`,
- category: a(n("cat.scanning"), "Watcher queue"),
+ id: `${an}.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",
@@ -1636,11 +1624,11 @@ function on(e, t, i) {
step: 10
},
onChange: (e) => {
- t.watcher = t.watcher || {}, t.watcher.maxPending = Math.max(10, Math.min(5e3, Math.round(U(e, 500)))), q(t), J(t), i("watcher.maxPending");
+ t.watcher = t.watcher || {}, t.watcher.maxPending = Math.max(10, Math.min(5e3, Math.round(W(e, 500)))), J(t), Y(t), n("watcher.maxPending");
}
}), e({
- id: `${rn}.Watcher.MinSize`,
- category: a(n("cat.scanning"), "Watcher file size"),
+ id: `${an}.Watcher.MinSize`,
+ category: r(k("cat.scanning"), "Watcher file size"),
name: "Watcher: min size (bytes)",
tooltip: "Minimum file size indexed by watcher.",
type: "number",
@@ -1651,11 +1639,11 @@ function on(e, t, i) {
step: 100
},
onChange: (e) => {
- t.watcher = t.watcher || {}, t.watcher.minSize = Math.max(0, Math.min(1e6, Math.round(U(e, 100)))), q(t), J(t), i("watcher.minSize");
+ t.watcher = t.watcher || {}, t.watcher.minSize = Math.max(0, Math.min(1e6, Math.round(W(e, 100)))), J(t), Y(t), n("watcher.minSize");
}
}), e({
- id: `${rn}.Watcher.MaxSize`,
- category: a(n("cat.scanning"), "Watcher file size"),
+ id: `${an}.Watcher.MaxSize`,
+ category: r(k("cat.scanning"), "Watcher file size"),
name: "Watcher: max size (bytes)",
tooltip: "Maximum file size indexed by watcher.",
type: "number",
@@ -1666,40 +1654,40 @@ function on(e, t, i) {
step: 1e5
},
onChange: (e) => {
- t.watcher = t.watcher || {}, t.watcher.maxSize = Math.max(1e5, Math.min(17179869184, Math.round(U(e, 4294967296)))), q(t), J(t), i("watcher.maxSize");
+ t.watcher = t.watcher || {}, t.watcher.maxSize = Math.max(1e5, Math.min(17179869184, Math.round(W(e, 4294967296)))), J(t), Y(t), n("watcher.maxSize");
}
});
try {
- c().catch(() => {});
+ o().catch(() => {});
} catch (e) {
console.debug?.(e);
}
e({
- id: `${rn}.RatingTagsSync.Enabled`,
- category: a(n("cat.scanning"), n("setting.sync.rating.name").replace("Majoor: ", "")),
- name: n("setting.sync.rating.name"),
- tooltip: n("setting.sync.rating.desc"),
+ id: `${an}.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, q(t), i("ratingTagsSync.enabled");
+ t.ratingTagsSync = t.ratingTagsSync || {}, t.ratingTagsSync.enabled = !!e, J(t), n("ratingTagsSync.enabled");
}
});
}
//#endregion
//#region ui/app/settings/settingsFeed.ts
-var sn = "Majoor", cn = "Majoor Assets Manager";
-function ln(e, t, r) {
- let i = (e) => [
- cn,
- n("cat.feed", "Generated Feed"),
+var cn = "Majoor", ln = "Majoor Assets Manager";
+function un(e, t, n) {
+ let r = (e) => [
+ ln,
+ k("cat.feed", "Generated Feed"),
e
- ], a = () => {
+ ], i = () => {
t.feed = t.feed || {};
};
e({
- id: `${sn}.Feed.CardSize`,
- category: i("Card size"),
+ id: `${cn}.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",
@@ -1710,103 +1698,103 @@ function ln(e, t, r) {
step: 10
},
onChange: (e) => {
- a(), t.feed.minSize = Math.max(60, Math.min(600, Math.round(Number(e) || 120))), q(t), J(t), r("feed.minSize");
+ i(), t.feed.minSize = Math.max(60, Math.min(600, Math.round(Number(e) || 120))), J(t), Y(t), n("feed.minSize");
}
}), e({
- id: `${sn}.Feed.ShowInfo`,
- category: i("Show info section"),
+ id: `${cn}.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 ?? A.FEED_SHOW_INFO),
onChange: (e) => {
- a(), t.feed.showInfo = !!e, q(t), J(t), r("feed.showInfo");
+ i(), t.feed.showInfo = !!e, J(t), Y(t), n("feed.showInfo");
}
}), e({
- id: `${sn}.Feed.ShowFilename`,
- category: i("Show filename"),
+ id: `${cn}.Feed.ShowFilename`,
+ category: r("Show filename"),
name: "Show filename",
tooltip: "Display the filename on feed cards.",
type: "boolean",
defaultValue: !!(t.feed?.showFilename ?? A.FEED_SHOW_FILENAME),
onChange: (e) => {
- a(), t.feed.showFilename = !!e, q(t), J(t), r("feed.showFilename");
+ i(), t.feed.showFilename = !!e, J(t), Y(t), n("feed.showFilename");
}
}), e({
- id: `${sn}.Feed.ShowDimensions`,
- category: i("Show dimensions"),
+ id: `${cn}.Feed.ShowDimensions`,
+ category: r("Show dimensions"),
name: "Show dimensions",
tooltip: "Display resolution (WxH) and duration on feed cards.",
type: "boolean",
defaultValue: !!(t.feed?.showDimensions ?? A.FEED_SHOW_DIMENSIONS),
onChange: (e) => {
- a(), t.feed.showDimensions = !!e, q(t), J(t), r("feed.showDimensions");
+ i(), t.feed.showDimensions = !!e, J(t), Y(t), n("feed.showDimensions");
}
}), e({
- id: `${sn}.Feed.ShowDate`,
- category: i("Show date/time"),
+ id: `${cn}.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 ?? A.FEED_SHOW_DATE),
onChange: (e) => {
- a(), t.feed.showDate = !!e, q(t), J(t), r("feed.showDate");
+ i(), t.feed.showDate = !!e, J(t), Y(t), n("feed.showDate");
}
}), e({
- id: `${sn}.Feed.ShowGenTime`,
- category: i("Show generation time"),
+ id: `${cn}.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 ?? A.FEED_SHOW_GENTIME),
onChange: (e) => {
- a(), t.feed.showGenTime = !!e, q(t), J(t), r("feed.showGenTime");
+ i(), t.feed.showGenTime = !!e, J(t), Y(t), n("feed.showGenTime");
}
}), e({
- id: `${sn}.Feed.ShowWorkflowDot`,
- category: i("Show workflow dot"),
+ id: `${cn}.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 ?? A.FEED_SHOW_WORKFLOW_DOT),
onChange: (e) => {
- a(), t.feed.showWorkflowDot = !!e, q(t), J(t), r("feed.showWorkflowDot");
+ i(), t.feed.showWorkflowDot = !!e, J(t), Y(t), n("feed.showWorkflowDot");
}
}), e({
- id: `${sn}.Feed.ShowExtBadge`,
- category: i("Show format badges"),
+ id: `${cn}.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 ?? A.FEED_SHOW_BADGES_EXTENSION),
onChange: (e) => {
- a(), t.feed.showExtBadge = !!e, q(t), J(t), r("feed.showExtBadge");
+ i(), t.feed.showExtBadge = !!e, J(t), Y(t), n("feed.showExtBadge");
}
}), e({
- id: `${sn}.Feed.ShowRatingBadge`,
- category: i("Show rating badges"),
+ id: `${cn}.Feed.ShowRatingBadge`,
+ category: r("Show rating badges"),
name: "Show ratings",
tooltip: "Display star ratings on feed card thumbnails.",
type: "boolean",
defaultValue: !!(t.feed?.showRatingBadge ?? A.FEED_SHOW_BADGES_RATING),
onChange: (e) => {
- a(), t.feed.showRatingBadge = !!e, q(t), J(t), r("feed.showRatingBadge");
+ i(), t.feed.showRatingBadge = !!e, J(t), Y(t), n("feed.showRatingBadge");
}
}), e({
- id: `${sn}.Feed.ShowTagsBadge`,
- category: i("Show tags badges"),
+ id: `${cn}.Feed.ShowTagsBadge`,
+ category: r("Show tags badges"),
name: "Show tags",
tooltip: "Display tag indicators on feed card thumbnails.",
type: "boolean",
defaultValue: !!(t.feed?.showTagsBadge ?? A.FEED_SHOW_BADGES_TAGS),
onChange: (e) => {
- a(), t.feed.showTagsBadge = !!e, q(t), J(t), r("feed.showTagsBadge");
+ i(), t.feed.showTagsBadge = !!e, J(t), Y(t), n("feed.showTagsBadge");
}
});
}
//#endregion
//#region ui/app/settings/settingsSecurity.ts
-var un = "Majoor", dn = "Majoor Assets Manager", fn = 16, pn = {
+var dn = "Majoor", fn = "Majoor Assets Manager", pn = 16, mn = {
safeMode: !1,
allowWrite: !0,
allowDelete: !0,
@@ -1814,106 +1802,106 @@ var un = "Majoor", dn = "Majoor Assets Manager", fn = 16, pn = {
allowOpenInFolder: !0,
allowResetIndex: !0
};
-function mn(e) {
+function hn(e) {
return !!e;
}
-function hn(e, t) {
- return mn(e) === mn(t);
-}
-function gn(e) {
- return typeof e == "string" ? e.trim() : "";
+function gn(e, t) {
+ return hn(e) === hn(t);
}
function _n(e) {
+ return typeof e == "string" ? e.trim() : "";
+}
+function vn(e) {
let t = String(e || "").trim().toLowerCase();
return t === "localhost" || t === "127.0.0.1" || t === "::1";
}
-function vn() {
+function yn() {
return globalThis.location || globalThis.window?.location || null;
}
-function yn() {
- let e = vn();
+function bn() {
+ let e = yn();
if (!e) return !1;
let t = String(e.protocol || "").toLowerCase(), n = String(e.hostname || "").trim();
- return t === "http:" && !_n(n);
+ return t === "http:" && !vn(n);
}
-function bn(e) {
+function xn(e) {
let t = globalThis.crypto;
if (!t?.getRandomValues) throw Error("Secure token generation requires crypto.getRandomValues().");
return t.getRandomValues(e);
}
-function xn(e) {
+function Sn(e) {
let t = Math.max(4, Number(e) || 0), n = new Uint8Array(t);
- return bn(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join("");
+ return xn(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join("");
}
-function Sn() {
- return `mjr_${xn(18)}`;
-}
-function Cn(e) {
- return String(e?.apiToken || "").trim().length >= fn && H(e?.allowWrite, !0) && H(e?.requireAuth, !1) && !H(e?.allowRemoteWrite, !1);
+function Cn() {
+ return `mjr_${Sn(18)}`;
}
function wn(e) {
+ return String(e?.apiToken || "").trim().length >= pn && U(e?.allowWrite, !0) && U(e?.requireAuth, !1) && !U(e?.allowRemoteWrite, !1);
+}
+function Tn(e) {
let t = String((e && typeof e == "object" ? e : {}).apiToken || "").trim();
return {
- apiToken: t.length >= fn ? t : Sn(),
+ apiToken: t.length >= pn ? t : Cn(),
allowWrite: !0,
requireAuth: !0,
allowRemoteWrite: !1,
- allowInsecureTokenTransport: yn()
- };
-}
-function Tn(e) {
- let t = e || {};
- return {
- safe_mode: H(t.safeMode, !1),
- allow_write: H(t.allowWrite, !0),
- require_auth: H(t.requireAuth, !1),
- allow_remote_write: H(t.allowRemoteWrite, !1),
- allow_insecure_token_transport: H(t.allowInsecureTokenTransport, !1),
- allow_delete: H(t.allowDelete, !0),
- allow_rename: H(t.allowRename, !0),
- allow_open_in_folder: H(t.allowOpenInFolder, !0),
- allow_reset_index: H(t.allowResetIndex, !0),
- ...String(t.apiToken || "").trim() ? { api_token: String(t.apiToken || "").trim() } : {}
+ allowInsecureTokenTransport: bn()
};
}
function En(e) {
- return ie(Tn(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 Dn(e) {
- let t = String(e?.security?.tokenHint || "").trim();
- return t ? n("setting.sec.token.placeholderConfigured", "Token configured on server ({tokenHint}). Leave blank to keep the current server token.", { tokenHint: t }) : e?.security?.tokenConfigured ? n("setting.sec.token.placeholderConfiguredGeneric", "Token configured on server. Leave blank to keep the current server token.") : n("setting.sec.token.placeholder", "Auto-generated for this browser session.");
+ return se(En(e));
}
-function On(e, t, a) {
- let o = (e, t) => [
- dn,
+function On(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 kn(e, t, n) {
+ let r = (e, t) => [
+ fn,
e,
t
];
e({
- id: `${un}.Safety.ConfirmDeletion`,
- category: o(n("cat.security"), "Confirm before deleting"),
+ id: `${dn}.Safety.ConfirmDeletion`,
+ category: r(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: t.safety?.confirmDeletion !== !1,
onChange: (e) => {
- hn(t.safety?.confirmDeletion !== !1, e) || (t.safety = t.safety || {}, t.safety.confirmDeletion = !!e, q(t), J(t), a("safety.confirmDeletion"));
+ gn(t.safety?.confirmDeletion !== !1, e) || (t.safety = t.safety || {}, t.safety.confirmDeletion = !!e, J(t), Y(t), n("safety.confirmDeletion"));
}
});
- let s = (r, i, s, c = "cat.security") => {
+ let i = (i, a, o, s = "cat.security") => {
e({
- id: `${un}.Security.${r}`,
- category: o(n(c), n(i).replace("Majoor: ", "")),
- name: n(i),
- tooltip: n(s),
+ id: `${dn}.Security.${i}`,
+ category: r(k(s), k(a).replace("Majoor: ", "")),
+ name: k(a),
+ tooltip: k(o),
type: "boolean",
- defaultValue: H(t.security?.[r], pn[r] ?? !1),
+ defaultValue: U(t.security?.[i], mn[i] ?? !1),
onChange: (e) => {
- if (!hn(t.security?.[r], e)) {
- t.security = t.security || {}, t.security[r] = !!e, q(t), a(`security.${r}`);
+ if (!gn(t.security?.[i], e)) {
+ t.security = t.security || {}, t.security[i] = !!e, J(t), n(`security.${i}`);
try {
- En(t.security).then((e) => {
- e?.ok && e.data?.prefs ? Ft() : e && e.ok === !1 && console.warn("[Majoor] backend security settings update failed", e.error || e);
+ Dn(t.security).then((e) => {
+ e?.ok && e.data?.prefs ? It() : e && e.ok === !1 && console.warn("[Majoor] backend security settings update failed", e.error || e);
}).catch(() => {});
} catch (e) {
console.debug?.(e);
@@ -1922,134 +1910,134 @@ function On(e, t, a) {
}
});
};
- s("safeMode", "setting.sec.safe.name", "setting.sec.safe.desc"), s("allowWrite", "setting.sec.write.name", "setting.sec.write.desc"), s("allowDelete", "setting.sec.del.name", "setting.sec.del.desc"), s("allowRename", "setting.sec.ren.name", "setting.sec.ren.desc"), s("allowOpenInFolder", "setting.sec.open.name", "setting.sec.open.desc"), s("allowResetIndex", "setting.sec.reset.name", "setting.sec.reset.desc"), e({
- id: `${un}.Security.RemoteLanPreset`,
- category: o(n("cat.remote"), n("setting.sec.remoteLanPreset.name").replace("Majoor: ", "")),
- name: n("setting.sec.remoteLanPreset.name"),
- tooltip: n("setting.sec.remoteLanPreset.desc"),
+ 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: `${dn}.Security.RemoteLanPreset`,
+ category: r(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: Cn(t.security),
+ defaultValue: wn(t.security),
onChange: (e) => {
- if (t.security = t.security || {}, hn(t.security.remoteLanPreset, e)) return;
+ if (t.security = t.security || {}, gn(t.security.remoteLanPreset, e)) return;
if (t.security.remoteLanPreset = !!e, !e) {
- q(t), a("security.remoteLanPreset");
+ J(t), n("security.remoteLanPreset");
return;
}
- let o;
+ let r;
try {
- o = wn(t.security);
+ r = Tn(t.security);
} catch (e) {
- r(e?.message || n("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error");
+ y(e?.message || k("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error");
return;
}
- Object.assign(t.security, o), t.security.tokenConfigured = !0, t.security.tokenHint = String(o.apiToken || "").trim() ? `...${String(o.apiToken).trim().slice(-4)}` : "", o.apiToken && i(o.apiToken), q(t), a("security.remoteLanPreset"), a("security.apiToken"), a("security.allowWrite"), a("security.requireAuth"), a("security.allowRemoteWrite"), a("security.allowInsecureTokenTransport");
+ 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), J(t), n("security.remoteLanPreset"), n("security.apiToken"), n("security.allowWrite"), n("security.requireAuth"), n("security.allowRemoteWrite"), n("security.allowInsecureTokenTransport");
try {
- En(t.security).then((e) => {
- e?.ok && e.data?.prefs ? (Ft(), r(n("toast.remoteLanPresetApplied", "Recommended remote LAN setup applied. This browser session is now authorized for Majoor write operations."), "success")) : e && e.ok === !1 && (r(e.error || n("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"), console.warn("[Majoor] backend remote LAN preset update failed", e.error || e));
+ Dn(t.security).then((e) => {
+ e?.ok && e.data?.prefs ? (It(), y(k("toast.remoteLanPresetApplied", "Recommended remote LAN setup applied. This browser session is now authorized for Majoor write operations."), "success")) : e && e.ok === !1 && (y(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) => {
- r(e?.message || n("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error");
+ y(e?.message || k("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error");
});
} catch (e) {
console.debug?.(e);
}
}
}), e({
- id: `${un}.Security.ApiToken`,
- category: o(n("cat.remote"), n("setting.sec.token.name").replace("Majoor: ", "")),
- name: n("setting.sec.token.name", "Majoor: API Token"),
- tooltip: n("setting.sec.token.desc", "Store the API token used for write operations. Majoor sends it via X-MJR-Token and Authorization headers."),
+ id: `${dn}.Security.ApiToken`,
+ category: r(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: t.security?.apiToken || "",
- attrs: { placeholder: Dn(t) },
+ attrs: { placeholder: On(t) },
onChange: (e) => {
t.security = t.security || {};
- let n = gn(e);
- if (gn(t.security.apiToken) !== n && (t.security.apiToken = n, t.security.apiToken && (t.security.tokenConfigured = !0, t.security.tokenHint = `...${t.security.apiToken.slice(-4)}`, i(t.security.apiToken)), q(t), a("security.apiToken"), t.security.apiToken)) try {
- ie({ api_token: t.security.apiToken }).then((e) => {
- e?.ok && e.data?.prefs ? Ft() : e && e.ok === !1 && console.warn("[Majoor] backend token update failed", e.error || e);
+ let r = _n(e);
+ if (_n(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)), J(t), n("security.apiToken"), t.security.apiToken)) try {
+ se({ api_token: t.security.apiToken }).then((e) => {
+ e?.ok && e.data?.prefs ? It() : e && e.ok === !1 && console.warn("[Majoor] backend token update failed", e.error || e);
}).catch(() => {});
} catch (e) {
console.debug?.(e);
}
}
- }), s("requireAuth", "setting.sec.requireAuth.name", "setting.sec.requireAuth.desc", "cat.remote"), s("allowRemoteWrite", "setting.sec.remote.name", "setting.sec.remote.desc", "cat.remote"), s("allowInsecureTokenTransport", "setting.sec.insecureTransport.name", "setting.sec.insecureTransport.desc", "cat.remote");
+ }), 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");
}
//#endregion
//#region ui/app/settings/settingsAdvanced.ts
-var X = "Majoor", kn = "Majoor Assets Manager";
-function An(e, t, i, a) {
- let s = (e, t) => [
- kn,
+var Z = "Majoor", An = "Majoor Assets Manager";
+function jn(t, a, o, l) {
+ let d = (e, t) => [
+ An,
e,
t
- ], c = String(t.paths?.outputDirectory || ""), d = null, m = 0, x = null;
- e({
- id: `${X}.Paths.OutputDirectory`,
- category: s(n("cat.advanced"), "Paths / Output"),
+ ], p = String(a.paths?.outputDirectory || ""), m = null, h = 0, g = null;
+ t({
+ id: `${Z}.Paths.OutputDirectory`,
+ category: d(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(t.paths?.outputDirectory || ""),
+ defaultValue: String(a.paths?.outputDirectory || ""),
attrs: { placeholder: "D:\\\\____COMFY_OUTPUTS" },
onChange: async (e) => {
- let a = String(e || "").trim();
- t.paths = t.paths || {}, t.paths.outputDirectory = a, q(t);
+ let t = String(e || "").trim();
+ a.paths = a.paths || {}, a.paths.outputDirectory = t, J(a);
try {
- d &&= (clearTimeout(d), null);
+ m &&= (clearTimeout(m), null);
} catch (e) {
console.debug?.(e);
}
- d = setTimeout(async () => {
- d = null;
- let e = ++m;
+ m = setTimeout(async () => {
+ m = null;
+ let e = ++h;
try {
- x?.abort?.();
+ g?.abort?.();
} catch (e) {
console.debug?.(e);
}
- x = typeof AbortController < "u" ? new AbortController() : null;
+ g = typeof AbortController < "u" ? new AbortController() : null;
try {
- let r = await re(a, x ? { signal: x.signal } : {});
- if (e !== m) return;
- if (!r?.ok) throw Error(r?.error || n("toast.failedSetOutputDirectory", "Failed to set output directory"));
- let o = String(r?.data?.output_directory || a).trim();
- t.paths.outputDirectory = o, c = o, q(t), i("paths.outputDirectory");
- } catch (a) {
- if (e !== m || String(a?.name || "") === "AbortError" || String(a?.code || "") === "ABORTED") return;
- t.paths.outputDirectory = c, q(t), i("paths.outputDirectory"), r(a?.message || n("toast.failedSetOutputDirectory", "Failed to set output directory"), "error");
+ let n = await f(t, g ? { signal: g.signal } : {});
+ if (e !== h) return;
+ if (!n?.ok) throw Error(n?.error || k("toast.failedSetOutputDirectory", "Failed to set output directory"));
+ let r = String(n?.data?.output_directory || t).trim();
+ a.paths.outputDirectory = r, p = r, J(a), o("paths.outputDirectory");
+ } catch (t) {
+ if (e !== h || String(t?.name || "") === "AbortError" || String(t?.code || "") === "ABORTED") return;
+ a.paths.outputDirectory = p, J(a), o("paths.outputDirectory"), y(t?.message || k("toast.failedSetOutputDirectory", "Failed to set output directory"), "error");
}
}, 700);
}
});
try {
- f().then((e) => {
+ r().then((e) => {
if (!e?.ok) return;
- let n = String(e?.data?.output_directory || "").trim();
- t.paths = t.paths || {}, t.paths.outputDirectory !== n && (t.paths.outputDirectory = n, c = n, q(t), i("paths.outputDirectory"));
+ let t = String(e?.data?.output_directory || "").trim();
+ a.paths = a.paths || {}, a.paths.outputDirectory !== t && (a.paths.outputDirectory = t, p = t, J(a), o("paths.outputDirectory"));
}).catch(() => {});
} catch (e) {
console.debug?.(e);
}
- let S = String(t.paths?.indexDirectory || ""), w = null, T = 0, E = null;
- e({
- id: `${X}.Paths.IndexDirectory`,
- category: s(n("cat.advanced"), "Paths / Index"),
+ let x = String(a.paths?.indexDirectory || ""), C = null, w = 0, E = null;
+ t({
+ id: `${Z}.Paths.IndexDirectory`,
+ category: d(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(t.paths?.indexDirectory || ""),
+ defaultValue: String(a.paths?.indexDirectory || ""),
attrs: { placeholder: "D:\\MajoorIndex" },
onChange: async (e) => {
- let a = String(e || "").trim();
- t.paths = t.paths || {}, t.paths.indexDirectory = a, q(t);
+ let t = String(e || "").trim();
+ a.paths = a.paths || {}, a.paths.indexDirectory = t, J(a);
try {
- w &&= (clearTimeout(w), null);
+ C &&= (clearTimeout(C), null);
} catch (e) {
console.debug?.(e);
}
- w = setTimeout(async () => {
- w = null;
- let e = ++T;
+ C = setTimeout(async () => {
+ C = null;
+ let e = ++w;
try {
E?.abort?.();
} catch (e) {
@@ -2057,253 +2045,253 @@ function An(e, t, i, a) {
}
E = typeof AbortController < "u" ? new AbortController() : null;
try {
- let o = await te(a, E ? { signal: E.signal } : {});
- if (e !== T) return;
- if (!o?.ok) throw Error(o?.error || n("toast.failedSetIndexDirectory", "Failed to set index directory"));
- let s = String(o?.data?.index_directory || a).trim(), c = s !== S;
- t.paths.indexDirectory = s, S = s, q(t), i("paths.indexDirectory"), c && r(n("toast.indexDirectorySavedRestart", "Index directory saved. Restart ComfyUI to apply."), "success", void 0, { history: { trackId: "settings:index-directory-saved" } });
- } catch (a) {
- if (e !== T || String(a?.name || "") === "AbortError" || String(a?.code || "") === "ABORTED") return;
- t.paths.indexDirectory = S, q(t), i("paths.indexDirectory"), r(a?.message || n("toast.failedSetIndexDirectory", "Failed to set index directory"), "error");
+ let n = await _(t, E ? { signal: E.signal } : {});
+ if (e !== w) return;
+ if (!n?.ok) throw Error(n?.error || k("toast.failedSetIndexDirectory", "Failed to set index directory"));
+ let r = String(n?.data?.index_directory || t).trim(), i = r !== x;
+ a.paths.indexDirectory = r, x = r, J(a), o("paths.indexDirectory"), i && y(k("toast.indexDirectorySavedRestart", "Index directory saved. Restart ComfyUI to apply."), "success", void 0, { history: { trackId: "settings:index-directory-saved" } });
+ } catch (t) {
+ if (e !== w || String(t?.name || "") === "AbortError" || String(t?.code || "") === "ABORTED") return;
+ a.paths.indexDirectory = x, J(a), o("paths.indexDirectory"), y(t?.message || k("toast.failedSetIndexDirectory", "Failed to set index directory"), "error");
}
}, 700);
}
});
try {
- _().then((e) => {
+ O().then((e) => {
if (!e?.ok) return;
- let n = String(e?.data?.index_directory || "").trim();
- t.paths = t.paths || {}, t.paths.indexDirectory !== n && (t.paths.indexDirectory = n, S = n, q(t), i("paths.indexDirectory"));
+ let t = String(e?.data?.index_directory || "").trim();
+ a.paths = a.paths || {}, a.paths.indexDirectory !== t && (a.paths.indexDirectory = t, x = t, J(a), o("paths.indexDirectory"));
}).catch(() => {});
} catch (e) {
console.debug?.(e);
}
- let ee = o().map((e) => e.code), D = ["auto", ...ee];
- e({
- id: `${X}.Language`,
- category: s(n("cat.advanced"), n("setting.language.name", "Language")),
- name: n("setting.language.name", "Majoor: Language"),
+ let ne = he().map((e) => e.code), re = ["auto", ...ne];
+ t({
+ id: `${Z}.Language`,
+ category: d(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: t.i18n?.followComfyLanguage ? "auto" : v(),
- options: D,
+ defaultValue: a.i18n?.followComfyLanguage ? "auto" : ye(),
+ options: re,
onChange: (e) => {
- if (t.i18n = t.i18n || {}, e === "auto") {
- t.i18n.followComfyLanguage = !0, p(!0), u(a), q(t), i("language");
+ if (a.i18n = a.i18n || {}, e === "auto") {
+ a.i18n.followComfyLanguage = !0, ve(!0), pe(l), J(a), o("language");
return;
}
- ee.includes(e) && (t.i18n.followComfyLanguage = !1, p(!1), b(e), q(t), i("language"));
+ ne.includes(e) && (a.i18n.followComfyLanguage = !1, ve(!1), be(e), J(a), o("language"));
}
- }), e({
- id: `${X}.ProbeBackend.Mode`,
- category: s(n("cat.advanced"), n("setting.probe.mode.name").replace("Majoor: ", "")),
- name: n("setting.probe.mode.name"),
- tooltip: n("setting.probe.mode.desc") + " (env: MAJOOR_MEDIA_PROBE_BACKEND)",
+ }), t({
+ id: `${Z}.ProbeBackend.Mode`,
+ category: d(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: t.probeBackend?.mode || G.probeBackend.mode,
+ defaultValue: a.probeBackend?.mode || K.probeBackend.mode,
options: [
"auto",
"exiftool",
"ffprobe",
"both"
],
- onChange: (e) => {
- let n = ct(e, [
+ onChange: (t) => {
+ let n = lt(t, [
"auto",
"exiftool",
"ffprobe",
"both"
- ], G.probeBackend.mode);
- t.probeBackend = t.probeBackend || {}, t.probeBackend.mode = n, q(t), J(t), i("probeBackend.mode"), le(n).catch(() => {});
+ ], K.probeBackend.mode);
+ a.probeBackend = a.probeBackend || {}, a.probeBackend.mode = n, J(a), Y(a), o("probeBackend.mode"), e(n).catch(() => {});
}
- }), e({
- id: `${X}.MetadataFallback.Image`,
- category: s(n("cat.advanced"), "Metadata"),
+ }), t({
+ id: `${Z}.MetadataFallback.Image`,
+ category: d(k("cat.advanced"), "Metadata"),
name: "Majoor: Metadata Fallback (Images)",
tooltip: "Enable Pillow fallback when ExifTool is missing or fails.",
type: "boolean",
- defaultValue: t.metadataFallback?.image ?? G.metadataFallback.image,
+ defaultValue: a.metadataFallback?.image ?? K.metadataFallback.image,
onChange: async (e) => {
- let a = !!e, o = !!(t.metadataFallback?.image ?? G.metadataFallback.image);
- t.metadataFallback = t.metadataFallback || {}, t.metadataFallback.image = a, q(t), i("metadataFallback.image");
+ let t = !!e, n = !!(a.metadataFallback?.image ?? K.metadataFallback.image);
+ a.metadataFallback = a.metadataFallback || {}, a.metadataFallback.image = t, J(a), o("metadataFallback.image");
try {
- let e = await he({
- image: a,
- media: t.metadataFallback?.media ?? G.metadataFallback.media
+ let e = await v({
+ image: t,
+ media: a.metadataFallback?.media ?? K.metadataFallback.media
});
- if (!e?.ok) throw Error(e?.error || n("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"));
+ if (!e?.ok) throw Error(e?.error || k("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"));
} catch (e) {
- t.metadataFallback.image = o, q(t), i("metadataFallback.image"), r(e?.message || n("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"), "error");
+ a.metadataFallback.image = n, J(a), o("metadataFallback.image"), y(e?.message || k("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"), "error");
}
}
- }), e({
- id: `${X}.MetadataFallback.Media`,
- category: s(n("cat.advanced"), "Metadata"),
+ }), t({
+ id: `${Z}.MetadataFallback.Media`,
+ category: d(k("cat.advanced"), "Metadata"),
name: "Majoor: Metadata Fallback (Audio/Video)",
tooltip: "Enable hachoir fallback when ffprobe is missing or fails.",
type: "boolean",
- defaultValue: t.metadataFallback?.media ?? G.metadataFallback.media,
+ defaultValue: a.metadataFallback?.media ?? K.metadataFallback.media,
onChange: async (e) => {
- let a = !!e, o = !!(t.metadataFallback?.media ?? G.metadataFallback.media);
- t.metadataFallback = t.metadataFallback || {}, t.metadataFallback.media = a, q(t), i("metadataFallback.media");
+ let t = !!e, n = !!(a.metadataFallback?.media ?? K.metadataFallback.media);
+ a.metadataFallback = a.metadataFallback || {}, a.metadataFallback.media = t, J(a), o("metadataFallback.media");
try {
- let e = await he({
- image: t.metadataFallback?.image ?? G.metadataFallback.image,
- media: a
+ let e = await v({
+ image: a.metadataFallback?.image ?? K.metadataFallback.image,
+ media: t
});
- if (!e?.ok) throw Error(e?.error || n("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"));
+ if (!e?.ok) throw Error(e?.error || k("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"));
} catch (e) {
- t.metadataFallback.media = o, q(t), i("metadataFallback.media"), r(e?.message || n("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"), "error");
+ a.metadataFallback.media = n, J(a), o("metadataFallback.media"), y(e?.message || k("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"), "error");
}
}
});
try {
- l().then((e) => {
+ i().then((e) => {
if (!e?.ok || !e?.data?.prefs) return;
- let n = e.data.prefs || {}, r = !!(n.image ?? G.metadataFallback.image), a = !!(n.media ?? G.metadataFallback.media);
- t.metadataFallback = t.metadataFallback || {};
- let o = !1;
- t.metadataFallback.image !== r && (t.metadataFallback.image = r, o = !0), t.metadataFallback.media !== a && (t.metadataFallback.media = a, o = !0), o && (q(t), i("metadataFallback"));
+ let t = e.data.prefs || {}, n = !!(t.image ?? K.metadataFallback.image), r = !!(t.media ?? K.metadataFallback.media);
+ a.metadataFallback = a.metadataFallback || {};
+ let i = !1;
+ a.metadataFallback.image !== n && (a.metadataFallback.image = n, i = !0), a.metadataFallback.media !== r && (a.metadataFallback.media = r, i = !0), i && (J(a), o("metadataFallback"));
}).catch(() => {});
} catch (e) {
console.debug?.(e);
}
- e({
- id: `${X}.Db.Timeout`,
- category: s(n("cat.advanced"), "Database"),
+ t({
+ id: `${Z}.Db.Timeout`,
+ category: d(k("cat.advanced"), "Database"),
name: "DB Timeout (ms)",
tooltip: "Client-side DB timeout preference (stored locally).",
type: "number",
- defaultValue: Number(t.db?.timeoutMs || 5e3),
+ defaultValue: Number(a.db?.timeoutMs || 5e3),
attrs: {
min: 1e3,
max: 3e4,
step: 1e3
},
onChange: (e) => {
- t.db = t.db || {}, t.db.timeoutMs = Math.max(1e3, Math.min(3e4, Math.round(U(e, 5e3)))), q(t), J(t), i("db.timeoutMs");
+ a.db = a.db || {}, a.db.timeoutMs = Math.max(1e3, Math.min(3e4, Math.round(W(e, 5e3)))), J(a), Y(a), o("db.timeoutMs");
}
- }), e({
- id: `${X}.Db.MaxConnections`,
- category: s(n("cat.advanced"), "Database"),
+ }), t({
+ id: `${Z}.Db.MaxConnections`,
+ category: d(k("cat.advanced"), "Database"),
name: "DB Max Connections",
tooltip: "Client-side DB max connections preference (stored locally).",
type: "number",
- defaultValue: Number(t.db?.maxConnections || 10),
+ defaultValue: Number(a.db?.maxConnections || 10),
attrs: {
min: 1,
max: 100,
step: 1
},
onChange: (e) => {
- t.db = t.db || {}, t.db.maxConnections = Math.max(1, Math.min(100, Math.round(U(e, 10)))), q(t), J(t), i("db.maxConnections");
+ a.db = a.db || {}, a.db.maxConnections = Math.max(1, Math.min(100, Math.round(W(e, 10)))), J(a), Y(a), o("db.maxConnections");
}
- }), e({
- id: `${X}.Db.QueryTimeout`,
- category: s(n("cat.advanced"), "Database"),
+ }), t({
+ id: `${Z}.Db.QueryTimeout`,
+ category: d(k("cat.advanced"), "Database"),
name: "DB Query Timeout (ms)",
tooltip: "Client-side DB query timeout preference (stored locally).",
type: "number",
- defaultValue: Number(t.db?.queryTimeoutMs || 1e3),
+ defaultValue: Number(a.db?.queryTimeoutMs || 1e3),
attrs: {
min: 500,
max: 1e4,
step: 500
},
onChange: (e) => {
- t.db = t.db || {}, t.db.queryTimeoutMs = Math.max(500, Math.min(1e4, Math.round(U(e, 1e3)))), q(t), J(t), i("db.queryTimeoutMs");
+ a.db = a.db || {}, a.db.queryTimeoutMs = Math.max(500, Math.min(1e4, Math.round(W(e, 1e3)))), J(a), Y(a), o("db.queryTimeoutMs");
}
- }), e({
- id: `${X}.Observability.Enabled`,
- category: s(n("cat.advanced"), n("setting.obs.enabled.name").replace("Majoor: ", "")),
- name: n("setting.obs.enabled.name"),
- tooltip: n("setting.obs.enabled.desc"),
+ }), t({
+ id: `${Z}.Observability.Enabled`,
+ category: d(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: !!t.observability?.enabled,
+ defaultValue: !!a.observability?.enabled,
onChange: (e) => {
- t.observability = t.observability || {}, t.observability.enabled = !!e, q(t), J(t), i("observability.enabled");
+ a.observability = a.observability || {}, a.observability.enabled = !!e, J(a), Y(a), o("observability.enabled");
}
- }), e({
- id: `${X}.Observability.RuntimeDashboardMode`,
- category: s(n("cat.advanced"), "Runtime metrics badge"),
+ }), t({
+ id: `${Z}.Observability.RuntimeDashboardMode`,
+ category: d(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: t.observability?.runtimeDashboardMode || G.observability.runtimeDashboardMode,
+ defaultValue: a.observability?.runtimeDashboardMode || K.observability.runtimeDashboardMode,
options: [
"autoHide30",
"always",
"hidden"
],
onChange: (e) => {
- let n = ct(e, [
+ let t = lt(e, [
"autoHide30",
"always",
"hidden"
- ], G.observability.runtimeDashboardMode);
- t.observability = t.observability || {}, t.observability.runtimeDashboardMode = n, q(t), i("observability.runtimeDashboardMode");
+ ], K.observability.runtimeDashboardMode);
+ a.observability = a.observability || {}, a.observability.runtimeDashboardMode = t, J(a), o("observability.runtimeDashboardMode");
}
- }), e({
- id: `${X}.Observability.VerboseErrors`,
- category: s(n("cat.advanced"), "Verbose error logging"),
+ }), t({
+ id: `${Z}.Observability.VerboseErrors`,
+ category: d(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: !!t.observability?.verboseErrors,
+ defaultValue: !!a.observability?.verboseErrors,
onChange: (e) => {
- t.observability = t.observability || {}, t.observability.verboseErrors = !!e, q(t), J(t), i("observability.verboseErrors");
+ a.observability = a.observability || {}, a.observability.verboseErrors = !!e, J(a), Y(a), o("observability.verboseErrors");
}
- }), e({
- id: `${X}.Observability.VerboseRouteRegistrationLogs`,
- category: s(n("cat.advanced"), "Logs"),
+ }), t({
+ id: `${Z}.Observability.VerboseRouteRegistrationLogs`,
+ category: d(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: !!(t.observability?.verboseRouteRegistrationLogs ?? G.observability?.verboseRouteRegistrationLogs ?? !1),
+ defaultValue: !!(a.observability?.verboseRouteRegistrationLogs ?? K.observability?.verboseRouteRegistrationLogs ?? !1),
onChange: async (e) => {
- let n = !!e, a = !!(t.observability?.verboseRouteRegistrationLogs ?? G.observability?.verboseRouteRegistrationLogs ?? !1);
- t.observability = t.observability || {}, t.observability.verboseRouteRegistrationLogs = n, q(t), i("observability.verboseRouteRegistrationLogs");
+ let t = !!e, n = !!(a.observability?.verboseRouteRegistrationLogs ?? K.observability?.verboseRouteRegistrationLogs ?? !1);
+ a.observability = a.observability || {}, a.observability.verboseRouteRegistrationLogs = t, J(a), o("observability.verboseRouteRegistrationLogs");
try {
- let e = await ge(n);
+ let e = await S(t);
if (!e?.ok) throw Error(e?.error || "Failed to update route logging settings");
} catch (e) {
- t.observability.verboseRouteRegistrationLogs = a, q(t), i("observability.verboseRouteRegistrationLogs"), r(e?.message || "Failed to update route logging settings", "error");
+ a.observability.verboseRouteRegistrationLogs = n, J(a), o("observability.verboseRouteRegistrationLogs"), y(e?.message || "Failed to update route logging settings", "error");
}
}
}), (async () => {
try {
- let e = !!(await y())?.data?.prefs?.enabled;
- t.observability = t.observability || {}, t.observability.verboseRouteRegistrationLogs !== e && (t.observability.verboseRouteRegistrationLogs = e, q(t), i("observability.verboseRouteRegistrationLogs"));
+ let e = !!(await u())?.data?.prefs?.enabled;
+ a.observability = a.observability || {}, a.observability.verboseRouteRegistrationLogs !== e && (a.observability.verboseRouteRegistrationLogs = e, J(a), o("observability.verboseRouteRegistrationLogs"));
} catch (e) {
console.debug?.(e);
}
- })(), e({
- id: `${X}.Observability.VerboseStartupLogs`,
- category: s(n("cat.advanced"), "Logs"),
+ })(), t({
+ id: `${Z}.Observability.VerboseStartupLogs`,
+ category: d(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: !!(t.observability?.verboseStartupLogs ?? G.observability?.verboseStartupLogs ?? !1),
+ defaultValue: !!(a.observability?.verboseStartupLogs ?? K.observability?.verboseStartupLogs ?? !1),
onChange: async (e) => {
- let n = !!e, a = !!(t.observability?.verboseStartupLogs ?? G.observability?.verboseStartupLogs ?? !1);
- t.observability = t.observability || {}, t.observability.verboseStartupLogs = n, q(t), i("observability.verboseStartupLogs");
+ let t = !!e, n = !!(a.observability?.verboseStartupLogs ?? K.observability?.verboseStartupLogs ?? !1);
+ a.observability = a.observability || {}, a.observability.verboseStartupLogs = t, J(a), o("observability.verboseStartupLogs");
try {
- let e = await oe(n);
+ let e = await te(t);
if (!e?.ok) throw Error(e?.error || "Failed to update startup logging settings");
} catch (e) {
- t.observability.verboseStartupLogs = a, q(t), i("observability.verboseStartupLogs"), r(e?.message || "Failed to update startup logging settings", "error");
+ a.observability.verboseStartupLogs = n, J(a), o("observability.verboseStartupLogs"), y(e?.message || "Failed to update startup logging settings", "error");
}
}
}), (async () => {
try {
- let e = !!(await C())?.data?.prefs?.enabled;
- t.observability = t.observability || {}, t.observability.verboseStartupLogs !== e && (t.observability.verboseStartupLogs = e, q(t), i("observability.verboseStartupLogs"));
+ let e = !!(await T())?.data?.prefs?.enabled;
+ a.observability = a.observability || {}, a.observability.verboseStartupLogs !== e && (a.observability.verboseStartupLogs = e, J(a), o("observability.verboseStartupLogs"));
} catch (e) {
console.debug?.(e);
}
})();
{
- let a = "HuggingFace Token", o = "", c = null, l = 0, u = !!t.ai?.huggingFaceTokenVisible, d = () => {
+ let e = "HuggingFace Token", r = "", i = null, l = 0, u = !!a.ai?.huggingFaceTokenVisible, f = () => {
try {
let e = Array.from(document.querySelectorAll("input[data-mjr-hf-token=\"1\"]"));
for (let t of e) try {
@@ -2314,7 +2302,7 @@ function An(e, t, i, a) {
} catch (e) {
console.debug?.(e);
}
- }, f = (e) => {
+ }, p = (e) => {
try {
let t = String(e || "").trim();
if (!t) return;
@@ -2328,20 +2316,20 @@ function An(e, t, i, a) {
console.debug?.(e);
}
};
- e({
- id: `${X}.AI.HuggingFaceTokenVisible`,
- category: s(n("cat.advanced"), a),
+ t({
+ id: `${Z}.AI.HuggingFaceTokenVisible`,
+ category: d(k("cat.advanced"), e),
name: "Show HuggingFace token",
tooltip: "Show or hide the HuggingFace token while editing.",
type: "boolean",
defaultValue: u,
onChange: (e) => {
- let n = !!e;
- u = n, t.ai = t.ai || {}, t.ai.huggingFaceTokenVisible = n, q(t), i("ai.huggingFaceTokenVisible"), setTimeout(d, 0);
+ let t = !!e;
+ u = t, a.ai = a.ai || {}, a.ai.huggingFaceTokenVisible = t, J(a), o("ai.huggingFaceTokenVisible"), setTimeout(f, 0);
}
- }), e({
- id: `${X}.AI.HuggingFaceToken`,
- category: s(n("cat.advanced"), a),
+ }), t({
+ id: `${Z}.AI.HuggingFaceToken`,
+ category: d(k("cat.advanced"), e),
name: "HuggingFace Token",
tooltip: [
"Optional token for HuggingFace Hub downloads (higher rate limits).",
@@ -2359,77 +2347,77 @@ function An(e, t, i, a) {
},
onChange: (e) => {
let t = String(e || "").trim();
- if (t !== o) {
+ if (t !== r) {
try {
- c &&= (clearTimeout(c), null);
+ i &&= (clearTimeout(i), null);
} catch (e) {
console.debug?.(e);
}
- c = setTimeout(async () => {
- c = null;
+ i = setTimeout(async () => {
+ i = null;
let e = ++l;
try {
- let n = await O(t);
+ let n = await s(t);
if (e !== l) return;
if (!n?.ok) throw Error(n?.error || "Failed to update HuggingFace token");
- o = t, i("ai.huggingFaceToken"), t ? r("HuggingFace token saved", "success") : r("HuggingFace token cleared", "success", void 0, { noHistory: !0 });
+ r = t, o("ai.huggingFaceToken"), t ? y("HuggingFace token saved", "success") : y("HuggingFace token cleared", "success", void 0, { noHistory: !0 });
} catch (t) {
if (e !== l) return;
- r(t?.message || "Failed to update HuggingFace token", "error");
+ y(t?.message || "Failed to update HuggingFace token", "error");
}
}, 900);
}
}
- }), setTimeout(d, 0), (async () => {
+ }), setTimeout(f, 0), (async () => {
try {
- let e = (await h())?.data?.prefs || {}, t = !!e?.has_token, n = String(e?.token_hint || "").trim();
- f(t ? `Configured ${n || "(saved)"}` : "Paste HuggingFace token (hf_...)");
+ let e = (await n())?.data?.prefs || {}, t = !!e?.has_token, r = String(e?.token_hint || "").trim();
+ p(t ? `Configured ${r || "(saved)"}` : "Paste HuggingFace token (hf_...)");
} catch (e) {
console.debug?.(e);
}
- })(), e({
- id: `${X}.AI.VerboseLogs`,
- category: s(n("cat.advanced"), a),
+ })(), t({
+ id: `${Z}.AI.VerboseLogs`,
+ category: d(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: !!(t.ai?.verboseAiLogs ?? G.ai?.verboseAiLogs ?? !1),
+ defaultValue: !!(a.ai?.verboseAiLogs ?? K.ai?.verboseAiLogs ?? !1),
onChange: async (e) => {
- let n = !!e, a = !!(t.ai?.verboseAiLogs ?? G.ai?.verboseAiLogs ?? !1);
- t.ai = t.ai || {}, t.ai.verboseAiLogs = n, q(t), i("ai.verboseAiLogs");
+ let t = !!e, n = !!(a.ai?.verboseAiLogs ?? K.ai?.verboseAiLogs ?? !1);
+ a.ai = a.ai || {}, a.ai.verboseAiLogs = t, J(a), o("ai.verboseAiLogs");
try {
- let e = await ue(n);
+ let e = await c(t);
if (!e?.ok) throw Error(e?.error || "Failed to update AI logging settings");
} catch (e) {
- t.ai.verboseAiLogs = a, q(t), i("ai.verboseAiLogs"), r(e?.message || "Failed to update AI logging settings", "error");
+ a.ai.verboseAiLogs = n, J(a), o("ai.verboseAiLogs"), y(e?.message || "Failed to update AI logging settings", "error");
}
}
}), (async () => {
try {
- let e = !!(await k())?.data?.prefs?.enabled;
- t.ai = t.ai || {}, t.ai.verboseAiLogs !== e && (t.ai.verboseAiLogs = e, q(t), i("ai.verboseAiLogs"));
+ let e = !!(await le())?.data?.prefs?.enabled;
+ a.ai = a.ai || {}, a.ai.verboseAiLogs !== e && (a.ai.verboseAiLogs = e, J(a), o("ai.verboseAiLogs"));
} catch (e) {
console.debug?.(e);
}
})();
}
- e({
- id: `${X}.AI.VectorStats`,
- category: s(n("cat.advanced"), "AI / Vector Search"),
+ t({
+ id: `${Z}.AI.VectorStats`,
+ category: d(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 ve();
+ let e = await ee();
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: `${X}.AI.VectorBackfillAction`,
- category: s(n("cat.advanced"), "AI / Vector Search"),
+ })(), t({
+ id: `${Z}.AI.VectorBackfillAction`,
+ category: d(k("cat.advanced"), "AI / Vector Search"),
name: "Vector Index Action",
tooltip: [
"Compute CLIP embeddings for all assets that don't have them yet.",
@@ -2453,14 +2441,14 @@ function An(e, t, i, a) {
forceStore: !0
} };
try {
- r(n("toast.vectorBackfillStarting", "Starting vector backfill... This may take a while."), "info", void 0, { history: {
+ y(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 _e(64, { onProgress: (e) => {
+ 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}`;
- g({
+ D({
summary: "Vector Backfill",
detail: u
}, n === "failed" ? "error" : n === "succeeded" ? "success" : "info", 0, { history: {
@@ -2479,56 +2467,56 @@ function An(e, t, i, a) {
} });
} });
if (e?.ok) {
- let i = e.data || {}, a = String(i?.status || "").toLowerCase(), o = !!i?.pending || [
+ let n = e.data || {}, r = String(n?.status || "").toLowerCase(), i = !!n?.pending || [
"queued",
"running",
"pending"
- ].includes(a), s = i?.progress || {}, c = Number(i?.processed ?? s?.candidates ?? 0), l = Number(i?.indexed ?? s?.indexed ?? 0), u = Number(i?.skipped ?? s?.skipped ?? 0);
- if (o) {
- let e = String(i?.job_id || "").trim();
- r(n("toast.vectorBackfillRunning", "Vector backfill still running in background{job}.", { job: e ? ` (job ${e.slice(0, 8)})` : "" }), "info", void 0, { history: {
+ ].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();
+ y(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: l + u,
- total: Math.max(c, l + u),
- percent: Math.max(c, l + u) > 0 ? Math.round((l + u) / Math.max(c, l + u) * 100) : null,
- indexed: l,
- skipped: u,
+ 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 r(n("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", {
- processed: c,
- indexed: l,
- skipped: u
+ } else y(k("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", {
+ processed: o,
+ indexed: s,
+ skipped: c
}), "success", void 0, { history: {
...t.history,
status: "succeeded",
- detail: `Processed ${c}, indexed ${l}, skipped ${u}`,
+ detail: `Processed ${o}, indexed ${s}, skipped ${c}`,
progress: {
- current: c,
- total: c,
- percent: c > 0 ? 100 : null,
- indexed: l,
- skipped: u,
+ current: o,
+ total: o,
+ percent: o > 0 ? 100 : null,
+ indexed: s,
+ skipped: c,
label: "done"
}
} });
try {
- let e = await ve();
+ let e = await ee();
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 || n("toast.vectorBackfillFailedGeneric", "Backfill failed"));
+ } else throw Error(e?.error || k("toast.vectorBackfillFailedGeneric", "Backfill failed"));
} catch (e) {
- let i = e?.message || String(e || n("status.unknown", "unknown"));
- r(n("toast.vectorBackfillFailedDetail", "Vector backfill failed: {error}", { error: i }), "error", void 0, { history: {
+ let n = e?.message || String(e || k("status.unknown", "unknown"));
+ y(k("toast.vectorBackfillFailedDetail", "Vector backfill failed: {error}", { error: n }), "error", void 0, { history: {
...t.history,
status: "failed",
- detail: i
+ detail: n
} }), console.error("[Majoor] Vector backfill error:", e);
}
}
@@ -2536,62 +2524,62 @@ function An(e, t, i, a) {
}
//#endregion
//#region ui/app/settings/settingsSearch.ts
-var jn = "Majoor", Mn = "Majoor Assets Manager";
-function Nn(e, t, i) {
- let a = (e, t) => [
- Mn,
+var Mn = "Majoor", Nn = "Majoor Assets Manager";
+function Pn(e, t, n) {
+ let r = (e, t) => [
+ Nn,
e,
t
];
e({
- id: `${jn}.AI.VectorSearchEnabled`,
- category: a(n("cat.search", "Search"), "AI"),
- name: n("setting.ai.vector.enabled.name", "Enable AI semantic search"),
- tooltip: n("setting.ai.vector.enabled.desc", "Enable/disable AI vector search features (SigLIP2/X-CLIP: description search, prompt alignment, AI tag suggestions, smart collections)."),
+ id: `${Mn}.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 n = !!(t.ai.vectorSearchEnabled ?? !0), a = !!e;
- t.ai.vectorSearchEnabled = a, q(t), J(t), i("ai.vectorSearchEnabled");
+ let r = !!(t.ai.vectorSearchEnabled ?? !0), i = !!e;
+ t.ai.vectorSearchEnabled = i, J(t), Y(t), n("ai.vectorSearchEnabled");
try {
- let e = await fe(a);
+ let e = await ie(i);
if (!e?.ok) {
- t.ai.vectorSearchEnabled = n, q(t), J(t), i("ai.vectorSearchEnabled"), r(e?.error || "Failed to update AI vector search setting", "error");
+ t.ai.vectorSearchEnabled = r, J(t), Y(t), n("ai.vectorSearchEnabled"), y(e?.error || "Failed to update AI vector search setting", "error");
return;
}
- r(a ? "AI semantic search enabled" : "AI semantic search disabled", "info", 2200);
+ y(i ? "AI semantic search enabled" : "AI semantic search disabled", "info", 2200);
} catch (e) {
- t.ai.vectorSearchEnabled = n, q(t), J(t), i("ai.vectorSearchEnabled"), r(e?.message || "Failed to update AI vector search setting", "error");
+ t.ai.vectorSearchEnabled = r, J(t), Y(t), n("ai.vectorSearchEnabled"), y(e?.message || "Failed to update AI vector search setting", "error");
}
}
}), e({
- id: `${jn}.AI.VectorCaptionOnIndex`,
- category: a(n("cat.search", "Search"), "AI"),
- name: n("setting.ai.vector.captionOnIndex.name", "Generate AI captions during indexing"),
- tooltip: n("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."),
+ id: `${Mn}.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 n = !!(t.ai.vectorCaptionOnIndex ?? !1), a = !!e;
- t.ai.vectorCaptionOnIndex = a, q(t), J(t), i("ai.vectorCaptionOnIndex");
+ let r = !!(t.ai.vectorCaptionOnIndex ?? !1), i = !!e;
+ t.ai.vectorCaptionOnIndex = i, J(t), Y(t), n("ai.vectorCaptionOnIndex");
try {
- let e = await fe({ caption_on_index: a });
+ let e = await ie({ caption_on_index: i });
if (!e?.ok) {
- t.ai.vectorCaptionOnIndex = n, q(t), J(t), i("ai.vectorCaptionOnIndex"), r(e?.error || "Failed to update AI caption indexing setting", "error");
+ t.ai.vectorCaptionOnIndex = r, J(t), Y(t), n("ai.vectorCaptionOnIndex"), y(e?.error || "Failed to update AI caption indexing setting", "error");
return;
}
- a && r("AI captions during indexing enabled", "info", 2600);
+ i && y("AI captions during indexing enabled", "info", 2600);
} catch (e) {
- t.ai.vectorCaptionOnIndex = n, q(t), J(t), i("ai.vectorCaptionOnIndex"), r(e?.message || "Failed to update AI caption indexing setting", "error");
+ t.ai.vectorCaptionOnIndex = r, J(t), Y(t), n("ai.vectorCaptionOnIndex"), y(e?.message || "Failed to update AI caption indexing setting", "error");
}
}
}), e({
- id: `${jn}.Search.MaxResults`,
- category: a(n("cat.search", "Search")),
- name: n("setting.search.maxResults.name", "Max search results (client)"),
- tooltip: n("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."),
+ id: `${Mn}.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 || A.SEARCH_DEFAULT_LIMIT),
attrs: {
@@ -2600,11 +2588,11 @@ function Nn(e, t, i) {
step: 1
},
onChange: (e) => {
- t.search = t.search || {}, t.search.maxResults = Math.max(10, Math.min(A.MAX_PAGE_SIZE || 2e3, Number(e) || A.SEARCH_DEFAULT_LIMIT)), q(t), J(t), i("search.maxResults");
+ t.search = t.search || {}, t.search.maxResults = Math.max(10, Math.min(A.MAX_PAGE_SIZE || 2e3, Number(e) || A.SEARCH_DEFAULT_LIMIT)), J(t), Y(t), n("search.maxResults");
}
}), e({
- id: `${jn}.EnvVars.Reference`,
- category: a(n("cat.advanced"), "Environment variables"),
+ id: `${Mn}.EnvVars.Reference`,
+ category: r(k("cat.advanced"), "Environment variables"),
name: "Environment variables reference",
tooltip: [
"Set these env vars before starting ComfyUI to override defaults:",
@@ -2636,7 +2624,7 @@ function Nn(e, t, i) {
}
//#endregion
//#region ui/app/settings/SettingsPanel.ts
-var Pn = "Majoor Assets Manager", Fn = /^\s*Majoor:\s*/i, In = Object.freeze({
+var Fn = "Majoor Assets Manager", In = /^\s*Majoor:\s*/i, Ln = Object.freeze({
ASSETS_PANEL: "Assets Panel",
GENERATED_FEED: "Generated Feed",
VIEWER: "Viewer & Floating Viewer",
@@ -2645,7 +2633,7 @@ var Pn = "Majoor Assets Manager", Fn = /^\s*Majoor:\s*/i, In = Object.freeze({
GENERAL: "General",
ADVANCED: "Advanced",
SECURITY: "Security"
-}), Ln = new Set([
+}), Rn = new Set([
"grid.starColor",
"grid.badgeImageColor",
"grid.badgeVideoColor",
@@ -2657,94 +2645,94 @@ var Pn = "Majoor Assets Manager", Fn = /^\s*Majoor:\s*/i, In = Object.freeze({
"ui.ratingColor",
"ui.tagColor"
]);
-function Rn(e) {
- let t = String(e || "").trim();
- return t ? /^Majoor\.(Safety|Security)\./.test(t) ? In.SECURITY : /^Majoor\.(Paths|ProbeBackend|MetadataFallback|Db|Observability)\./.test(t) || t === "Majoor.EnvVars.Reference" || t === "Majoor.AI.HuggingFaceTokenVisible" || t === "Majoor.AI.HuggingFaceToken" || t === "Majoor.AI.VerboseLogs" || t === "Majoor.AI.VectorStats" || t === "Majoor.AI.VectorBackfillAction" ? In.ADVANCED : /^Majoor\.(Viewer|WorkflowMinimap)\./.test(t) ? In.VIEWER : /^Majoor\.Feed\./.test(t) ? In.GENERATED_FEED : /^Majoor\.(AutoScan|Scan|Watcher|ExecutionGrouping|RatingTagsSync)\./.test(t) ? In.INDEXING : t === "Majoor.RtHydrate.Concurrency" ? In.ADVANCED : t === "Majoor.AI.VectorSearchEnabled" || t === "Majoor.AI.VectorCaptionOnIndex" || /^Majoor\.Search\./.test(t) ? In.SEARCH_AI : /^Majoor\.(Grid|Cards|Badges|Sidebar|InfiniteScroll|General)\./.test(t) ? In.ASSETS_PANEL : In.GENERAL : In.GENERAL;
-}
function zn(e) {
- let t = Array.isArray(e?.category) ? e.category.filter(Boolean) : [], n = Rn(e?.id), r = String(t[1] || t[0] || "").trim(), i = String(t[2] || "").trim(), a = String(e?.name || "").replace(Fn, "").trim();
+ let t = String(e || "").trim();
+ return t ? /^Majoor\.(Safety|Security)\./.test(t) ? Ln.SECURITY : /^Majoor\.(Paths|ProbeBackend|MetadataFallback|Db|Observability)\./.test(t) || t === "Majoor.EnvVars.Reference" || t === "Majoor.AI.HuggingFaceTokenVisible" || t === "Majoor.AI.HuggingFaceToken" || t === "Majoor.AI.VerboseLogs" || t === "Majoor.AI.VectorStats" || t === "Majoor.AI.VectorBackfillAction" ? Ln.ADVANCED : /^Majoor\.(Viewer|WorkflowMinimap)\./.test(t) ? Ln.VIEWER : /^Majoor\.Feed\./.test(t) ? Ln.GENERATED_FEED : /^Majoor\.(AutoScan|Scan|Watcher|ExecutionGrouping|RatingTagsSync)\./.test(t) ? Ln.INDEXING : t === "Majoor.RtHydrate.Concurrency" ? Ln.ADVANCED : t === "Majoor.AI.VectorSearchEnabled" || t === "Majoor.AI.VectorCaptionOnIndex" || /^Majoor\.Search\./.test(t) ? Ln.SEARCH_AI : /^Majoor\.(Grid|Cards|Badges|Sidebar|InfiniteScroll|General)\./.test(t) ? Ln.ASSETS_PANEL : Ln.GENERAL : Ln.GENERAL;
+}
+function Bn(e) {
+ let t = Array.isArray(e?.category) ? e.category.filter(Boolean) : [], n = zn(e?.id), r = String(t[1] || t[0] || "").trim(), i = String(t[2] || "").trim(), a = String(e?.name || "").replace(In, "").trim();
return [
- Pn,
+ Fn,
n,
i || r || a || n
];
}
-var Bn = !1, Vn = null, Hn = null, Un = !1, Wn = /* @__PURE__ */ new Set();
-function Gn(e) {
+var Vn = !1, Hn = null, Un = null, Wn = !1, Gn = /* @__PURE__ */ new Set();
+function Kn(e) {
if (!e || typeof e != "object") return null;
let t = { ...e };
try {
- typeof t.name == "string" && (t.name = t.name.replace(Fn, "").trim());
+ typeof t.name == "string" && (t.name = t.name.replace(In, "").trim());
} catch (e) {
console.debug?.(e);
}
try {
- t.category = zn(t);
+ t.category = Bn(t);
} catch {
- t.category = [Pn, In.GENERAL];
+ t.category = [Fn, Ln.GENERAL];
}
return !t.tooltip && typeof t.name == "string" && t.name.trim() && (t.tooltip = t.name.trim()), t;
}
-function Kn(e, t, n) {
+function qn(e, t, n) {
let r = String(t?.id || "").trim();
- if (!r || Wn.has(r)) return !1;
- Wn.add(r);
+ if (!r || Gn.has(r)) return !1;
+ Gn.add(r);
try {
- return ee(e, r, n);
+ return de(e, r, n);
} finally {
- Wn.delete(r);
+ Gn.delete(r);
}
}
-function qn(e, t) {
+function Jn(e, t) {
if (!t || typeof t != "object") return t;
let n = { ...t };
- Kn(e, n, n.defaultValue);
+ qn(e, n, n.defaultValue);
let r = n.onChange;
return n.onChange = (t, ...i) => {
- if (Kn(e, n, t), typeof r == "function") return r(t, ...i);
+ if (qn(e, n, t), typeof r == "function") return r(t, ...i);
n.defaultValue = t;
}, n;
}
-function Jn(e, t, { initRuntime: n = !1 } = {}) {
- if (Hn) typeof t == "function" && Hn.onAppliedListeners.add(t), e && !Hn.app && (Hn.app = e);
+function Yn(e, t, { initRuntime: n = !1 } = {}) {
+ if (Un) typeof t == "function" && Un.onAppliedListeners.add(t), e && !Un.app && (Un.app = e);
else {
- let n = K();
- n.i18n = n.i18n || {}, typeof n.i18n.followComfyLanguage == "boolean" ? p(!!n.i18n.followComfyLanguage) : (n.i18n.followComfyLanguage = !0, p(!0), q(n));
+ let n = q();
+ n.i18n = n.i18n || {}, typeof n.i18n.followComfyLanguage == "boolean" ? ve(!!n.i18n.followComfyLanguage) : (n.i18n.followComfyLanguage = !0, ve(!0), J(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) st("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" });
+ for (let t of e) ct("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" });
}, s = () => {
if (!a.size) return;
let e = Array.from(a);
a.clear();
- for (let t of e) st("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" });
- }, c = Zt(o, 120), l = Zt(s, 450), u = (e) => {
+ for (let t of e) ct("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" });
+ }, c = Qt(o, 120), l = Qt(s, 450), u = (e) => {
typeof e == "string" && i.add(e), c();
}, d = (e) => {
typeof e == "string" && a.add(e), l();
}, f = () => {
- let e = K();
- Object.assign(n, e), J(n), u("storage");
- }, m = (e) => {
+ let e = q();
+ Object.assign(n, e), Y(n), u("storage");
+ }, p = (e) => {
!e || e.key !== "mjrSettings" || e.newValue !== e.oldValue && f();
};
- if (!Bn) {
- if (Vn && typeof window < "u") try {
- window.removeEventListener("storage", Vn);
+ if (!Vn) {
+ if (Hn && typeof window < "u") try {
+ window.removeEventListener("storage", Hn);
} catch (e) {
console.debug?.(e);
}
try {
- window.addEventListener("storage", m), Bn = !0, Vn = m;
+ window.addEventListener("storage", p), Vn = !0, Hn = p;
} catch (e) {
console.debug?.(e);
}
}
- Hn = {
+ Un = {
app: e,
notifyApplied: (e) => {
for (let t of r) try {
@@ -2752,63 +2740,63 @@ function Jn(e, t, { initRuntime: n = !1 } = {}) {
} catch (e) {
console.debug?.(e);
}
- Ln.has(String(e || "")) ? d(e) : u(e);
+ Rn.has(String(e || "")) ? d(e) : u(e);
},
onAppliedListeners: r,
refreshFromStorage: f,
settings: n
};
}
- if (n && !Un) {
- let t = e || Hn.app, n = Hn.settings;
- u(t), J(n), xe(t), Ft(), It(), Lt(), n?.watcher && typeof n.watcher.enabled == "boolean" && se(!!n.watcher.enabled).catch(() => {}), Yt(), Un = !0;
+ if (n && !Wn) {
+ let t = e || Un.app, n = Un.settings;
+ pe(t), Y(n), me(t), It(), Lt(), Rt(), n?.watcher && typeof n.watcher.enabled == "boolean" && ne(!!n.watcher.enabled).catch(() => {}), Xt(), Wn = !0;
}
- return Hn;
+ return Un;
}
-var Yn = (e, t) => Jn(e, t, { initRuntime: !0 }).settings, Xn = (e, t) => {
- let n = Jn(e, t, { initRuntime: !1 });
- Object.assign(n.settings, K());
+var Xn = (e, t) => Yn(e, t, { initRuntime: !0 }).settings, Zn = (e, t) => {
+ let n = Yn(e, t, { initRuntime: !1 });
+ Object.assign(n.settings, q());
let r = (t) => {
- let r = Gn(t);
- r && i.push(qn(e || n.app, r));
+ let r = Kn(t);
+ r && i.push(Jn(e || n.app, r));
}, i = [];
- return $t(r, n.settings, n.notifyApplied), ln(r, n.settings, n.notifyApplied), nn(r, n.settings, n.notifyApplied), on(r, n.settings, n.notifyApplied), On(r, n.settings, n.notifyApplied), An(r, n.settings, n.notifyApplied, e), Nn(r, n.settings, n.notifyApplied), i;
+ return en(r, n.settings, n.notifyApplied), un(r, n.settings, n.notifyApplied), rn(r, n.settings, n.notifyApplied), sn(r, n.settings, n.notifyApplied), kn(r, n.settings, n.notifyApplied), jn(r, n.settings, n.notifyApplied, e), Pn(r, n.settings, n.notifyApplied), i;
};
try {
- let e = K();
- e?.watcher && typeof e.watcher.enabled == "boolean" && s().then((e) => {
- let t = !!e?.ok && !!e?.data?.enabled, n = K();
- n.watcher = n.watcher || {}, typeof t == "boolean" && t !== !!n.watcher.enabled && (n.watcher.enabled = t, q(n), st("mjr-settings-changed", { key: "watcher.enabled" }, { warnPrefix: "[Majoor]" }));
+ let e = q();
+ e?.watcher && typeof e.watcher.enabled == "boolean" && o().then((e) => {
+ let t = !!e?.ok && !!e?.data?.enabled, n = q();
+ n.watcher = n.watcher || {}, typeof t == "boolean" && t !== !!n.watcher.enabled && (n.watcher.enabled = t, J(n), ct("mjr-settings-changed", { key: "watcher.enabled" }, { warnPrefix: "[Majoor]" }));
}).catch(() => {});
} catch (e) {
console.debug?.(e);
}
//#endregion
//#region ui/features/status/AssetStatusDotTheme.ts
-function Zn(e) {
+function Qn(e) {
return String(e || "").trim().toLowerCase();
}
-function Qn({ dot: e = null, asset: t = null, scope: n = "" } = {}) {
- let r = Zn(n);
+function $n({ dot: e = null, asset: t = null, scope: n = "" } = {}) {
+ let r = Qn(n);
if (r) return r === "custom";
- let i = Zn(t?.type || t?.scope);
+ let i = Qn(t?.type || t?.scope);
if (i) return i === "custom";
try {
- let t = Zn(e?.closest?.(".mjr-grid")?.dataset?.mjrScope);
+ let t = Qn(e?.closest?.(".mjr-grid")?.dataset?.mjrScope);
if (t) return t === "custom";
} catch (e) {
console.debug?.(e);
}
return !1;
}
-function $n(e, t = {}) {
- let n = Zn(e);
- return Qn(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)";
+function er(e, t = {}) {
+ let n = Qn(e);
+ return $n(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)";
}
//#endregion
//#region ui/stores/useRuntimeStore.ts
-var er = Qe("mjr-runtime", () => {
- let e = I(null), t = I(null), n = I(!1), r = I(0), i = I(null), a = I(null), o = I(null), s = I(null), c = I(null), l = I([]), u = B(() => !!i.value), d = B(() => {
+var tr = $e("mjr-runtime", () => {
+ let e = I(null), t = I(null), n = I(!1), r = I(0), i = I(null), a = I(null), o = I(null), s = I(null), c = I(null), l = I([]), u = V(() => !!i.value), d = V(() => {
let e = s.value, t = c.value;
return !t || t <= 0 || e == null ? 0 : Math.round(e / t * 100);
});
@@ -2856,17 +2844,17 @@ var er = Qe("mjr-runtime", () => {
});
//#endregion
//#region ui/stores/getOptionalRuntimeStore.ts
-function tr() {
+function nr() {
try {
- return $e() ? er() : null;
+ return et() ? tr() : null;
} catch {
return null;
}
}
//#endregion
//#region ui/stores/runtimeEnrichmentState.ts
-var nr = Symbol.for("majoor.assets_manager.runtime_state");
-function rr() {
+var rr = Symbol.for("majoor.assets_manager.runtime_state");
+function ir() {
return {
api: null,
assetsDeletedHandler: null,
@@ -2874,27 +2862,27 @@ function rr() {
enrichmentQueueLength: 0
};
}
-function ir() {
+function ar() {
try {
let e = typeof globalThis < "u" ? globalThis : {};
- return (!e[nr] || typeof e[nr] != "object") && (e[nr] = rr()), e[nr];
+ return (!e[rr] || typeof e[rr] != "object") && (e[rr] = ir()), e[rr];
} catch {
- return rr();
+ return ir();
}
}
-function ar(e, t) {
- let n = tr();
+function or(e, t) {
+ let n = nr();
if (n) {
n.setEnrichmentState(e, t);
return;
}
- let r = ir();
+ let r = ar();
r.enrichmentActive = !!e, r.enrichmentQueueLength = Math.max(0, Number(t || 0) || 0);
}
-function or() {
- let e = tr();
+function sr() {
+ let e = nr();
if (e) return e.getEnrichmentState();
- let t = ir();
+ let t = ar();
return {
active: !!t.enrichmentActive,
queueLength: Math.max(0, Number(t.enrichmentQueueLength || 0) || 0)
@@ -2902,21 +2890,21 @@ function or() {
}
//#endregion
//#region ui/features/grid/AssetCardRenderer.ts
-function sr(e) {
+function cr(e) {
try {
return String(e || "").trim().toLowerCase();
} catch {
return "";
}
}
-function cr(e) {
+function lr(e) {
try {
return (String(e || "").split(".").pop() || "").toUpperCase();
} catch {
return "";
}
}
-function lr(e) {
+function ur(e) {
try {
let t = String(e || ""), n = t.lastIndexOf("."), r = n > 0 ? t.slice(0, n) : t;
return String(r || "").trim().toLowerCase();
@@ -2924,7 +2912,7 @@ function lr(e) {
return "";
}
}
-function ur(e) {
+function dr(e) {
try {
if (String(e?.kind || "").toLowerCase() !== "video") return !1;
let t = String(e?.filename || "").toLowerCase();
@@ -2933,10 +2921,10 @@ function ur(e) {
return !1;
}
}
-function dr(e) {
+function fr(e) {
try {
let t = String(e?.kind || "").toLowerCase(), n = 0;
- ur(e) ? n = 2 : t === "video" && (n = 1);
+ dr(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,
@@ -2953,31 +2941,31 @@ function dr(e) {
];
}
}
-function fr(e, t) {
+function pr(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 pr(e) {
+function mr(e) {
if (!Array.isArray(e) || e.length === 0) return null;
if (e.length === 1) return e[0];
- let t = e[0], n = dr(t);
+ let t = e[0], n = fr(t);
for (let r = 1; r < e.length; r++) {
- let i = e[r], a = dr(i);
- fr(a, n) > 0 && (t = i, n = a);
+ let i = e[r], a = fr(i);
+ pr(a, n) > 0 && (t = i, n = a);
}
return t;
}
-function mr(e, t) {
+function hr(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 : (e.generation_time_ms = r, !e.has_generation_data && n?.has_generation_data && (e.has_generation_data = n.has_generation_data), e);
}
-function hr(e, t) {
+function gr(e, t) {
let n = String(e?.kind || "").toLowerCase();
if (n) return n;
let r = new Set([
@@ -3013,29 +3001,29 @@ function hr(e, t) {
]);
return r.has(t) ? "image" : i.has(t) ? "video" : a.has(t) ? "audio" : o.has(t) ? "model3d" : "unknown";
}
-function gr(e) {
+function _r(e) {
try {
return !!e()?.siblings?.hidePngSiblings;
} catch {
return !1;
}
}
-function _r(e) {
+function vr(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 vr(e) {
- let t = sr(e?.filename);
- return t ? `${_r(e)}|${t}` : "";
+function yr(e) {
+ let t = cr(e?.filename);
+ return t ? `${vr(e)}|${t}` : "";
}
-function yr(e, t = cr(e?.filename || "")) {
- let n = hr(e, t), r = String(e?.filename || "").trim();
+function br(e, t = lr(e?.filename || "")) {
+ let n = gr(e, t), r = String(e?.filename || "").trim();
if (!r) return "";
- let i = _r(e);
+ let i = vr(e);
if (n === "model3d") return `${i}|model3d|${r.toLowerCase()}`;
- let a = lr(r);
+ let a = ur(r);
return a ? `${i}|media|${a}` : "";
}
-function br(e) {
+function xr(e) {
let t = e.nonImageSiblingKeys || /* @__PURE__ */ new Set();
e.nonImageSiblingKeys = t;
let n = e.stemMap || /* @__PURE__ */ new Map();
@@ -3050,7 +3038,7 @@ function br(e) {
seenKeys: i
};
}
-function xr(e, t, n) {
+function Sr(e, t, n) {
try {
t?.id != null && n.assetIdSet.delete(String(t.id));
} catch (e) {
@@ -3063,20 +3051,20 @@ function xr(e, t, n) {
console.debug?.(e);
}
}
-function Sr(e, t, n, r) {
+function Cr(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 Cr(e, t, n) {
- if (!gr(n)) return {
+function wr(e, t, n) {
+ if (!_r(n)) return {
hidden: !1,
hideEnabled: !1,
removed: []
};
- let r = br(t), i = String(e?.filename || ""), a = cr(i), o = hr(e, a), s = yr(e, a);
+ let r = xr(t), i = String(e?.filename || ""), a = lr(i), o = gr(e, a), s = br(e, a);
if (!s) return {
hidden: !1,
hideEnabled: !0,
@@ -3085,10 +3073,10 @@ function Cr(e, t, n) {
if (o === "video" || o === "audio" || o === "model3d" || a === "WEBP") return r.nonImageSiblingKeys.add(s), {
hidden: !1,
hideEnabled: !0,
- removed: Sr(t, s, r, (e) => cr(e?.filename || "") === "PNG")
+ removed: Cr(t, s, r, (e) => lr(e?.filename || "") === "PNG")
};
if (a === "PNG") {
- let t = `${_r(e)}|model3d|${lr(i)}`;
+ let t = `${vr(e)}|model3d|${ur(i)}`;
if (r.nonImageSiblingKeys.has(s) || r.nonImageSiblingKeys.has(t)) return {
hidden: !0,
hideEnabled: !0,
@@ -3101,15 +3089,15 @@ function Cr(e, t, n) {
removed: []
};
}
-function wr(e, t, n, r) {
- let i = gr(r.loadMajoorSettings), a = n.filenameCounts || /* @__PURE__ */ new Map();
+function Tr(e, t, n, r) {
+ let i = _r(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 = br(n), c = /* @__PURE__ */ new Map();
+ let s = xr(n), c = /* @__PURE__ */ new Map();
for (let e of n.assets || []) {
- let t = vr(e);
+ let t = yr(e);
if (!t) continue;
let n = c.get(t);
n || (n = [], c.set(t, n)), n.push(e);
@@ -3136,7 +3124,7 @@ function wr(e, t, n, r) {
}
continue;
}
- let l = mr(pr(s), s), u = s.filter((e) => e !== l);
+ let l = hr(mr(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;
@@ -3168,13 +3156,13 @@ function wr(e, t, n, r) {
} catch (e) {
console.debug?.(e);
}
- let t = cr(String(e?.filename || "")), i = Cr(e, n, r.loadMajoorSettings);
+ let t = lr(String(e?.filename || "")), i = wr(e, n, r.loadMajoorSettings);
for (let e of i.removed || []) f.add(e);
if (i.hidden) {
n.hiddenPngSiblings += 1;
continue;
}
- let a = vr(e);
+ let a = yr(e);
if (a) {
let t = c.get(a);
t || (t = [], c.set(a, t)), t.push(e);
@@ -3182,7 +3170,7 @@ function wr(e, t, n, r) {
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 = yr(e, t);
+ let u = br(e, t);
if (u) {
let t = s.stemMap.get(u);
t || (t = [], s.stemMap.set(u, t)), t.push(e);
@@ -3192,10 +3180,10 @@ function wr(e, t, n, r) {
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) xr(n, e, s);
+ for (let e of f) Sr(n, e, s);
try {
for (let e of f) {
- let t = vr(e);
+ let t = yr(e);
if (!t) continue;
let n = c.get(t);
if (!n) continue;
@@ -3217,18 +3205,18 @@ function wr(e, t, n, r) {
}
//#endregion
//#region ui/components/Badges.ts
-function Tr({ ext: e = "", filename: t = "", count: n = 0, paths: r = [] } = {}) {
+function Er({ 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:");
+ if (a && c.push(k("badge.collisionName", "Name: {name}", { name: a })), s.length) {
+ c.push(k("badge.collisionPaths", "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");
+ return c.push(k("badge.collisionSelect", "Click to select collisions in current view")), c.join("\n");
}
-function Er(e, t, n = !1, r = null) {
+function Dr(e, t, n = !1, r = null) {
let i = document.createElement("div");
i.className = "mjr-file-badge";
let a = String(e || "").split(".").pop()?.toUpperCase?.() || "";
@@ -3242,8 +3230,8 @@ function Er(e, t, n = !1, r = null) {
video: "--mjr-badge-video",
audio: "--mjr-badge-audio",
model3d: "--mjr-badge-model3d"
- }[hr({ 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 ? Tr({
+ }[gr({ 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 ? Er({
ext: a,
filename: e,
count: r?.count,
@@ -3273,10 +3261,10 @@ function Er(e, t, n = !1, r = null) {
}
return i;
}
-function Dr(e, t, n = null) {
+function Or(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 ? Tr({
+ e.textContent = String(r || "") + (t ? "+" : ""), e.title = t ? Er({
ext: r,
filename: n?.filename || "",
count: n?.count,
@@ -3286,18 +3274,18 @@ function Dr(e, t, n = null) {
console.debug?.(e);
}
}
-function Or(e) {
+function kr(e) {
return e === !0 ? !0 : e === !1 ? !1 : e === 1 || e === "1" ? !0 : e === 0 || e === "0" ? !1 : null;
}
-function kr(e, t = []) {
+function Ar(e, t = []) {
if (!e || typeof e != "object") return null;
for (let n of t) if (e[n] != null) return e[n];
return null;
}
-function Ar(e) {
+function jr(e) {
return typeof e == "string" && e.trim().length > 0;
}
-function jr(e) {
+function Mr(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;
@@ -3311,44 +3299,44 @@ function jr(e) {
}
return !0;
}
-function Mr(e) {
- let t = kr(e, [
+function Nr(e) {
+ let t = Ar(e, [
"auto_tags",
"autoTags",
"ai_auto_tags",
"aiAutoTags",
"suggested_tags",
"suggestedTags"
- ]), n = kr(e, [
+ ]), n = Ar(e, [
"enhanced_caption",
"enhancedCaption",
"enhanced_prompt",
"enhancedPrompt",
"ai_enhanced_prompt",
"aiEnhancedPrompt"
- ]), r = Or(kr(e, [
+ ]), r = kr(Ar(e, [
"has_ai_auto_tags",
"hasAiAutoTags",
"ai_has_auto_tags",
"aiHasAutoTags"
- ])), i = Or(kr(e, [
+ ])), i = kr(Ar(e, [
"has_ai_enhanced_caption",
"hasAiEnhancedCaption",
"ai_has_enhanced_caption",
"aiHasEnhancedCaption"
- ])), a = Or(kr(e, [
+ ])), a = kr(Ar(e, [
"has_ai_vector",
"hasAiVector",
"has_vector_embedding",
"hasVectorEmbedding",
"vector_indexed",
"vectorIndexed"
- ])), o = Or(kr(e, [
+ ])), o = kr(Ar(e, [
"has_ai_info",
"hasAiInfo",
"ai_indexed",
"aiIndexed"
- ])), s = r === !0 || r === null && jr(t), c = i === !0 || i === null && Ar(n), l = a === !0 || o === !0;
+ ])), s = r === !0 || r === null && Mr(t), c = i === !0 || i === null && jr(n), l = a === !0 || o === !0;
return {
hasAiInfo: o === !0 || s || c || l,
hasAutoTags: s,
@@ -3356,17 +3344,17 @@ function Mr(e) {
hasVectorIndexed: l
};
}
-function Nr(e) {
+function Pr(e) {
let t = document.createElement("span");
t.className = "mjr-workflow-dot mjr-asset-status-dot";
- let n = Or(e?.has_workflow ?? e?.hasWorkflow), r = Or(e?.has_generation_data ?? e?.hasGenerationData), i = or(), 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 n = kr(e?.has_workflow ?? e?.hasWorkflow), r = kr(e?.has_generation_data ?? e?.hasGenerationData), i = sr(), a = i.queueLength, o = i.active || a > 0, s = k("badge.workflow.pendingParsing", "Pending: parsing metadata..."), c = n === !0 || r === !0, l = n === !1 || r === !1, u = n === null || r === null;
+ n === !0 && r === !0 ? s = k("badge.workflow.complete", "Complete: workflow + generation data detected") : c ? s = n === !0 ? k("badge.workflow.partialWorkflowOnly", "Partial: workflow only (generation data missing)") : k("badge.workflow.partialGenerationOnly", "Partial: generation data only (workflow missing)") : l && !c && !u ? s = k("badge.workflow.none", "None: no workflow or generation data found") : u && (s = k("badge.workflow.pendingNotParsed", "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"), Pr(t, d, s, { asset: e });
- let f = Mr(e);
+ o && d !== "success" && (d = "pending", s = a > 0 ? k("badge.workflow.enrichmentQueued", "Pending: database metadata enrichment in progress ({count} queued)", { count: a }) : k("badge.workflow.enrichment", "Pending: database metadata enrichment in progress")), Fr(t, d, s, { asset: e });
+ let f = Nr(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 = "";
+ f.hasVectorIndexed && e.push(k("badge.ai.vectorIndexed", "vector indexed")), f.hasAutoTags && e.push(k("badge.ai.tagSuggestions", "AI tag suggestions")), f.hasEnhancedPrompt && e.push(k("badge.ai.enhancedPrompt", "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 {
@@ -3374,20 +3362,23 @@ function Nr(e) {
} catch (e) {
console.debug?.(e);
}
- t.title = `${s}\nAI: ${e.length ? e.join(", ") : "indexed"}\nClick to rescan this file`;
+ t.title = k("badge.workflow.aiTooltip", "{title}\nAI: {ai}\nClick to rescan this file", {
+ title: s,
+ ai: e.length ? e.join(", ") : k("badge.ai.indexed", "indexed")
+ });
} else {
try {
t.dataset.mjrAi = "0";
} catch (e) {
console.debug?.(e);
}
- t.textContent = "●", t.title = `${s}\nClick to rescan this file`;
+ t.textContent = "●", t.title = k("badge.workflow.tooltip", "{title}\nClick to rescan this file", { title: s });
}
return t;
}
-function Pr(e, t, n = "", r = {}) {
+function Fr(e, t, n = "", r = {}) {
if (!e) return;
- let i = String(t || "").toLowerCase(), a = $n(i, {
+ let i = String(t || "").toLowerCase(), a = er(i, {
dot: e,
...r || {}
});
@@ -3412,18 +3403,21 @@ function Pr(e, t, n = "", r = {}) {
console.debug?.(e);
}
}
-function Fr(e) {
+function Ir(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 ";
+ n.className = "mjr-rating-badge", n.title = k("badge.rating", "Rating: {rating} star{plural}", {
+ rating: t,
+ plural: 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 Ir(e) {
+function Lr(e) {
if (Array.isArray(e)) return e.map((e) => String(e ?? "").trim()).filter(Boolean);
if (typeof e == "string") {
let t = e.trim();
@@ -3436,26 +3430,29 @@ function Ir(e) {
}
return [];
}
-function Lr(e) {
+function Rr(e) {
let t = Number(e) / 1e3;
return t >= 60 ? "#FF9800" : t >= 30 ? "#FFC107" : t >= 10 ? "#8BC34A" : "#4CAF50";
}
-function Rr(e) {
+function zr(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)`
+ title: k("badge.generationTimeMinutes", "Generation time: {minutes} minutes ({seconds}s)", {
+ minutes: e,
+ seconds: t.toFixed(1)
+ })
};
}
let n = t.toFixed(1);
return {
text: `${n}s`,
- title: `Generation time: ${n} seconds`
+ title: k("badge.generationTimeSeconds", "Generation time: {seconds} seconds", { seconds: n })
};
}
-function zr(e, { maxMs: t = 864e5 } = {}) {
+function Br(e, { maxMs: t = 864e5 } = {}) {
let n;
if (e == null) return 0;
if (typeof e == "string") {
@@ -3470,53 +3467,53 @@ function zr(e, { maxMs: t = 864e5 } = {}) {
} else n = Number(e);
return !Number.isFinite(n) || n <= 0 || n >= Number(t) ? 0 : n;
}
-function Br(e) {
+function Vr(e) {
let t = document.createElement("div");
t.className = "mjr-tags-badge";
- let n = Ir(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);
+ let n = Lr(e);
+ return n.length === 0 ? (t.style.display = "none", t) : (t.textContent = n.join(", "), t.title = k("badge.tags", "Tags: {tags}", { 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);
}
//#endregion
//#region ui/utils/safeCall.ts
-var Vr = () => {};
-function Hr(e) {
+var Hr = () => {};
+function Ur(e) {
try {
return !!j?.[e];
} catch {
return !1;
}
}
-function Ur(e, t) {
+function Wr(e, t) {
try {
console.warn(`[Majoor] ${e}`, t);
} catch (e) {
console.debug?.(e);
}
}
-function Wr(e, t = "safeCall") {
+function Gr(e, t = "safeCall") {
try {
return e?.();
} catch (e) {
- Hr("DEBUG_SAFE_CALL") && Ur(t, e);
+ Ur("DEBUG_SAFE_CALL") && Wr(t, e);
return;
}
}
-function Gr(e, t, n, r, i = "safeAddListener") {
+function Kr(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") && Ur(`${i}:remove:${String(t || "")}`, e);
+ Ur("DEBUG_SAFE_LISTENERS") && Wr(`${i}:remove:${String(t || "")}`, e);
}
};
} catch (e) {
- return Hr("DEBUG_SAFE_LISTENERS") && Ur(`${i}:add:${String(t || "")}`, e), Vr;
+ return Ur("DEBUG_SAFE_LISTENERS") && Wr(`${i}:add:${String(t || "")}`, e), Hr;
}
}
//#endregion
//#region ui/utils/mediaFps.ts
-function Kr(e) {
+function qr(e) {
try {
let t = Number(e);
if (Number.isFinite(t) && t > 0) return t;
@@ -3535,15 +3532,15 @@ function Kr(e) {
return null;
}
}
-function qr(e) {
+function Jr(e) {
try {
let t = e, n = t.metadata_raw || {}, r = (n.raw_ffprobe || {}).video_stream || {};
- return Kr(t.fps) ?? Kr(n.fps) ?? Kr(n.frame_rate) ?? Kr(r.avg_frame_rate) ?? Kr(r.r_frame_rate);
+ return qr(t.fps) ?? qr(n.fps) ?? qr(n.frame_rate) ?? qr(r.avg_frame_rate) ?? qr(r.r_frame_rate);
} catch {
return null;
}
}
-function Jr(e, t) {
+function Yr(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);
@@ -3554,52 +3551,52 @@ function Jr(e, t) {
}
return null;
}
-function Yr(e) {
+function Xr(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 Xr(e, t = 30) {
- let n = Kr(e);
+function Zr(e, t = 30) {
+ let n = qr(e);
if (n != null) return Math.max(1, Math.round(n * 1e3) / 1e3);
- let r = Kr(t);
+ let r = qr(t);
return r == null ? 30 : Math.max(1, Math.round(r * 1e3) / 1e3);
}
//#endregion
//#region ui/vue/majoorPrimeVue.ts
-var Zr = {
- Button: Pe,
- Checkbox: Ye,
- InputText: Be,
- Select: qe,
- ToggleButton: Ue,
- Badge: Fe,
- Tag: Me,
- Dialog: Re,
- Menu: Ge,
- Listbox: He,
- Tree: Je,
- VirtualScroller: Ne
+var Qr = {
+ Button: Ie,
+ Checkbox: Xe,
+ InputText: He,
+ Select: Je,
+ ToggleButton: Ge,
+ Badge: Le,
+ Tag: Pe,
+ Dialog: Be,
+ Menu: qe,
+ Listbox: We,
+ Tree: Ye,
+ VirtualScroller: Fe
};
-function Qr(e) {
- return e.use(Le, {
+function $r(e) {
+ return e.use(ze, {
ripple: !1,
unstyled: !0,
zIndex: { overlay: 10100 }
- }), e.use(Ve), e.use(We), Object.entries(Zr).forEach(([t, n]) => {
+ }), e.use(Ue), e.use(Ke), Object.entries(Qr).forEach(([t, n]) => {
e.component(`M${t}`, n);
}), e;
}
//#endregion
//#region ui/vue/createVueApp.ts
-function $r(e, t = void 0) {
- let n = et(), r = Ie(e, t);
- return r.use(n), Qr(r), {
+function ei(e, t = void 0) {
+ let n = tt(), r = Re(e, t);
+ return r.use(n), $r(r), {
app: r,
pinia: n
};
}
-var ei = /* @__PURE__ */ new Map();
-function ti(e, t, n) {
+var ti = /* @__PURE__ */ new Map();
+function ni(e, t, n) {
try {
window.dispatchEvent(new CustomEvent("mjr:keepalive-attached", { detail: {
mountKey: String(e || "_mjrVueApp"),
@@ -3608,28 +3605,28 @@ function ti(e, t, n) {
} }));
} catch {}
}
-function ni(e) {
+function ri(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 ri(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), ti(t?.dataset?.mjrKeepAliveHost, t, e)));
+function ii(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), ni(t?.dataset?.mjrKeepAliveHost, t, e)));
}
-function ii(e, t, n = "_mjrVueApp") {
+function ai(e, t, n = "_mjrVueApp") {
if (!e) return !1;
- let r = ei.get(n), i = !1;
+ let r = ti.get(n), i = !1;
if (!r) {
- let e = ni(n), { app: a } = $r(t);
+ let e = ri(n), { app: a } = ei(t);
a.mount(e), r = {
app: a,
host: e,
container: null
- }, ei.set(n, r), i = !0;
+ }, ti.set(n, r), i = !0;
}
- return ri(e, r.host), r.container = e, i;
+ return ii(e, r.host), r.container = e, i;
}
-function ai(e, t = "_mjrVueApp") {
- let n = ei.get(t);
+function oi(e, t = "_mjrVueApp") {
+ let n = ti.get(t);
if (n?.app) {
try {
n.app.unmount();
@@ -3637,32 +3634,254 @@ function ai(e, t = "_mjrVueApp") {
try {
n.host?.remove?.();
} catch {}
- ei.delete(t);
+ ti.delete(t);
}
}
//#endregion
//#region ui/utils/format.ts
-function oi(e) {
+function si(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 si(e) {
- let t = oi(e);
+function ci(e) {
+ let t = si(e);
return t ? `${t.getDate().toString().padStart(2, "0")}/${(t.getMonth() + 1).toString().padStart(2, "0")}` : "";
}
-function ci(e) {
- let t = oi(e);
+function li(e) {
+ let t = si(e);
return t ? `${t.getHours().toString().padStart(2, "0")}:${t.getMinutes().toString().padStart(2, "0")}` : "";
}
-function li(e) {
+function ui(e) {
return e ? e < 60 ? `${Math.round(e)}s` : `${Math.floor(e / 60)}m ${Math.round(e % 60)}s` : "";
}
//#endregion
-//#region ui/vue/components/panel/sidebar/SidebarFileInfoSection.vue
-var ui = {
+//#region ui/stores/usePanelStore.ts
+var di = "mjr_panel_state", fi = new Set([
+ "output",
+ "input",
+ "all",
+ "custom"
+]);
+function pi(e, t = !1) {
+ 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;
+}
+function mi(e, t = 0) {
+ let n = Number(e);
+ return Number.isFinite(n) ? n : t;
+}
+function Q(e, t = "") {
+ return e == null ? t : String(e);
+}
+function hi(e, t = 0, n = Infinity) {
+ return Math.max(t, Math.min(n, Math.floor(mi(e, t))));
+}
+function gi(e) {
+ let t = Q(e || "output").toLowerCase(), n = t === "outputs" ? "output" : t === "inputs" ? "input" : t;
+ return fi.has(n) ? n : "output";
+}
+function _i(e) {
+ if (!e || typeof e != "object") return {};
+ let t = e;
+ return {
+ scope: gi(t.scope),
+ customRootId: Q(t.customRootId),
+ customRootLabel: Q(t.customRootLabel),
+ currentFolderRelativePath: Q(t.currentFolderRelativePath || t.subfolder),
+ collectionId: Q(t.collectionId),
+ collectionName: Q(t.collectionName),
+ kindFilter: Q(t.kindFilter),
+ dateRangeFilter: Q(t.dateRangeFilter),
+ dateExactFilter: Q(t.dateExactFilter),
+ workflowOnly: pi(t.workflowOnly, !1),
+ minRating: hi(t.minRating, 0, 5),
+ minSizeMB: Math.max(0, mi(t.minSizeMB, 0)),
+ maxSizeMB: Math.max(0, mi(t.maxSizeMB, 0)),
+ resolutionCompare: t.resolutionCompare === "lte" ? "lte" : "gte",
+ minWidth: hi(t.minWidth),
+ minHeight: hi(t.minHeight),
+ maxWidth: hi(t.maxWidth),
+ maxHeight: hi(t.maxHeight),
+ workflowType: Q(t.workflowType),
+ workflowId: Q(t.workflowId || t.workflow_id),
+ sort: Q(t.sort || "mtime_desc"),
+ searchQuery: Q(t.searchQuery),
+ scrollTop: hi(t.scrollTop),
+ activeAssetId: Q(t.activeAssetId),
+ selectedAssetIds: Array.isArray(t.selectedAssetIds) ? t.selectedAssetIds.map((e) => Q(e).trim()).filter(Boolean).slice(0, 5e3) : [],
+ sidebarOpen: pi(t.sidebarOpen, !1)
+ };
+}
+function vi() {
+ try {
+ let e = localStorage.getItem(di);
+ if (e) return _i(JSON.parse(e));
+ } catch {}
+ return {};
+}
+function yi(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(di, JSON.stringify(t));
+ } catch {}
+}
+var bi = $e("mjr-panel", () => {
+ let e = vi(), t = I(e.scope || "output"), n = I(e.customRootId || ""), r = I(e.customRootLabel || ""), i = I(e.currentFolderRelativePath || ""), a = I(e.collectionId || ""), o = I(e.collectionName || ""), s = I(e.kindFilter || ""), c = I(e.dateRangeFilter || ""), l = I(e.dateExactFilter || ""), u = I(e.workflowOnly || !1), d = I(e.minRating || 0), f = I(e.minSizeMB || 0), p = I(e.maxSizeMB || 0), m = I(e.resolutionCompare || "gte"), h = I(e.minWidth || 0), g = I(e.minHeight || 0), _ = I(e.maxWidth || 0), v = I(e.maxHeight || 0), y = I(e.workflowType || ""), b = I(e.workflowId || ""), x = I(e.sort || "mtime_desc"), S = I(e.searchQuery || ""), C = I(e.scrollTop || 0), w = I(e.activeAssetId || ""), T = I(e.selectedAssetIds || []), E = I(e.sidebarOpen || !1), ee = I(0), te = I(0), ne = I(""), re = I([]), ie = I(""), ae = I(""), se = null;
+ we([
+ t,
+ n,
+ r,
+ i,
+ a,
+ o,
+ s,
+ c,
+ l,
+ u,
+ d,
+ f,
+ p,
+ m,
+ h,
+ g,
+ _,
+ v,
+ y,
+ b,
+ x,
+ S,
+ C,
+ w,
+ T,
+ E
+ ], () => {
+ se && clearTimeout(se), se = setTimeout(() => {
+ se = null, yi({
+ scope: t.value,
+ customRootId: n.value,
+ customRootLabel: r.value,
+ currentFolderRelativePath: i.value,
+ collectionId: a.value,
+ collectionName: o.value,
+ kindFilter: s.value,
+ dateRangeFilter: c.value,
+ dateExactFilter: l.value,
+ workflowOnly: u.value,
+ minRating: d.value,
+ minSizeMB: f.value,
+ maxSizeMB: p.value,
+ resolutionCompare: m.value,
+ minWidth: h.value,
+ minHeight: g.value,
+ maxWidth: _.value,
+ maxHeight: v.value,
+ workflowType: y.value,
+ workflowId: b.value,
+ sort: x.value,
+ searchQuery: S.value,
+ scrollTop: C.value,
+ activeAssetId: w.value,
+ selectedAssetIds: T.value,
+ sidebarOpen: E.value
+ });
+ }, 750);
+ }, { deep: !0 });
+ let ce = (e) => {
+ if (!(e.key !== di || !e.newValue)) try {
+ let n = _i(JSON.parse(e.newValue));
+ n.scope !== void 0 && (t.value = n.scope), n.customRootLabel !== void 0 && (r.value = n.customRootLabel), n.searchQuery !== void 0 && (S.value = n.searchQuery), n.sort !== void 0 && (x.value = n.sort), n.sidebarOpen !== void 0 && (E.value = n.sidebarOpen);
+ } catch {}
+ };
+ try {
+ window.addEventListener("storage", ce);
+ } catch {}
+ Me(() => {
+ try {
+ window.removeEventListener("storage", ce);
+ } catch {}
+ });
+ function D() {
+ 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 = "", S.value = "";
+ }
+ function O() {
+ T.value = [], w.value = "";
+ }
+ function le(e, t = "") {
+ T.value = Array.isArray(e) ? e.map(String).filter(Boolean) : [], w.value = t || T.value[0] || "";
+ }
+ function ue(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 || "", ne.value = "", re.value = [], ie.value = "", ae.value = "", O();
+ }
+ async function de() {
+ let e = String(n.value || "").trim();
+ if (e) try {
+ let a = await oe("/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;
+ }
+ let s = String(o.label || "").trim();
+ s && s !== r.value && (r.value = s);
+ } catch {}
+ }
+ return {
+ scope: t,
+ customRootId: n,
+ customRootLabel: r,
+ currentFolderRelativePath: i,
+ collectionId: a,
+ collectionName: o,
+ kindFilter: s,
+ dateRangeFilter: c,
+ dateExactFilter: l,
+ workflowOnly: u,
+ minRating: d,
+ minSizeMB: f,
+ maxSizeMB: p,
+ resolutionCompare: m,
+ minWidth: h,
+ minHeight: g,
+ maxWidth: _,
+ maxHeight: v,
+ workflowType: y,
+ workflowId: b,
+ sort: x,
+ searchQuery: S,
+ scrollTop: C,
+ activeAssetId: w,
+ selectedAssetIds: T,
+ sidebarOpen: E,
+ lastGridCount: ee,
+ lastGridTotal: te,
+ viewScope: ne,
+ similarResults: re,
+ similarTitle: ie,
+ similarSourceAssetId: ae,
+ resetFilters: D,
+ clearSelection: O,
+ setSelection: le,
+ navigateToScope: ue,
+ validatePersistedCustomRoot: de
+ };
+}), xi = {
key: 0,
class: "mjr-sidebar-section",
style: {
@@ -3671,11 +3890,18 @@ var ui = {
"border-radius": "8px",
padding: "10px"
}
-}, di = { style: {
+}, Si = { style: {
+ "font-size": "12px",
+ "font-weight": "700",
+ color: "#607d8b",
+ "margin-bottom": "8px",
+ "text-transform": "uppercase",
+ "letter-spacing": "0.4px"
+} }, Ci = { style: {
display: "flex",
"flex-direction": "column",
gap: "6px"
-} }, fi = ["title"], pi = ["title"], mi = {
+} }, wi = ["title"], Ti = ["title", "onClick"], Ei = ["title"], Di = {
__name: "SidebarFileInfoSection",
props: { asset: {
type: Object,
@@ -3684,6 +3910,22 @@ var ui = {
setup(e) {
let t = e;
function n(e) {
+ let t = String(e || "").trim();
+ if (t) {
+ try {
+ let e = bi();
+ e.workflowId = t;
+ } catch (e) {
+ console.debug?.(e);
+ }
+ try {
+ window.dispatchEvent(new CustomEvent("mjr:filters-changed"));
+ } catch (e) {
+ console.debug?.(e);
+ }
+ }
+ }
+ function r(e) {
if (!e || e <= 0) return "0 B";
let t = [
"B",
@@ -3694,7 +3936,7 @@ var ui = {
for (; r >= 1024 && n < t.length - 1;) r /= 1024, n += 1;
return `${r.toFixed(+(n > 0))} ${t[n]}`;
}
- function r(e) {
+ function i(e) {
try {
if (String(e?.kind || "").toLowerCase() === "video") return !0;
let t = String(e?.filename || e?.filepath || e?.path || "").toLowerCase();
@@ -3703,96 +3945,93 @@ var ui = {
return !1;
}
}
- function i(e, t) {
+ function a(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 a = B(() => {
- let e = t.asset || {}, a = [];
- if (e.width && e.height && a.push({
- label: "Dimensions",
- value: `${e.width} × ${e.height}`,
- tooltip: "Image/video resolution in pixels"
- }), e.duration && e.duration > 0 && a.push({
- label: "Duration",
- value: li(e.duration),
- tooltip: "Video duration"
- }), r(e)) {
- let t = qr(e);
- t != null && a.push({
+ let o = V(() => {
+ let e = t.asset || {}, n = [];
+ if (e.width && e.height && n.push({
+ label: k("sidebar.dimensions", "Dimensions"),
+ value: `${e.width} x ${e.height}`,
+ tooltip: k("sidebar.fileInfo.dimensionsTooltip", "Image/video resolution in pixels")
+ }), e.duration && e.duration > 0 && n.push({
+ label: k("sidebar.fileInfo.duration", "Duration"),
+ value: ui(e.duration),
+ tooltip: k("sidebar.fileInfo.durationTooltip", "Video duration")
+ }), i(e)) {
+ let t = Jr(e);
+ t != null && n.push({
label: "FPS",
- value: Yr(t),
- tooltip: "Native frame rate"
- });
- let n = Jr(e, t);
- n != null && a.push({
- label: "Length",
- value: `${Math.max(0, Math.floor(n))} frames`,
- tooltip: "Total frame count"
+ value: Xr(t),
+ tooltip: k("sidebar.fileInfo.fpsTooltip", "Native frame rate")
});
+ let r = Yr(e, t);
+ if (r != null) {
+ let e = Math.max(0, Math.floor(r));
+ n.push({
+ label: k("sidebar.fileInfo.length", "Length"),
+ value: k("sidebar.fileInfo.frames", "{count} frames", { count: e }),
+ tooltip: k("sidebar.fileInfo.lengthTooltip", "Total frame count")
+ });
+ }
}
- let o = zr(e.generation_time_ms ?? e.metadata?.generation_time_ms ?? 0);
- o > 0 && a.push({
- label: "Generation Time",
+ let o = Br(e.generation_time_ms ?? e.metadata?.generation_time_ms ?? 0);
+ o > 0 && n.push({
+ label: k("sidebar.fileInfo.generationTime", "Generation Time"),
value: `${(Number(o) / 1e3).toFixed(1)}s`,
- tooltip: "Time taken to generate this asset (workflow execution time)",
- valueStyle: `color: ${Lr(o)}; font-weight: 600;`
+ tooltip: k("sidebar.fileInfo.generationTimeTooltip", "Time taken to generate this asset (workflow execution time)"),
+ valueStyle: `color: ${Rr(o)}; font-weight: 600;`
});
let s = e.generation_time || e.file_creation_time || e.mtime || e.created_at;
if (s) {
- let e = si(s), t = ci(s);
- e && a.push({
- label: "Date",
+ let e = ci(s), t = li(s);
+ e && n.push({
+ label: k("sidebar.date", "Date"),
value: e,
- tooltip: "File creation/generation date"
- }), t && a.push({
- label: "Time",
+ tooltip: k("sidebar.fileInfo.dateTooltip", "File creation/generation date")
+ }), t && n.push({
+ label: k("sidebar.fileInfo.time", "Time"),
value: t,
- tooltip: "File creation/generation time"
+ tooltip: k("sidebar.fileInfo.timeTooltip", "File creation/generation time")
});
}
- e.size && e.size > 0 && a.push({
- label: "File Size",
- value: n(e.size),
- tooltip: "File size on disk"
- }), e.id != null && a.push({
- label: "Asset ID",
+ e.size && e.size > 0 && n.push({
+ label: k("sidebar.fileInfo.fileSize", "File Size"),
+ value: r(e.size),
+ tooltip: k("sidebar.fileInfo.fileSizeTooltip", "File size on disk")
+ }), e.id != null && n.push({
+ label: k("sidebar.fileInfo.assetId", "Asset ID"),
value: String(e.id),
- tooltip: "Internal database asset identifier"
+ tooltip: k("sidebar.fileInfo.assetIdTooltip", "Internal database asset identifier")
});
- let c = String(i(e, "job_id") || "").trim();
- c && a.push({
- label: "Job ID",
+ let c = String(a(e, "job_id") || "").trim();
+ c && n.push({
+ label: k("sidebar.fileInfo.jobId", "Job ID"),
value: c,
- tooltip: "Workflow execution job identifier (prompt_id)"
+ tooltip: k("sidebar.fileInfo.jobIdTooltip", "Workflow execution job identifier (prompt_id)")
});
- let l = String(i(e, "source_node_id") || "").trim();
- l && a.push({
- label: "Source Node",
+ let l = String(a(e, "source_node_id") || "").trim();
+ l && n.push({
+ label: k("sidebar.fileInfo.sourceNode", "Source Node"),
value: l,
- tooltip: "ComfyUI node id that produced this file"
+ tooltip: k("sidebar.fileInfo.sourceNodeTooltip", "ComfyUI node id that produced this file")
});
- let u = String(i(e, "source_node_type") || "").trim();
- u && a.push({
- label: "Node Type",
+ let u = String(a(e, "source_node_type") || "").trim();
+ u && n.push({
+ label: k("sidebar.fileInfo.nodeType", "Node Type"),
value: u,
- tooltip: "ComfyUI node class that produced this file"
+ tooltip: k("sidebar.fileInfo.nodeTypeTooltip", "ComfyUI node class that produced this file")
});
- let d = String(i(e, "workflow_id") || "").trim();
- return d && a.push({
- label: "Workflow ID",
+ let d = String(a(e, "workflow_id") || "").trim();
+ return d && n.push({
+ label: k("sidebar.fileInfo.workflowId", "Workflow ID"),
value: d,
- tooltip: "ComfyUI workflow identifier (from workflow.id in extra_data)"
- }), a;
+ tooltip: k("sidebar.fileInfo.workflowIdTooltip", "ComfyUI workflow identifier (from workflow.id in extra_data)"),
+ action: "sameWorkflow"
+ }), n;
});
- return (e, t) => a.value.length ? (M(), F("div", ui, [t[0] ||= P("div", { style: {
- "font-size": "12px",
- "font-weight": "700",
- color: "#607d8b",
- "margin-bottom": "8px",
- "text-transform": "uppercase",
- "letter-spacing": "0.4px"
- } }, " File Info ", -1), P("div", di, [(M(!0), F(V, null, N(a.value, (e) => (M(), F("div", {
+ return (e, t) => o.value.length ? (M(), F("div", xi, [P("div", Si, R(z(k)("sidebar.fileInfo.title", "File Info")), 1), P("div", Ci, [(M(!0), F(H, null, N(o.value, (e) => (M(), F("div", {
key: e.label,
style: {
display: "flex",
@@ -3807,12 +4046,33 @@ var ui = {
opacity: "0.68",
"min-width": "92px"
}
- }, R(e.label), 9, fi), P("div", {
+ }, R(e.label), 9, wi), e.action === "sameWorkflow" ? (M(), F("button", {
+ key: 0,
+ type: "button",
+ title: z(k)("tooltip.filterWorkflowId", "Filter assets generated from the same embedded workflow id"),
+ style: {
+ appearance: "none",
+ border: "0",
+ background: "transparent",
+ color: "inherit",
+ font: "inherit",
+ "font-size": "12px",
+ "text-align": "right",
+ "word-break": "break-word",
+ cursor: "pointer",
+ padding: "0",
+ "text-decoration": "underline",
+ "text-decoration-color": "rgba(255,255,255,0.25)",
+ "text-underline-offset": "3px"
+ },
+ onClick: (t) => n(e.value)
+ }, R(e.value), 9, Ti)) : (M(), F("div", {
+ key: 1,
style: L(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"),
title: String(e.value || "")
- }, R(e.value), 13, pi)]))), 128))])])) : z("", !0);
+ }, R(e.value), 13, Ei))]))), 128))])])) : B("", !0);
}
-}, hi = new Set([
+}, Oi = new Set([
"png",
"jpg",
"jpeg",
@@ -3828,31 +4088,31 @@ var ui = {
"hdr",
"svg"
]);
-function gi(e) {
+function ki(e) {
let t = String(e?.filename || e?.name || e?.filepath || e?.path || "").trim().toLowerCase();
return !t || !t.includes(".") ? "" : t.split(".").pop() || "";
}
-function _i(e) {
- return String(e?.kind || "").trim().toLowerCase() === "image" || String(e?.mime || e?.mimetype || "").trim().toLowerCase().startsWith("image/") ? !0 : hi.has(gi(e));
+function Ai(e) {
+ return String(e?.kind || "").trim().toLowerCase() === "image" || String(e?.mime || e?.mimetype || "").trim().toLowerCase().startsWith("image/") ? !0 : Oi.has(ki(e));
}
-function vi(e) {
- let t = gi(e);
+function ji(e) {
+ let t = ki(e);
return t === "jpg" || t === "jpeg";
}
-function yi() {
+function Mi() {
try {
- return !!(K()?.ai?.vectorSearchEnabled ?? !0);
+ return !!(q()?.ai?.vectorSearchEnabled ?? !0);
} catch {
return !0;
}
}
-function bi(e) {
+function Ni(e) {
return e >= .75 ? "#4CAF50" : e >= .5 ? "#8BC34A" : e >= .3 ? "#FF9800" : "#F44336";
}
-function xi(e) {
+function Pi(e) {
return e >= .85 ? "Excellent" : e >= .7 ? "Good" : e >= .5 ? "Fair" : e >= .3 ? "Low" : "Very Low";
}
-function Si(e) {
+function Fi(e) {
let t = String(e || "").trim();
if (!t) return "";
let n = [];
@@ -3862,17 +4122,17 @@ function Si(e) {
}
return (n.length ? n.join(" ") : t).replace(/\s+/g, " ").replace(/:{2,}\s*$/, "").trim();
}
-function Ci(e) {
+function Ii(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 = Se(t, n, e);
+ let r = _e(t, n, e);
r && !i.includes(r) && i.push(r);
};
return (r === "input" || r === "output") && a(r), a("input"), a("output"), i;
}
-function wi(e) {
+function Li(e) {
let t = String(e || "").trim();
if (!t) return !1;
if (t.startsWith("/")) return !0;
@@ -3883,31 +4143,37 @@ function wi(e) {
return !1;
}
}
-function Z(e) {
+function $(e) {
return e == null || e === "" ? "-" : String(e);
}
-function Ti(e, t) {
- let n = String(e?.pass_name || "").trim();
- if (n) return n;
- let r = Number(e?.denoise);
- return t === 0 || r === 1 ? "Base" : Number.isFinite(r) && r < 1 ? "Refine / Upscale" : `Pass ${t + 1}`;
+function Ri(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 Ei(e) {
+function zi(e) {
return e?.geninfo && typeof e.geninfo == "object" ? { geninfo: e.geninfo } : e?.metadata && (typeof e.metadata == "object" || typeof e.metadata == "string") ? e.metadata : e?.prompt && (typeof e.prompt == "object" || typeof e.prompt == "string") ? e.prompt : e?.metadata_raw ? e.metadata_raw : e?.exif ? e.exif : null;
}
-function Di(e) {
+function Bi(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 || it(e.prompt) || typeof (e.negative_prompt || e.negativePrompt) == "string" && it(e.negative_prompt || e.negativePrompt) || e.models || e.model || e.checkpoint || e.loras || 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;
+ 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 || at(e.prompt) || typeof (e.negative_prompt || e.negativePrompt) == "string" && at(e.negative_prompt || e.negativePrompt) || e.models || e.model || e.checkpoint || e.loras || 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 Q(e) {
- return e ? typeof e == "string" ? at(e) : typeof e == "object" ? at(e.name || e.value || "") : "" : "";
+function Vi(e) {
+ return e ? typeof e == "string" ? ot(e) : typeof e == "object" ? ot(e.name || e.value || "") : "" : "";
}
-function Oi(e, t, n, r) {
+function Hi(e, t, n, r) {
let i = String(r || "").trim();
if (!i) return;
let a = `${n}::${i}`;
@@ -3916,15 +4182,15 @@ function Oi(e, t, n, r) {
value: i
}));
}
-function ki(e) {
+function Ui(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 Ai(e) {
+function Wi(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 = Q(e.model), r = Array.isArray(e.loras) ? e.loras.map((e) => rt(e)).filter(Boolean) : [];
+ let n = Vi(e.model), r = Array.isArray(e.loras) ? e.loras.map((e) => it(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}`,
@@ -3935,46 +4201,46 @@ function Ai(e) {
let r = e.models && typeof e.models == "object" ? e.models : null, i = Array.isArray(e.loras) ? e.loras : [];
return r && [{
key: "high_noise",
- label: "High Noise",
- model: Q(r.unet_high_noise)
+ label: k("sidebar.generation.highNoise", "High Noise"),
+ model: Vi(r.unet_high_noise)
}, {
key: "low_noise",
- label: "Low Noise",
- model: Q(r.unet_low_noise)
+ label: k("sidebar.generation.lowNoise", "Low Noise"),
+ model: Vi(r.unet_low_noise)
}].forEach((e) => {
- let n = i.filter((t) => ki(t) === e.key).map((e) => rt(e)).filter(Boolean);
+ let n = i.filter((t) => Ui(t) === e.key).map((e) => it(e)).filter(Boolean);
!e.model && !n.length || t.push({
...e,
loras: n
});
}), t;
}
-function ji(e, t) {
+function Gi(e, t) {
return t == null ? null : {
label: e,
- value: t ? "on" : "off"
+ value: t ? k("state.on", "on") : k("state.off", "off")
};
}
-function Mi(e) {
+function Ki(e) {
return e != null && String(e).trim() !== "";
}
-function Ni(e) {
+function qi(e) {
return new Set(Array.isArray(e.override_fields) ? e.override_fields.map((e) => String(e || "").trim()).filter(Boolean) : []);
}
-function $(e, ...t) {
+function Ji(e, ...t) {
return t.some((t) => e.has(t));
}
-function Pi(e) {
+function Yi(e) {
return Array.isArray(e) ? e.filter((e) => e && typeof e == "object").map((e, t) => ({
- title: String(e.title || `Custom Info ${t + 1}`).trim(),
+ 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 Fi(e) {
- let t = nt(Ei(e)), n = {
+function Xi(e) {
+ let t = rt(zi(e)), n = {
kind: "empty",
- title: "Generation",
+ title: k("sidebar.generation.title", "Generation"),
workflowType: "",
workflowLabel: "",
workflowBadge: "",
@@ -3986,9 +4252,9 @@ function Fi(e) {
promptTabs: [],
mediaOnlyMessage: "",
showAlignment: !1,
- captionLabel: "Image Description",
- emptyCaptionText: "No image description yet.",
- isImageAsset: _i(e),
+ captionLabel: k("sidebar.generation.imageDescription", "Image Description"),
+ emptyCaptionText: k("sidebar.generation.noImageDescription", "No image description yet."),
+ isImageAsset: Ai(e),
lyrics: "",
modelFields: [],
modelGroups: [],
@@ -4007,159 +4273,167 @@ function Fi(e) {
notesFields: [],
customInfoBlocks: []
};
- if (!t || typeof t == "object" && Object.keys(t).length === 0 || !Di(t)) {
+ if (!t || typeof t == "object" && Object.keys(t).length === 0 || !Bi(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: "This file looks like a media-only pipeline (e.g. LoadVideo/VideoCombine) and does not contain generation parameters."
- } : _i(e) || vi(e) ? {
+ mediaOnlyMessage: k("sidebar.generation.mediaOnlyPipeline", "This file looks like a media-only pipeline (e.g. LoadVideo/VideoCombine) and does not contain generation parameters.")
+ } : Ai(e) || ji(e) ? {
...n,
kind: "caption-only",
showAlignment: !1
} : n;
}
- let r = t, i = Ni(r), a = r.engine && typeof r.engine == "object" ? r.engine : null, o = !!(r.is_override || a?.mode === "override" || a?.parser_version === "geninfo-override-v1" || a?.source === "majoor_geninfo"), s = ot(r), c = tt(typeof r.prompt == "string" ? r.prompt : null, typeof (r.negative_prompt || r.negativePrompt) == "string" ? r.negative_prompt || r.negativePrompt : null), l = Array.isArray(r.all_positive_prompts) && r.all_positive_prompts.length > 1 ? r.all_positive_prompts.map((e, t) => {
- let n = tt(typeof e == "string" ? e : "", typeof r.all_negative_prompts?.[t] == "string" ? r.all_negative_prompts[t] : "");
+ let r = t, i = qi(r), a = r.engine && typeof r.engine == "object" ? r.engine : null, o = !!(r.is_override || a?.mode === "override" || a?.parser_version === "geninfo-override-v1" || a?.source === "majoor_geninfo"), s = st(r), c = nt(typeof r.prompt == "string" ? r.prompt : null, typeof (r.negative_prompt || r.negativePrompt) == "string" ? r.negative_prompt || r.negativePrompt : null), l = Array.isArray(r.all_positive_prompts) && r.all_positive_prompts.length > 1 ? r.all_positive_prompts.map((e, t) => {
+ let n = nt(typeof e == "string" ? e : "", typeof r.all_negative_prompts?.[t] == "string" ? r.all_negative_prompts[t] : "");
return {
- label: `Prompt ${t + 1}`,
- positive: it(n.positive),
- negative: it(n.negative)
+ label: k("sidebar.generation.promptN", "Prompt {n}", { n: t + 1 }),
+ positive: at(n.positive),
+ negative: at(n.negative)
};
- }).filter((e) => e.positive) : [], u = [], d = /* @__PURE__ */ new Set(), f = r.models && typeof r.models == "object" ? r.models : null, p = Ai(r), m = new Set(p.map((e) => String(e.model || "").trim()).filter(Boolean)), h = Array.isArray(r.all_checkpoints) && r.all_checkpoints.length > 1 ? r.all_checkpoints : null;
+ }).filter((e) => e.positive) : [], u = [], d = /* @__PURE__ */ new Set(), f = r.models && typeof r.models == "object" ? r.models : null, p = Wi(r), m = new Set(p.map((e) => String(e.model || "").trim()).filter(Boolean)), h = Array.isArray(r.all_checkpoints) && r.all_checkpoints.length > 1 ? r.all_checkpoints : null;
if (f) {
let e = new Set([
- Q(f.unet_high_noise),
- Q(f.unet_low_noise),
+ Vi(f.unet_high_noise),
+ Vi(f.unet_low_noise),
...m
].filter(Boolean));
if (h) h.forEach((e, t) => {
- let n = Q(e);
- Oi(u, d, `Checkpoint ${t + 1}`, n);
+ let n = Vi(e);
+ Hi(u, d, k("sidebar.generation.checkpointN", "Checkpoint {n}", { n: t + 1 }), n);
});
else {
- let t = Q(f.checkpoint);
- t && !e.has(t) && Oi(u, d, "Checkpoint", t);
+ let t = Vi(f.checkpoint);
+ t && !e.has(t) && Hi(u, d, k("sidebar.generation.checkpoint", "Checkpoint"), t);
}
[
- ["UNet", Q(f.unet)],
- ["Diffusion", Q(f.diffusion)],
- ["Upscaler", Q(f.upscaler)],
- ["CLIP", Q(f.clip)],
- ["VAE", Q(f.vae)]
+ ["UNet", Vi(f.unet)],
+ ["Diffusion", Vi(f.diffusion)],
+ [k("sidebar.generation.upscaler", "Upscaler"), Vi(f.upscaler)],
+ ["CLIP", Vi(f.clip)],
+ ["VAE", Vi(f.vae)]
].forEach(([t, n]) => {
- e.has(n) || Oi(u, d, t, n);
+ e.has(n) || Hi(u, d, t, n);
});
- } else (r.model || r.checkpoint) && Oi(u, d, "Model", at(r.model || r.checkpoint));
+ } else (r.model || r.checkpoint) && Hi(u, d, k("sidebar.generation.model", "Model"), ot(r.model || r.checkpoint));
if (Array.isArray(r.loras) && r.loras.length > 0) {
- let e = r.loras.map((e) => rt(e)).filter(Boolean).join("\n");
- e && Oi(u, d, r.loras.length > 1 ? "LoRAs" : "LoRA", e);
+ let e = r.loras.map((e) => it(e)).filter(Boolean).join("\n");
+ e && Hi(u, d, r.loras.length > 1 ? k("sidebar.generation.loras", "LoRAs") : "LoRA", e);
}
- !f && r.clip && Oi(u, d, "CLIP", at(r.clip)), !f && r.vae && Oi(u, d, "VAE", at(r.vae)), !f && r.unet && Oi(u, d, "UNet", at(r.unet)), !f && r.diffusion && Oi(u, d, "Diffusion", at(r.diffusion)), f && r.clip && Oi(u, d, "CLIP", at(r.clip)), f && r.vae && Oi(u, d, "VAE", at(r.vae));
+ !f && r.clip && Hi(u, d, "CLIP", ot(r.clip)), !f && r.vae && Hi(u, d, "VAE", ot(r.vae)), !f && r.unet && Hi(u, d, "UNet", ot(r.unet)), !f && r.diffusion && Hi(u, d, "Diffusion", ot(r.diffusion)), f && r.clip && Hi(u, d, "CLIP", ot(r.clip)), f && r.vae && Hi(u, d, "VAE", ot(r.vae));
for (let e of u) {
let t = String(e.label || "").toLowerCase();
- (t.includes("checkpoint") || t === "model") && (e.override = $(i, "checkpoint", "model")), t === "clip" && (e.override = $(i, "clip")), t === "vae" && (e.override = $(i, "vae")), t.includes("lora") && (e.override = $(i, "loras"));
+ (t.includes("checkpoint") || t === "model") && (e.override = Ji(i, "checkpoint", "model")), t === "clip" && (e.override = Ji(i, "clip")), t === "vae" && (e.override = Ji(i, "vae")), t.includes("lora") && (e.override = Ji(i, "loras"));
}
let g = [];
- Mi(r.seed) && g.push({
- label: "Seed",
+ Ki(r.seed) && g.push({
+ label: k("sidebar.generation.seed", "Seed"),
value: r.seed,
- override: $(i, "seed")
+ override: Ji(i, "seed")
}), (r.sampler || r.sampler_name) && g.push({
- label: "Sampler",
+ label: k("sidebar.generation.sampler", "Sampler"),
value: r.sampler || r.sampler_name,
- override: $(i, "sampler", "sampler_name")
- }), Mi(r.steps) && g.push({
- label: "Steps",
+ override: Ji(i, "sampler", "sampler_name")
+ }), Ki(r.steps) && g.push({
+ label: k("sidebar.generation.steps", "Steps"),
value: r.steps,
- override: $(i, "steps")
+ override: Ji(i, "steps")
});
- let _ = Mi(r.cfg) ? r.cfg : r.cfg_scale;
- Mi(_) && g.push({
- label: "CFG Scale",
+ let _ = Ki(r.cfg) ? r.cfg : r.cfg_scale;
+ Ki(_) && g.push({
+ label: k("sidebar.generation.cfgScale", "CFG Scale"),
value: _,
- override: $(i, "cfg", "cfg_scale")
+ override: Ji(i, "cfg", "cfg_scale")
}), r.cfg_high_noise !== void 0 && r.cfg_high_noise !== null && g.push({
- label: "CFG High Noise",
+ label: k("sidebar.generation.cfgHighNoise", "CFG High Noise"),
value: r.cfg_high_noise
}), r.cfg_low_noise !== void 0 && r.cfg_low_noise !== null && g.push({
- label: "CFG Low Noise",
+ label: k("sidebar.generation.cfgLowNoise", "CFG Low Noise"),
value: r.cfg_low_noise
}), r.scheduler && g.push({
- label: "Scheduler",
+ label: k("sidebar.generation.scheduler", "Scheduler"),
value: r.scheduler,
- override: $(i, "scheduler")
+ override: Ji(i, "scheduler")
});
- let v = Mi(r.denoise) ? r.denoise : r.denoising;
- Mi(v) && g.push({
- label: "Denoise",
+ let v = Ki(r.denoise) ? r.denoise : r.denoising;
+ Ki(v) && g.push({
+ label: k("sidebar.generation.denoise", "Denoise"),
value: v,
- override: $(i, "denoise", "denoising")
+ override: Ji(i, "denoise", "denoising")
});
let y = [];
Array.isArray(r.chained_passes) && r.chained_passes.length > 1 ? y = r.chained_passes.filter((e) => e && typeof e == "object").map((e, t) => ({
- label: Ti(e, t),
+ label: Ri(e, t),
fields: [
{
- label: "Sampler",
- value: Z(e?.sampler_name || e?.sampler)
+ label: k("sidebar.generation.model", "Model"),
+ value: $(e?.model)
},
{
- label: "Scheduler",
- value: Z(e?.scheduler)
+ label: k("sidebar.generation.sampler", "Sampler"),
+ value: $(e?.sampler_name || e?.sampler)
},
{
- label: "Steps",
- value: Z(e?.steps)
+ label: k("sidebar.generation.scheduler", "Scheduler"),
+ value: $(e?.scheduler)
+ },
+ {
+ label: k("sidebar.generation.steps", "Steps"),
+ value: $(e?.steps)
},
{
label: "CFG",
- value: Z(e?.cfg)
+ value: $(e?.cfg)
},
{
- label: "Denoise",
- value: Z(e?.denoise)
+ label: k("sidebar.generation.denoise", "Denoise"),
+ value: $(e?.denoise)
},
{
- label: "Seed",
- value: Z(e?.seed_val || e?.seed)
+ label: k("sidebar.generation.seed", "Seed"),
+ value: $(e?.seed_val || e?.seed)
}
]
})) : Array.isArray(r.all_samplers) && r.all_samplers.length > 1 && (y = r.all_samplers.filter((e) => e && typeof e == "object").map((e, t) => ({
- label: Ti(e, t),
+ label: Ri(e, t),
fields: [
{
- label: "Sampler",
- value: Z(e?.sampler_name || e?.sampler)
+ label: k("sidebar.generation.model", "Model"),
+ value: $(e?.model)
},
{
- label: "Scheduler",
- value: Z(e?.scheduler)
+ label: k("sidebar.generation.sampler", "Sampler"),
+ value: $(e?.sampler_name || e?.sampler)
},
{
- label: "Steps",
- value: Z(e?.steps)
+ label: k("sidebar.generation.scheduler", "Scheduler"),
+ value: $(e?.scheduler)
+ },
+ {
+ label: k("sidebar.generation.steps", "Steps"),
+ value: $(e?.steps)
},
{
label: "CFG",
- value: Z(e?.cfg)
+ value: $(e?.cfg)
},
{
- label: "Denoise",
- value: Z(e?.denoise)
+ label: k("sidebar.generation.denoise", "Denoise"),
+ value: $(e?.denoise)
},
{
- label: "Seed",
- value: Z(e?.seed_val || e?.seed)
+ label: k("sidebar.generation.seed", "Seed"),
+ value: $(e?.seed_val || e?.seed)
}
]
})));
let b = [];
r.voice && b.push({
- label: "Narrator Voice",
+ label: k("sidebar.generation.narratorVoice", "Narrator Voice"),
value: r.voice
}), r.language && b.push({
- label: "Language",
+ label: k("sidebar.generation.language", "Language"),
value: r.language
}), r.top_k !== void 0 && r.top_k !== null && b.push({
label: "Top-k",
@@ -4168,84 +4442,84 @@ function Fi(e) {
label: "Top-p",
value: r.top_p
}), r.temperature !== void 0 && r.temperature !== null && b.push({
- label: "Temperature",
+ label: k("sidebar.generation.temperature", "Temperature"),
value: r.temperature
}), r.repetition_penalty !== void 0 && r.repetition_penalty !== null && b.push({
- label: "Repetition Penalty",
+ label: k("sidebar.generation.repetitionPenalty", "Repetition Penalty"),
value: r.repetition_penalty
}), r.max_new_tokens !== void 0 && r.max_new_tokens !== null && b.push({
- label: "Max New Tokens",
+ label: k("sidebar.generation.maxNewTokens", "Max New Tokens"),
value: r.max_new_tokens
});
let x = [];
r.device && x.push({
- label: "Device",
+ label: k("sidebar.generation.device", "Device"),
value: r.device
}), r.voice_preset && x.push({
- label: "Voice Preset",
+ label: k("sidebar.generation.voicePreset", "Voice Preset"),
value: r.voice_preset
}), r.dtype && x.push({
- label: "Dtype",
+ label: k("sidebar.generation.dtype", "Dtype"),
value: r.dtype
}), r.attn_implementation && x.push({
- label: "Attention",
+ label: k("sidebar.generation.attention", "Attention"),
value: r.attn_implementation
}), r.compile_mode && x.push({
- label: "Compile Mode",
+ label: k("sidebar.generation.compileMode", "Compile Mode"),
value: r.compile_mode
}), [
- ji("Torch Compile", r.use_torch_compile),
- ji("CUDA Graphs", r.use_cuda_graphs),
- ji("X-Vector Only", r.x_vector_only_mode)
+ Gi(k("sidebar.generation.torchCompile", "Torch Compile"), r.use_torch_compile),
+ Gi(k("sidebar.generation.cudaGraphs", "CUDA Graphs"), r.use_cuda_graphs),
+ Gi(k("sidebar.generation.xVectorOnly", "X-Vector Only"), r.x_vector_only_mode)
].filter(Boolean).forEach((e) => x.push(e));
let S = [];
[
- ji("Chunking", r.enable_chunking),
+ Gi(k("sidebar.generation.chunking", "Chunking"), r.enable_chunking),
r.max_chars_per_chunk !== void 0 && r.max_chars_per_chunk !== null ? {
- label: "Max Chars/Chunk",
+ label: k("sidebar.generation.maxCharsChunk", "Max Chars/Chunk"),
value: r.max_chars_per_chunk
} : null,
r.chunk_combination_method ? {
- label: "Chunk 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: "Silence Between Chunks (ms)",
+ label: k("sidebar.generation.silenceBetweenChunks", "Silence Between Chunks (ms)"),
value: r.silence_between_chunks_ms
} : null,
- ji("Audio Cache", r.enable_audio_cache),
+ Gi(k("sidebar.generation.audioCache", "Audio Cache"), r.enable_audio_cache),
r.batch_size !== void 0 && r.batch_size !== null ? {
- label: "Batch Size",
+ label: k("sidebar.generation.batchSize", "Batch Size"),
value: r.batch_size
} : null
].filter(Boolean).forEach((e) => S.push(e));
let C = [];
r.lyrics_strength !== void 0 && r.lyrics_strength !== null && C.push({
- label: "Lyrics Strength",
+ label: k("sidebar.generation.lyricsStrength", "Lyrics Strength"),
value: r.lyrics_strength
});
let w = [];
- Mi(v) && !g.some((e) => e.label === "Denoise") && w.push({
- label: "Denoise",
+ Ki(v) && !g.some((e) => e.label === "Denoise") && w.push({
+ label: k("sidebar.generation.denoise", "Denoise"),
value: v
- }), Mi(r.clip_skip) && w.push({
- label: "Clip Skip",
+ }), Ki(r.clip_skip) && w.push({
+ label: k("sidebar.generation.clipSkip", "Clip Skip"),
value: r.clip_skip
});
let T = [], E = String(r.workflow_notes || r.notes || "").trim();
E && T.push({
- label: "Workflow Notes",
+ label: k("sidebar.generation.workflowNotes", "Workflow Notes"),
value: E,
- override: $(i, "workflow_notes", "notes")
+ override: Ji(i, "workflow_notes", "notes")
});
- let ee = Pi(r.custom_info), D = Array.isArray(r.inputs) ? r.inputs.filter((e) => e && typeof e == "object" && e.filename).map((e, t) => ({
+ let ee = Yi(r.custom_info), te = 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(),
filepath: String(e.filepath || e.filename || "").trim(),
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 || "")),
- previewCandidates: Ci(e)
+ previewCandidates: Ii(e)
})) : [];
return {
...n,
@@ -4257,11 +4531,11 @@ function Fi(e) {
isTruncated: !!(e?.geninfo?._truncated || e?.metadata?._truncated || e?.prompt?._truncated),
positivePrompt: l.length ? "" : String(c.positive || "").trim(),
negativePrompt: l.length ? "" : String(c.negative || "").trim(),
- positivePromptOverride: $(i, "prompt", "positive", "positive_prompt"),
- negativePromptOverride: $(i, "negative_prompt", "negative", "negativePrompt"),
+ positivePromptOverride: Ji(i, "prompt", "positive", "positive_prompt"),
+ negativePromptOverride: Ji(i, "negative_prompt", "negative", "negativePrompt"),
promptTabs: l,
showAlignment: !!e?.id && (!!String(c.positive || "").trim() || l.length > 0),
- isImageAsset: _i(e),
+ isImageAsset: Ai(e),
lyrics: String(r.lyrics || "").trim(),
modelFields: u,
modelGroups: p,
@@ -4274,7 +4548,7 @@ function Fi(e) {
audioFields: C,
seed: r.seed ?? null,
imageFields: w,
- inputFiles: D,
+ inputFiles: te,
isOverride: o,
overrideLabel: o ? "Gen Info Override" : "",
notesFields: T,
@@ -4283,7 +4557,7 @@ function Fi(e) {
}
//#endregion
//#region ui/vue/components/panel/sidebar/GenerationInputThumb.vue
-var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
+var Zi = ["title"], Qi = ["src"], $i = ["src"], ea = {
key: 2,
style: {
position: "absolute",
@@ -4299,7 +4573,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
overflow: "hidden",
"text-overflow": "ellipsis"
}
-}, Bi = {
+}, ta = {
key: 3,
title: "Video file",
style: {
@@ -4309,7 +4583,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
"font-size": "16px",
"pointer-events": "none"
}
-}, Vi = {
+}, na = {
__name: "GenerationInputThumb",
props: { inputFile: {
type: Object,
@@ -4338,7 +4612,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
function s(e) {
e?.stopPropagation?.();
let t = i();
- if (wi(t)) try {
+ if (Li(t)) try {
window.open(t, "_blank", "noopener,noreferrer");
} catch (e) {
console.debug?.(e);
@@ -4387,7 +4661,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
onError: a,
onMouseover: c,
onMouseout: l
- }, null, 40, Li)) : (M(), F("img", {
+ }, null, 40, Qi)) : (M(), F("img", {
key: 1,
src: i(),
style: {
@@ -4396,16 +4670,16 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
"object-fit": "cover"
},
onError: a
- }, null, 40, Ri)), e.inputFile.role && e.inputFile.role !== "secondary" ? (M(), F("div", zi, R(e.inputFile.roleLabel), 1)) : e.inputFile.isVideo ? (M(), F("div", Bi, " ▶ ")) : z("", !0)], 44, Ii));
+ }, null, 40, $i)), e.inputFile.role && e.inputFile.role !== "secondary" ? (M(), F("div", ea, R(e.inputFile.roleLabel), 1)) : e.inputFile.isVideo ? (M(), F("div", ta, " ▶ ")) : B("", !0)], 44, Zi));
}
-}, Hi = {
+}, ra = {
key: 0,
style: {
display: "flex",
"flex-direction": "column",
gap: "12px"
}
-}, Ui = {
+}, ia = {
key: 0,
style: {
display: "flex",
@@ -4420,40 +4694,77 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
fontSize: "11px",
color: "var(--fg-color, #ccc)"
}
-}, Wi = { style: {
+}, aa = { style: { opacity: "0.85" } }, oa = { style: {
display: "flex",
"align-items": "center",
gap: "8px",
"flex-wrap": "wrap",
"justify-content": "flex-end"
-} }, Gi = ["title"], Ki = ["title"], qi = { style: {
+} }, sa = ["title"], ca = ["title"], la = { style: {
display: "flex",
"align-items": "center",
"justify-content": "space-between",
gap: "10px"
-} }, Ji = { style: {
+} }, ua = { style: {
+ "font-size": "11px",
+ "font-weight": "700",
+ color: "#00BCD4",
+ "text-transform": "uppercase",
+ "letter-spacing": "0.6px"
+} }, da = { style: {
"font-size": "11px",
color: "var(--fg-color, rgba(255,255,255,0.9))",
"font-weight": "600"
-} }, Yi = { style: {
+} }, fa = { style: {
+ "font-size": "11px",
+ "font-weight": "600",
+ color: "#FF9800",
+ "text-transform": "uppercase",
+ "letter-spacing": "0.5px",
+ "margin-bottom": "8px"
+} }, pa = { 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"
-} }, Xi = { style: {
+} }, ma = { style: {
+ "font-size": "11px",
+ "font-weight": "600",
+ color: "#9E9E9E",
+ "text-transform": "uppercase",
+ "letter-spacing": "0.5px",
+ "margin-bottom": "8px"
+} }, ha = { 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"
+} }, ga = { style: {
"font-size": "11px",
"font-weight": "600",
color: "#4CAF50",
"text-transform": "uppercase",
"letter-spacing": "0.5px",
"margin-bottom": "10px"
-} }, Zi = { style: {
+} }, _a = { style: {
display: "flex",
"flex-wrap": "wrap",
gap: "6px",
"margin-bottom": "10px"
-} }, Qi = ["onClick"], $i = ["onClick"], ea = { style: {
+} }, va = { style: {
+ "font-size": "10px",
+ "font-weight": "700",
+ color: "#4CAF50",
+ "letter-spacing": "0.4px"
+} }, ya = ["onClick"], ba = { style: {
+ "font-size": "10px",
+ "font-weight": "700",
+ color: "#F44336",
+ "letter-spacing": "0.4px",
+ "margin-top": "4px"
+} }, xa = ["onClick"], Sa = { style: {
display: "flex",
"justify-content": "space-between",
"align-items": "center",
@@ -4463,7 +4774,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
"text-transform": "uppercase",
"letter-spacing": "0.5px",
"margin-bottom": "8px"
-} }, ta = { style: {
+} }, Ca = ["title"], wa = ["title"], Ta = { style: {
display: "flex",
"justify-content": "space-between",
"align-items": "center",
@@ -4473,17 +4784,26 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
"text-transform": "uppercase",
"letter-spacing": "0.5px",
"margin-bottom": "8px"
-} }, na = { style: {
+} }, Ea = ["title"], Da = ["title"], Oa = { 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"
+} }, ka = ["title"], Aa = { style: {
display: "flex",
"align-items": "center",
gap: "10px"
-} }, ra = { style: {
+} }, ja = { style: {
flex: "1",
height: "8px",
background: "rgba(255,255,255,0.1)",
"border-radius": "4px",
overflow: "hidden"
-} }, ia = {
+} }, Ma = {
key: 0,
style: {
"font-size": "10px",
@@ -4493,7 +4813,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
padding: "6px 8px",
background: "rgba(255,255,255,0.04)"
}
-}, aa = { style: {
+}, Na = { style: {
"font-size": "10px",
"font-weight": "600",
color: "rgba(0, 188, 212, 0.75)",
@@ -4504,96 +4824,149 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
"align-items": "center",
"justify-content": "space-between",
gap: "8px"
-} }, oa = { title: "AI caption generated by Florence-2" }, sa = { style: {
+} }, Pa = ["title"], Fa = { style: {
display: "flex",
"align-items": "center",
gap: "6px"
-} }, ca = ["title"], la = { style: {
+} }, Ia = ["title"], La = { 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"
+} }, Ra = { 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"
-} }, ua = { style: {
+} }, za = { style: {
+ "font-size": "11px",
+ "font-weight": "600",
+ color: "#FF9800",
+ "text-transform": "uppercase",
+ "letter-spacing": "0.5px",
+ "margin-bottom": "10px"
+} }, Ba = { style: {
display: "flex",
"flex-wrap": "wrap",
gap: "6px",
"margin-bottom": "10px"
-} }, da = { style: {
+} }, Va = { style: {
"font-size": "10px",
"font-weight": "600",
color: "rgba(255,255,255,0.6)",
"text-transform": "uppercase",
"letter-spacing": "0.4px"
-} }, fa = ["onClick"], pa = { style: {
+} }, Ha = ["onClick"], Ua = { style: {
+ "font-size": "11px",
+ "font-weight": "600",
+ color: "#9C27B0",
+ "text-transform": "uppercase",
+ "letter-spacing": "0.5px",
+ "margin-bottom": "10px"
+} }, Wa = { style: {
display: "grid",
"grid-template-columns": "repeat(auto-fit, minmax(220px, 1fr))",
gap: "10px"
-} }, ma = { style: {
+} }, Ga = { style: {
display: "flex",
"align-items": "center",
"justify-content": "space-between",
gap: "10px"
-} }, ha = { style: {
+} }, Ka = { style: {
display: "flex",
"flex-direction": "column",
gap: "4px"
-} }, ga = ["onClick"], _a = {
+} }, qa = ["onClick"], Ja = {
key: 0,
style: {
display: "flex",
"flex-direction": "column",
gap: "6px"
}
-}, va = { style: {
+}, Ya = { style: {
+ "font-size": "10px",
+ "font-weight": "700",
+ color: "rgba(255,255,255,0.58)",
+ "text-transform": "uppercase",
+ "letter-spacing": "0.4px"
+} }, Xa = { style: {
display: "flex",
"flex-direction": "column",
gap: "5px"
-} }, ya = ["onClick"], ba = { style: {
+} }, Za = ["onClick"], Qa = { style: {
display: "grid",
"grid-template-columns": "auto 1fr",
gap: "8px 12px",
"align-items": "start"
-} }, xa = ["title"], Sa = ["title", "onClick"], Ca = ["title", "onClick"], wa = ["title", "onClick"], Ta = ["title"], Ea = ["title"], Da = { style: {
+} }, $a = ["title"], eo = ["title"], to = ["title", "onClick"], no = { style: {
+ "font-size": "11px",
+ "font-weight": "600",
+ color: "#4CAF50",
+ "text-transform": "uppercase",
+ "letter-spacing": "0.5px",
+ "margin-bottom": "10px"
+} }, ro = ["title", "onClick"], io = ["title", "onClick"], ao = { 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"
+} }, oo = ["title"], so = { style: {
+ "font-size": "11px",
+ "font-weight": "700",
+ color: "#E91E63",
+ "text-transform": "uppercase",
+ "letter-spacing": "1px"
+} }, co = ["title"], lo = ["title"], uo = { style: {
display: "flex",
gap: "8px",
"flex-wrap": "wrap"
-} }, Oa = {
+} }, fo = {
__name: "SidebarGenerationSection",
props: { asset: {
type: Object,
required: !0
} },
setup(e) {
- let t = e, r = I(0), i = I(0), a = I(""), o = I("Copy"), s = I("Generate"), c = I(!1), l = I(d()), u = 0;
- function d() {
+ let t = e, n = I(0), r = I(0), i = I(""), a = I(k("action.copy", "Copy")), o = I(k("action.generate", "Generate")), s = I(!1), c = I(u()), l = 0;
+ function u() {
return {
scoreText: "...",
scoreColor: "#888",
- qualityText: "Loading",
+ qualityText: k("status.loading", "Loading"),
qualityColor: "#888",
qualityBackground: "rgba(127,127,127,0.3)",
fillWidth: "0%",
fillColor: "#666",
aiStatusVisible: !1,
- aiStatusText: "AI features are disabled (enable vector search env var)."
+ aiStatusText: k("sidebar.generation.aiDisabledEnv", "AI features are disabled (enable vector search env var).")
};
}
- function f(e, t) {
+ function d(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 } = {}) {
+ function f(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))",
+ background: t ? `linear-gradient(135deg, ${d(e, n)} 0%, ${d(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",
+ border: t ? `1px solid ${d(e, .45)}` : "1px solid var(--border-color, rgba(255,255,255,0.12))",
+ boxShadow: t ? `0 0 0 1px ${d(e, .15)} inset` : "none",
borderRadius: "6px",
padding: "12px"
};
}
- function m() {
+ function p() {
return {
background: "linear-gradient(135deg, rgba(233, 30, 99, 0.15) 0%, rgba(156, 39, 176, 0.15) 100%)",
border: "2px solid #E91E63",
@@ -4605,7 +4978,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
gap: "12px"
};
}
- function h() {
+ function m() {
return {
display: "inline-flex",
alignItems: "center",
@@ -4622,50 +4995,50 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
whiteSpace: "nowrap"
};
}
- let g = B(() => Fi(t.asset)), _ = B(() => yi()), v = B(() => g.value.kind === "full" || g.value.kind === "caption-only"), y = B(() => Si(a.value) || g.value.emptyCaptionText), b = B(() => _.value && g.value.isImageAsset && !!t.asset?.id), x = B(() => _.value && !!Si(y.value) && y.value !== g.value.emptyCaptionText), S = B(() => {
+ let h = V(() => Xi(t.asset)), g = V(() => Mi()), _ = V(() => h.value.kind === "full" || h.value.kind === "caption-only"), v = V(() => Fi(i.value) || h.value.emptyCaptionText), y = V(() => g.value && h.value.isImageAsset && !!t.asset?.id), b = V(() => g.value && !!Fi(v.value) && v.value !== h.value.emptyCaptionText), S = V(() => {
let e = [];
- return g.value.modelFields.length && e.push({
+ return h.value.modelFields.length && e.push({
key: "model",
- title: "Model & LoRA",
+ title: k("sidebar.generation.modelLora", "Model & LoRA"),
accent: "#9C27B0",
emphasis: !0,
- fields: g.value.modelFields
- }), !g.value.pipelineTabs.length && g.value.samplingFields.length && e.push({
+ fields: h.value.modelFields
+ }), !h.value.pipelineTabs.length && h.value.samplingFields.length && e.push({
key: "sampling",
- title: "Sampling",
+ title: k("sidebar.generation.sampling", "Sampling"),
accent: "#FF9800",
emphasis: !0,
- fields: g.value.samplingFields
- }), (g.value.ttsFields.length || g.value.workflowType.toLowerCase() === "tts") && e.push({
+ fields: h.value.samplingFields
+ }), (h.value.ttsFields.length || h.value.workflowType.toLowerCase() === "tts") && e.push({
key: "tts",
title: "TTS",
accent: "#26A69A",
emphasis: !0,
- fields: g.value.ttsFields
- }), g.value.ttsEngineFields.length && e.push({
+ fields: h.value.ttsFields
+ }), h.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({
+ fields: h.value.ttsEngineFields
+ }), h.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({
+ fields: h.value.ttsRuntimeFields
+ }), h.value.audioFields.length && e.push({
key: "audio",
- title: "Audio",
+ title: k("sidebar.generation.audio", "Audio"),
accent: "#00BCD4",
emphasis: !1,
- fields: g.value.audioFields
- }), g.value.imageFields.length && e.push({
+ fields: h.value.audioFields
+ }), h.value.imageFields.length && e.push({
key: "image",
- title: "Image",
+ title: k("sidebar.generation.image", "Image"),
accent: "#2196F3",
emphasis: !1,
- fields: g.value.imageFields
+ fields: h.value.imageFields
}), e;
});
function C(e, t, n = 450) {
@@ -4677,9 +5050,9 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
}
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`,
+ background: t ? `linear-gradient(135deg, ${d(e, .16)} 0%, ${d(e, .08)} 100%)` : "var(--comfy-menu-bg, rgba(0,0,0,0.3))",
+ border: `1px solid ${d(e, .42)}`,
+ boxShadow: `0 0 0 1px ${d(e, .14)} inset`,
borderRadius: "8px",
padding: "12px",
display: "flex",
@@ -4699,46 +5072,46 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
}
}
function ee() {
- l.value = {
+ c.value = {
scoreText: "AI OFF",
scoreColor: "#9E9E9E",
- qualityText: "Disabled",
+ qualityText: k("status.disabled", "Disabled"),
qualityColor: "#BDBDBD",
qualityBackground: "rgba(158,158,158,0.25)",
fillWidth: "0%",
fillColor: "#777",
aiStatusVisible: !0,
- aiStatusText: "AI features are disabled in settings."
+ aiStatusText: k("sidebar.generation.aiDisabledSettings", "AI features are disabled in settings.")
};
}
- function D() {
- l.value = d();
+ function te() {
+ c.value = u();
}
- async function te() {
- u += 1;
- let e = u;
- if (!g.value.showAlignment || !t.asset?.id) {
- D();
+ async function ne() {
+ l += 1;
+ let e = l;
+ if (!h.value.showAlignment || !t.asset?.id) {
+ te();
return;
}
- if (!_.value) {
+ if (!g.value) {
ee();
return;
}
- D();
+ te();
try {
- let n = await ye(t.asset.id);
- if (e !== u) return;
+ let n = await x(t.asset.id);
+ if (e !== l) return;
if (!n?.ok && (String(n?.code || "").toUpperCase() === "SERVICE_UNAVAILABLE" || /vector search is not enabled/i.test(String(n?.error || "")))) {
ee();
return;
}
let r = n?.ok && n.data != null ? Number(n.data) : null;
if (!Number.isFinite(r)) {
- l.value = {
+ c.value = {
scoreText: "N/A",
scoreColor: "#888",
- qualityText: "N/A",
+ qualityText: k("status.na", "N/A"),
qualityColor: "#888",
qualityBackground: "rgba(127,127,127,0.3)",
fillWidth: "0%",
@@ -4748,11 +5121,11 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
};
return;
}
- let i = Math.round(r * 100), a = bi(r);
- l.value = {
+ let i = Math.round(r * 100), a = Ni(r);
+ c.value = {
scoreText: `${i}%`,
scoreColor: a,
- qualityText: xi(r),
+ qualityText: Pi(r),
qualityColor: a,
qualityBackground: `${a}33`,
fillWidth: `${i}%`,
@@ -4761,11 +5134,11 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
aiStatusText: ""
};
} catch (t) {
- if (console.debug?.(t), e !== u) return;
- l.value = {
+ if (console.debug?.(t), e !== l) return;
+ c.value = {
scoreText: "-",
scoreColor: "#888",
- qualityText: "Unavailable",
+ qualityText: k("status.unavailable", "Unavailable"),
qualityColor: "#888",
qualityBackground: "rgba(127,127,127,0.3)",
fillWidth: "0%",
@@ -4776,41 +5149,41 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
}
}
async function re() {
- if (!(!b.value || c.value)) {
- c.value = !0, s.value = "Generating...";
+ if (!(!y.value || s.value)) {
+ s.value = !0, o.value = k("status.generating", "Generating...");
try {
- let e = await ne(t.asset.id);
- e?.ok && (a.value = String(e?.data || "").trim());
+ let e = await ce(t.asset.id);
+ e?.ok && (i.value = String(e?.data || "").trim());
} catch (e) {
console.debug?.(e);
} finally {
- c.value = !1, s.value = "Generate";
+ s.value = !1, o.value = k("action.generate", "Generate");
}
}
}
async function ie() {
- if (x.value) try {
- await navigator.clipboard.writeText(y.value), o.value = "Copied!", setTimeout(() => {
- o.value = "Copy";
+ if (b.value) try {
+ await navigator.clipboard.writeText(v.value), a.value = k("viewer.copySuccessShort", "Copied!"), setTimeout(() => {
+ a.value = k("action.copy", "Copy");
}, 900);
} catch (e) {
console.debug?.(e);
}
}
- return Ce(() => t.asset, () => {
- r.value = 0, i.value = 0, a.value = String(t.asset?.enhanced_caption || "").trim(), o.value = "Copy", s.value = "Generate";
- }, { immediate: !0 }), Ce(() => [
+ return we(() => 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 }), we(() => [
t.asset?.id,
- g.value.kind,
- g.value.showAlignment,
- _.value
+ h.value.kind,
+ h.value.showAlignment,
+ g.value
], () => {
- te();
+ ne();
}, { immediate: !0 }), (e, t) => {
- let a = Ze("MButton");
- return g.value.kind === "empty" ? z("", !0) : (M(), F("div", Hi, [
- g.value.workflowType ? (M(), F("div", Ui, [t[4] ||= P("span", { style: { opacity: "0.85" } }, "Workflow", -1), P("div", Wi, [P("span", {
- title: `Workflow engine: ${g.value.workflowType}`,
+ let i = Qe("MButton");
+ return h.value.kind === "empty" ? B("", !0) : (M(), F("div", ra, [
+ h.value.workflowType ? (M(), F("div", ia, [P("span", aa, R(z(k)("viewer.workflow", "Workflow")), 1), P("div", oa, [P("span", {
+ title: z(k)("sidebar.generation.workflowEngine", "Workflow engine: {value}", { value: h.value.workflowType }),
style: {
background: "#2196F3",
color: "white",
@@ -4820,9 +5193,9 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
"font-size": "10px",
"letter-spacing": "0.2px"
}
- }, R(g.value.workflowLabel || g.value.workflowType), 9, Gi), g.value.workflowBadge ? (M(), F("span", {
+ }, R(h.value.workflowLabel || h.value.workflowType), 9, sa), h.value.workflowBadge ? (M(), F("span", {
key: 0,
- title: `API provider: ${g.value.workflowBadge}`,
+ title: z(k)("sidebar.generation.apiProvider", "API provider: {value}", { value: h.value.workflowBadge }),
style: {
background: "rgba(255,255,255,0.08)",
color: "var(--fg-color, #eee)",
@@ -4833,67 +5206,41 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
"font-size": "10px",
"letter-spacing": "0.2px"
}
- }, R(g.value.workflowBadge), 9, Ki)) : z("", !0)])])) : z("", !0),
- g.value.isOverride ? (M(), F("div", {
+ }, R(h.value.workflowBadge), 9, ca)) : B("", !0)])])) : B("", !0),
+ h.value.isOverride ? (M(), F("div", {
key: 1,
- style: L(p("#00BCD4", {
+ style: L(f("#00BCD4", {
emphasis: !0,
startAlpha: .14,
endAlpha: .08
}))
- }, [P("div", qi, [t[5] ||= P("span", { style: {
- "font-size": "11px",
- "font-weight": "700",
- color: "#00BCD4",
- "text-transform": "uppercase",
- "letter-spacing": "0.6px"
- } }, " Override ", -1), P("span", Ji, R(g.value.overrideLabel), 1)])], 4)) : z("", !0),
- g.value.isTruncated ? (M(), F("div", {
+ }, [P("div", la, [P("span", ua, R(z(k)("sidebar.generation.override", "Override")), 1), P("span", da, R(h.value.overrideLabel), 1)])], 4)) : B("", !0),
+ h.value.isTruncated ? (M(), F("div", {
key: 2,
- style: L(p("#FF9800", {
+ style: L(f("#FF9800", {
emphasis: !0,
startAlpha: .12,
endAlpha: .08
}))
- }, [...t[6] ||= [P("div", { style: {
- "font-size": "11px",
- "font-weight": "600",
- color: "#FF9800",
- "text-transform": "uppercase",
- "letter-spacing": "0.5px",
- "margin-bottom": "8px"
- } }, " Metadata Truncated ", -1), P("div", { 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"
- } }, " Generation data is incomplete because it exceeded the size limit. ", -1)]], 4)) : z("", !0),
- g.value.kind === "media-only" ? (M(), F("div", {
+ }, [P("div", fa, R(z(k)("sidebar.generation.metadataTruncated", "Metadata Truncated")), 1), P("div", pa, R(z(k)("sidebar.generation.metadataTruncatedBody", "Generation data is incomplete because it exceeded the size limit.")), 1)], 4)) : B("", !0),
+ h.value.kind === "media-only" ? (M(), F("div", {
key: 3,
- style: L(p("#9E9E9E", {
+ style: L(f("#9E9E9E", {
emphasis: !0,
startAlpha: .1,
endAlpha: .06
}))
- }, [t[7] ||= P("div", { style: {
- "font-size": "11px",
- "font-weight": "600",
- color: "#9E9E9E",
- "text-transform": "uppercase",
- "letter-spacing": "0.5px",
- "margin-bottom": "8px"
- } }, " Generation Data ", -1), P("div", Yi, R(g.value.mediaOnlyMessage), 1)], 4)) : z("", !0),
- g.value.kind === "full" ? (M(), F(V, { key: 4 }, [g.value.promptTabs.length ? (M(), F("div", {
+ }, [P("div", ma, R(z(k)("sidebar.generation.generationData", "Generation Data")), 1), P("div", ha, R(h.value.mediaOnlyMessage), 1)], 4)) : B("", !0),
+ h.value.kind === "full" ? (M(), F(H, { key: 4 }, [h.value.promptTabs.length ? (M(), F("div", {
key: 0,
- style: L(p("#4CAF50", {
+ style: L(f("#4CAF50", {
emphasis: !0,
startAlpha: .16,
endAlpha: .1
}))
}, [
- P("div", Xi, " Prompt Pipeline (" + R(g.value.promptTabs.length) + " variants) ", 1),
- P("div", Zi, [(M(!0), F(V, null, N(g.value.promptTabs, (e, t) => (M(), we(a, {
+ P("div", ga, R(z(k)("sidebar.generation.promptPipeline", "Prompt Pipeline ({count} variants)", { count: h.value.promptTabs.length })), 1),
+ P("div", _a, [(M(!0), F(H, null, N(h.value.promptTabs, (e, t) => (M(), Te(i, {
key: e.label,
type: "button",
severity: "secondary",
@@ -4901,22 +5248,22 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
rounded: "",
style: L({
appearance: "none",
- border: r.value === t ? "1px solid #4CAF50" : "1px solid var(--border-color, rgba(255,255,255,0.12))",
+ border: n.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)",
+ 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: r.value === t ? "700" : "500",
- boxShadow: r.value === t ? "0 0 0 1px #4CAF5055 inset" : "none"
+ fontWeight: n.value === t ? "700" : "500",
+ boxShadow: n.value === t ? "0 0 0 1px #4CAF5055 inset" : "none"
}),
- onClick: (e) => r.value = t
+ onClick: (e) => n.value = t
}, {
- default: De(() => [Ee(R(e.label), 1)]),
+ default: Oe(() => [De(R(e.label), 1)]),
_: 2
}, 1032, ["style", "onClick"]))), 128))]),
- (M(!0), F(V, null, N(g.value.promptTabs, (e, n) => Ae((M(), F("div", {
+ (M(!0), F(H, null, N(h.value.promptTabs, (e, t) => je((M(), F("div", {
key: `${e.label}-panel`,
style: {
display: "flex",
@@ -4929,12 +5276,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
padding: "10px"
}
}, [
- t[9] ||= P("div", { style: {
- "font-size": "10px",
- "font-weight": "700",
- color: "#4CAF50",
- "letter-spacing": "0.4px"
- } }, " POSITIVE ", -1),
+ P("div", va, R(z(k)("sidebar.generation.positive", "POSITIVE")), 1),
P("div", {
style: {
"font-size": "12px",
@@ -4944,14 +5286,8 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
cursor: "pointer"
},
onClick: (t) => E(e.positive, t.currentTarget)
- }, R(e.positive), 9, Qi),
- e.negative ? (M(), F(V, { key: 0 }, [t[8] ||= P("div", { style: {
- "font-size": "10px",
- "font-weight": "700",
- color: "#F44336",
- "letter-spacing": "0.4px",
- "margin-top": "4px"
- } }, " NEGATIVE ", -1), P("div", {
+ }, R(e.positive), 9, ya),
+ e.negative ? (M(), F(H, { key: 0 }, [P("div", ba, R(z(k)("sidebar.generation.negative", "NEGATIVE")), 1), P("div", {
style: {
"font-size": "12px",
color: "var(--fg-color, #ddd)",
@@ -4960,21 +5296,21 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
cursor: "pointer"
},
onClick: (t) => E(e.negative, t.currentTarget)
- }, R(e.negative), 9, $i)], 64)) : z("", !0)
- ])), [[je, r.value === n]])), 128))
- ], 4)) : g.value.positivePrompt ? (M(), F("div", {
+ }, R(e.negative), 9, xa)], 64)) : B("", !0)
+ ])), [[Ne, n.value === t]])), 128))
+ ], 4)) : h.value.positivePrompt ? (M(), F("div", {
key: 1,
- style: L(p("#4CAF50", {
+ style: L(f("#4CAF50", {
emphasis: !0,
startAlpha: .16,
endAlpha: .1
}))
- }, [P("div", ea, [t[10] ||= P("span", null, "Positive Prompt", -1), g.value.positivePromptOverride ? (M(), F("span", {
+ }, [P("div", Sa, [P("span", null, R(z(k)("sidebar.generation.positivePrompt", "Positive Prompt")), 1), h.value.positivePromptOverride ? (M(), F("span", {
key: 0,
- style: L(h()),
- title: "This field was forced by Majoor Gen Info Override"
- }, " override ", 4)) : z("", !0)]), P("div", {
- title: "Click to copy",
+ style: L(m()),
+ title: z(k)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override")
+ }, R(z(k)("sidebar.generation.override", "override")), 13, Ca)) : B("", !0)]), P("div", {
+ title: z(k)("action.clickToCopy", "Click to copy"),
style: {
"font-size": "12px",
color: "var(--fg-color, rgba(255,255,255,0.9))",
@@ -4983,20 +5319,20 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
"word-break": "break-word",
cursor: "pointer"
},
- onClick: t[0] ||= (e) => E(g.value.positivePrompt, e.currentTarget)
- }, R(g.value.positivePrompt), 1)], 4)) : z("", !0), !g.value.promptTabs.length && g.value.negativePrompt ? (M(), F("div", {
+ onClick: t[0] ||= (e) => E(h.value.positivePrompt, e.currentTarget)
+ }, R(h.value.positivePrompt), 9, wa)], 4)) : B("", !0), !h.value.promptTabs.length && h.value.negativePrompt ? (M(), F("div", {
key: 2,
- style: L(p("#F44336", {
+ style: L(f("#F44336", {
emphasis: !0,
startAlpha: .16,
endAlpha: .1
}))
- }, [P("div", ta, [t[11] ||= P("span", null, "Negative Prompt", -1), g.value.negativePromptOverride ? (M(), F("span", {
+ }, [P("div", Ta, [P("span", null, R(z(k)("sidebar.generation.negativePrompt", "Negative Prompt")), 1), h.value.negativePromptOverride ? (M(), F("span", {
key: 0,
- style: L(h()),
- title: "This field was forced by Majoor Gen Info Override"
- }, " override ", 4)) : z("", !0)]), P("div", {
- title: "Click to copy",
+ style: L(m()),
+ title: z(k)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override")
+ }, R(z(k)("sidebar.generation.override", "override")), 13, Ea)) : B("", !0)]), P("div", {
+ title: z(k)("action.clickToCopy", "Click to copy"),
style: {
"font-size": "12px",
color: "var(--fg-color, rgba(255,255,255,0.9))",
@@ -5005,9 +5341,9 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
"word-break": "break-word",
cursor: "pointer"
},
- onClick: t[1] ||= (e) => E(g.value.negativePrompt, e.currentTarget)
- }, R(g.value.negativePrompt), 1)], 4)) : z("", !0)], 64)) : z("", !0),
- v.value ? (M(), F("div", {
+ onClick: t[1] ||= (e) => E(h.value.negativePrompt, e.currentTarget)
+ }, R(h.value.negativePrompt), 9, Da)], 4)) : B("", !0)], 64)) : B("", !0),
+ _.value ? (M(), F("div", {
key: 5,
style: {
background: "linear-gradient(135deg, rgba(0, 188, 212, 0.14) 0%, rgba(33, 150, 243, 0.10) 100%)",
@@ -5018,54 +5354,68 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
"flex-direction": "column",
gap: "10px"
},
- class: ze({ "mjr-ai-disabled-block": !_.value })
+ class: Ve({ "mjr-ai-disabled-block": !g.value })
}, [
- g.value.showAlignment ? (M(), F(V, { key: 0 }, [
- t[12] ||= P("div", { 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"
- } }, [P("span", { title: "How closely the generated image matches the prompt (SigLIP2 score)" }, " Prompt Alignment ")], -1),
- P("div", na, [
- P("div", ra, [P("div", { style: L({
+ h.value.showAlignment ? (M(), F(H, { key: 0 }, [
+ P("div", Oa, [P("span", { title: z(k)("sidebar.generation.promptAlignmentTooltip", "How closely the generated image matches the prompt (SigLIP2 score)") }, R(z(k)("sidebar.generation.promptAlignment", "Prompt Alignment")), 9, ka)]),
+ P("div", Aa, [
+ P("div", ja, [P("div", { style: L({
height: "100%",
- width: l.value.fillWidth,
- background: l.value.fillColor,
+ width: c.value.fillWidth,
+ background: c.value.fillColor,
borderRadius: "4px",
transition: "width 0.6s ease, background 0.4s ease"
}) }, null, 4)]),
P("span", { style: L({
fontSize: "13px",
fontWeight: "700",
- color: l.value.scoreColor,
+ color: c.value.scoreColor,
minWidth: "60px",
textAlign: "right",
fontFamily: "'Consolas', 'Monaco', monospace"
- }) }, R(l.value.scoreText), 5),
+ }) }, R(c.value.scoreText), 5),
P("span", { style: L({
fontSize: "9px",
fontWeight: "700",
padding: "2px 6px",
borderRadius: "3px",
- background: l.value.qualityBackground,
- color: l.value.qualityColor,
+ background: c.value.qualityBackground,
+ color: c.value.qualityColor,
textTransform: "uppercase",
letterSpacing: "0.5px"
- }) }, R(l.value.qualityText), 5)
+ }) }, R(c.value.qualityText), 5)
]),
- l.value.aiStatusVisible ? (M(), F("div", ia, R(l.value.aiStatusText), 1)) : z("", !0)
- ], 64)) : z("", !0),
- P("div", aa, [P("span", oa, R(g.value.captionLabel), 1), P("div", sa, [Te(a, {
+ c.value.aiStatusVisible ? (M(), F("div", Ma, R(c.value.aiStatusText), 1)) : B("", !0)
+ ], 64)) : B("", !0),
+ P("div", Na, [P("span", { title: z(k)("sidebar.generation.aiCaptionTooltip", "AI caption generated by Florence-2") }, R(h.value.captionLabel), 9, Pa), P("div", Fa, [Ee(i, {
type: "button",
class: "mjr-ai-control",
severity: "secondary",
text: "",
- disabled: !b.value || c.value,
+ disabled: !y.value || s.value,
+ style: L([{
+ 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: y.value ? "1" : "0.6",
+ cursor: y.value ? "pointer" : "default"
+ }]),
+ onClick: Ze(re, ["stop"])
+ }, {
+ default: Oe(() => [De(R(o.value), 1)]),
+ _: 1
+ }, 8, ["disabled", "style"]), Ee(i, {
+ type: "button",
+ class: "mjr-ai-control",
+ severity: "secondary",
+ text: "",
+ disabled: !b.value,
style: L([{
border: "1px solid rgba(0,188,212,0.45)",
background: "rgba(0,188,212,0.12)",
@@ -5079,36 +5429,13 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
opacity: b.value ? "1" : "0.6",
cursor: b.value ? "pointer" : "default"
}]),
- onClick: Xe(re, ["stop"])
+ onClick: Ze(ie, ["stop"])
}, {
- default: De(() => [Ee(R(s.value), 1)]),
- _: 1
- }, 8, ["disabled", "style"]), Te(a, {
- type: "button",
- class: "mjr-ai-control",
- severity: "secondary",
- text: "",
- disabled: !x.value,
- style: L([{
- 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: Xe(ie, ["stop"])
- }, {
- default: De(() => [Ee(R(o.value), 1)]),
+ default: Oe(() => [De(R(a.value), 1)]),
_: 1
}, 8, ["disabled", "style"])])]),
P("div", {
- title: _.value ? "Click to copy caption" : "AI caption controls are disabled",
+ title: g.value ? z(k)("sidebar.generation.copyCaptionTooltip", "Click to copy caption") : z(k)("sidebar.generation.aiCaptionDisabled", "AI caption controls are disabled"),
style: L({
marginTop: "4px",
padding: "8px",
@@ -5120,42 +5447,25 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
lineHeight: "1.45",
whiteSpace: "pre-wrap",
wordBreak: "break-word",
- cursor: x.value ? "copy" : "default"
+ cursor: b.value ? "copy" : "default"
}),
onClick: ie
- }, R(y.value), 13, ca)
- ], 2)) : z("", !0),
- g.value.lyrics ? (M(), F("div", {
+ }, R(v.value), 13, Ia)
+ ], 2)) : B("", !0),
+ h.value.lyrics ? (M(), F("div", {
key: 6,
- style: L(p("#00BCD4", { emphasis: !1 }))
- }, [t[13] ||= P("div", { 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"
- } }, [P("span", null, "Lyrics")], -1), P("div", la, R(g.value.lyrics), 1)], 4)) : z("", !0),
- g.value.pipelineTabs.length ? (M(), F("div", {
+ style: L(f("#00BCD4", { emphasis: !1 }))
+ }, [P("div", La, [P("span", null, R(z(k)("sidebar.generation.lyrics", "Lyrics")), 1)]), P("div", Ra, R(h.value.lyrics), 1)], 4)) : B("", !0),
+ h.value.pipelineTabs.length ? (M(), F("div", {
key: 7,
- style: L(p("#FF9800", {
+ style: L(f("#FF9800", {
emphasis: !0,
startAlpha: .16,
endAlpha: .1
}))
}, [
- t[14] ||= P("div", { style: {
- "font-size": "11px",
- "font-weight": "600",
- color: "#FF9800",
- "text-transform": "uppercase",
- "letter-spacing": "0.5px",
- "margin-bottom": "10px"
- } }, " Generation Pipeline ", -1),
- P("div", ua, [(M(!0), F(V, null, N(g.value.pipelineTabs, (e, t) => (M(), we(a, {
+ P("div", za, R(z(k)("sidebar.generation.pipeline", "Generation Pipeline")), 1),
+ P("div", Ba, [(M(!0), F(H, null, N(h.value.pipelineTabs, (e, t) => (M(), Te(i, {
key: e.label,
type: "button",
severity: "secondary",
@@ -5163,22 +5473,22 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
rounded: "",
style: L({
appearance: "none",
- border: i.value === t ? "1px solid #FF9800" : "1px solid var(--border-color, rgba(255,255,255,0.12))",
+ border: r.value === t ? "1px solid #FF9800" : "1px solid var(--border-color, rgba(255,255,255,0.12))",
borderRadius: "999px",
- background: i.value === t ? "#FF980033" : "rgba(127,127,127,0.12)",
- color: i.value === t ? "#FF9800" : "var(--fg-color, #ddd)",
+ background: r.value === t ? "#FF980033" : "rgba(127,127,127,0.12)",
+ color: r.value === t ? "#FF9800" : "var(--fg-color, #ddd)",
fontSize: "11px",
padding: "4px 10px",
cursor: "pointer",
- fontWeight: i.value === t ? "700" : "500",
- boxShadow: i.value === t ? "0 0 0 1px #FF980055 inset" : "none"
+ fontWeight: r.value === t ? "700" : "500",
+ boxShadow: r.value === t ? "0 0 0 1px #FF980055 inset" : "none"
}),
- onClick: (e) => i.value = t
+ onClick: (e) => r.value = t
}, {
- default: De(() => [Ee(R(e.label), 1)]),
+ default: Oe(() => [De(R(e.label), 1)]),
_: 2
}, 1032, ["style", "onClick"]))), 128))]),
- (M(!0), F(V, null, N(g.value.pipelineTabs, (e, t) => Ae((M(), F("div", {
+ (M(!0), F(H, null, N(h.value.pipelineTabs, (e, t) => je((M(), F("div", {
key: `${e.label}-pipeline`,
style: {
display: "grid",
@@ -5190,7 +5500,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
background: "linear-gradient(135deg, rgba(255, 152, 0, 0.12) 0%, rgba(255, 193, 7, 0.08) 100%)",
"box-shadow": "0 0 0 1px rgba(255, 152, 0, 0.12) inset"
}
- }, [(M(!0), F(V, null, N(e.fields, (t) => (M(), F("div", {
+ }, [(M(!0), F(H, null, N(e.fields, (t) => (M(), F("div", {
key: `${e.label}-${t.label}`,
style: {
display: "flex",
@@ -5198,7 +5508,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
gap: "2px",
"min-width": "0"
}
- }, [P("span", da, R(t.label), 1), P("span", {
+ }, [P("span", Va, R(t.label), 1), P("span", {
style: {
"font-size": "12px",
color: "var(--fg-color, #ddd)",
@@ -5209,27 +5519,20 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
cursor: "copy"
},
onClick: (e) => E(t.value, e.currentTarget)
- }, R(t.value), 9, fa)]))), 128))])), [[je, i.value === t]])), 128))
- ], 4)) : z("", !0),
- g.value.modelGroups.length ? (M(), F("div", {
+ }, R(t.value), 9, Ha)]))), 128))])), [[Ne, r.value === t]])), 128))
+ ], 4)) : B("", !0),
+ h.value.modelGroups.length ? (M(), F("div", {
key: 8,
- style: L(p("#9C27B0", {
+ style: L(f("#9C27B0", {
emphasis: !0,
startAlpha: .18,
endAlpha: .1
}))
- }, [t[17] ||= P("div", { style: {
- "font-size": "11px",
- "font-weight": "600",
- color: "#9C27B0",
- "text-transform": "uppercase",
- "letter-spacing": "0.5px",
- "margin-bottom": "10px"
- } }, " Model Branches ", -1), P("div", pa, [(M(!0), F(V, null, N(g.value.modelGroups, (e) => (M(), F("div", {
+ }, [P("div", Ua, R(z(k)("sidebar.generation.modelBranches", "Model Branches")), 1), P("div", Wa, [(M(!0), F(H, null, N(h.value.modelGroups, (e) => (M(), F("div", {
key: `model-group-${e.key}`,
style: L(w(T(e.key), !0))
}, [
- P("div", ma, [P("div", { style: L({
+ P("div", Ga, [P("div", { style: L({
fontSize: "10px",
fontWeight: "800",
color: T(e.key),
@@ -5239,14 +5542,14 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
fontSize: "9px",
fontWeight: "700",
color: "#fff",
- background: f(T(e.key), .22),
- border: `1px solid ${f(T(e.key), .48)}`,
+ background: d(T(e.key), .22),
+ border: `1px solid ${d(T(e.key), .48)}`,
borderRadius: "999px",
padding: "2px 8px",
letterSpacing: "0.4px",
textTransform: "uppercase"
}) }, R(e.loras?.length || 0) + " LoRA ", 5)]),
- P("div", ha, [t[15] ||= P("div", { style: {
+ P("div", Ka, [t[4] ||= P("div", { style: {
"font-size": "10px",
"font-weight": "700",
color: "rgba(255,255,255,0.58)",
@@ -5261,14 +5564,8 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
cursor: "pointer"
},
onClick: (t) => E(e.model, t.currentTarget)
- }, R(e.model || "-"), 9, ga)]),
- e.loras?.length ? (M(), F("div", _a, [t[16] ||= P("div", { style: {
- "font-size": "10px",
- "font-weight": "700",
- color: "rgba(255,255,255,0.58)",
- "text-transform": "uppercase",
- "letter-spacing": "0.4px"
- } }, " LoRA Stack ", -1), P("div", va, [(M(!0), F(V, null, N(e.loras, (t, n) => (M(), F("div", {
+ }, R(e.model || "-"), 9, qa)]),
+ e.loras?.length ? (M(), F("div", Ja, [P("div", Ya, R(z(k)("sidebar.generation.loraStack", "LoRA Stack")), 1), P("div", Xa, [(M(!0), F(H, null, N(e.loras, (t, n) => (M(), F("div", {
key: `${e.key}-lora-${n}`,
style: {
"font-size": "12px",
@@ -5282,11 +5579,11 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
cursor: "pointer"
},
onClick: (e) => E(t, e.currentTarget)
- }, R(t), 9, ya))), 128))])])) : z("", !0)
- ], 4))), 128))])], 4)) : z("", !0),
- (M(!0), F(V, null, N(S.value, (e) => (M(), F("div", {
+ }, R(t), 9, Za))), 128))])])) : B("", !0)
+ ], 4))), 128))])], 4)) : B("", !0),
+ (M(!0), F(H, null, N(S.value, (e) => (M(), F("div", {
key: e.key,
- style: L(p(e.accent, { emphasis: e.emphasis }))
+ style: L(f(e.accent, { emphasis: e.emphasis }))
}, [P("div", { style: L({
fontSize: "11px",
fontWeight: "600",
@@ -5294,7 +5591,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
textTransform: "uppercase",
letterSpacing: "0.5px",
marginBottom: "10px"
- }) }, R(e.title), 5), P("div", ba, [(M(!0), F(V, null, N(e.fields, (t) => (M(), F(V, { key: `${e.key}-${t.label}` }, [P("div", {
+ }) }, R(e.title), 5), P("div", Qa, [(M(!0), F(H, null, N(e.fields, (t) => (M(), F(H, { key: `${e.key}-${t.label}` }, [P("div", {
title: t.label,
style: {
"font-size": "11px",
@@ -5306,9 +5603,9 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
}
}, [P("span", null, R(t.label) + ":", 1), t.override ? (M(), F("span", {
key: 0,
- style: L(h()),
- title: "This field was forced by Majoor Gen Info Override"
- }, " override ", 4)) : z("", !0)], 8, xa), P("div", {
+ style: L(m()),
+ title: z(k)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override")
+ }, R(z(k)("sidebar.generation.override", "override")), 13, eo)) : B("", !0)], 8, $a), P("div", {
title: `${t.label}: ${t.value}`,
style: {
"font-size": "12px",
@@ -5318,18 +5615,11 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
cursor: "pointer"
},
onClick: (e) => E(t.value, e.currentTarget)
- }, R(t.value), 9, Sa)], 64))), 128))])], 4))), 128)),
- g.value.notesFields.length ? (M(), F("div", {
+ }, R(t.value), 9, to)], 64))), 128))])], 4))), 128)),
+ h.value.notesFields.length ? (M(), F("div", {
key: 9,
- style: L(p("#4CAF50", { emphasis: !1 }))
- }, [t[18] ||= P("div", { style: {
- "font-size": "11px",
- "font-weight": "600",
- color: "#4CAF50",
- "text-transform": "uppercase",
- "letter-spacing": "0.5px",
- "margin-bottom": "10px"
- } }, " Notes ", -1), (M(!0), F(V, null, N(g.value.notesFields, (e) => (M(), F("div", {
+ style: L(f("#4CAF50", { emphasis: !1 }))
+ }, [P("div", no, R(z(k)("sidebar.generation.notes", "Notes")), 1), (M(!0), F(H, null, N(h.value.notesFields, (e) => (M(), F("div", {
key: e.label,
title: `${e.label}: ${e.value}`,
style: {
@@ -5341,10 +5631,10 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
cursor: "pointer"
},
onClick: (t) => E(e.value, t.currentTarget)
- }, R(e.value), 9, Ca))), 128))], 4)) : z("", !0),
- (M(!0), F(V, null, N(g.value.customInfoBlocks, (e) => (M(), F("div", {
+ }, R(e.value), 9, ro))), 128))], 4)) : B("", !0),
+ (M(!0), F(H, null, N(h.value.customInfoBlocks, (e) => (M(), F("div", {
key: `${e.title}-${e.content}`,
- style: L(p(e.color, { emphasis: !1 }))
+ style: L(f(e.color, { emphasis: !1 }))
}, [P("div", { style: L({
fontSize: "11px",
fontWeight: "600",
@@ -5363,22 +5653,12 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
cursor: "pointer"
},
onClick: (t) => E(e.content, t.currentTarget)
- }, R(e.content), 9, wa)], 4))), 128)),
- g.value.ttsInstruction ? (M(), F("div", {
+ }, R(e.content), 9, io)], 4))), 128)),
+ h.value.ttsInstruction ? (M(), F("div", {
key: 10,
- style: L(p("#26A69A", { emphasis: !1 }))
- }, [t[19] ||= P("div", { 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"
- } }, [P("span", null, "TTS Instruction")], -1), P("div", {
- title: "Click to copy",
+ style: L(f("#26A69A", { emphasis: !1 }))
+ }, [P("div", ao, [P("span", null, R(z(k)("sidebar.generation.ttsInstruction", "TTS Instruction")), 1)]), P("div", {
+ title: z(k)("action.clickToCopy", "Click to copy"),
style: {
"font-size": "12px",
color: "var(--fg-color, rgba(255,255,255,0.9))",
@@ -5387,19 +5667,13 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
"word-break": "break-word",
cursor: "pointer"
},
- onClick: t[2] ||= (e) => E(g.value.ttsInstruction, e.currentTarget)
- }, R(g.value.ttsInstruction), 1)], 4)) : z("", !0),
- g.value.seed !== null && g.value.seed !== void 0 && g.value.seed !== "" ? (M(), F("div", {
+ onClick: t[2] ||= (e) => E(h.value.ttsInstruction, e.currentTarget)
+ }, R(h.value.ttsInstruction), 9, oo)], 4)) : B("", !0),
+ h.value.seed !== null && h.value.seed !== void 0 && h.value.seed !== "" ? (M(), F("div", {
key: 11,
- style: L(m())
- }, [t[20] ||= P("div", { style: {
- "font-size": "11px",
- "font-weight": "700",
- color: "#E91E63",
- "text-transform": "uppercase",
- "letter-spacing": "1px"
- } }, " SEED ", -1), P("div", {
- title: `Click to copy seed: ${g.value.seed}`,
+ style: L(p())
+ }, [P("div", so, R(z(k)("sidebar.generation.seed", "SEED")), 1), P("div", {
+ title: z(k)("sidebar.generation.copySeedTooltip", "Click to copy seed: {seed}", { seed: h.value.seed }),
style: {
"font-size": "18px",
"font-weight": "700",
@@ -5411,17 +5685,17 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
"border-radius": "4px",
transition: "background 0.2s"
},
- onClick: t[3] ||= (e) => E(g.value.seed, e.currentTarget, "rgba(76, 175, 80, 0.4)")
- }, R(g.value.seed), 9, Ta)], 4)) : z("", !0),
- g.value.inputFiles.length ? (M(), F("div", {
+ onClick: t[3] ||= (e) => E(h.value.seed, e.currentTarget, "rgba(76, 175, 80, 0.4)")
+ }, R(h.value.seed), 9, co)], 4)) : B("", !0),
+ h.value.inputFiles.length ? (M(), F("div", {
key: 12,
- style: L(p("#4CAF50", {
+ style: L(f("#4CAF50", {
emphasis: !0,
startAlpha: .16,
endAlpha: .1
}))
}, [P("div", {
- title: Ke(n)("tooltip.generationInputs", "Input files used in generation"),
+ title: z(k)("tooltip.generationInputs", "Input files used in generation"),
style: {
"font-size": "11px",
"font-weight": "600",
@@ -5430,42 +5704,42 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = {
"letter-spacing": "0.5px",
"margin-bottom": "8px"
}
- }, " Source Files ", 8, Ea), P("div", Da, [(M(!0), F(V, null, N(g.value.inputFiles, (e) => (M(), we(Vi, {
+ }, R(z(k)("sidebar.generation.sourceFiles", "Source Files")), 9, lo), P("div", uo, [(M(!0), F(H, null, N(h.value.inputFiles, (e) => (M(), Te(na, {
key: e.id,
"input-file": e
- }, null, 8, ["input-file"]))), 128))])], 4)) : z("", !0)
+ }, null, 8, ["input-file"]))), 128))])], 4)) : B("", !0)
]));
};
}
-}, ka = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, Aa = /^[0-9a-f]{20,}$/i;
-function ja(...e) {
+}, po = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, mo = /^[0-9a-f]{20,}$/i;
+function ho(...e) {
for (let t of e) {
let e = String(t || "").trim();
if (e) return e;
}
return "";
}
-function Ma(e) {
+function go(e) {
let t = String(e || "").trim();
- return !!t && (ka.test(t) || Aa.test(t));
+ return !!t && (po.test(t) || mo.test(t));
}
-function Na(e) {
+function _o(e) {
return String(e?.type || e?.class_type || e?.comfyClass || e?.classType || "").trim();
}
-function Pa(e) {
- return ja(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 vo(e) {
+ return ho(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 Fa(e) {
- let t = Na(e), n = Pa(e);
- return n && (!t || Ma(t) || n !== t) ? n : t && !Ma(t) ? t : n || (t ? "Subgraph" : String(e?.id || "Node").trim() || "Node");
+function yo(e) {
+ let t = _o(e), n = vo(e);
+ return n && (!t || go(t) || n !== t) ? n : t && !go(t) ? t : n || (t ? "Subgraph" : String(e?.id || "Node").trim() || "Node");
}
-function Ia(e) {
- let t = Na(e);
- return t && !Ma(t) ? t : t ? "Subgraph" : "Node";
+function bo(e) {
+ let t = _o(e);
+ return t && !go(t) ? t : t ? "Subgraph" : "Node";
}
//#endregion
//#region ui/components/sidebar/utils/minimap.ts
-var La = 6, Ra = 1, za = 8, Ba = 74, Va = 42, Ha = [
+var xo = 6, So = 1, Co = 8, wo = 74, To = 42, Eo = [
["sampler", "#8e5cff"],
["ksampler", "#8e5cff"],
["loader", "#4f8cff"],
@@ -5482,20 +5756,20 @@ var La = 6, Ra = 1, za = 8, Ba = 74, Va = 42, Ha = [
["save", "#4aa37c"],
["preview", "#4aa37c"],
["api", "#3aa6a6"]
-], Ua = (e, t, n) => {
+], Do = (e, t, n) => {
let r = Number(e);
return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t;
-}, Wa = (e, t = !1) => {
+}, Oo = (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)";
-}, Ga = (e, t, n) => {
+}, ko = (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 Ka(e, t, n = null) {
+function Ao(e, t, n = null) {
if (!e) return;
let r = e.getContext?.("2d");
if (!r) return;
@@ -5507,8 +5781,9 @@ function Ka(e, t, n = null) {
renderErrorState: !0,
showViewport: !0,
showNodeLabels: !1,
+ expandSubgraphs: !0,
...n && typeof n == "object" ? n : {}
- }, a = qa(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);
+ }, a = i.expandSubgraphs === !1 ? t : jo(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})`;
@@ -5545,7 +5820,7 @@ function Ka(e, t, n = null) {
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 Ha) if (n.includes(e)) return t;
+ for (let [e, t] of Eo) 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%)`;
@@ -5554,7 +5829,7 @@ function Ka(e, t, n = 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 && to(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());
+ 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 && zo(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]);
@@ -5597,7 +5872,7 @@ function Ka(e, t, n = null) {
outputs: C,
inputCount: S.length || (e?.inputs && typeof e.inputs == "object" ? Object.keys(e.inputs).length : 0),
outputCount: C.length,
- label: Fa(e).replace(/\s+/g, " ").trim()
+ label: yo(e).replace(/\s+/g, " ").trim()
}), n && h.set(n, m[m.length - 1]);
}
if (i.showGroups) for (let e of s || []) {
@@ -5617,21 +5892,21 @@ function Ka(e, t, n = 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), w = v + S / 2, T = y + C / 2, E = i.view && typeof i.view == "object" ? i.view : Object.create(null), ee = Ua(E.zoom ?? 1, Ra, za), D = Math.max(1, S / ee), te = Math.max(1, C / ee), ne = D / 2, re = te / 2, ie = D >= S ? w : Ua(E.centerX ?? w, v + ne, b - ne), ae = te >= C ? T : Ua(E.centerY ?? T, y + re, x - re), oe = ie - ne, se = ae - re, O = La, k = Math.min((l - O * 2) / D, (u - O * 2) / te), le = E.hoveredNodeId !== null && E.hoveredNodeId !== void 0 ? String(E.hoveredNodeId) : null;
+ let S = Math.max(1, b - v), C = Math.max(1, x - y), w = v + S / 2, T = y + C / 2, E = i.view && typeof i.view == "object" ? i.view : Object.create(null), ee = Do(E.zoom ?? 1, So, Co), te = Math.max(1, S / ee), ne = Math.max(1, C / ee), re = te / 2, ie = ne / 2, ae = te >= S ? w : Do(E.centerX ?? w, v + re, b - re), oe = ne >= C ? T : Do(E.centerY ?? T, y + ie, x - ie), se = ae - re, ce = oe - ie, D = xo, O = Math.min((l - D * 2) / te, (u - D * 2) / ne), le = E.hoveredNodeId !== null && E.hoveredNodeId !== void 0 ? String(E.hoveredNodeId) : null;
r.clearRect(0, 0, l, u), r.fillStyle = "rgba(0,0,0,0.22)", r.fillRect(0, 0, l, u);
let ue = (e, t) => ({
- x: O + (e - oe) * k,
- y: O + (t - se) * k
+ x: D + (e - se) * O,
+ y: D + (t - ce) * O
}), de = (e, t) => ({
- x: Ua(oe + (Number(e) - O) / k, v, b),
- y: Ua(se + (Number(t) - O) / k, y, x)
+ x: Do(se + (Number(e) - D) / O, v, b),
+ y: Do(ce + (Number(t) - D) / O, y, x)
}), fe = (e) => ({
- x: O + (e.x - oe) * k,
- y: O + (e.y - se) * k,
- w: Math.max(1, e.w * k),
- h: Math.max(1, e.h * k)
+ x: D + (e.x - se) * O,
+ y: D + (e.y - ce) * O,
+ w: Math.max(1, e.w * O),
+ h: Math.max(1, e.h * O)
}), 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 = Ua(t, 0, Math.max(0, o - 1));
+ 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 = Do(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],
@@ -5645,10 +5920,10 @@ function Ka(e, t, n = null) {
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) => {
+ } : null, k = (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 = () => {
+ }, ge = () => {
if (i.showLinks && !(!c || c.length === 0)) {
r.save(), r.globalAlpha = 1, r.lineWidth = 1;
for (let e of c) {
@@ -5663,12 +5938,12 @@ function Ka(e, t, n = null) {
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.strokeStyle = k(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 >= Ba && o >= Va, _ = Math.max(2, Math.min(g ? 7 : 8, Math.floor(Math.min(a, o) * .08))), v = s ? pe(o) : 0;
+ }, A = (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 >= wo && o >= To, _ = 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, [
_,
_,
@@ -5689,11 +5964,11 @@ function Ka(e, t, n = null) {
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 = Wa(e.inputs?.[i]?.type, !1), r.beginPath(), r.arc(t, n, g ? 3 : 2.2, 0, Math.PI * 2), r.fill(), r.stroke();
+ r.fillStyle = Oo(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 = Wa(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.fillStyle = Oo(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();
}
@@ -5736,22 +6011,22 @@ function Ka(e, t, n = null) {
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(Ga(r, s, i), t + 7, me(e, a, "input") + n * .35, i);
+ s && r.fillText(ko(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 = Ga(r, c, i);
+ let l = ko(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);
+ for (let e of m.filter((e) => e.kind === "group")) A(e);
+ ge();
+ for (let e of m.filter((e) => e.kind === "node")) A(e);
if (i.showViewport) try {
- let e = ce();
+ let e = Ce();
if (e) {
let t = ue(e.x0, e.y0), n = ue(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();
@@ -5770,14 +6045,14 @@ function Ka(e, t, n = null) {
},
resolvedView: {
zoom: ee,
- centerX: ie,
- centerY: ae,
- visibleW: D,
- visibleH: te,
- viewMinX: oe,
- viewMinY: se,
- pad: O,
- renderScale: k
+ centerX: ae,
+ centerY: oe,
+ visibleW: te,
+ visibleH: ne,
+ viewMinX: se,
+ viewMinY: ce,
+ pad: D,
+ renderScale: O
},
canvasToWorld: de,
worldToCanvas: ue,
@@ -5791,16 +6066,16 @@ function Ka(e, t, n = null) {
}
};
}
-function qa(e) {
+function jo(e) {
if (!e || typeof e != "object") return e;
- let t = Array.isArray(e.nodes) ? e.nodes.filter(Boolean) : [], n = Ja(e);
+ let t = Array.isArray(e.nodes) ? e.nodes.filter(Boolean) : [], n = Mo(e);
if (!t.length) return e;
let r = [], i = Array.isArray(e.links) ? [...e.links] : [], a = [...Array.isArray(e.groups) ? e.groups : [], ...Array.isArray(e.extra?.groups) ? e.extra.groups : []];
for (let e of t) {
r.push(e);
- let t = Ya(e, n);
+ let t = No(e, n);
if (!t || !Array.isArray(t.nodes) || !t.nodes.length) continue;
- let o = Za(e, qa(t));
+ let o = Fo(e, jo(t));
r.push(...o.nodes), i.push(...o.links), o.group && a.push(o.group);
}
return {
@@ -5814,16 +6089,16 @@ function qa(e) {
}
};
}
-function Ja(e) {
+function Mo(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 Xa(e)) t != null && n.set(String(t), e);
+ for (let e of t) for (let t of Po(e)) t != null && n.set(String(t), e);
return n;
}
-function Ya(e, t) {
+function No(e, t) {
let n = [
e?.type,
e?.comfyClass,
@@ -5851,7 +6126,7 @@ function Ya(e, t) {
e?.subgraph_graph
].find((e) => e && typeof e == "object" && Array.isArray(e.nodes)) || null;
}
-function Xa(e) {
+function Po(e) {
return [
e?.id,
e?.name,
@@ -5863,9 +6138,9 @@ function Xa(e) {
e?.properties?.subgraphId
].filter((e) => e != null && String(e).trim());
}
-function Za(e, t) {
- let n = String(e?.id ?? e?.ID ?? ""), r = $a(e?.pos) || [0, 0], i = eo(e?.size) || [260, 180], a = t.nodes.filter(Boolean), o = Qa(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 = $a(r?.pos) || [o.minX, o.minY], a = eo(r?.size) || [140, 60];
+function Fo(e, t) {
+ let n = String(e?.id ?? e?.ID ?? ""), r = Lo(e?.pos) || [0, 0], i = Ro(e?.size) || [260, 180], a = t.nodes.filter(Boolean), o = Io(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 = Lo(r?.pos) || [o.minX, o.minY], a = Ro(r?.size) || [140, 60];
return {
...r,
id: `${n}::${r?.id ?? r?.ID ?? ""}`,
@@ -5905,12 +6180,12 @@ function Za(e, t) {
}
};
}
-function Qa(e) {
+function Io(e) {
let t = Infinity, n = Infinity, r = -Infinity, i = -Infinity;
for (let a of e) {
- let e = $a(a?.pos);
+ let e = Lo(a?.pos);
if (!e) continue;
- let o = eo(a?.size) || [140, 60];
+ let o = Ro(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) ? {
@@ -5925,7 +6200,7 @@ function Qa(e) {
height: 1
};
}
-function $a(e) {
+function Lo(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;
@@ -5933,7 +6208,7 @@ function $a(e) {
}
return null;
}
-function eo(e) {
+function Ro(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;
@@ -5941,12 +6216,12 @@ function eo(e) {
}
return null;
}
-function to(e) {
+function zo(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 no(e, t = null) {
+function Bo(e, t = null) {
if (!e || typeof e != "object") return null;
let n = {
maxNodes: 220,
@@ -6017,7 +6292,7 @@ function no(e, t = null) {
}
//#endregion
//#region ui/vue/components/panel/sidebar/SidebarWorkflowSection.vue
-var ro = {
+var Vo = {
key: 0,
class: "mjr-sidebar-section",
style: {
@@ -6027,12 +6302,19 @@ var ro = {
padding: "12px",
"min-width": "300px"
}
-}, io = { style: {
+}, Ho = { style: {
+ "font-size": "13px",
+ "font-weight": "600",
+ color: "var(--fg-color, #eaeaea)",
+ "margin-bottom": "12px",
+ "text-transform": "uppercase",
+ "letter-spacing": "0.5px"
+} }, Uo = { style: {
display: "flex",
"flex-wrap": "wrap",
gap: "8px",
"margin-bottom": "10px"
-} }, ao = { style: {
+} }, Wo = { style: {
padding: "4px 9px",
"border-radius": "999px",
background: "rgba(33,150,243,0.14)",
@@ -6042,7 +6324,7 @@ var ro = {
color: "#90CAF9",
"text-transform": "uppercase",
"letter-spacing": "0.4px"
-} }, oo = {
+} }, Go = {
key: 0,
style: {
padding: "4px 9px",
@@ -6053,62 +6335,80 @@ var ro = {
"font-weight": "600",
color: "rgba(255,255,255,0.82)"
}
-}, so = { style: {
+}, Ko = { style: {
display: "grid",
"grid-template-columns": "repeat(3, minmax(0, 1fr))",
gap: "8px",
"margin-bottom": "12px"
-} }, co = { style: {
+} }, qo = { style: {
padding: "8px 10px",
"border-radius": "10px",
background: "rgba(255,255,255,0.04)",
border: "1px solid rgba(255,255,255,0.10)"
-} }, lo = { style: {
+} }, Jo = { style: {
+ "font-size": "10px",
+ "font-weight": "700",
+ color: "rgba(255,255,255,0.55)",
+ "text-transform": "uppercase",
+ "letter-spacing": "0.4px"
+} }, Yo = { style: {
"font-size": "18px",
"font-weight": "700",
color: "rgba(255,255,255,0.94)",
"margin-top": "2px"
-} }, uo = { style: {
+} }, Xo = { style: {
padding: "8px 10px",
"border-radius": "10px",
background: "rgba(255,255,255,0.04)",
border: "1px solid rgba(255,255,255,0.10)"
-} }, fo = { style: {
+} }, Zo = { style: {
+ "font-size": "10px",
+ "font-weight": "700",
+ color: "rgba(255,255,255,0.55)",
+ "text-transform": "uppercase",
+ "letter-spacing": "0.4px"
+} }, Qo = { style: {
"font-size": "18px",
"font-weight": "700",
color: "rgba(255,255,255,0.94)",
"margin-top": "2px"
-} }, po = { style: {
+} }, $o = { style: {
padding: "8px 10px",
"border-radius": "10px",
background: "rgba(255,255,255,0.04)",
border: "1px solid rgba(255,255,255,0.10)"
-} }, mo = { style: {
+} }, es = { style: {
+ "font-size": "10px",
+ "font-weight": "700",
+ color: "rgba(255,255,255,0.55)",
+ "text-transform": "uppercase",
+ "letter-spacing": "0.4px"
+} }, ts = { style: {
"font-size": "18px",
"font-weight": "700",
color: "rgba(255,255,255,0.94)",
"margin-top": "2px"
-} }, ho = {
+} }, ns = {
key: 0,
class: "mjr-workflow-tree-wrap"
-}, go = { class: "mjr-workflow-tree-node" }, _o = { class: "mjr-workflow-tree-node-name" }, vo = {
+}, rs = { class: "mjr-section-title" }, is = { class: "mjr-workflow-tree-node" }, as = { class: "mjr-workflow-tree-node-name" }, os = {
key: 0,
class: "mjr-workflow-tree-node-type"
-}, yo = { class: "mjr-menu-item-hint" }, bo = {
+}, ss = { class: "mjr-menu-item-hint" }, cs = {
key: 0,
class: "mjr-section-hint"
-}, xo = { style: {
+}, ls = { style: {
display: "flex",
"align-items": "center",
"justify-content": "space-between",
gap: "10px",
"margin-top": "8px"
-} }, So = { style: {
+} }, us = { style: {
display: "flex",
"flex-wrap": "wrap",
gap: "6px",
"align-items": "center"
-} }, Co = {
+} }, ds = {
key: 1,
style: {
display: "grid",
@@ -6118,23 +6418,23 @@ var ro = {
"margin-top": "10px",
"margin-bottom": "10px"
}
-}, wo = { style: {
+}, fs = { style: {
display: "flex",
"flex-direction": "column",
gap: "2px",
"min-width": "0"
-} }, To = { style: {
+} }, ps = { style: {
"font-size": "13px",
"font-weight": "600"
-} }, Eo = { style: {
+} }, ms = { style: {
"font-size": "11px",
color: "rgba(255,255,255,0.58)"
-} }, Do = { style: {
+} }, hs = { style: {
display: "flex",
gap: "10px",
"align-items": "stretch",
"margin-top": "10px"
-} }, Oo = { style: {
+} }, gs = { style: {
display: "flex",
"justify-content": "space-between",
"align-items": "center",
@@ -6142,7 +6442,12 @@ var ro = {
"margin-top": "8px",
"font-size": "11px",
color: "rgba(255,255,255,0.58)"
-} }, ko = ["open"], Ao = { style: {
+} }, _s = ["open"], vs = { style: {
+ cursor: "pointer",
+ color: "var(--mjr-muted, rgba(255,255,255,0.65))",
+ "font-size": "12px",
+ "user-select": "none"
+} }, ys = { style: {
background: "rgba(0,0,0,0.5)",
padding: "10px",
"border-radius": "6px",
@@ -6152,14 +6457,14 @@ var ro = {
margin: "10px 0 0 0",
color: "#90CAF9",
"font-family": "'Consolas', 'Monaco', monospace"
-} }, jo = 1, Mo = 8, No = 250, Po = {
+} }, bs = 1, xs = 8, Ss = 250, Cs = {
__name: "SidebarWorkflowSection",
props: { asset: {
type: Object,
required: !0
} },
- setup(t) {
- let r = t, i = Object.freeze({
+ setup(e) {
+ let t = e, n = Object.freeze({
nodeColors: !0,
showLinks: !0,
showGroups: !0,
@@ -6168,44 +6473,47 @@ var ro = {
showViewport: !0,
showNodeLabels: !1,
size: "comfortable"
- }), a = Object.freeze({
+ }), r = Object.freeze({
zoom: 1,
centerX: null,
centerY: null,
hoveredNodeId: null
- }), o = Object.freeze([
+ }), i = Object.freeze([
{
key: "compact",
- label: "Compact",
+ labelKey: "workflowSidebar.sizeCompact",
+ fallback: "Compact",
height: 120
},
{
key: "comfortable",
- label: "Comfort",
+ labelKey: "workflowSidebar.sizeComfort",
+ fallback: "Comfort",
height: 160
},
{
key: "expanded",
- label: "Expanded",
+ labelKey: "workflowSidebar.sizeExpanded",
+ fallback: "Expanded",
height: 220
}
- ]), s = I(null), c = I(!1), l = I(!1), u = I(w()), d = I({ ...a }), f = I("crosshair"), p = I(""), m = null, h = null, g = null;
- function _(e, t, n) {
+ ]), a = I(null), o = I(!1), s = I(!1), c = I(C()), l = I({ ...r }), u = I("crosshair"), d = I(""), f = null, p = null, m = null;
+ function g(e, t, n) {
let r = Number(e);
return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t;
}
- function v(e) {
- !e || typeof e != "object" || (d.value = {
- ...d.value,
- zoom: _(e.zoom ?? d.value.zoom, jo, Mo),
+ function _(e) {
+ !e || typeof e != "object" || (l.value = {
+ ...l.value,
+ zoom: g(e.zoom ?? l.value.zoom, bs, xs),
centerX: Number.isFinite(Number(e.centerX)) ? Number(e.centerX) : null,
centerY: Number.isFinite(Number(e.centerY)) ? Number(e.centerY) : null
});
}
- function y() {
- d.value = { ...a }, p.value = "";
+ function v() {
+ l.value = { ...r }, d.value = "";
}
- function b(e) {
+ function y(e) {
let t = e?.metadata_raw ?? null;
if (!t) return null;
if (typeof t == "object") return t;
@@ -6221,7 +6529,7 @@ var ro = {
}
return null;
}
- function x(e) {
+ function b(e) {
try {
let t = Object.entries(e || {});
if (!t.length) return !1;
@@ -6232,8 +6540,8 @@ var ro = {
}
return !1;
}
- function S(e) {
- let t = b(e), n = e?.workflow || e?.Workflow || e?.comfy_workflow || t?.workflow || t?.Workflow || t?.comfy_workflow || null;
+ function x(e) {
+ let t = y(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") {
@@ -6247,70 +6555,70 @@ var ro = {
}
return null;
}
- function C(e) {
- let t = b(e), n = e?.prompt || e?.Prompt || t?.prompt || t?.Prompt || null;
+ function S(e) {
+ let t = y(e), n = e?.prompt || e?.Prompt || t?.prompt || t?.Prompt || null;
if (!n) return null;
- if (typeof n == "object") return x(n) ? n : null;
+ if (typeof n == "object") return b(n) ? n : null;
if (typeof n == "string") {
let e = n.trim();
if (!e) return null;
try {
let t = JSON.parse(e);
- return x(t) ? t : null;
+ return b(t) ? t : null;
} catch {
return null;
}
}
return null;
}
- function w() {
+ function C() {
try {
- let e = K?.()?.workflowMinimap;
+ let e = q?.()?.workflowMinimap;
if (e && typeof e == "object") return {
- ...i,
+ ...n,
...e
};
} catch (e) {
console.debug?.(e);
}
try {
- let t = localStorage?.getItem?.(e);
- if (!t) return { ...i };
- let n = JSON.parse(t);
- if (!n || typeof n != "object") return { ...i };
+ let e = localStorage?.getItem?.(h);
+ if (!e) return { ...n };
+ let t = JSON.parse(e);
+ if (!t || typeof t != "object") return { ...n };
let r = {
- ...i,
- ...n
+ ...n,
+ ...t
};
try {
- let t = K();
- t.workflowMinimap = {
- ...t.workflowMinimap,
+ let e = q();
+ e.workflowMinimap = {
+ ...e.workflowMinimap,
...r
- }, q(t), localStorage?.removeItem?.(e);
+ }, J(e), localStorage?.removeItem?.(h);
} catch (e) {
console.debug?.(e);
}
return r;
} catch {
- return { ...i };
+ return { ...n };
}
}
- function T(e) {
+ function w(e) {
try {
- let t = K();
+ let t = q();
t.workflowMinimap = {
...t.workflowMinimap,
...e
- }, q(t);
+ }, J(t);
} catch (e) {
console.debug?.(e);
}
}
- let E = B(() => {
- let e = S(r.asset), t = C(r.asset);
- return !e && !t ? null : e || no(t);
- }), ee = B(() => r.asset?.has_generation_data ? "Complete" : "Partial"), D = B(() => E.value ? JSON.stringify(E.value, null, 2) : "");
+ let T = V(() => {
+ let e = x(t.asset), n = S(t.asset);
+ return !e && !n ? null : e || Bo(n);
+ }), E = V(() => t.asset?.has_generation_data ? "Complete" : "Partial"), ee = V(() => T.value ? JSON.stringify(T.value, null, 2) : "");
function te(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}`);
@@ -6318,7 +6626,7 @@ var ro = {
function ne(e) {
return String(e?.type || e?.class_type || e?.name || "").trim();
}
- let re = B(() => (Array.isArray(E.value?.nodes) ? E.value.nodes : []).slice(0, No).map((e, t) => {
+ let re = V(() => (Array.isArray(T.value?.nodes) ? T.value.nodes : []).slice(0, Ss).map((e, t) => {
let n = e?.id ?? e?.key ?? t + 1, r = ne(e);
return {
key: String(n),
@@ -6329,75 +6637,75 @@ var ro = {
type: r
}
};
- })), ie = B(() => Math.max(0, Number(ae.value.nodes || 0) - re.value.length)), ae = B(() => {
- let e = E.value;
+ })), ie = V(() => Math.max(0, Number(ae.value.nodes || 0) - re.value.length)), ae = V(() => {
+ let e = T.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"
+ source: e?.extra?.synthetic ? k("workflowSidebar.sourceSynthetic", "Synthetic") : k("workflowSidebar.sourceEmbedded", "Embedded")
} : {
nodes: 0,
links: 0,
groups: 0,
source: ""
};
- }), oe = B(() => {
- let e = String(u.value?.size || "comfortable");
- return o.find((t) => t.key === e) || o[1];
- }), se = B(() => `${oe.value.height}px`), ce = B(() => [
+ }), oe = V(() => {
+ let e = String(c.value?.size || "comfortable");
+ return i.find((t) => t.key === e) || i[1];
+ }), se = V(() => `${oe.value.height}px`), ce = V(() => [
{
key: "showNodeLabels",
- label: "Node Labels",
+ label: k("workflowSidebar.nodeLabels", "Node Labels"),
iconClass: "pi pi-tag"
},
{
key: "nodeColors",
- label: "Node Colors",
+ label: k("workflowSidebar.nodeColors", "Node Colors"),
iconClass: "pi pi-palette"
},
{
key: "showLinks",
- label: "Show Links",
+ label: k("workflowSidebar.showLinks", "Show Links"),
iconClass: "pi pi-share-alt"
},
{
key: "showGroups",
- label: "Show Frames/Groups",
+ label: k("workflowSidebar.showFramesGroups", "Show Frames/Groups"),
iconClass: "pi pi-th-large"
},
{
key: "renderBypassState",
- label: "Render Bypass State",
+ label: k("workflowSidebar.renderBypassState", "Render Bypass State"),
iconClass: "pi pi-ban"
},
{
key: "renderErrorState",
- label: "Render Error State",
+ label: k("workflowSidebar.renderErrorState", "Render Error State"),
iconClass: "pi pi-exclamation-triangle"
},
{
key: "showViewport",
- label: "Show Viewport",
+ label: k("workflowSidebar.showViewport", "Show Viewport"),
iconClass: "pi pi-window-maximize"
}
]);
- function O() {
- let e = s.value, t = E.value;
+ function D() {
+ let e = a.value, t = T.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), h = Ka(e, t, {
- ...u.value,
- view: d.value
- }) || null, v(h?.resolvedView);
+ let o = e.getContext("2d");
+ o && o.setTransform(i, 0, 0, i, 0, 0), p = Ao(e, t, {
+ ...c.value,
+ view: l.value
+ }) || null, _(p?.resolvedView);
}
- function k(e) {
- pe(e);
+ function O(e) {
+ ge(e);
}
function le(e) {
- let t = s.value;
+ let t = a.value;
if (!t) return null;
let n = t.getBoundingClientRect?.();
return n ? {
@@ -6407,132 +6715,107 @@ var ro = {
}
function ue(e) {
let t = le(e);
- return !t || !h?.canvasToWorld ? null : {
+ return !t || !p?.canvasToWorld ? null : {
local: t,
- world: h.canvasToWorld(t.x, t.y)
+ world: p.canvasToWorld(t.x, t.y)
};
}
function de(e) {
- let t = le(e), n = t && h?.hitTestNode ? h.hitTestNode(t.x, t.y) : null, r = n?.id !== null && n?.id !== void 0 ? String(n.id) : null, i = d.value.hoveredNodeId !== null && d.value.hoveredNodeId !== void 0 ? String(d.value.hoveredNodeId) : null;
- p.value = n?.label || "", r !== i && (d.value = {
- ...d.value,
+ let t = le(e), n = t && p?.hitTestNode ? p.hitTestNode(t.x, t.y) : null, r = n?.id !== null && n?.id !== void 0 ? String(n.id) : null, i = l.value.hoveredNodeId !== null && l.value.hoveredNodeId !== void 0 ? String(l.value.hoveredNodeId) : null;
+ d.value = n?.label || "", r !== i && (l.value = {
+ ...l.value,
hoveredNodeId: r
- }, O());
+ }, D());
}
function fe(e) {
- e && (k(e), d.value = {
- ...d.value,
+ e && (O(e), l.value = {
+ ...l.value,
centerX: Number(e.x),
centerY: Number(e.y)
- }, O());
+ }, D());
}
- function me(e) {
+ function pe(e) {
if (Number(e?.button ?? 0) !== 0) return;
let t = ue(e);
- t && (g = e.pointerId ?? 1, f.value = "grabbing", s.value?.setPointerCapture?.(g), fe(t.world), de(e), e.preventDefault?.(), e.stopPropagation?.());
+ t && (m = e.pointerId ?? 1, u.value = "grabbing", a.value?.setPointerCapture?.(m), fe(t.world), de(e), e.preventDefault?.(), e.stopPropagation?.());
}
- function he(e) {
- if (g !== null && e.pointerId === g) {
+ function me(e) {
+ if (m !== null && e.pointerId === m) {
let t = ue(e);
t && fe(t.world), e.preventDefault?.(), e.stopPropagation?.();
return;
}
de(e);
}
- function ge(e) {
- g !== null && e?.pointerId === g && (s.value?.releasePointerCapture?.(g), g = null, f.value = "crosshair"), e?.type === "pointerleave" && (p.value = "", d.value.hoveredNodeId !== null && (d.value = {
- ...d.value,
+ function he(e) {
+ m !== null && e?.pointerId === m && (a.value?.releasePointerCapture?.(m), m = null, u.value = "crosshair"), e?.type === "pointerleave" && (d.value = "", l.value.hoveredNodeId !== null && (l.value = {
+ ...l.value,
hoveredNodeId: null
- }, O()));
+ }, D()));
}
- function _e(e) {
- let t = ue(e), n = h?.resolvedView;
+ function A(e) {
+ let t = ue(e), n = p?.resolvedView;
if (!t || !n) return;
- let r = _(Number(e?.deltaY) || 0, -240, 240), i = Math.exp(-r * .0025), a = _((Number(d.value.zoom) || 1) * i, jo, Mo);
- if (Math.abs(a - (Number(d.value.zoom) || 1)) < .001) {
+ let r = g(Number(e?.deltaY) || 0, -240, 240), i = Math.exp(-r * .0025), a = g((Number(l.value.zoom) || 1) * i, bs, xs);
+ if (Math.abs(a - (Number(l.value.zoom) || 1)) < .001) {
e.preventDefault?.(), e.stopPropagation?.();
return;
}
- let o = Math.max(1, Number(h?.bounds?.width || 1) / a), s = Math.max(1, Number(h?.bounds?.height || 1) / a), c = _((Number(t.world.x) - Number(n.viewMinX || 0)) / Math.max(1, Number(n.visibleW || 1)), 0, 1), l = _((Number(t.world.y) - Number(n.viewMinY || 0)) / Math.max(1, Number(n.visibleH || 1)), 0, 1);
- d.value = {
- ...d.value,
+ let o = Math.max(1, Number(p?.bounds?.width || 1) / a), s = Math.max(1, Number(p?.bounds?.height || 1) / a), c = g((Number(t.world.x) - Number(n.viewMinX || 0)) / Math.max(1, Number(n.visibleW || 1)), 0, 1), u = g((Number(t.world.y) - Number(n.viewMinY || 0)) / Math.max(1, Number(n.visibleH || 1)), 0, 1);
+ l.value = {
+ ...l.value,
zoom: a,
centerX: Number(t.world.x) + (.5 - c) * o,
- centerY: Number(t.world.y) + (.5 - l) * s
- }, O(), de(e), e.preventDefault?.(), e.stopPropagation?.();
+ centerY: Number(t.world.y) + (.5 - u) * s
+ }, D(), de(e), e.preventDefault?.(), e.stopPropagation?.();
+ }
+ function _e(e) {
+ let t = ue(e);
+ v(), t && O(t.world), D(), e.preventDefault?.(), e.stopPropagation?.();
}
function ve(e) {
- let t = ue(e);
- y(), t && k(t.world), O(), e.preventDefault?.(), e.stopPropagation?.();
+ c.value = {
+ ...c.value,
+ [e]: !c.value?.[e]
+ }, w(c.value);
}
function ye(e) {
- u.value = {
- ...u.value,
- [e]: !u.value?.[e]
- }, T(u.value);
- }
- function be(e) {
- o.some((t) => t.key === e) && (u.value = {
- ...u.value,
+ i.some((t) => t.key === e) && (c.value = {
+ ...c.value,
size: e
- }, T(u.value));
+ }, w(c.value));
}
- return ke(() => {
- s.value && typeof ResizeObserver == "function" && (m = new ResizeObserver(() => O()), m.observe(s.value)), O();
- }), Ce(E, () => {
- y(), O();
- }, { flush: "post" }), Ce(u, () => {
- O();
+ return Ae(() => {
+ a.value && typeof ResizeObserver == "function" && (f = new ResizeObserver(() => D()), f.observe(a.value)), D();
+ }), we(T, () => {
+ v(), D();
+ }, { flush: "post" }), we(c, () => {
+ D();
}, {
deep: !0,
flush: "post"
- }), Ce(c, () => {
- O();
- }, { flush: "post" }), Oe(() => {
+ }), we(o, () => {
+ D();
+ }, { flush: "post" }), ke(() => {
try {
- m?.disconnect?.();
+ f?.disconnect?.();
} catch (e) {
console.debug?.(e);
}
- m = null, g = null;
+ f = null, m = null;
}), (e, t) => {
- let r = Ze("MTree"), i = Ze("MButton");
- return E.value ? (M(), F("div", ro, [
- t[8] ||= P("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),
- P("div", io, [P("div", ao, R(ee.value), 1), ae.value.source ? (M(), F("div", oo, R(ae.value.source), 1)) : z("", !0)]),
- P("div", so, [
- P("div", co, [t[2] ||= P("div", { style: {
- "font-size": "10px",
- "font-weight": "700",
- color: "rgba(255,255,255,0.55)",
- "text-transform": "uppercase",
- "letter-spacing": "0.4px"
- } }, "Nodes", -1), P("div", lo, R(ae.value.nodes), 1)]),
- P("div", uo, [t[3] ||= P("div", { style: {
- "font-size": "10px",
- "font-weight": "700",
- color: "rgba(255,255,255,0.55)",
- "text-transform": "uppercase",
- "letter-spacing": "0.4px"
- } }, "Links", -1), P("div", fo, R(ae.value.links), 1)]),
- P("div", po, [t[4] ||= P("div", { style: {
- "font-size": "10px",
- "font-weight": "700",
- color: "rgba(255,255,255,0.55)",
- "text-transform": "uppercase",
- "letter-spacing": "0.4px"
- } }, "Groups", -1), P("div", mo, R(ae.value.groups), 1)])
+ let n = Qe("MTree"), r = Qe("MButton");
+ return T.value ? (M(), F("div", Vo, [
+ P("div", Ho, R(z(k)("workflowSidebar.comfyWorkflow", "ComfyUI Workflow")), 1),
+ P("div", Uo, [P("div", Wo, R(E.value), 1), ae.value.source ? (M(), F("div", Go, R(ae.value.source), 1)) : B("", !0)]),
+ P("div", Ko, [
+ P("div", qo, [P("div", Jo, R(z(k)("workflowSidebar.nodes", "Nodes")), 1), P("div", Yo, R(ae.value.nodes), 1)]),
+ P("div", Xo, [P("div", Zo, R(z(k)("workflowSidebar.links", "Links")), 1), P("div", Qo, R(ae.value.links), 1)]),
+ P("div", $o, [P("div", es, R(z(k)("workflowSidebar.groups", "Groups")), 1), P("div", ts, R(ae.value.groups), 1)])
]),
- re.value.length ? (M(), F("div", ho, [
- t[5] ||= P("div", { class: "mjr-section-title" }, " Workflow Nodes ", -1),
- Te(r, {
+ re.value.length ? (M(), F("div", ns, [
+ P("div", rs, R(z(k)("workflowSidebar.workflowNodes", "Workflow Nodes")), 1),
+ Ee(n, {
value: re.value,
class: "mjr-workflow-tree",
"scroll-height": "180px",
@@ -6545,48 +6828,48 @@ var ro = {
nodeLabel: { class: "mjr-workflow-tree-label" }
}
}, {
- default: De(({ node: e }) => [P("span", go, [
- P("span", _o, R(e.label), 1),
- e.data?.type ? (M(), F("span", vo, R(e.data.type), 1)) : z("", !0),
- P("span", yo, "#" + R(e.data?.id), 1)
+ default: Oe(({ node: e }) => [P("span", is, [
+ P("span", as, R(e.label), 1),
+ e.data?.type ? (M(), F("span", os, R(e.data.type), 1)) : B("", !0),
+ P("span", ss, "#" + R(e.data?.id), 1)
])]),
_: 1
}, 8, ["value"]),
- ie.value ? (M(), F("div", bo, " +" + R(ie.value) + " more nodes ", 1)) : z("", !0)
- ])) : z("", !0),
- P("div", xo, [P("div", So, [(M(!0), F(V, null, N(Ke(o), (e) => (M(), we(i, {
+ ie.value ? (M(), F("div", cs, R(z(k)("workflowSidebar.moreNodes", "+{count} more nodes", { count: ie.value })), 1)) : B("", !0)
+ ])) : B("", !0),
+ P("div", ls, [P("div", us, [(M(!0), F(H, null, N(z(i), (e) => (M(), Te(r, {
key: e.key,
type: "button",
severity: "secondary",
text: "",
rounded: "",
- title: `${e.label} minimap`,
+ title: z(k)("workflowSidebar.minimapSizeTitle", "{label} minimap", { label: z(k)(e.labelKey, e.fallback) }),
style: L({
appearance: "none",
- border: u.value.size === e.key ? "1px solid rgba(33,150,243,0.55)" : "1px solid rgba(255,255,255,0.12)",
+ border: c.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: u.value.size === e.key ? "rgba(33,150,243,0.18)" : "rgba(255,255,255,0.04)",
- color: u.value.size === e.key ? "#90CAF9" : "rgba(255,255,255,0.78)",
+ background: c.value.size === e.key ? "rgba(33,150,243,0.18)" : "rgba(255,255,255,0.04)",
+ color: c.value.size === e.key ? "#90CAF9" : "rgba(255,255,255,0.78)",
fontSize: "11px",
- fontWeight: u.value.size === e.key ? "700" : "600",
+ fontWeight: c.value.size === e.key ? "700" : "600",
cursor: "pointer"
}),
- onClick: (t) => be(e.key)
+ onClick: (t) => ye(e.key)
}, {
- default: De(() => [Ee(R(e.label), 1)]),
+ default: Oe(() => [De(R(z(k)(e.labelKey, e.fallback)), 1)]),
_: 2
}, 1032, [
"title",
"style",
"onClick"
- ]))), 128))]), Te(i, {
+ ]))), 128))]), Ee(r, {
type: "button",
class: "mjr-btn mjr-icon-btn",
severity: "secondary",
text: "",
rounded: "",
- title: Ke(n)("tooltip.minimapSettings", "Minimap settings"),
+ title: z(k)("tooltip.minimapSettings", "Minimap settings"),
style: {
width: "28px",
height: "28px",
@@ -6599,12 +6882,12 @@ var ro = {
color: "rgba(255,255,255,0.9)",
cursor: "pointer"
},
- onClick: t[0] ||= (e) => c.value = !c.value
+ onClick: t[0] ||= (e) => o.value = !o.value
}, {
- default: De(() => [...t[6] ||= [P("i", { class: "pi pi-sliders-h" }, null, -1)]]),
+ default: Oe(() => [...t[2] ||= [P("i", { class: "pi pi-sliders-h" }, null, -1)]]),
_: 1
}, 8, ["title"])]),
- c.value ? (M(), F("div", Co, [(M(!0), F(V, null, N(ce.value, (e) => (M(), we(i, {
+ o.value ? (M(), F("div", ds, [(M(!0), F(H, null, N(ce.value, (e) => (M(), Te(r, {
key: e.key,
type: "button",
severity: "secondary",
@@ -6615,15 +6898,15 @@ var ro = {
gap: "10px",
padding: "9px 10px",
borderRadius: "10px",
- border: u.value?.[e.key] ? "1px solid rgba(76,175,80,0.40)" : "1px solid rgba(255,255,255,0.12)",
- background: u.value?.[e.key] ? "rgba(76,175,80,0.10)" : "rgba(255,255,255,0.04)",
+ border: c.value?.[e.key] ? "1px solid rgba(76,175,80,0.40)" : "1px solid rgba(255,255,255,0.12)",
+ background: c.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) => ye(e.key)
+ onClick: (t) => ve(e.key)
}, {
- default: De(() => [
+ default: Oe(() => [
P("span", { style: L({
width: "22px",
height: "22px",
@@ -6631,35 +6914,35 @@ var ro = {
display: "inline-flex",
alignItems: "center",
justifyContent: "center",
- background: u.value?.[e.key] ? "rgba(76,175,80,0.95)" : "rgba(255,255,255,0.08)",
- border: u.value?.[e.key] ? "1px solid rgba(76,175,80,0.35)" : "1px solid rgba(255,255,255,0.12)",
+ background: c.value?.[e.key] ? "rgba(76,175,80,0.95)" : "rgba(255,255,255,0.08)",
+ border: c.value?.[e.key] ? "1px solid rgba(76,175,80,0.35)" : "1px solid rgba(255,255,255,0.12)",
flex: "0 0 auto"
}) }, [P("i", {
class: "pi pi-check",
style: L({
fontSize: "12px",
- opacity: u.value?.[e.key] ? "1" : "0"
+ opacity: c.value?.[e.key] ? "1" : "0"
})
}, null, 4)], 4),
P("i", {
- class: ze(e.iconClass),
+ class: Ve(e.iconClass),
style: {
"font-size": "18px",
opacity: "0.9",
width: "18px"
}
}, null, 2),
- P("div", wo, [P("div", To, R(e.label), 1), P("div", Eo, R(u.value?.[e.key] ? "On" : "Off"), 1)])
+ P("div", fs, [P("div", ps, R(e.label), 1), P("div", ms, R(c.value?.[e.key] ? z(k)("state.on", "on") : z(k)("state.off", "off")), 1)])
]),
_: 2
- }, 1032, ["style", "onClick"]))), 128))])) : z("", !0),
- P("div", Do, [P("canvas", {
+ }, 1032, ["style", "onClick"]))), 128))])) : B("", !0),
+ P("div", hs, [P("canvas", {
ref_key: "canvasRef",
- ref: s,
+ ref: a,
style: L({
width: "100%",
height: se.value,
- cursor: f.value,
+ cursor: u.value,
touchAction: "none",
borderRadius: "10px",
marginTop: "0",
@@ -6667,28 +6950,23 @@ var ro = {
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: me,
- onPointermove: he,
- onPointerup: ge,
- onPointercancel: ge,
- onPointerleave: ge,
- onWheel: _e,
- onDblclick: ve
+ onPointerdown: pe,
+ onPointermove: me,
+ onPointerup: he,
+ onPointercancel: he,
+ onPointerleave: he,
+ onWheel: A,
+ onDblclick: _e
}, null, 36)]),
- P("div", Oo, [P("span", null, R(p.value || "Click/drag to navigate · wheel to zoom"), 1), P("span", null, R(Math.round((d.value.zoom || 1) * 100)) + "% · " + R(oe.value.label), 1)]),
+ P("div", gs, [P("span", null, R(d.value || z(k)("workflowSidebar.minimapHint", "Click/drag to navigate - wheel to zoom")), 1), P("span", null, R(Math.round((l.value.zoom || 1) * 100)) + "% - " + R(z(k)(oe.value.labelKey, oe.value.fallback)), 1)]),
P("details", {
- open: l.value,
+ open: s.value,
style: { "margin-top": "10px" },
- onToggle: t[1] ||= (e) => l.value = e.target.open
- }, [t[7] ||= P("summary", { style: {
- cursor: "pointer",
- color: "var(--mjr-muted, rgba(255,255,255,0.65))",
- "font-size": "12px",
- "user-select": "none"
- } }, " Show raw JSON ", -1), P("pre", Ao, R(D.value), 1)], 40, ko)
- ])) : z("", !0);
+ onToggle: t[1] ||= (e) => s.value = e.target.open
+ }, [P("summary", vs, R(z(k)("workflowSidebar.showRawJson", "Show raw JSON")), 1), P("pre", ys, R(ee.value), 1)], 40, _s)
+ ])) : B("", !0);
};
}
};
//#endregion
-export { zr as A, Xn as B, Pr as C, Nr as D, Br as E, pr as F, q as G, Zt as H, Cr as I, st as J, vt as K, xr as L, wr as M, sr as N, Rr as O, mr as P, or as R, Wr as S, Fr as T, J as U, Yn as V, K as W, Kr as _, Na as a, Vr as b, Fi as c, li as d, ci as f, Xr as g, ai as h, Fa as i, Dr as j, Lr as k, mi as l, ii as m, Ka as n, Ia as o, $r as p, yt as q, no as r, Oa as s, Po as t, si as u, qr as v, Er as w, Gr as x, Jr as y, ar as z };
+export { Rr as A, or as B, Gr as C, Vr as D, Ir as E, hr as F, q as G, Xn as H, mr as I, bt as J, J as K, wr as L, Or as M, Tr as N, Pr as O, cr as P, Sr as R, Kr as S, Dr as T, Qt as U, Zn as V, Y as W, ct as Y, Zr as _, _o as a, Yr as b, Xi as c, ci as d, ui as f, oi as g, ai as h, yo as i, Br as j, zr as k, Di as l, ei as m, Ao as n, bo as o, li as p, yt as q, Bo as r, fo as s, Cs as t, bi as u, qr as v, Fr as w, Hr as x, Jr as y, sr as z };
diff --git a/dist/chunks/client-DZE_lzdb.js b/dist/chunks/client-DZE_lzdb.js
new file mode 100644
index 00000000..45363ef7
--- /dev/null
+++ b/dist/chunks/client-DZE_lzdb.js
@@ -0,0 +1,1578 @@
+import { C as e, G as t, K as n, ct as r, l as i, ot as a, st as o } from "./config-Cxv7acF8.js";
+//#region ui/app/settingsStore.ts
+var s = "mjrSettings", c = "mjrMinimapSettings", l = new Set([
+ "POST",
+ "PUT",
+ "DELETE",
+ "PATCH"
+]), u = 2e4, d = 3e5, f = 3, p = 400, m = "/mjr/am/settings/security/bootstrap-token", h = "/mjr/am/", g = /* @__PURE__ */ new Map();
+function _(e) {
+ return new Promise((t) => setTimeout(t, e));
+}
+function v(e) {
+ return l.has(String(e || "").trim().toUpperCase());
+}
+function y(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 b(e) {
+ return y(e).startsWith(h);
+}
+function x(e) {
+ return y(e) === m;
+}
+function ee(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 S(e = {}) {
+ try {
+ let t = Number(e?.timeoutMs);
+ return Number.isFinite(t) ? Math.max(1e3, Math.min(d, Math.floor(t))) : u;
+ } catch {
+ return u;
+ }
+}
+function te(e = {}) {
+ let t = e?.signal || null;
+ if (typeof AbortController > "u") return {
+ signal: t || void 0,
+ timeoutMs: S(e),
+ cleanup: () => {}
+ };
+ let n = S(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 ne(e, t, n = {}) {
+ let r = String(e || "GET").trim().toUpperCase(), i = String(t || "").trim();
+ return !r || !i ? "" : `${r}:${i}:timeout=${S(n)}`;
+}
+function re(e, t) {
+ let n = String(e || "").trim();
+ if (!n) return t();
+ if (g.has(n)) return g.get(n);
+ let r = Promise.resolve().then(() => t()).finally(() => {
+ try {
+ g.delete(n);
+ } catch (e) {
+ console.debug?.(e);
+ }
+ });
+ return g.set(n, r), r;
+}
+function ie(e, t, n) {
+ if (v(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 ae(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 oe(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 && v(n) && b(t) && !x(t) && Number(e.status || 0) === 401 && await i({
+ force: !0,
+ allowCookieRefresh: !0
+ }) ? await o(t, {
+ ...s,
+ _authRetryDone: !0
+ }, c) : {
+ ok: !1,
+ error: `Server returned non-JSON response (${e.status})`,
+ code: "INVALID_RESPONSE",
+ status: e.status,
+ content_type: l,
+ data: null
+ };
+ let u = await e.json().catch((e) => (console.debug?.("[MJR API] JSON parse error:", e), null));
+ if (typeof u != "object" || !u) return {
+ ok: !1,
+ error: "Invalid response structure",
+ code: "INVALID_RESPONSE",
+ status: e.status,
+ data: null
+ };
+ if (!("status" in u)) try {
+ u.status = e.status;
+ } catch (e) {
+ console.debug?.(e);
+ }
+ return !r && v(n) && !x(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) : (v(n) && b(t) && !x(t) && (u = a(u)), u);
+}
+function se({ 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 = te(s), d = null;
+ try {
+ let i = (s.method || "GET").toUpperCase(), l = !!s?._authRetryDone, f = typeof Headers < "u" ? new Headers(s.headers || {}) : { ...s.headers };
+ ie(f, i, !!e());
+ let p = t();
+ if (!p && v(i) && b(o) && !x(o)) {
+ try {
+ await n();
+ } catch (e) {
+ console.debug?.(e);
+ }
+ p = t();
+ }
+ ae(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 oe(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);
+ }
+ if (c < f && ee(e)) {
+ try {
+ await _(p * (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 re(t?.dedupe === !1 ? "" : String(t?.dedupeKey || "").trim() || ne("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
+ };
+}
+//#endregion
+//#region ui/utils/ttlCache.ts
+function C({ 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 : !1 : !0;
+ }
+ 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);
+ return;
+ }
+ 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;
+ }
+ };
+}
+//#endregion
+//#region ui/features/panel/messages/toastHistory.ts
+var ce = "mjr_toast_history_v1", le = "mjr_toast_history_last_read_v1", ue = 60, de = "mjr:toast-history-changed", w = null;
+function T(e) {
+ return String(e || "").trim();
+}
+function fe(e) {
+ let t = T(e).toLowerCase();
+ return t === "warn" ? "warning" : t === "danger" ? "error" : t || "info";
+}
+function pe(e) {
+ let t = Number(e);
+ return Number.isFinite(t) ? t : null;
+}
+function me(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 = T(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 he(e, t, n) {
+ return e && t ? `${e}: ${t}` : t || e || n || "";
+}
+function E(e, t = "info", n = null) {
+ if (!e || typeof e != "object") return null;
+ let r = T(e.title || e.summary), i = T(e.detail), o = T(e.message || he(r, i, T(e.fallbackMessage)));
+ if (!o) return null;
+ let s = pe(e.durationMs ?? e.duration ?? n), c = Number(e.createdAt), l = Number.isFinite(c) && c > 0 ? c : Date.now(), u = typeof e.persistent == "boolean" ? e.persistent : !(Number.isFinite(s) && (s ?? 0) > 0);
+ return {
+ id: T(e.id) || a(`th-${l}-`, 4),
+ message: o,
+ title: r,
+ detail: i,
+ type: fe(e.type || t),
+ createdAt: l,
+ durationMs: s,
+ persistent: u,
+ source: T(e.source),
+ trackId: T(e.trackId),
+ status: T(e.status),
+ operation: T(e.operation),
+ progress: me(e.progress),
+ forceStore: !!e.forceStore,
+ actionLabel: T(e.actionLabel),
+ actionUrl: T(e.actionUrl)
+ };
+}
+function D() {
+ if (w === null) try {
+ let e = localStorage.getItem(ce), t = e ? JSON.parse(e) : [];
+ w = Array.isArray(t) ? t.map((e) => {
+ if (e && typeof e == "object") return E(e);
+ let t = T(e);
+ return t ? E({ message: t }) : null;
+ }).filter(Boolean) : [];
+ } catch {
+ w = [];
+ }
+}
+function O() {
+ try {
+ localStorage.setItem(ce, JSON.stringify(w));
+ } catch {}
+}
+function k() {
+ try {
+ window.dispatchEvent(new CustomEvent(de));
+ } catch {}
+}
+function ge() {
+ try {
+ return Number(localStorage.getItem(le)) || 0;
+ } catch {
+ return 0;
+ }
+}
+function _e(e) {
+ try {
+ localStorage.setItem(le, String(Number(e) || 0));
+ } catch {}
+}
+function ve(e, t, n) {
+ D();
+ let r = E(e && typeof e == "object" ? e : {
+ message: T(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 = w.findIndex((e) => String(e?.trackId || "").trim() === i);
+ if (e >= 0) {
+ let t = w[e] || {};
+ w.splice(e, 1), r.id = String(t.id || r.id || "").trim() || r.id;
+ }
+ }
+ w.unshift(r), w.length > ue && (w = w.slice(0, ue)), O(), k();
+}
+function ye() {
+ return D(), w.map((e) => ({ ...e }));
+}
+function be() {
+ D();
+ let e = ge();
+ return w.filter((t) => t.createdAt > e).length;
+}
+function xe() {
+ _e(Date.now()), k();
+}
+function Se() {
+ D(), w = [], O(), _e(Date.now()), k();
+}
+//#endregion
+//#region ui/app/toast.ts
+function Ce(e) {
+ let t = String(e || "info").trim().toLowerCase();
+ return t === "warn" ? "warning" : t === "danger" ? "error" : t === "success" || t === "warning" || t === "error" ? t : "info";
+}
+function A(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 j(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 = A(e), a) : (a.title = String(i?.title || "").trim(), a.detail = String(i?.detail || "").trim(), a.message = A(e), a);
+}
+function we(e, t = "info", n, r) {
+ try {
+ let i = j(e, t, n, r);
+ i.forceStore = !0, ve(i, t, n ?? void 0);
+ } catch {}
+}
+function Te(e) {
+ switch (e) {
+ case "success": return 2e3;
+ case "info": return 3e3;
+ case "warning": return 4e3;
+ case "error": return 5e3;
+ default: return 5e3;
+ }
+}
+function Ee(e) {
+ if (typeof e != "string") return e;
+ let t = e.trim(), n = {
+ "Failed to update rating": i("toast.ratingUpdateFailed", "Failed to update rating"),
+ "Error updating rating": i("toast.ratingUpdateError", "Error updating rating"),
+ "Rating cleared": i("toast.ratingCleared", "Rating cleared"),
+ "Failed to update tags": i("toast.tagsUpdateFailed", "Failed to update tags"),
+ "Tags updated": i("toast.tagsUpdated", "Tags updated"),
+ "Failed to toggle watcher": i("toast.watcherToggleFailed", "Failed to toggle watcher"),
+ "No valid assets selected.": i("toast.noValidAssetsSelected", "No valid assets selected."),
+ "Name collision in current view": i("toast.nameCollisionInView", "Name collision in current view"),
+ "Failed to create collection.": i("toast.failedCreateCollectionDot", "Failed to create collection."),
+ "Failed to add assets to collection.": i("toast.failedAddAssetsToCollection", "Failed to add assets to collection."),
+ "Failed to remove from collection.": i("toast.removeFromCollectionFailed", "Failed to remove from collection."),
+ "Collection created": i("toast.collectionCreated", "Collection created"),
+ "Added to collection": i("toast.addedToCollection", "Added to collection"),
+ "Removed from collection": i("toast.removedFromCollection", "Removed from collection"),
+ "File renamed successfully!": i("toast.fileRenamedSuccess", "File renamed successfully!"),
+ "Failed to rename file": i("toast.fileRenameFailed", "Failed to rename file"),
+ "Failed to rename file.": i("toast.fileRenameFailed", "Failed to rename file."),
+ "File deleted successfully!": i("toast.fileDeletedSuccess", "File deleted successfully!"),
+ "Failed to delete file.": i("toast.fileDeleteFailed", "Failed to delete file."),
+ "Failed to delete file. ": i("toast.fileDeleteFailed", "Failed to delete file."),
+ "File deleted": i("toast.deleted", "File deleted"),
+ "File renamed": i("toast.renamed", "File renamed"),
+ "Folder created": i("toast.folderCreated", "Folder created"),
+ "Folder renamed": i("toast.folderRenamed", "Folder renamed"),
+ "Folder moved": i("toast.folderMoved", "Folder moved"),
+ "Folder deleted": i("toast.folderDeleted", "Folder deleted"),
+ "Failed to create folder": i("toast.createFolderFailed", "Failed to create folder"),
+ "Failed to rename folder": i("toast.renameFolderFailed", "Failed to rename folder"),
+ "Failed to move folder": i("toast.moveFolderFailed", "Failed to move folder"),
+ "Failed to delete folder": i("toast.deleteFolderFailed", "Failed to delete folder"),
+ "Failed to pin folder": i("toast.pinFolderFailed", "Failed to pin folder"),
+ "Failed to unpin folder": i("toast.unpinFolderFailed", "Failed to unpin folder"),
+ "Folder pinned as browser root": i("toast.folderPinnedAsBrowserRoot", "Folder pinned as browser root"),
+ "Folder added": i("toast.folderAdded", "Folder added"),
+ "Folder removed": i("toast.folderRemoved", "Folder removed"),
+ "Folder linked successfully": i("toast.folderLinked", "Folder linked successfully"),
+ "An error occurred while adding the custom folder": i("toast.errorAddingFolder", "An error occurred while adding the custom folder"),
+ "An error occurred while removing the custom folder": i("toast.errorRemovingFolder", "An error occurred while removing the custom folder"),
+ "Failed to add custom folder": i("toast.failedAddFolder", "Failed to add custom folder"),
+ "Failed to remove custom folder": i("toast.failedRemoveFolder", "Failed to remove custom folder"),
+ "Native folder browser unavailable. Please enter path manually.": i("toast.nativeBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."),
+ "Opened in folder": i("toast.openedInFolder", "Opened in folder"),
+ "Failed to open folder": i("toast.openFolderFailed", "Failed to open folder"),
+ "Failed to open folder.": i("toast.openFolderFailed", "Failed to open folder."),
+ "File path copied to clipboard": i("toast.pathCopied", "File path copied to clipboard"),
+ "Failed to copy path": i("toast.pathCopyFailed", "Failed to copy path"),
+ "Failed to copy to clipboard": i("toast.copyClipboardFailed", "Failed to copy to clipboard"),
+ "No file path available for this asset.": i("toast.noFilePath", "No file path available for this asset."),
+ "Failed to refresh metadata.": i("toast.metadataRefreshFailed", "Failed to refresh metadata."),
+ "Metadata refreshed": i("toast.metadataRefreshed", "Metadata refreshed"),
+ "Duplicate analysis started": i("toast.dupAnalysisStarted", "Duplicate analysis started"),
+ "Tags merged": i("toast.tagsMerged", "Tags merged"),
+ "Duplicates deleted": i("toast.duplicatesDeleted", "Duplicates deleted"),
+ "Rescanning file...": i("toast.rescanningFile", "Rescanning file..."),
+ "Metadata enrichment complete": i("toast.enrichmentComplete", "Metadata enrichment complete"),
+ "Playback speed is available for video media only": i("toast.playbackVideoOnly", "Playback speed is available for video media only"),
+ "DB backup saved": i("toast.dbSaveSuccess", "DB backup saved"),
+ "Failed to save DB backup": i("toast.dbSaveFailed", "Failed to save DB backup"),
+ "DB restore started": i("toast.dbRestoreStarted", "DB restore started"),
+ "Failed to restore DB backup": i("toast.dbRestoreFailed", "Failed to restore DB backup"),
+ "Select a DB backup first": i("toast.dbRestoreSelect", "Select a DB backup first"),
+ "Stopping running workers": i("toast.dbRestoreStopping", "Stopping running workers"),
+ "Unlocking and resetting database": i("toast.dbRestoreResetting", "Unlocking and resetting database"),
+ "Recreating database": i("toast.dbRestoreReplacing", "Recreating database"),
+ "Replacing database files": i("toast.dbRestoreReplacing", "Replacing database files"),
+ "Restarting scan": i("toast.dbRestoreRescan", "Restarting scan"),
+ "Deleting database and rebuilding...": i("toast.dbDeleteTriggered", "Deleting database and rebuilding..."),
+ "Database deleted and rebuilt. Files are being reindexed.": i("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed."),
+ "Failed to delete database": i("toast.dbDeleteFailed", "Failed to delete database"),
+ "Database backup restored": i("toast.dbRestoreSuccess", "Database backup restored"),
+ "Index reset started. Files will be reindexed in the background.": i("toast.resetStarted", "Index reset started. Files will be reindexed in the background."),
+ "Failed to reset index": i("toast.resetFailed", "Failed to reset index"),
+ "Reset triggered: Reindexing all files...": i("toast.resetTriggered", "Reset triggered: Reindexing all files..."),
+ "Reset failed - database is corrupted. Use the \"Delete DB\" button to force-delete and rebuild.": i("toast.resetFailedCorrupt", "Reset failed - database is corrupted. Use the \"Delete DB\" button to force-delete and rebuild."),
+ "Scan started": i("toast.scanStarted", "Scan started"),
+ "Scan complete": i("toast.scanComplete", "Scan complete"),
+ "Scan failed": i("toast.scanFailed", "Scan failed"),
+ "Permission denied": i("toast.permissionDenied", "Permission denied"),
+ "Language changed. Reload the page for full effect.": i("toast.languageChanged", "Language changed. Reload the page for full effect."),
+ "Tag added": i("toast.tagAdded", "Tag added"),
+ "Tag removed": i("toast.tagRemoved", "Tag removed"),
+ "Rating saved": i("toast.ratingSaved", "Rating saved"),
+ "Failed to create collection": i("toast.failedCreateCollection", "Failed to create collection"),
+ "Failed to delete collection": i("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 i("toast.ratingSetN", "Rating set to {n} stars", { n: Number(r[1]) });
+ if (r = t.match(/Downloading (.+?)\.\.\./i), r) return i("toast.downloadingFile", "Downloading {filename}...", { filename: r[1] });
+ if (r = t.match(/Playback ([0-9]+(?:\.[0-9]+)?)x/i), r) return i("toast.playbackRate", "Playback {rate}x", { rate: Number(r[1]).toFixed(2) });
+ if (r = t.match(/Metadata refreshed(?:\s*(.*))?/i), r) return i("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: r[1] ? " (" + r[1] + ")" : "" });
+ if (r = t.match(/Error renaming(?: file)?:\s*(.+)/i), r) return i("toast.errorRenaming", "Error renaming file: {error}", { error: r[1] });
+ if (r = t.match(/Error deleting(?: files?| file)?:\s*(.+)/i), r) return i("toast.errorDeleting", "Error deleting file: {error}", { error: r[1] });
+ if (r = t.match(/Tag merge failed:\s*(.+)/i), r) return i("toast.tagMergeFailed", "Tag merge failed: {error}", { error: r[1] });
+ if (r = t.match(/Delete failed:\s*(.+)/i), r) return i("toast.deleteFailed", "Delete failed: {error}", { error: r[1] });
+ if (r = t.match(/Analysis not started:\s*(.+)/i), r) return i("toast.analysisNotStarted", "Analysis not started: {error}", { error: r[1] });
+ if (r = t.match(/(\d+)\s+files deleted successfully!/i), r) return i("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 i("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 i("toast.filesDeletedShort", "{n} files deleted", { n: Number(r[1]) });
+ if (r = t.match(/(\d+)\s+deleted,\s+(\d+)\s+failed/i), r) return i("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 i("toast.copiedToClipboardNamed", "{name} copied to clipboard!", { name: r[1] });
+ if (r = t.match(/Folder created:\s*(.+)/i), r) return i("toast.folderCreated", "Folder created: {name}", { name: r[1] });
+ if (r = t.match(/Failed to create folder:\s*(.+)/i), r) return i("toast.createFolderFailedDetail", "Failed to create folder: {error}", { error: r[1] });
+ if (r = t.match(/Failed to rename folder:\s*(.+)/i), r) return i("toast.renameFolderFailedDetail", "Failed to rename folder: {error}", { error: r[1] });
+ if (r = t.match(/Failed to move folder:\s*(.+)/i), r) return i("toast.moveFolderFailedDetail", "Failed to move folder: {error}", { error: r[1] });
+ if (r = t.match(/Failed to delete folder:\s*(.+)/i), r) return i("toast.deleteFolderFailedDetail", "Failed to delete folder: {error}", { error: r[1] });
+ if (r = t.match(/Error removing from collection:\s*(.+)/i), r) return i("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": i("toast.failedAddFolder", "Failed to add custom folder"),
+ "remove folder": i("toast.failedRemoveFolder", "Failed to remove custom folder"),
+ "create collection": i("toast.failedCreateCollection", "Failed to create collection"),
+ "delete collection": i("toast.failedDeleteCollection", "Failed to delete collection")
+ };
+ for (let [n, r] of Object.entries(t)) if (e.includes(n)) return r;
+ }
+ return t;
+}
+function M(t, n = "info", r, a) {
+ if (n = Ce(n), t = Ee(t), r ??= Te(n), !a?.noHistory) try {
+ ve(j(t, n, r, a), n, r ?? void 0);
+ } catch {}
+ let o = !(Number.isFinite(Number(r)) && Number(r) > 0);
+ try {
+ let a = e();
+ if (a && typeof a.add == "function") {
+ let e = n;
+ e === "warning" && (e = "warn");
+ let s = i("manager.title"), c = t;
+ if (typeof t == "object" && t?.summary) s = t.summary, c = t.detail || "";
+ else if (typeof t != "string") try {
+ c = t.message || String(t);
+ } catch (e) {
+ console.debug?.(e);
+ }
+ let l = {
+ severity: e,
+ summary: s,
+ detail: c
+ };
+ o || (l.life = r), a.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(t, n);
+ } catch (e) {
+ console.debug("Native app.ui.toast failed", e);
+ }
+ console.warn("[Majoor Toast] Native toast API unavailable", {
+ type: n,
+ message: A(t),
+ duration: o ? 0 : r
+ });
+}
+//#endregion
+//#region ui/api/clientAuth.ts
+var De = 2e3, Oe = 15e3, ke = 8e3, N = "__mjr_write_token", P = "token", F = null, I = null, Ae = null, L = C({
+ ttlMs: De,
+ maxSize: 1
+});
+function je() {
+ try {
+ return String(sessionStorage?.getItem?.(N) || "").trim();
+ } catch {
+ return "";
+ }
+}
+function R(e) {
+ let t = String(e || "").trim();
+ try {
+ return t ? sessionStorage?.setItem?.(N, t) : sessionStorage?.removeItem?.(N), !0;
+ } catch {
+ return !1;
+ }
+}
+function z() {
+ try {
+ let e = localStorage?.getItem?.(s), 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?.(s, JSON.stringify(n)));
+ } catch (e) {
+ console.debug?.(e);
+ }
+}
+function B() {
+ try {
+ L.delete(P);
+ } catch (e) {
+ console.debug?.(e);
+ }
+ R(""), z();
+}
+function V() {
+ let e = L.get(P);
+ if (e !== void 0) return e;
+ let t = Date.now(), n = je();
+ if (n) return L.set(P, n, { at: t }), n;
+ try {
+ let e = localStorage?.getItem?.(s), 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?.(s, 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 H(e) {
+ let t = String(e || "").trim();
+ if (!t) return !1;
+ try {
+ L.set(P, t), I = null, R(t), z();
+ try {
+ window?.dispatchEvent?.(new CustomEvent("mjr-settings-changed", { detail: { key: "security.apiToken" } }));
+ } catch (e) {
+ console.debug?.(e);
+ }
+ return !0;
+ } catch {
+ return !1;
+ }
+}
+var Me = /^[A-Za-z0-9._\-~+/]+=*$/;
+function Ne(e) {
+ let t = String(e || "").trim();
+ return t ? Me.test(t) ? H(t) : (console.debug?.("[MJR auth] Rejected malformed security token (invalid characters)"), !1) : !1;
+}
+function U(e = {}) {
+ I = {
+ code: String(e?.code || "").trim().toUpperCase(),
+ error: String(e?.error || "").trim(),
+ status: Number(e?.status || 0) || 0,
+ at: Date.now()
+ };
+}
+function W() {
+ let e = I;
+ if (!e) return null;
+ let t = Date.now() - (Number(e.at || 0) || 0);
+ return t < 0 || t > Oe ? (I = null, null) : e;
+}
+function Pe(e) {
+ let t = W(), n = String(e?.code || "").trim().toUpperCase(), r = String(e?.error || "").trim(), a = String(t?.code || "").trim().toUpperCase(), o = String(t?.error || "").trim().toLowerCase(), s = r.toLowerCase();
+ return a === "FORBIDDEN" && (o.includes("already configured") || o.includes("rotate-token")) ? i("toast.writeAuthConfiguredTokenRequired", "Write access requires the Majoor API token already configured on the server. Open Settings -> Security -> API Token and enter the matching token.") : a === "AUTH_REQUIRED" && (o.includes("sign in to comfyui") || o.includes("authenticated comfyui user")) ? i("toast.writeAuthSignInRequired", "Write access is blocked. Sign in to ComfyUI first, then retry so Majoor can bootstrap the remote session token automatically.") : a === "BOOTSTRAP_DISABLED" || a === "AUTH_REQUIRED" && o.includes("bootstrap") || n === "AUTH_REQUIRED" && s.includes("api token") ? i("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 Fe(e) {
+ let t = String(e || "").trim();
+ if (!t) return;
+ let n = Date.now(), r = Ae;
+ if (!(r && r.message === t && n - (Number(r.at || 0) || 0) < ke)) {
+ Ae = {
+ message: t,
+ at: n
+ };
+ try {
+ M({
+ summary: i("toast.writeAuthTitle", "Majoor remote write access"),
+ detail: t
+ }, "warning", 6500, { noHistory: !0 });
+ } catch (e) {
+ console.debug?.(e);
+ }
+ }
+}
+function Ie(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 = Pe(e);
+ return i ? (Fe(i), {
+ ...e,
+ error: i
+ }) : e;
+}
+async function Le() {
+ 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 U({
+ 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 U({
+ code: "INVALID_RESPONSE",
+ error: "Bootstrap token response was invalid.",
+ status: e.status
+ }), {
+ ok: !1,
+ token: !1
+ };
+ if (!t.ok) return U({
+ code: t?.code,
+ error: t?.error,
+ status: e.status
+ }), {
+ ok: !1,
+ token: !1
+ };
+ let n = String(t?.data?.token || "").trim();
+ return n ? {
+ ok: H(n),
+ token: !0
+ } : (I = null, {
+ ok: !0,
+ token: !1
+ });
+ } catch (e) {
+ return U({
+ code: "NETWORK_ERROR",
+ error: e?.message || "Bootstrap token request failed.",
+ status: 0
+ }), {
+ ok: !1,
+ token: !1
+ };
+ }
+}
+async function Re({ force: e = !1, allowCookieRefresh: t = !1 } = {}) {
+ let n = V();
+ if (n && !e) return n;
+ let r = {
+ ok: !1,
+ token: !1
+ };
+ F ||= (async () => {
+ try {
+ return await Le();
+ } finally {
+ F = null;
+ }
+ })();
+ try {
+ r = await F || r;
+ } catch (e) {
+ console.debug?.(e);
+ }
+ if (e && r?.ok && !r?.token && n) B();
+ else if (e && !r?.ok) {
+ let e = W(), t = String(e?.code || "").trim().toUpperCase();
+ (!t || !["NETWORK_ERROR", "INVALID_RESPONSE"].includes(t)) && B();
+ }
+ let i = V();
+ return !i && t && r?.ok ? !0 : i;
+}
+function ze() {
+ L.clear();
+}
+//#endregion
+//#region ui/api/clientOps.ts
+async function Be(e) {
+ return !e || typeof e != "string" ? {
+ ok: !1,
+ error: "Missing mode",
+ code: "INVALID_INPUT"
+ } : Q("/mjr/am/settings/probe-backend", { mode: e });
+}
+async function Ve() {
+ return Z(t.SETTINGS_METADATA_FALLBACK);
+}
+async function He({ image: e, media: n } = {}) {
+ return Q(t.SETTINGS_METADATA_FALLBACK, {
+ image: e,
+ media: n
+ });
+}
+async function Ue() {
+ return Z(t.SETTINGS_VECTOR_SEARCH);
+}
+async function We(e = !0) {
+ if (e && typeof e == "object") {
+ let n = {};
+ return "enabled" in e && (n.enabled = !!e.enabled), "caption_on_index" in e && (n.caption_on_index = !!e.caption_on_index), "captionOnIndex" in e && (n.caption_on_index = !!e.captionOnIndex), Q(t.SETTINGS_VECTOR_SEARCH, n);
+ }
+ return Q(t.SETTINGS_VECTOR_SEARCH, { enabled: !!e });
+}
+async function Ge() {
+ return Z(t.SETTINGS_EXECUTION_GROUPING);
+}
+async function Ke(e = !0) {
+ return Q(t.SETTINGS_EXECUTION_GROUPING, { enabled: !!e });
+}
+async function qe() {
+ return Z(t.SETTINGS_HUGGINGFACE);
+}
+async function Je(e = "") {
+ return Q(t.SETTINGS_HUGGINGFACE, { token: String(e ?? "").trim() });
+}
+async function Ye() {
+ return Z(t.SETTINGS_AI_LOGGING);
+}
+async function Xe(e = !1) {
+ return Q(t.SETTINGS_AI_LOGGING, { enabled: !!e });
+}
+async function Ze() {
+ return Z(t.SETTINGS_ROUTE_LOGGING);
+}
+async function Qe(e = !1) {
+ return Q(t.SETTINGS_ROUTE_LOGGING, { enabled: !!e });
+}
+async function $e() {
+ return Z(t.SETTINGS_STARTUP_LOGGING);
+}
+async function et(e = !1) {
+ return Q(t.SETTINGS_STARTUP_LOGGING, { enabled: !!e });
+}
+async function tt() {
+ return Z(t.SETTINGS_LTXAV_RGB_FALLBACK);
+}
+async function nt(e = !1) {
+ return Q(t.SETTINGS_LTXAV_RGB_FALLBACK, { enabled: !!e });
+}
+async function rt() {
+ return Z(t.SETTINGS_OUTPUT_DIRECTORY);
+}
+async function it(e, n = {}) {
+ let r = String(e ?? "").trim();
+ return Q(t.SETTINGS_OUTPUT_DIRECTORY, { output_directory: r }, n);
+}
+async function at() {
+ return Z(t.SETTINGS_INDEX_DIRECTORY);
+}
+async function ot(e, n = {}) {
+ let r = String(e ?? "").trim();
+ return Q(t.SETTINGS_INDEX_DIRECTORY, { index_directory: r }, n);
+}
+async function st() {
+ return Z("/mjr/am/settings/security");
+}
+async function ct(e) {
+ return Q("/mjr/am/settings/security", e && typeof e == "object" ? e : {});
+}
+async function lt() {
+ let e = await Q("/mjr/am/settings/security/bootstrap-token", {});
+ if (e?.ok) try {
+ let t = String(e?.data?.token || "").trim();
+ t && H(t);
+ } catch (e) {
+ console.debug?.(e);
+ }
+ return e;
+}
+async function ut(e) {
+ if (e && typeof e == "object") {
+ let t = String(e.filepath || e.path || e?.file_info?.filepath || "").trim();
+ return e.id == null ? Q("/mjr/am/open-in-folder", { filepath: t }) : Q("/mjr/am/open-in-folder", { asset_id: o(e.id) });
+ }
+ return Q("/mjr/am/open-in-folder", { asset_id: o(e) });
+}
+async function dt({ op: e = "", path: n = "", name: r = "", destination: i = "", recursive: a = !0 } = {}, o = {}) {
+ let s = {
+ op: String(e || "").trim().toLowerCase(),
+ path: String(n || "").trim()
+ };
+ return r != null && String(r).trim() && (s.name = String(r).trim()), i != null && String(i).trim() && (s.destination = String(i).trim()), s.op === "delete" && (s.recursive = !!a), Q(t.BROWSER_FOLDER_OP, s, o);
+}
+async function ft(e = {}) {
+ let n = (e, t) => e == null ? t : !!e, r = String(e.scope || "output").trim().toLowerCase() || "output", i = e.customRootId ?? e.custom_root_id ?? e.rootId ?? e.root_id ?? e.customRoot ?? null, a = {
+ scope: r,
+ reindex: n(e.reindex, !0),
+ hard_reset_db: n(e.hardResetDb ?? e.hard_reset_db ?? e.deleteDbFiles ?? e.delete_db_files ?? e.deleteDb ?? e.delete_db ?? void 0, r === "all"),
+ clear_scan_journal: n(e.clearScanJournal ?? e.clear_scan_journal, !0),
+ clear_metadata_cache: n(e.clearMetadataCache ?? e.clear_metadata_cache, !0),
+ clear_asset_metadata: n(e.clearAssetMetadata ?? e.clear_asset_metadata, !0),
+ clear_assets: n(e.clearAssets ?? e.clear_assets, !0),
+ preserve_vectors: n(e.preserveVectors ?? e.preserve_vectors ?? e.keepVectors ?? e.keep_vectors, !1),
+ rebuild_fts: n(e.rebuildFts ?? e.rebuild_fts, !0),
+ incremental: n(e.incremental, !1),
+ fast: n(e.fast, !0),
+ background_metadata: n(e.backgroundMetadata ?? e.background_metadata, !0),
+ maintenance_force: n(e.maintenanceForce ?? e.maintenance_force, !1)
+ };
+ return i && (a.custom_root_id = String(i)), Q(t.INDEX_RESET, a);
+}
+async function pt({ scope: e = "output", customRootId: n = "" } = {}) {
+ let r = String(e || "output").trim().toLowerCase() || "output", i = String(n || "").trim(), a = { scope: r };
+ return i && (a.custom_root_id = i), Q(t.WATCHER_SCOPE, a);
+}
+async function mt(e = {}) {
+ return Z(t.WATCHER_STATUS, e);
+}
+async function ht(e = !0) {
+ return Q(t.WATCHER_TOGGLE, { enabled: !!e });
+}
+async function gt() {
+ return Z(t.WATCHER_SETTINGS);
+}
+async function _t(e = {}) {
+ return Q(t.WATCHER_SETTINGS, e);
+}
+async function vt(e = {}) {
+ return Z(t.TOOLS_STATUS, e);
+}
+async function yt(e = {}) {
+ return Z(t.STATUS, e);
+}
+async function bt() {
+ return Q("/mjr/am/db/force-delete", {});
+}
+async function xt(e = {}) {
+ return Z(t.DB_BACKUPS, e);
+}
+async function St() {
+ return Q(t.DB_BACKUP_SAVE, {});
+}
+async function Ct({ name: e = "", useLatest: n = !1 } = {}) {
+ let r = {};
+ return e && (r.name = String(e)), n && (r.use_latest = !0), Q(t.DB_BACKUP_RESTORE, r);
+}
+async function wt(e = 250) {
+ return Q("/mjr/am/duplicates/analyze", { limit: Math.max(10, Math.min(5e3, Number(e) || 250)) });
+}
+async function Tt({ 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)))}`, Z(a, i);
+}
+async function Et(e, t = []) {
+ return Q("/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 Dt(e) {
+ let t, n;
+ if (e && typeof e == "object") {
+ t = o(e.id);
+ let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim();
+ n = t ? { asset_id: t } : { filepath: r };
+ } else t = o(e), n = { asset_id: t };
+ let r = await Q("/mjr/am/asset/delete", n);
+ return r?.ok && t && kt([t]), r;
+}
+async function Ot(e) {
+ let t = Array.isArray(e) ? e.map((e) => o(e)).filter(Boolean) : [], n = await Q("/mjr/am/assets/delete", { ids: t });
+ return n?.ok && kt(t), n;
+}
+function kt(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 At(e, t) {
+ let n;
+ if (e && typeof e == "object") {
+ n = o(e.id);
+ let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(), i = n ? await Q("/mjr/am/asset/rename", {
+ asset_id: n,
+ new_name: t
+ }) : await Q("/mjr/am/asset/rename", {
+ filepath: r,
+ new_name: t
+ });
+ if (i?.ok && n) try {
+ let e = await $(n);
+ e?.ok && e?.data && (i.data = {
+ ...i.data || {},
+ asset: e.data
+ });
+ } catch (e) {
+ console.debug?.(e);
+ }
+ return i;
+ }
+ n = o(e);
+ let r = await Q("/mjr/am/asset/rename", {
+ asset_id: n,
+ new_name: t
+ });
+ if (r?.ok && n) try {
+ let e = await $(n);
+ e?.ok && e?.data && (r.data = {
+ ...r.data || {},
+ asset: e.data
+ });
+ } catch (e) {
+ console.debug?.(e);
+ }
+ return r;
+}
+async function jt() {
+ let e = typeof AbortController < "u" ? new AbortController() : null, t = null;
+ try {
+ return e && (t = setTimeout(() => e.abort(), 1e4)), await Z("/mjr/am/collections", e ? { signal: e.signal } : {});
+ } finally {
+ t && clearTimeout(t);
+ }
+}
+async function Mt(e) {
+ return Q("/mjr/am/collections", { name: String(e || "").trim() });
+}
+async function Nt(e) {
+ let t = String(e || "").trim();
+ return Q(`/mjr/am/collections/${encodeURIComponent(t)}/delete`, {});
+}
+async function Pt(e, t) {
+ let n = String(e || "").trim(), r = Array.isArray(t) ? t : [];
+ return Q(`/mjr/am/collections/${encodeURIComponent(n)}/add`, { assets: r });
+}
+async function Ft(e, t) {
+ let n = String(e || "").trim(), r = Array.isArray(t) ? t : [];
+ return Q(`/mjr/am/collections/${encodeURIComponent(n)}/remove`, { filepaths: r });
+}
+async function It(e) {
+ let t = String(e || "").trim();
+ return Z(`/mjr/am/collections/${encodeURIComponent(t)}/assets`);
+}
+async function Lt(e, r = 20) {
+ let i = String(e || "").trim();
+ if (!i) return {
+ ok: !1,
+ error: "Empty query"
+ };
+ let a = r && typeof r == "object" ? r : { topK: Number(r) }, o = Math.max(1, Math.min(200, Number(a?.topK ?? 20) || 20)), s = String(a?.scope || "").trim(), c = String(a?.customRootId || "").trim(), l = `${t.VECTOR_SEARCH}?q=${encodeURIComponent(i)}&top_k=${o}`;
+ return s && (l += `&scope=${encodeURIComponent(s)}`), c && (l += `&custom_root_id=${encodeURIComponent(c)}`), l = n(l, {
+ subfolder: a?.subfolder ?? null,
+ kind: a?.kind ?? null,
+ hasWorkflow: a?.hasWorkflow ?? null,
+ minRating: a?.minRating ?? null,
+ minSizeMB: a?.minSizeMB ?? null,
+ maxSizeMB: a?.maxSizeMB ?? null,
+ minWidth: a?.minWidth ?? null,
+ minHeight: a?.minHeight ?? null,
+ maxWidth: a?.maxWidth ?? null,
+ maxHeight: a?.maxHeight ?? null,
+ workflowType: a?.workflowType ?? null,
+ workflowId: a?.workflowId ?? null,
+ dateRange: a?.dateRange ?? null,
+ dateExact: a?.dateExact ?? null
+ }), Z(l, { timeoutMs: 12e4 });
+}
+async function Rt(e, n = 20) {
+ let r = String(e || "").trim();
+ if (!r) return {
+ ok: !1,
+ error: "Missing asset ID"
+ };
+ let i = n && typeof n == "object" ? n : { topK: Number(n) }, a = Math.max(1, Math.min(200, Number(i?.topK ?? 20) || 20)), o = String(i?.scope || "").trim(), s = String(i?.customRootId || "").trim(), c = `${t.VECTOR_SIMILAR}/${encodeURIComponent(r)}?top_k=${a}`;
+ return o && (c += `&scope=${encodeURIComponent(o)}`), s && (c += `&custom_root_id=${encodeURIComponent(s)}`), Z(c, { dedupeKey: `vec:${r}:${a}:${o}:${s}` });
+}
+async function zt(e) {
+ let n = String(e || "").trim();
+ return n ? Z(`${t.VECTOR_ALIGNMENT}/${encodeURIComponent(n)}`) : {
+ ok: !1,
+ error: "Missing asset ID"
+ };
+}
+async function Bt(e) {
+ let n = String(e || "").trim();
+ return n ? Q(`${t.VECTOR_INDEX}/${encodeURIComponent(n)}`, {}) : {
+ ok: !1,
+ error: "Missing asset ID"
+ };
+}
+async function Vt() {
+ return Z(t.VECTOR_STATS);
+}
+async function Ht(e = 64, n = {}) {
+ let r = Math.max(1, Math.min(200, e)), i = typeof n?.onProgress == "function" ? n.onProgress : null, a = String(n?.scope || "").trim().toLowerCase(), o = String(n?.customRootId ?? n?.custom_root_id ?? "").trim(), s = `${t.VECTOR_BACKFILL}?batch_size=${r}&async=1`;
+ a && (s += `&scope=${encodeURIComponent(a)}`), o && (s += `&custom_root_id=${encodeURIComponent(o)}`);
+ let c = await Q(s, {}, { timeoutMs: 3e4 });
+ if (!c?.ok) return c;
+ let l = c?.data || {}, u = String(l?.status || "").toLowerCase(), d = String(l?.backfill_id || "").trim();
+ try {
+ i?.(l);
+ } catch (e) {
+ console.debug?.(e);
+ }
+ if (!d || ![
+ "queued",
+ "running",
+ "pending"
+ ].includes(u)) return c;
+ let f = Number(n?.pollIntervalMs), p = Number(n?.pollTimeoutMs), m = Number.isFinite(f) ? Math.max(500, Math.min(1e4, Math.floor(f))) : Xt, h = Number.isFinite(p) ? Math.max(1e4, Math.min(Qt, Math.floor(p))) : Zt, g = Date.now(), v = null;
+ for (; Date.now() - g < h;) {
+ await _(m);
+ let e = await Z(`${t.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 });
+ if (!e?.ok) {
+ v = e;
+ continue;
+ }
+ let n = e?.data || {}, r = String(n?.status || "").toLowerCase();
+ v = e;
+ try {
+ i?.(n);
+ } catch (e) {
+ console.debug?.(e);
+ }
+ if (r === "succeeded") return {
+ ok: !0,
+ data: n?.result || {},
+ code: null,
+ status: 200
+ };
+ if (r === "failed") return {
+ ok: !1,
+ error: String(n?.error || "Vector backfill failed"),
+ code: String(n?.code || "DB_ERROR"),
+ data: n,
+ status: 500
+ };
+ }
+ let y = await Z(`${t.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }), b = y?.data || v?.data || {}, x = String(b?.status || "").toLowerCase();
+ if (y?.ok && [
+ "queued",
+ "running",
+ "pending"
+ ].includes(x)) {
+ try {
+ i?.(b);
+ } catch (e) {
+ console.debug?.(e);
+ }
+ return {
+ ok: !0,
+ code: "PENDING",
+ status: 202,
+ data: {
+ ...b,
+ pending: !0,
+ timed_out: !0,
+ poll_timeout_ms: h,
+ backfill_id: String(b?.backfill_id || d),
+ status: x || "running"
+ },
+ meta: { pending: !0 }
+ };
+ }
+ return y?.ok && x === "failed" ? {
+ ok: !1,
+ error: String(b?.error || "Vector backfill failed"),
+ code: String(b?.code || "DB_ERROR"),
+ data: b,
+ status: 500
+ } : {
+ ok: !1,
+ error: `Vector backfill polling timed out after ${h}ms`,
+ code: "TIMEOUT",
+ data: b || null,
+ status: 408
+ };
+}
+async function Ut(e) {
+ let n = String(e || "").trim();
+ return n ? Q(`${t.VECTOR_CAPTION}/${encodeURIComponent(n)}`, {}) : {
+ ok: !1,
+ error: "Missing asset ID"
+ };
+}
+async function Wt(e, { topK: r = 50, scope: i = "output", customRootId: a = "", subfolder: o = null, kind: s = null, hasWorkflow: c = null, minRating: l = null, minSizeMB: u = null, maxSizeMB: d = null, minWidth: f = null, minHeight: p = null, maxWidth: m = null, maxHeight: h = null, workflowType: g = null, workflowId: _ = null, dateRange: v = null, dateExact: y = null } = {}) {
+ let b = String(e || "").trim();
+ if (!b) return {
+ ok: !1,
+ error: "Empty query"
+ };
+ let x = `${t.HYBRID_SEARCH}?q=${encodeURIComponent(b)}&top_k=${Math.max(1, Math.min(200, r))}&scope=${encodeURIComponent(i)}`;
+ return a && (x += `&custom_root_id=${encodeURIComponent(a)}`), x = n(x, {
+ subfolder: o,
+ kind: s,
+ hasWorkflow: c,
+ minRating: l,
+ minSizeMB: u,
+ maxSizeMB: d,
+ minWidth: f,
+ minHeight: p,
+ maxWidth: m,
+ maxHeight: h,
+ workflowType: g,
+ workflowId: _,
+ dateRange: v,
+ dateExact: y
+ }), Z(x, { timeoutMs: 12e4 });
+}
+async function Gt(e = 8) {
+ return Q(t.VECTOR_SUGGEST_COLLECTIONS, { k: Math.max(2, Math.min(20, e)) });
+}
+//#endregion
+//#region ui/api/client.ts
+var Kt = 3e4, qt = "__MJR_API_CLIENT__", Jt = 2e3, Yt = 200, Xt = 1e3, Zt = 30 * 6e4, Qt = 720 * 6e4, G = "settings", $t = "available-tags", K = C({
+ ttlMs: Jt,
+ maxSize: 1
+}), q = C({
+ ttlMs: Jt,
+ maxSize: 1
+}), J = C({
+ ttlMs: () => rn(),
+ maxSize: 1
+}), en = new Set([
+ "1",
+ "true",
+ "yes",
+ "on"
+]), tn = new Set([
+ "0",
+ "false",
+ "no",
+ "off"
+]);
+function nn(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 (en.has(t)) return !0;
+ if (tn.has(t)) return !1;
+ }
+ return !!t;
+}
+function rn() {
+ 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(10 * 6e4, Math.floor(r))) : Kt;
+ } catch {
+ return Kt;
+ }
+}
+function an() {
+ K.clear();
+}
+function on() {
+ q.clear();
+}
+function Y() {
+ J.clear();
+}
+function sn(e) {
+ return String(e ?? "").trim().toLowerCase() || "";
+}
+function cn(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 = sn(e);
+ !i || n.has(i) || (n.add(i), t.push(e));
+ }
+ return t;
+}
+try {
+ let e = typeof window < "u" ? window : null;
+ e && !e[qt] && (e[qt] = { initialized: !0 }, e.addEventListener?.("storage", (e) => {
+ try {
+ e?.key === "mjrSettings" && (an(), on(), Y(), ze());
+ } catch (e) {
+ console.debug?.(e);
+ }
+ }), e.addEventListener?.("mjr-settings-changed", () => {
+ an(), on(), Y(), ze();
+ }));
+} catch (e) {
+ console.debug?.(e);
+}
+var ln = () => {
+ let e = K.get(G);
+ if (e !== void 0) return e;
+ let t = Date.now();
+ try {
+ let e = localStorage?.getItem?.(s);
+ if (!e) return K.set(G, !1, { at: t }), !1;
+ let n = !!JSON.parse(e)?.observability?.enabled;
+ return K.set(G, n, { at: t }), n;
+ } catch {
+ return K.set(G, !1, { at: t }), !1;
+ }
+}, un = () => {
+ let e = q.get(G);
+ if (e !== void 0) return e;
+ let t = Date.now();
+ try {
+ let e = localStorage?.getItem?.(s);
+ if (!e) return q.set(G, !0, { at: t }), !0;
+ let n = JSON.parse(e)?.ratingTagsSync?.enabled, r = n == null ? !0 : nn(n, !0);
+ return q.set(G, r, { at: t }), r;
+ } catch {
+ return q.set(G, !0, { at: t }), !0;
+ }
+}, X = se({
+ readObsEnabled: ln,
+ readAuthToken: V,
+ ensureWriteAuthToken: Re,
+ normalizeWriteAuthFailure: Ie
+}), dn = X.fetchAPI;
+async function Z(e, t = {}) {
+ return X.get(e, t);
+}
+async function Q(e, t, n = {}) {
+ return X.post(e, t, n);
+}
+async function fn(e, t, n = {}) {
+ let i = un(), a = e && typeof e == "object" ? e : null, s = o(a ? a.id : e), c = { rating: Math.max(0, Math.min(5, Number(t) || 0)) };
+ return s ? c.asset_id = s : a && (c.filepath = a.filepath || a.path || a?.file_info?.filepath || "", c.type = a.type || "output", c.root_id = r(a)), dn("/mjr/am/asset/rating", {
+ ...n,
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ ...i ? { "X-MJR-RTSYNC": "on" } : {}
+ },
+ body: JSON.stringify(c)
+ });
+}
+async function pn(e, t, n = {}) {
+ let i = un(), a = e && typeof e == "object" ? e : null, s = o(a ? a.id : e), c = { tags: Array.isArray(t) ? t : [] };
+ s ? c.asset_id = s : a && (c.filepath = a.filepath || a.path || a?.file_info?.filepath || "", c.type = a.type || "output", c.root_id = r(a));
+ let l = await dn("/mjr/am/asset/tags", {
+ ...n,
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ ...i ? { "X-MJR-RTSYNC": "on" } : {}
+ },
+ body: JSON.stringify(c)
+ });
+ return l?.ok && Y(), l;
+}
+async function mn() {
+ let e = J.get($t);
+ if (Array.isArray(e)) return {
+ ok: !0,
+ data: e,
+ error: null,
+ code: "OK",
+ meta: { cached: !0 }
+ };
+ let t = await Z("/mjr/am/tags");
+ if (t?.ok && Array.isArray(t.data)) {
+ let e = cn(t.data);
+ return J.set($t, e), {
+ ...t,
+ data: e
+ };
+ }
+ return t;
+}
+async function $(e, t = {}) {
+ let n = encodeURIComponent(o(e));
+ return Z(`/mjr/am/asset/${n}`, {
+ ...t,
+ dedupeKey: t?.dedupeKey || `meta:${n}`
+ });
+}
+async function hn(e, t = {}) {
+ let n = o(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 Z(r, a);
+}
+async function gn(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 >= Yt)) break;
+ }
+ return r.length ? Q("/mjr/am/assets/batch", { asset_ids: r }, t) : {
+ ok: !0,
+ data: [],
+ error: null,
+ code: "OK"
+ };
+}
+async function _n({ 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)}`), Z(f, o);
+}
+async function vn({ filepath: e = "", root_id: n = "", subfolder: r = "" } = {}, i = {}) {
+ try {
+ if (globalThis.__mjrFolderInfoSupported === !1) return {
+ ok: !1,
+ data: null,
+ error: "Folder info endpoint unavailable",
+ code: "UNAVAILABLE"
+ };
+ if (globalThis.__mjrFolderInfoSupported == null) {
+ let e = await Z("/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 a = String(e || "").trim(), o = String(n || "").trim(), s = String(r || "").trim(), c = t.FOLDER_INFO, l = [];
+ a ? (l.push(`filepath=${encodeURIComponent(a)}`), l.push("browser_mode=1")) : (o && l.push(`root_id=${encodeURIComponent(o)}`), s && l.push(`subfolder=${encodeURIComponent(s)}`)), l.length && (c += `?${l.join("&")}`);
+ let u = await Z(c, i);
+ try {
+ !u?.ok && Number(u?.status || 0) === 404 && (globalThis.__mjrFolderInfoSupported = !1);
+ } catch (e) {
+ console.debug?.(e);
+ }
+ return u;
+}
+//#endregion
+export { Be as $, st as A, ut as B, qe as C, xe as Ct, rt as D, Ve as E, s as Et, mt as F, St as G, At as H, Wt as I, Je as J, Xe as K, jt as L, vt as M, Ue as N, Ze as O, gt as P, it as Q, xt as R, Ge as S, ye as St, tt as T, c as Tt, ft as U, Ft as V, Ct as W, nt as X, ot as Y, He as Z, Nt as _, M as _t, _n as a, wt as at, It as b, Se as bt, Q as c, Ht as ct, Pt as d, zt as dt, Qe as et, lt as f, Bt as ft, Ot as g, Ne as gt, Dt as h, Gt as ht, mn as i, pt as it, $e as j, yt as k, fn as l, Rt as lt, Mt as m, Vt as mt, $ as n, et as nt, vn as o, ht as ot, dt as p, Lt as pt, Ke as q, gn as r, We as rt, hn as s, _t as st, Z as t, ct as tt, pn as u, Ut as ut, bt as v, we as vt, at as w, C as wt, Tt as x, be as xt, Ye as y, de as yt, Et as z };
diff --git a/dist/chunks/hostAdapter-D6BwD-lN.js b/dist/chunks/config-Cxv7acF8.js
similarity index 57%
rename from dist/chunks/hostAdapter-D6BwD-lN.js
rename to dist/chunks/config-Cxv7acF8.js
index 566384d7..a0902333 100644
--- a/dist/chunks/hostAdapter-D6BwD-lN.js
+++ b/dist/chunks/config-Cxv7acF8.js
@@ -1,377 +1,291 @@
-import { b as e, i as t, r as n, v as r, y as i } from "./config-dvcltBqE.js";
-//#region ui/app/settingsStore.ts
-var a = "mjrSettings", o = "mjrMinimapSettings", s = new Set([
- "POST",
- "PUT",
- "DELETE",
- "PATCH"
-]), c = 2e4, l = 3e5, u = 3, d = 400, f = "/mjr/am/settings/security/bootstrap-token", p = "/mjr/am/", m = /* @__PURE__ */ new Map();
-function ee(e) {
- return new Promise((t) => setTimeout(t, e));
-}
-function h(e) {
- return s.has(String(e || "").trim().toUpperCase());
-}
-function g(e) {
+import { a as e, n as t, s as n } from "./graphTraversal-CjIZsRsP.js";
+//#region ui/utils/ids.ts
+function r(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] || "";
+ return String(e ?? "").trim();
} catch {
return "";
}
}
-function _(e) {
- return g(e).startsWith(p);
-}
-function v(e) {
- return g(e) === f;
-}
-function y(e) {
+var i = 0;
+function a(e) {
+ let t = Math.max(4, Number(e) || 0);
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");
+ let e = globalThis.crypto;
+ if (!e?.getRandomValues) return "";
+ let n = new Uint8Array(t);
+ return e.getRandomValues(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join("");
} catch {
- return !1;
+ return "";
}
}
-function b(e = {}) {
+function o(e = "", t = 16) {
+ let n = a(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 c(e) {
+ let t = r(e);
+ if (!t || !/^\d+$/.test(t)) return "";
try {
- let t = Number(e?.timeoutMs);
- return Number.isFinite(t) ? Math.max(1e3, Math.min(l, Math.floor(t))) : c;
+ let e = Number(t);
+ return !Number.isSafeInteger(e) || e <= 0 ? "" : String(e);
} catch {
- return c;
+ return "";
}
}
-function te(e = {}) {
- let t = e?.signal || null;
- if (typeof AbortController > "u") return {
- signal: t || void 0,
- timeoutMs: b(e),
- cleanup: () => {}
- };
- let n = b(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);
- }
- };
+function l(e) {
+ return c(e);
+}
+function u(e) {
try {
- i = setTimeout(() => {
- try {
- r.abort();
- } catch (e) {
- console.debug?.(e);
- }
- }, n);
- } catch (e) {
- console.debug?.(e);
+ 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 ?? "");
+ } catch {
+ return "";
}
- 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 ne(e, t, n = {}) {
- let r = String(e || "GET").trim().toUpperCase(), i = String(t || "").trim();
- return !r || !i ? "" : `${r}:${i}:timeout=${b(n)}`;
-}
-function re(e, t) {
- let n = String(e || "").trim();
- if (!n) return t();
- if (m.has(n)) return m.get(n);
- let r = Promise.resolve().then(() => t()).finally(() => {
- try {
- m.delete(n);
- } catch (e) {
- console.debug?.(e);
- }
- });
- return m.set(n, r), r;
-}
-function ie(e, t, n) {
- if (h(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 ae(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 oe(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 && h(n) && _(t) && !v(t) && Number(e.status || 0) === 401 && await i({
- force: !0,
- allowCookieRefresh: !0
- }) ? await o(t, {
- ...s,
- _authRetryDone: !0
- }, c) : {
- ok: !1,
- error: `Server returned non-JSON response (${e.status})`,
- code: "INVALID_RESPONSE",
- status: e.status,
- content_type: l,
- data: null
- };
- let u = await e.json().catch((e) => (console.debug?.("[MJR API] JSON parse error:", e), null));
- if (typeof u != "object" || !u) return {
- ok: !1,
- error: "Invalid response structure",
- code: "INVALID_RESPONSE",
- status: e.status,
- data: null
- };
- if (!("status" in u)) try {
- u.status = e.status;
- } catch (e) {
- console.debug?.(e);
- }
- return !r && h(n) && !v(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) : (h(n) && _(t) && !v(t) && (u = a(u)), u);
-}
-function se({ 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(), f = te(s), p = null;
- try {
- let i = (s.method || "GET").toUpperCase(), l = !!s?._authRetryDone, u = typeof Headers < "u" ? new Headers(s.headers || {}) : { ...s.headers };
- ie(u, i, !!e());
- let d = t();
- if (!d && h(i) && _(o) && !v(o)) {
- try {
- await n();
- } catch (e) {
- console.debug?.(e);
- }
- d = t();
- }
- ae(u, d);
- let m = {
- ...s,
- headers: u,
- signal: f.signal
- };
- try {
- delete m._authRetryDone, delete m.timeoutMs;
- } catch (e) {
- console.debug?.(e);
- }
- return p = await oe(await fetch(o, m), o, i, l, {
- ensureWriteAuthToken: n,
- normalizeWriteAuthFailure: r,
- fetchAPI: a,
- options: s,
- retryCount: c
- }), p;
- } 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 ${f.timeoutMs}ms`,
- code: "TIMEOUT",
- data: null,
- timeout_ms: f.timeoutMs
- };
- } catch (e) {
- console.debug?.(e);
- }
- if (c < u && y(e)) {
- try {
- await ee(d * (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, !p?.ok) : typeof window < "u" && window.MajoorMetrics && window.MajoorMetrics.trackApiCall(e, !p?.ok);
- } catch (e) {
- console.debug?.(e);
- }
- try {
- f.cleanup?.();
- } catch (e) {
- console.debug?.(e);
- }
- }
- }
- async function o(e, t = {}) {
- return re(t?.dedupe === !1 ? "" : String(t?.dedupeKey || "").trim() || ne("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
- };
}
//#endregion
-//#region ui/utils/ttlCache.ts
-function x({ 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 : !1 : !0;
- }
- 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);
- return;
- }
- 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;
- }
+//#region ui/utils/path.ts
+function d(e) {
+ return String(e || "").replace(/\\/g, "/");
+}
+function f(e) {
+ let t = d(e).trim();
+ if (!t) return {
+ filename: "",
+ subfolder: ""
};
+ let n = t.lastIndexOf("/");
+ return n < 0 ? {
+ filename: t,
+ subfolder: ""
+ } : {
+ filename: t.slice(n + 1),
+ subfolder: t.slice(0, n)
+ };
+}
+function p(e) {
+ return /^[a-zA-Z]:\//.test(String(e || ""));
+}
+//#endregion
+//#region ui/api/endpoints.ts
+var m = 200, h = 0, g = {
+ HEALTH: "/mjr/am/health",
+ HEALTH_COUNTERS: "/mjr/am/health/counters",
+ HEALTH_DB: "/mjr/am/health/db",
+ STATUS: "/mjr/am/status",
+ RUNTIME_EXECUTION: "/mjr/am/runtime/execution",
+ CONFIG: "/mjr/am/config",
+ VERSION: "/mjr/am/version",
+ SCAN: "/mjr/am/scan",
+ INDEX_FILES: "/mjr/am/index-files",
+ INDEX_RESET: "/mjr/am/index/reset",
+ DB_RESET: "/mjr/am/db/reset",
+ SEARCH: "/mjr/am/search",
+ LIST: "/mjr/am/list",
+ ROOTS: "/mjr/am/roots",
+ CUSTOM_ROOTS: "/mjr/am/custom-roots",
+ CUSTOM_ROOTS_REMOVE: "/mjr/am/custom-roots/remove",
+ BROWSER_FOLDER_OP: "/mjr/am/browser/folder-op",
+ BROWSE_FOLDER: "/mjr/sys/browse-folder",
+ FOLDER_INFO: "/mjr/am/folder-info",
+ METADATA: "/mjr/am/metadata",
+ WORKFLOW_QUICK: "/mjr/am/workflow-quick",
+ RETRY_SERVICES: "/mjr/am/retry-services",
+ STAGE_TO_INPUT: "/mjr/am/stage-to-input",
+ OPEN_IN_FOLDER: "/mjr/am/open-in-folder",
+ TOOLS_STATUS: "/mjr/am/tools/status",
+ SETTINGS_OUTPUT_DIRECTORY: "/mjr/am/settings/output-directory",
+ SETTINGS_INDEX_DIRECTORY: "/mjr/am/settings/index-directory",
+ SETTINGS_METADATA_FALLBACK: "/mjr/am/settings/metadata-fallback",
+ SETTINGS_VECTOR_SEARCH: "/mjr/am/settings/vector-search",
+ SETTINGS_EXECUTION_GROUPING: "/mjr/am/settings/execution-grouping",
+ SETTINGS_HUGGINGFACE: "/mjr/am/settings/huggingface",
+ SETTINGS_AI_LOGGING: "/mjr/am/settings/ai-logging",
+ SETTINGS_ROUTE_LOGGING: "/mjr/am/settings/route-logging",
+ SETTINGS_STARTUP_LOGGING: "/mjr/am/settings/startup-logging",
+ SETTINGS_LTXAV_RGB_FALLBACK: "/mjr/am/settings/ltxav-rgb-fallback",
+ VIEW: "/view",
+ CUSTOM_VIEW: "/mjr/am/custom-view",
+ VIEWER_INFO: "/mjr/am/viewer/info",
+ VIEWER_RESOURCE: "/mjr/am/viewer/resource",
+ UPLOAD_INPUT: "/mjr/am/upload_input",
+ DOWNLOAD: "/mjr/am/download",
+ DOWNLOAD_CLEAN: "/mjr/am/download-clean",
+ BATCH_ZIP_CREATE: "/mjr/am/batch-zip",
+ DATE_HISTOGRAM: "/mjr/am/date-histogram",
+ ASSET_DELETE: "/mjr/am/asset/delete",
+ ASSET_RENAME: "/mjr/am/asset/rename",
+ WATCHER_STATUS: "/mjr/am/watcher/status",
+ WATCHER_TOGGLE: "/mjr/am/watcher/toggle",
+ WATCHER_SCOPE: "/mjr/am/watcher/scope",
+ WATCHER_SETTINGS: "/mjr/am/watcher/settings",
+ COLLECTIONS: "/mjr/am/collections",
+ STACKS: "/mjr/am/stacks",
+ STACKS_MERGE: "/mjr/am/stacks/merge",
+ STACKS_DISSOLVE: "/mjr/am/stacks/dissolve",
+ STACKS_AUTO_STACK: "/mjr/am/stacks/auto-stack",
+ DUPLICATES_ALERTS: "/mjr/am/duplicates/alerts",
+ DUPLICATES_ANALYZE: "/mjr/am/duplicates/analyze",
+ DUPLICATES_MERGE_TAGS: "/mjr/am/duplicates/merge-tags",
+ DB_BACKUPS: "/mjr/am/db/backups",
+ DB_BACKUP_SAVE: "/mjr/am/db/backup-save",
+ DB_BACKUP_RESTORE: "/mjr/am/db/backup-restore",
+ VECTOR_SEARCH: "/mjr/am/vector/search",
+ VECTOR_SIMILAR: "/mjr/am/vector/similar",
+ VECTOR_ALIGNMENT: "/mjr/am/vector/alignment",
+ VECTOR_AUTO_TAGS: "/mjr/am/vector/auto-tags",
+ VECTOR_CAPTION: "/mjr/am/vector/caption",
+ VECTOR_ENHANCED_PROMPT: "/mjr/am/vector/enhanced-prompt",
+ VECTOR_INDEX: "/mjr/am/vector/index",
+ VECTOR_STATS: "/mjr/am/vector/stats",
+ VECTOR_SUGGEST_COLLECTIONS: "/mjr/am/vector/suggest-collections",
+ VECTOR_BACKFILL: "/mjr/am/db/backfill-missing-vectors",
+ VECTOR_BACKFILL_STATUS: "/mjr/am/db/backfill-missing-vectors/status",
+ HYBRID_SEARCH: "/mjr/am/search/hybrid",
+ AUDIT: "/mjr/am/audit"
+};
+function _(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, dateRange: _ = null, dateExact: v = 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(`date_range=${encodeURIComponent(String(_))}`), v && i(`date_exact=${encodeURIComponent(String(v))}`), n;
+}
+function v(e, t = null, n = "output") {
+ let r = String(e || "").trim();
+ if (!r) return "";
+ let i = `${g.VIEW}?filename=${encodeURIComponent(r)}`;
+ return t && (i += `&subfolder=${encodeURIComponent(t)}`), i += `&type=${encodeURIComponent(n)}`, i;
+}
+function ee(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: ee = null, maxHeight: y = null, workflowType: te = null, workflowId: ne = null, dateRange: re = null, dateExact: ie = null, sort: b = null, cursor: x = null, includeTotal: ae = !0, groupStacks: S = !1 } = 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, {
+ kind: s,
+ hasWorkflow: c,
+ minRating: l,
+ minSizeMB: u,
+ maxSizeMB: d,
+ minWidth: p,
+ minHeight: v,
+ maxWidth: ee,
+ maxHeight: y,
+ workflowType: te,
+ workflowId: ne,
+ dateRange: re,
+ dateExact: ie
+ }), f && (C += `&resolution_compare=${encodeURIComponent(String(f))}`), b && (C += `&sort=${encodeURIComponent(String(b))}`), x && (C += `&cursor=${encodeURIComponent(String(x))}`), ae === !1 && (C += "&include_total=0"), S && (C += "&group_stacks=1"), C;
+}
+function y(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)}`;
+ return t && (a += `&subfolder=${encodeURIComponent(t)}`), a;
+}
+function te(e) {
+ return `${g.BATCH_ZIP_CREATE}/${encodeURIComponent(String(e || ""))}`;
+}
+function ne(e) {
+ return `${g.STACKS}/${encodeURIComponent(String(e || ""))}`;
+}
+function re(e) {
+ return `${ne(e)}/members`;
+}
+function ie(e, t = {}) {
+ let n = String(e || "").trim(), r = `${g.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 b(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)}`;
+ 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());
+ 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;
+}
+function x(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, {
+ subfolder: e.subfolder ?? null,
+ kind: i,
+ hasWorkflow: a,
+ minRating: o,
+ minSizeMB: e.minSizeMB ?? null,
+ maxSizeMB: e.maxSizeMB ?? null,
+ minWidth: e.minWidth ?? null,
+ minHeight: e.minHeight ?? null,
+ maxWidth: e.maxWidth ?? null,
+ maxHeight: e.maxHeight ?? null,
+ workflowType: e.workflowType ?? null,
+ workflowId: e.workflowId ?? null,
+ dateRange: e.dateRange ?? null,
+ dateExact: e.dateExact ?? null
+ });
+}
+function ae(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?.filename || e?.name || e?.file_info?.filename || "").trim(), a = String(e?.subfolder || e?.file_info?.subfolder || "").trim(), o = ((e) => {
+ let t = {
+ type: "",
+ subfolder: "",
+ filename: ""
+ }, n = d(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) : a >= 0 ? (t.type = "input", s = a + 7) : o >= 0 && (t.type = "temp", s = o + 6), 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;
+ return t;
+ })(r);
+ if (!a && i.includes("/")) {
+ let e = i.lastIndexOf("/");
+ e > 0 && (a = i.slice(0, e), i = i.slice(e + 1));
+ }
+ if (!i && o.filename && (i = o.filename), !a && o.subfolder && (a = o.subfolder), !i) return "";
+ let s = String(e?.type || e?.file_info?.type || "").toLowerCase().trim();
+ s !== "input" && s !== "output" && s !== "temp" && s !== "custom" && (s = ""), !s && o.type && (s = o.type), !s && r && (r.includes("/input/") ? s = "input" : r.includes("/output/") ? s = "output" : r.includes("/temp/") && (s = "temp")), s ||= "output";
+ let c = r.includes("/output/") || r.includes("/input/") || r.includes("/temp/"), l = p(a) || a.startsWith("/");
+ if (r && s !== "custom" && (l || !c)) return n(S(r, { inline: !0 }));
+ if (s === "custom") {
+ let t = String(u(e) || "").trim();
+ if (t) return n(y(i, a, t));
+ if (r) return n(`${g.CUSTOM_VIEW}?filepath=${encodeURIComponent(r)}&browser_mode=1`);
+ let s = o.type || "output";
+ return n(v(i, a, s));
+ }
+ return r.includes("/output/") && (s = "output"), r.includes("/input/") && (s = "input"), r.includes("/temp/") && (s = "temp"), n(v(i, a, s));
+}
+function S(e, t = {}) {
+ if (!e) return "";
+ let n = !!t?.inline, r = `${g.DOWNLOAD}?filepath=${encodeURIComponent(e)}`;
+ return n && (r += "&preview=1"), r;
+}
+function C(e) {
+ return e ? `${g.DOWNLOAD_CLEAN}?filepath=${encodeURIComponent(e)}` : "";
}
//#endregion
//#region ui/app/comfyApiBridge.ts
-var S = null, C = null, ce = 50;
-function w(e) {
+var w = null, T = null, oe = 50;
+function E(e) {
return !!e && typeof e == "object";
}
-function T(e, t) {
+function D(e, t) {
try {
if (!e || typeof e != "object" && typeof e != "function") return null;
let n = Object.getOwnPropertyDescriptor(e, t);
@@ -380,65 +294,65 @@ function T(e, t) {
return null;
}
}
-function E(e) {
- return w(e) ? typeof e.fetchApi == "function" || typeof e.apiURL == "function" || w(e.settings) : !1;
+function O(e) {
+ return E(e) ? typeof e.fetchApi == "function" || typeof e.apiURL == "function" || E(e.settings) : !1;
}
-function le(e) {
- return w(e) ? w(e.ui) || w(e.canvas) || w(e.graph) || typeof e.loadGraphData == "function" || E(e.api) : !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 le(e) && (S = e), S;
+function se(e) {
+ return k(e) && (w = e), w;
}
-function de(e) {
- return E(e) && (C = e), C;
+function ce(e) {
+ return O(e) && (T = e), T;
}
-function D(e) {
- if (E(C)) return C;
- let t = w(e) ? e : O(), n = t?.api || t?.ui?.api || t?.ui?.app?.api || null;
- if (E(n)) return n;
+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;
try {
- let e = typeof window < "u" ? T(window, "api") : null;
- if (E(e)) return e;
+ let e = typeof window < "u" ? D(window, "api") : null;
+ if (O(e)) return e;
} catch (e) {
console.debug?.(e);
}
try {
- let e = typeof globalThis < "u" ? T(globalThis, "api") : null;
- if (E(e)) return e;
+ let e = typeof globalThis < "u" ? D(globalThis, "api") : null;
+ if (O(e)) return e;
} catch (e) {
console.debug?.(e);
}
return null;
}
-async function fe(e, t = null, n) {
- let r = D(n);
+async function le(e, t = null, n) {
+ let r = A(n);
return r && typeof r.fetchApi == "function" ? r.fetchApi(e, t || void 0) : fetch(e, {
credentials: "include",
...t || {}
});
}
-function O() {
- if (le(S)) return S;
+function j() {
+ if (k(w)) return w;
try {
- let e = typeof globalThis < "u" ? T(globalThis, "app") : null;
- if (le(e)) return e;
+ let e = typeof globalThis < "u" ? D(globalThis, "app") : null;
+ if (k(e)) return e;
} catch (e) {
console.debug?.(e);
}
try {
- let e = typeof window < "u" ? T(window, "app") : null;
- if (le(e)) return e;
+ let e = typeof window < "u" ? D(window, "app") : null;
+ if (k(e)) return e;
} catch (e) {
console.debug?.(e);
}
return null;
}
-function pe(e) {
- let t = w(e) ? e : O();
+function ue(e) {
+ let t = E(e) ? e : j();
return !t || typeof t != "object" ? null : t?.ui?.settings || t?.settings || t?.ui?.api?.settings || t?.api?.settings || null;
}
-function me(e, t) {
- let n = pe(e);
+function de(e, t) {
+ let n = ue(e);
if (!n) return null;
for (let e of [
"getSettingValue",
@@ -459,8 +373,8 @@ function me(e, t) {
}
return null;
}
-function he(e, t, n) {
- let r = pe(e);
+function fe(e, t, n) {
+ let r = ue(e);
if (!r) return !1;
for (let e of [
"setSettingValue",
@@ -479,27 +393,27 @@ function he(e, t, n) {
}
return !1;
}
-function k(e) {
- let t = w(e) ? e : O();
+function M(e) {
+ let t = E(e) ? e : j();
return t?.extensionManager || t?.ui?.extensionManager || null;
}
-function ge(e) {
- let t = k(e);
- return w(t) && (t?.sidebarTabStore || t?.sidebarTab || t?.workspaceStore?.sidebarTab) || null;
+function pe(e) {
+ let t = M(e);
+ return E(t) && (t?.sidebarTabStore || t?.sidebarTab || t?.workspaceStore?.sidebarTab) || null;
}
-function _e(e) {
- return w(e) && (e?.bottomPanel || e?.bottomPanelStore) || null;
+function me(e) {
+ return E(e) && (e?.bottomPanel || e?.bottomPanelStore) || null;
}
-function ve(e) {
- let t = k(e)?.toast || null;
+function he(e) {
+ let t = M(e)?.toast || null;
return t && typeof t.add == "function" ? t : null;
}
-function ye(e) {
- let t = k(e)?.dialog || null;
+function ge(e) {
+ let t = M(e)?.dialog || null;
return t && (typeof t.alert == "function" || typeof t.confirm == "function" || typeof t.prompt == "function") ? t : null;
}
-function be(e, t) {
- let n = w(e) ? e : O(), r = k(n), i = ge(n), a = String(t || "").trim();
+function _e(e, t) {
+ let n = E(e) ? e : j(), r = M(n), i = pe(n), a = String(t || "").trim();
if (!r || !a) return !1;
let o = [
"activateSidebarTab",
@@ -521,8 +435,8 @@ function be(e, t) {
}
return !1;
}
-function xe(e, t) {
- let n = k(e), r = t && typeof t == "object" ? { ...t } : null;
+function ve(e, t) {
+ let n = M(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;
@@ -531,8 +445,8 @@ function xe(e, t) {
}
return !1;
}
-function Se(e, t) {
- let n = k(e), r = t && typeof t == "object" ? { ...t } : null;
+function ye(e, t) {
+ let n = M(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;
@@ -541,18 +455,18 @@ function Se(e, t) {
}
return !1;
}
-function Ce(e, t) {
+function be(e, t) {
try {
- let n = w(e) ? e : O(), r = n?.extensionManager || n?.ui?.extensionManager || null, i = ge(n);
+ let n = E(e) ? e : j(), r = n?.extensionManager || n?.ui?.extensionManager || null, i = pe(n);
for (let e of [r, i]) if (e && typeof e.registerSidebarTab == "function") return e.registerSidebarTab(t), !0;
} catch (e) {
console.debug?.(e);
}
return !1;
}
-function we(e, t) {
+function xe(e, t) {
try {
- let n = k(w(e) ? e : O()), r = _e(n), i = String(t || "").trim();
+ let n = M(E(e) ? e : j()), r = me(n), i = String(t || "").trim();
if (!i) return !1;
let a = [
"activateBottomPanelTab",
@@ -571,71 +485,537 @@ function we(e, t) {
}
return !1;
}
-function Te(e) {
+function Se(e) {
return new Promise((t) => setTimeout(t, Math.max(0, Number(e) || 0)));
}
-function Ee(e, t) {
+function Ce(e, t) {
try {
console.warn(`[Majoor] ${e} timed out after ${Math.max(0, Number(t) || 0)}ms`);
} catch (e) {
console.debug?.(e);
}
}
-async function De({ timeoutMs: e = 4e3, intervalMs: t = ce, warnOnTimeout: n = !0, rejectOnTimeout: r = !1 } = {}) {
+async function we({ timeoutMs: e = 4e3, intervalMs: t = oe, warnOnTimeout: n = !0, rejectOnTimeout: r = !1 } = {}) {
let i = Date.now(), a = Math.max(0, Number(e) || 0);
for (; Date.now() - i < a;) {
- let e = O();
+ let e = j();
if (e && typeof e == "object") return e;
- await Te(t);
+ await Se(t);
}
- let o = O();
+ let o = j();
if (o && typeof o == "object") return o;
- if (n && Ee("waitForComfyApp", a), r) throw Error(`waitForComfyApp timeout after ${a}ms`);
+ if (n && Ce("waitForComfyApp", a), r) throw Error(`waitForComfyApp timeout after ${a}ms`);
return null;
}
-async function Oe({ app: e = null, timeoutMs: t = 4e3, intervalMs: n = ce, warnOnTimeout: r = !0, rejectOnTimeout: i = !1 } = {}) {
+async function Te({ app: e = null, timeoutMs: t = 4e3, intervalMs: n = oe, warnOnTimeout: r = !0, rejectOnTimeout: i = !1 } = {}) {
let a = Date.now(), o = Math.max(0, Number(t) || 0);
for (; Date.now() - a < o;) {
- let t = D(e || O());
+ let t = A(e || j());
if (t) return t;
- await Te(n);
+ await Se(n);
}
- let s = D(e || O());
+ let s = A(e || j());
if (s) return s;
- if (r && Ee("waitForComfyApi", o), i) throw Error(`waitForComfyApi timeout after ${o}ms`);
+ if (r && Ce("waitForComfyApi", o), i) throw Error(`waitForComfyApi timeout after ${o}ms`);
return null;
}
//#endregion
+//#region ui/app/hostAdapter.ts
+var N = null, P = Symbol.for("mjr.host.queuePromptBinding"), Ee = [
+ "selectionchange",
+ "selection-change",
+ "node-selected",
+ "node-deselected",
+ "node-selection-change"
+];
+function De(e) {
+ try {
+ let t = he(N || j());
+ t && t.add({
+ severity: e?.severity ?? "info",
+ summary: e?.summary ?? "",
+ detail: e?.detail ?? "",
+ life: e?.life ?? 4e3
+ });
+ } catch {}
+}
+function Oe(e = null) {
+ try {
+ return he(e || N || j()) || null;
+ } catch {
+ return null;
+ }
+}
+function ke(e = null) {
+ try {
+ return ge(e || N || j()) || null;
+ } catch {
+ return null;
+ }
+}
+function Ae(e, t, n = null) {
+ try {
+ return de(e || N || j(), t) ?? n;
+ } catch {
+ return n;
+ }
+}
+function je(e, t, n) {
+ try {
+ return fe(e || N || j(), t, n);
+ } catch {
+ return !1;
+ }
+}
+function Me(e, t) {
+ try {
+ return be(e || N || j(), t);
+ } catch {
+ return !1;
+ }
+}
+function Ne(e, t) {
+ try {
+ return _e(e || N || j(), t);
+ } catch {
+ return !1;
+ }
+}
+function Pe(e, t) {
+ try {
+ return xe(e || N || j(), t);
+ } catch {
+ return !1;
+ }
+}
+function Fe(e, t) {
+ try {
+ return ve(e || N || j(), t);
+ } catch {
+ return !1;
+ }
+}
+function Ie(e, t) {
+ try {
+ return ye(e || N || j(), t);
+ } catch {
+ return !1;
+ }
+}
+function Le() {
+ return N || j() || null;
+}
+function F(e = null) {
+ try {
+ return A(e || N || j()) || null;
+ } catch {
+ return null;
+ }
+}
+async function Re(e = {}) {
+ try {
+ return await Te(e);
+ } catch {
+ return null;
+ }
+}
+async function ze(e, t = null, n = null) {
+ try {
+ return await le(e, t, n || N || j());
+ } catch {
+ return fetch(e, {
+ credentials: "include",
+ ...t || {}
+ });
+ }
+}
+function Be(e, t, n) {
+ if (!e || typeof e.addEventListener != "function") return null;
+ try {
+ e.addEventListener(t, n);
+ } catch {
+ return null;
+ }
+ return () => {
+ try {
+ e.removeEventListener?.(t, n);
+ } catch (e) {
+ console.debug?.(e);
+ }
+ };
+}
+function Ve(e, t = {}) {
+ if (typeof e != "function") return null;
+ let n = t.app || N || j(), r = n?.canvas;
+ if (!r) return null;
+ let i = [], a = !1, o = [
+ r,
+ n,
+ n?.graph
+ ].filter((e, t, n) => e && n.indexOf(e) === t), s = () => {
+ try {
+ e();
+ } catch (e) {
+ console.debug?.(e);
+ }
+ };
+ for (let e of o) for (let t of Ee) {
+ let n = Be(e, t, s);
+ n && (i.push(n), a = !0);
+ }
+ if (!a) {
+ let e = Object.prototype.hasOwnProperty.call(r, "onNodeSelected"), t = Object.prototype.hasOwnProperty.call(r, "onSelectionChange"), n = Object.prototype.hasOwnProperty.call(r, "onNodeDeselected"), a = r.onNodeSelected, o = r.onSelectionChange, c = r.onNodeDeselected;
+ r.onNodeSelected = function(e) {
+ a?.call(this, e), s();
+ }, r.onSelectionChange = function(e) {
+ o?.call(this, e), s();
+ }, r.onNodeDeselected = function(e) {
+ c?.call(this, e), s();
+ }, i.push(() => {
+ try {
+ e ? r.onNodeSelected = a : delete r.onNodeSelected, t ? r.onSelectionChange = o : delete r.onSelectionChange, n ? r.onNodeDeselected = c : delete r.onNodeDeselected;
+ } catch (e) {
+ console.debug?.(e);
+ }
+ });
+ }
+ if (t.includePointerFallback !== !1 && r.canvas?.addEventListener) {
+ let e = Be(r.canvas, "pointerup", s);
+ e && i.push(e);
+ }
+ let c = !1;
+ return () => {
+ if (!c) {
+ c = !0;
+ for (let e of i.splice(0).reverse()) e();
+ }
+ };
+}
+function He(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) : !1;
+ } catch (e) {
+ return console.debug?.(e), !1;
+ }
+ }
+ };
+ return Object.defineProperty(o, P, {
+ configurable: !0,
+ value: s
+ }), t.queuePrompt = o, s;
+}
+async function Ue(e = null) {
+ let t = e || N || j(), n = (t?.api && typeof t.api.interrupt == "function" ? t.api : null) || F(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" });
+ if (!e?.ok) throw Error(`POST /interrupt failed (${e?.status})`);
+ return !0;
+ }
+ let r = await fetch("/interrupt", {
+ method: "POST",
+ credentials: "include"
+ });
+ if (!r.ok) throw Error(`POST /interrupt failed (${r.status})`);
+ return !1;
+}
+function I(e = null) {
+ return (e || N || j())?.canvas || null;
+}
+function We(e = null) {
+ return I(e);
+}
+function L(e = null) {
+ let t = e || N || j();
+ return t?.graph || t?.canvas?.graph || null;
+}
+function Ge(e = null) {
+ return L(e);
+}
+function Ke(e) {
+ if (typeof e != "object" || !e) return e;
+ try {
+ return typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e));
+ } catch {
+ return e;
+ }
+}
+function R(e, t) {
+ n(e, ({ node: e }) => t(e));
+}
+function qe(e) {
+ let t = [];
+ return R(e, (e) => {
+ for (let n of e?.widgets ?? []) t.push({
+ widget: n,
+ value: Ke(n?.value)
+ });
+ }), t;
+}
+function Je(e, t) {
+ for (let e of Array.isArray(t) ? t : []) {
+ let t = e?.widget;
+ if (!t || typeof t != "object") continue;
+ let n = Ke(e?.value);
+ try {
+ t.value = n;
+ } catch (e) {
+ console.debug?.(e);
+ continue;
+ }
+ try {
+ t.callback?.(n);
+ } catch (e) {
+ console.debug?.(e);
+ }
+ }
+ z(e, { change: !1 });
+}
+function Ye(e, t) {
+ let n = [
+ e?.clientId,
+ e?.clientID,
+ e?.client_id,
+ t?.clientId,
+ t?.clientID,
+ t?.client_id
+ ];
+ for (let e of n) {
+ let t = String(e || "").trim();
+ if (t) return t;
+ }
+ return "";
+}
+function Xe(e = null) {
+ let t = I(e);
+ return t?.selected_nodes ?? t?.selectedNodes ?? null;
+}
+function Ze(e = null) {
+ let t = Xe(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 Qe(e = null) {
+ return Ze(e).map((e) => String(e?.id ?? "").trim()).filter(Boolean);
+}
+function $e(e = null) {
+ return Ze(e)[0] || null;
+}
+function z(e = null, t = {}) {
+ try {
+ let n = e || N || j(), r = I(n), i = L(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 et(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);
+ } catch (e) {
+ return console.debug?.(e), !1;
+ }
+}
+function tt(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), et(e, n), !0);
+ } catch (e) {
+ return console.debug?.(e), !1;
+ }
+}
+function nt(e, t = null) {
+ let n = t || N || j();
+ if (!e || typeof e != "object") return !1;
+ try {
+ if (typeof n?.loadGraphData == "function") return n.loadGraphData(e), !0;
+ let t = L(n);
+ if (typeof t?.configure == "function") return t.configure(e), z(n, {
+ draw: !1,
+ change: !1
+ }), !0;
+ } catch (e) {
+ console.debug?.(e);
+ }
+ return !1;
+}
+async function rt(t = {}) {
+ let n = t.app || N || j();
+ if (!n) throw Error("ComfyUI app not available");
+ let r = F(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) => {
+ 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) => {
+ for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 });
+ }), z(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: Ye(r, n) });
+ if (r && typeof r.fetchApi == "function") {
+ let e = await r.fetchApi("/prompt", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(s)
+ });
+ if (!e?.ok) throw Error(`POST /prompt failed (${e?.status})`);
+ return R(a, (e) => {
+ for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 });
+ }), z(n, { change: !1 }), !0;
+ }
+ let c = await fetch("/prompt", {
+ method: "POST",
+ credentials: "include",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify(s)
+ });
+ if (!c.ok) throw Error(`POST /prompt failed (${c.status})`);
+ return R(a, (e) => {
+ for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 });
+ }), z(n, { change: !1 }), !1;
+ } catch (e) {
+ throw Je(n, o), e;
+ }
+}
+function it(e, t = {}) {
+ if (!e) return !1;
+ try {
+ let n = I(t.app || N || j());
+ 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) {
+ let t = n.canvas || n.element || null, r = Number(t?.width || t?.clientWidth || 800) || 800, i = Number(t?.height || t?.clientHeight || 600) || 600, a = Number(n.ds?.scale || 1) || 1, o = Number(e?.size?.[0] || 100) || 100, s = Number(e?.size?.[1] || 80) || 80, c = -Number(e.pos[0] || 0) + r / (2 * a) - o / 2, l = -Number(e.pos[1] || 0) + i / (2 * a) - s / 2;
+ Array.isArray(n.ds.offset) ? (n.ds.offset[0] = c, n.ds.offset[1] = l) : n.ds.offset && typeof n.ds.offset == "object" && (n.ds.offset.x = c, n.ds.offset.y = l), n.setDirty?.(!0, !0);
+ }
+ return t.focusCanvas !== !1 && n.canvas?.focus?.(), !0;
+ } catch (e) {
+ return console.debug?.(e), !1;
+ }
+}
+function at(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 ? it(a, {
+ app: n,
+ select: !1,
+ focusCanvas: !1
+ }) : !1;
+ } catch (e) {
+ return console.debug?.(e), !1;
+ }
+}
+function ot() {
+ let e = N || j() || 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 : {
+ app: e,
+ graphCanvas: t,
+ ds: n,
+ scale: i,
+ width: a,
+ height: o
+ };
+}
+function st(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 ct(e, t) {
+ try {
+ t?.setDirty?.(!0, !0);
+ } catch (e) {
+ console.debug?.(e);
+ }
+ try {
+ e?.graph?.setDirtyCanvas?.(!0, !0);
+ } catch (e) {
+ console.debug?.(e);
+ }
+}
+function lt(e) {
+ try {
+ let t = ot();
+ 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) || !st(t.ds, a, o) ? !1 : (ct(t.app, t.graphCanvas), !0);
+ } catch (e) {
+ return console.debug?.(e), !1;
+ }
+}
+function ut() {
+ try {
+ let e = ot();
+ 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 : {
+ x0: -n / e.scale,
+ y0: -r / e.scale,
+ x1: (e.width - n) / e.scale,
+ y1: (e.height - r) / e.scale
+ };
+ } catch (e) {
+ return console.debug?.(e), null;
+ }
+}
+//#endregion
//#region ui/app/settings/SettingsStore.ts
-var A = /* @__PURE__ */ new Map(), j = !1, M = null;
-function ke() {
+var B = /* @__PURE__ */ new Map(), V = !1, H = null;
+function U() {
try {
return typeof window > "u" ? null : window.localStorage || null;
} catch {
return null;
}
}
-function Ae(e, t, n) {
- let r = A.get(String(e || ""));
+function W(e, t, n) {
+ let r = B.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 je() {
- if (!j) try {
- M = (e) => {
+function dt() {
+ if (!V) try {
+ H = (e) => {
let t = String(e?.key || "");
- t && Ae(t, e?.newValue ?? null, e?.oldValue ?? null);
- }, window.addEventListener("storage", M), j = !0;
+ t && W(t, e?.newValue ?? null, e?.oldValue ?? null);
+ }, window.addEventListener("storage", H), V = !0;
} catch (e) {
console.debug?.(e);
}
}
-var N = {
+var G = {
get(e) {
- let t = ke();
+ let t = U();
if (!t) return null;
try {
return t.getItem(String(e || ""));
@@ -646,13 +1026,13 @@ var N = {
set(e, t) {
let n = String(e || "");
if (!n) return !1;
- let r = ke();
+ let r = U();
if (!r) return !1;
- let i = N.get(n);
+ let i = G.get(n);
try {
- if (t == null) return r.removeItem(n), Ae(n, null, i), !0;
+ if (t == null) return r.removeItem(n), W(n, null, i), !0;
let e = String(t);
- return r.setItem(n, e), Ae(n, e, i), !0;
+ return r.setItem(n, e), W(n, e, i), !0;
} catch {
return !1;
}
@@ -660,19 +1040,19 @@ var N = {
subscribe(e, t) {
let n = String(e || "");
if (!n || typeof t != "function") return () => {};
- je();
- let r = A.get(n);
- return r || (r = /* @__PURE__ */ new Set(), A.set(n, r)), r.add(t), () => {
+ dt();
+ let r = B.get(n);
+ return r || (r = /* @__PURE__ */ new Set(), B.set(n, r)), r.add(t), () => {
try {
- let e = A.get(n);
- e?.delete(t), e && !e.size && A.delete(n);
+ let e = B.get(n);
+ e?.delete(t), e && !e.size && B.delete(n);
} catch (e) {
console.debug?.(e);
}
};
},
getAll() {
- let e = {}, t = ke();
+ let e = {}, t = U();
if (!t) return e;
try {
let n = Number(t.length || 0) || 0;
@@ -687,17 +1067,17 @@ var N = {
},
dispose() {
try {
- j && M && typeof window < "u" && window.removeEventListener("storage", M);
+ V && H && typeof window < "u" && window.removeEventListener("storage", H);
} catch (e) {
console.debug?.(e);
}
- j = !1, M = null, A.clear();
+ V = !1, H = null, B.clear();
}
-}, P = "en-US", F = P, Me = /* @__PURE__ */ new Set(), Ne = ["mjr_lang", "majoor.lang"], Pe = "mjr_lang_follow_comfy", Fe = 500, I = /* @__PURE__ */ new Set(), L = null, Ie = new Set([
+}, K = "en-US", q = K, ft = /* @__PURE__ */ new Set(), pt = ["mjr_lang", "majoor.lang"], mt = "mjr_lang_follow_comfy", ht = 500, J = /* @__PURE__ */ new Set(), Y = null, gt = new Set([
"ar-SA",
"fa-IR",
"he-IL"
-]), Le = {
+]), _t = {
fr: "fr-FR",
"fr-fr": "fr-FR",
fr_FR: "fr-FR",
@@ -803,7 +1183,7 @@ var N = {
"el-gr": "el-GR",
el_gr: "el-GR",
elgr: "el-GR"
-}, R = {
+}, X = {
"en-US": {
"cat.grid": "Grid",
"cat.cards": "Cards",
@@ -974,6 +1354,7 @@ var N = {
"label.only": "Only",
"label.toastHistory": "History",
"label.workflowType": "WF Type",
+ "label.sameWorkflow": "Generated with Same Workflow",
"label.resolution": "Resolution",
"label.fileSizeMB": "File size (MB)",
"label.min": "Min",
@@ -1022,6 +1403,7 @@ var N = {
"tooltip.copyFieldValue": "Copy value",
"tooltip.filterByFileType": "Filter by file type",
"tooltip.filterWorkflowOnly": "Show only assets with embedded workflow data",
+ "tooltip.filterWorkflowId": "Filter assets generated from the same embedded workflow id",
"tooltip.filterMinRating": "Filter by minimum rating",
"tooltip.filterByDateRange": "Filter by date range",
"tooltip.widthPx": "Width in pixels",
@@ -1067,6 +1449,8 @@ var N = {
"tooltip.captureView": "Save view as image",
"tooltip.pendingRefresh": "Pending: metadata refresh in progress",
"tooltip.noAssetsDay": "No assets on this day",
+ "tooltip.assetsDaySingular": "{count} asset",
+ "tooltip.assetsDayPlural": "{count} assets",
"tooltip.deleteCollection": "Delete collection",
"tooltip.viewerShortcuts": "Viewer keyboard shortcuts",
"tooltip.singleViewMode": "Single view mode (one image)",
@@ -1103,6 +1487,17 @@ var N = {
"filter.thisMonth": "This month",
"filter.last7days": "Last 7 days",
"filter.last30days": "Last 30 days",
+ "placeholder.workflowId": "Workflow ID",
+ "action.generate": "Generate",
+ "action.clear": "Clear",
+ "action.refresh": "Refresh",
+ "weekday.monShort": "Mon",
+ "weekday.tueShort": "Tue",
+ "weekday.wedShort": "Wed",
+ "weekday.thuShort": "Thu",
+ "weekday.friShort": "Fri",
+ "weekday.satShort": "Sat",
+ "weekday.sunShort": "Sun",
"group.core": "Core",
"group.media": "Media",
"group.time": "Time",
@@ -1116,6 +1511,10 @@ var N = {
"sort.sizeAsc": "Size (small)",
"status.checking": "Checking...",
"status.ready": "Ready",
+ "status.loading": "Loading",
+ "status.disabled": "Disabled",
+ "status.na": "N/A",
+ "status.generating": "Generating...",
"status.scanning": "Scanning...",
"status.error": "Error",
"status.capabilities": "Capabilities",
@@ -1133,6 +1532,8 @@ var N = {
"status.available": "available",
"status.missing": "missing",
"status.path": "Path",
+ "state.on": "on",
+ "state.off": "off",
"status.pathAuto": "auto / not configured",
"status.noAssets": "No assets indexed yet ({scope})",
"status.clickToScan": "Click the dot to start a scan",
@@ -1271,7 +1672,19 @@ var N = {
"viewer.noWorkflow": "No workflow data",
"viewer.noMetadata": "No metadata available",
"viewer.copySuccess": "Copied to clipboard!",
+ "viewer.copySuccessShort": "Copied!",
"viewer.copyFailed": "Failed to copy",
+ "viewer.mode": "Viewer mode",
+ "viewer.mode.simple": "Simple",
+ "viewer.mode.abCompare": "A/B Compare",
+ "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",
@@ -1319,6 +1732,193 @@ var N = {
"sidebar.date": "Date",
"sidebar.size": "Size",
"sidebar.genTime": "Generation time",
+ "sidebar.fileInfo.title": "File Info",
+ "sidebar.fileInfo.dimensionsTooltip": "Image/video resolution in pixels",
+ "sidebar.fileInfo.duration": "Duration",
+ "sidebar.fileInfo.durationTooltip": "Video duration",
+ "sidebar.fileInfo.fpsTooltip": "Native frame rate",
+ "sidebar.fileInfo.length": "Length",
+ "sidebar.fileInfo.frames": "{count} frames",
+ "sidebar.fileInfo.lengthTooltip": "Total frame count",
+ "sidebar.fileInfo.generationTime": "Generation Time",
+ "sidebar.fileInfo.generationTimeTooltip": "Time taken to generate this asset (workflow execution time)",
+ "sidebar.fileInfo.time": "Time",
+ "sidebar.fileInfo.dateTooltip": "File creation/generation date",
+ "sidebar.fileInfo.timeTooltip": "File creation/generation time",
+ "sidebar.fileInfo.fileSize": "File Size",
+ "sidebar.fileInfo.fileSizeTooltip": "File size on disk",
+ "sidebar.fileInfo.assetId": "Asset ID",
+ "sidebar.fileInfo.assetIdTooltip": "Internal database asset identifier",
+ "sidebar.fileInfo.jobId": "Job ID",
+ "sidebar.fileInfo.jobIdTooltip": "Workflow execution job identifier (prompt_id)",
+ "sidebar.fileInfo.sourceNode": "Source Node",
+ "sidebar.fileInfo.sourceNodeTooltip": "ComfyUI node id that produced this file",
+ "sidebar.fileInfo.nodeType": "Node Type",
+ "sidebar.fileInfo.nodeTypeTooltip": "ComfyUI node class that produced this file",
+ "sidebar.fileInfo.workflowId": "Workflow ID",
+ "sidebar.fileInfo.workflowIdTooltip": "ComfyUI workflow identifier (from workflow.id in extra_data)",
+ "sidebar.folder.details": "Folder Details",
+ "sidebar.folder.name": "Name",
+ "sidebar.folder.path": "Path",
+ "sidebar.folder.folders": "Folders",
+ "sidebar.folder.files": "Files",
+ "sidebar.folder.created": "Created",
+ "sidebar.folder.modified": "Modified",
+ "sidebar.folder.note": "Note",
+ "sidebar.folder.scanTruncated": "Scan was truncated for performance",
+ "sidebar.generation.title": "Generation",
+ "sidebar.generation.workflowEngine": "Workflow engine: {value}",
+ "sidebar.generation.apiProvider": "API provider: {value}",
+ "sidebar.generation.override": "Override",
+ "sidebar.generation.overrideTooltip": "This field was forced by Majoor Gen Info Override",
+ "sidebar.generation.metadataTruncated": "Metadata Truncated",
+ "sidebar.generation.metadataTruncatedBody": "Generation data is incomplete because it exceeded the size limit.",
+ "sidebar.generation.generationData": "Generation Data",
+ "sidebar.generation.mediaOnlyPipeline": "This file looks like a media-only pipeline (e.g. LoadVideo/VideoCombine) and does not contain generation parameters.",
+ "sidebar.generation.promptPipeline": "Prompt Pipeline ({count} variants)",
+ "sidebar.generation.promptN": "Prompt {n}",
+ "sidebar.generation.positive": "POSITIVE",
+ "sidebar.generation.negative": "NEGATIVE",
+ "sidebar.generation.positivePrompt": "Positive Prompt",
+ "sidebar.generation.negativePrompt": "Negative Prompt",
+ "sidebar.generation.promptAlignment": "Prompt Alignment",
+ "sidebar.generation.promptAlignmentTooltip": "How closely the generated image matches the prompt (SigLIP2 score)",
+ "sidebar.generation.aiCaptionTooltip": "AI caption generated by Florence-2",
+ "sidebar.generation.copyCaptionTooltip": "Click to copy caption",
+ "sidebar.generation.aiCaptionDisabled": "AI caption controls are disabled",
+ "sidebar.generation.aiDisabledEnv": "AI features are disabled (enable vector search env var).",
+ "sidebar.generation.aiDisabledSettings": "AI features are disabled in settings.",
+ "sidebar.generation.imageDescription": "Image Description",
+ "sidebar.generation.noImageDescription": "No image description yet.",
+ "sidebar.generation.lyrics": "Lyrics",
+ "sidebar.generation.pipeline": "Generation Pipeline",
+ "sidebar.generation.stageBase": "Base",
+ "sidebar.generation.stageTextToImage": "Text-to-Image",
+ "sidebar.generation.stageImageToImage": "Image-to-Image",
+ "sidebar.generation.stageInpaint": "Inpaint",
+ "sidebar.generation.stageUpscale": "Upscale",
+ "sidebar.generation.stageRefine": "Refine",
+ "sidebar.generation.stageRefineUpscale": "Refine / Upscale",
+ "sidebar.generation.stagePassN": "Pass {n}",
+ "sidebar.generation.modelBranches": "Model Branches",
+ "sidebar.generation.highNoise": "High Noise",
+ "sidebar.generation.lowNoise": "Low Noise",
+ "sidebar.generation.loraStack": "LoRA Stack",
+ "sidebar.generation.modelLora": "Model & LoRA",
+ "sidebar.generation.model": "Model",
+ "sidebar.generation.models": "Models",
+ "sidebar.generation.sampling": "Sampling",
+ "sidebar.generation.audio": "Audio",
+ "sidebar.generation.image": "Image",
+ "sidebar.generation.notes": "Notes",
+ "sidebar.generation.ttsInstruction": "TTS Instruction",
+ "sidebar.generation.seed": "Seed",
+ "sidebar.generation.copySeedTooltip": "Click to copy seed: {seed}",
+ "sidebar.generation.sourceFiles": "Source Files",
+ "sidebar.generation.customInfoN": "Custom Info {n}",
+ "sidebar.generation.checkpoint": "Checkpoint",
+ "sidebar.generation.checkpointN": "Checkpoint {n}",
+ "sidebar.generation.upscaler": "Upscaler",
+ "sidebar.generation.loras": "LoRAs",
+ "sidebar.generation.sampler": "Sampler",
+ "sidebar.generation.steps": "Steps",
+ "sidebar.generation.cfgScale": "CFG Scale",
+ "sidebar.generation.cfgHighNoise": "CFG High Noise",
+ "sidebar.generation.cfgLowNoise": "CFG Low Noise",
+ "sidebar.generation.scheduler": "Scheduler",
+ "sidebar.generation.denoise": "Denoise",
+ "sidebar.generation.narratorVoice": "Narrator Voice",
+ "sidebar.generation.language": "Language",
+ "sidebar.generation.repetitionPenalty": "Repetition Penalty",
+ "sidebar.generation.maxNewTokens": "Max New Tokens",
+ "sidebar.generation.device": "Device",
+ "sidebar.generation.voicePreset": "Voice Preset",
+ "sidebar.generation.compileMode": "Compile Mode",
+ "sidebar.generation.torchCompile": "Torch Compile",
+ "sidebar.generation.cudaGraphs": "CUDA Graphs",
+ "sidebar.generation.xVectorOnly": "X-Vector Only",
+ "sidebar.generation.chunking": "Chunking",
+ "sidebar.generation.maxCharsChunk": "Max Chars/Chunk",
+ "sidebar.generation.chunkMethod": "Chunk Method",
+ "sidebar.generation.silenceBetweenChunks": "Silence Between Chunks (ms)",
+ "sidebar.generation.audioCache": "Audio Cache",
+ "sidebar.generation.batchSize": "Batch Size",
+ "sidebar.generation.lyricsStrength": "Lyrics Strength",
+ "sidebar.generation.clipSkip": "Clip Skip",
+ "sidebar.generation.workflowNotes": "Workflow Notes",
+ "sidebar.generation.temperature": "Temperature",
+ "sidebar.generation.dtype": "Dtype",
+ "sidebar.generation.attention": "Attention",
+ "workflowSidebar.nodes": "Nodes",
+ "workflowSidebar.links": "Links",
+ "workflowSidebar.groups": "Groups",
+ "workflowSidebar.close": "Close sidebar",
+ "workflowSidebar.graphMap": "Graph Map",
+ "workflowSidebar.comfyWorkflow": "ComfyUI Workflow",
+ "workflowSidebar.workflowNodes": "Workflow Nodes",
+ "workflowSidebar.moreNodes": "+{count} more nodes",
+ "workflowSidebar.sourceSynthetic": "Synthetic",
+ "workflowSidebar.sourceEmbedded": "Embedded",
+ "workflowSidebar.sizeCompact": "Compact",
+ "workflowSidebar.sizeComfort": "Comfort",
+ "workflowSidebar.sizeExpanded": "Expanded",
+ "workflowSidebar.minimapSizeTitle": "{label} minimap",
+ "workflowSidebar.nodeLabels": "Node Labels",
+ "workflowSidebar.nodeColors": "Node Colors",
+ "workflowSidebar.showLinks": "Show Links",
+ "workflowSidebar.showFramesGroups": "Show Frames/Groups",
+ "workflowSidebar.renderBypassState": "Render Bypass State",
+ "workflowSidebar.renderErrorState": "Render Error State",
+ "workflowSidebar.showViewport": "Show Viewport",
+ "workflowSidebar.minimapHint": "Click/drag to navigate - wheel to zoom",
+ "workflowSidebar.showRawJson": "Show raw JSON",
+ "genInfoOverride.autoFillFromWorkflow": "Auto fill from workflow",
+ "genInfoOverride.pick": "Pick",
+ "genInfoOverride.pickField": "Pick {field}",
+ "genInfoOverride.pickFromWorkflow": "Pick Gen Info from workflow",
+ "model3d.controlHint": "Rotate: left drag Pan: right drag Zoom: wheel",
+ "model3d.viewportAction": "3D viewport action",
+ "model3d.preview": "3D preview",
+ "model3d.unavailable": "3D viewer unavailable",
+ "model3d.background": "Background",
+ "model3d.material": "Material",
+ "model3d.skeleton": "Skeleton",
+ "model3d.lights": "Lights",
+ "model3d.intensity": "Intensity",
+ "model3d.play": "Play",
+ "model3d.pause": "Pause",
+ "model3d.playPause": "Play / Pause",
+ "model3d.playbackSpeed": "Playback speed",
+ "model3d.reset": "Reset",
+ "model3d.resetView": "Reset 3D view",
+ "model3d.grid": "Grid",
+ "model3d.toggleGrid": "Toggle grid",
+ "model3d.persp": "Persp",
+ "model3d.ortho": "Ortho",
+ "model3d.switchCamera": "Switch perspective / orthographic",
+ "model3d.settings": "Settings",
+ "model3d.downloadFile": "Download {file}",
+ "badge.collisionName": "Name: {name}",
+ "badge.collisionPaths": "Paths:",
+ "badge.collisionSelect": "Click to select collisions in current view",
+ "badge.workflow.pendingParsing": "Pending: parsing metadata...",
+ "badge.workflow.complete": "Complete: workflow + generation data detected",
+ "badge.workflow.partialWorkflowOnly": "Partial: workflow only (generation data missing)",
+ "badge.workflow.partialGenerationOnly": "Partial: generation data only (workflow missing)",
+ "badge.workflow.none": "None: no workflow or generation data found",
+ "badge.workflow.pendingNotParsed": "Pending: metadata not parsed yet",
+ "badge.workflow.enrichmentQueued": "Pending: database metadata enrichment in progress ({count} queued)",
+ "badge.workflow.enrichment": "Pending: database metadata enrichment in progress",
+ "badge.workflow.aiTooltip": "{title}\nAI: {ai}\nClick to rescan this file",
+ "badge.workflow.tooltip": "{title}\nClick to rescan this file",
+ "badge.ai.vectorIndexed": "vector indexed",
+ "badge.ai.tagSuggestions": "AI tag suggestions",
+ "badge.ai.enhancedPrompt": "enhanced prompt",
+ "badge.ai.indexed": "indexed",
+ "badge.rating": "Rating: {rating} star{plural}",
+ "badge.generationTimeMinutes": "Generation time: {minutes} minutes ({seconds}s)",
+ "badge.generationTimeSeconds": "Generation time: {seconds} seconds",
+ "badge.tags": "Tags: {tags}",
"ctx.openViewer": "Open in viewer",
"ctx.loadWorkflow": "Load workflow",
"ctx.copyPath": "Copy path",
@@ -1352,6 +1952,7 @@ var N = {
"dialog.yes": "Yes",
"dialog.no": "No",
"dialog.ok": "OK",
+ "dialog.close": "Close",
"dialog.prompt": "Prompt",
"dialog.choiceTypeNumber": "Type a number:",
"dialog.delete.title": "Delete file?",
@@ -1578,6 +2179,9 @@ var N = {
"tooltip.openMessages": "Messages et nouveautes",
"tooltip.openMessagesUnread": "Messages ({count} non lus)",
"tooltip.markMessagesRead": "Marquer tous les messages comme lus",
+ "tooltip.noAssetsDay": "Aucun asset ce jour",
+ "tooltip.assetsDaySingular": "{count} asset",
+ "tooltip.assetsDayPlural": "{count} assets",
"tooltip.previewStreamOff": "Preview KSampler : OFF - cliquer pour afficher les images de denoising pendant l'execution",
"tooltip.previewStreamOn": "Preview KSampler : ON - affiche les images de denoising pendant l'execution",
"tooltip.nodeStreamOff": "Node Stream : OFF - cliquer pour suivre les previews du noeud selectionne, dont les canvas live ImageOps",
@@ -1587,7 +2191,228 @@ var N = {
"tooltip.queueStop": "Arreter la generation",
"tooltip.noUnreadMessages": "Aucun message non lu",
"label.toastHistory": "Historique",
+ "label.sameWorkflow": "Generes avec le meme workflow",
"tooltip.tab.similar": "Parcourir les trouvailles similaires courantes",
+ "tooltip.filterWorkflowId": "Filtrer les assets generes depuis le meme workflow embarque",
+ "placeholder.workflowId": "Workflow ID",
+ "action.copy": "Copier",
+ "action.generate": "Generer",
+ "action.clickToCopy": "Cliquer pour copier",
+ "action.clear": "Effacer",
+ "action.refresh": "Rafraichir",
+ "status.loading": "Chargement",
+ "status.disabled": "Desactive",
+ "status.na": "N/A",
+ "status.generating": "Generation...",
+ "status.unavailable": "Indisponible",
+ "state.on": "on",
+ "state.off": "off",
+ "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",
+ "sidebar.fileInfo.durationTooltip": "Duree de la video",
+ "sidebar.fileInfo.fpsTooltip": "Frequence d'image native",
+ "sidebar.fileInfo.length": "Longueur",
+ "sidebar.fileInfo.frames": "{count} frames",
+ "sidebar.fileInfo.lengthTooltip": "Nombre total de frames",
+ "sidebar.fileInfo.generationTime": "Temps de generation",
+ "sidebar.fileInfo.generationTimeTooltip": "Temps necessaire pour generer cet asset (temps d'execution workflow)",
+ "sidebar.fileInfo.time": "Heure",
+ "sidebar.fileInfo.dateTooltip": "Date de creation/generation du fichier",
+ "sidebar.fileInfo.timeTooltip": "Heure de creation/generation du fichier",
+ "sidebar.fileInfo.fileSize": "Taille fichier",
+ "sidebar.fileInfo.fileSizeTooltip": "Taille du fichier sur disque",
+ "sidebar.fileInfo.assetId": "Asset ID",
+ "sidebar.fileInfo.assetIdTooltip": "Identifiant interne de l'asset en base",
+ "sidebar.fileInfo.jobId": "Job ID",
+ "sidebar.fileInfo.jobIdTooltip": "Identifiant du job workflow (prompt_id)",
+ "sidebar.fileInfo.sourceNode": "Node source",
+ "sidebar.fileInfo.sourceNodeTooltip": "ID du node ComfyUI qui a produit ce fichier",
+ "sidebar.fileInfo.nodeType": "Type de node",
+ "sidebar.fileInfo.nodeTypeTooltip": "Classe du node ComfyUI qui a produit ce fichier",
+ "sidebar.fileInfo.workflowId": "Workflow ID",
+ "sidebar.fileInfo.workflowIdTooltip": "Identifiant du workflow ComfyUI (depuis workflow.id dans extra_data)",
+ "sidebar.folder.details": "Details dossier",
+ "sidebar.folder.name": "Nom",
+ "sidebar.folder.path": "Chemin",
+ "sidebar.folder.folders": "Dossiers",
+ "sidebar.folder.files": "Fichiers",
+ "sidebar.folder.created": "Cree",
+ "sidebar.folder.modified": "Modifie",
+ "sidebar.folder.note": "Note",
+ "sidebar.folder.scanTruncated": "Scan tronque pour les performances",
+ "sidebar.generation.title": "Generation",
+ "sidebar.generation.workflowEngine": "Moteur workflow : {value}",
+ "sidebar.generation.apiProvider": "Provider API : {value}",
+ "sidebar.generation.override": "Override",
+ "sidebar.generation.overrideTooltip": "Ce champ a ete force par Majoor Gen Info Override",
+ "sidebar.generation.metadataTruncated": "Metadonnees tronquees",
+ "sidebar.generation.metadataTruncatedBody": "Les donnees de generation sont incompletes car elles depassent la limite de taille.",
+ "sidebar.generation.generationData": "Donnees de generation",
+ "sidebar.generation.mediaOnlyPipeline": "Ce fichier ressemble a une pipeline media-only (ex. LoadVideo/VideoCombine) et ne contient pas de parametres de generation.",
+ "sidebar.generation.promptPipeline": "Pipeline prompt ({count} variantes)",
+ "sidebar.generation.promptN": "Prompt {n}",
+ "sidebar.generation.positive": "POSITIF",
+ "sidebar.generation.negative": "NEGATIF",
+ "sidebar.generation.positivePrompt": "Prompt positif",
+ "sidebar.generation.negativePrompt": "Prompt negatif",
+ "sidebar.generation.promptAlignment": "Alignement prompt",
+ "sidebar.generation.promptAlignmentTooltip": "Mesure a quel point l'image generee correspond au prompt (score SigLIP2)",
+ "sidebar.generation.aiCaptionTooltip": "Caption IA generee par Florence-2",
+ "sidebar.generation.copyCaptionTooltip": "Cliquer pour copier la caption",
+ "sidebar.generation.aiCaptionDisabled": "Les controles de caption IA sont desactives",
+ "sidebar.generation.aiDisabledEnv": "Les fonctions IA sont desactivees (activez la variable d'environnement vector search).",
+ "sidebar.generation.aiDisabledSettings": "Les fonctions IA sont desactivees dans les parametres.",
+ "sidebar.generation.imageDescription": "Description image",
+ "sidebar.generation.noImageDescription": "Aucune description image pour le moment.",
+ "sidebar.generation.lyrics": "Lyrics",
+ "sidebar.generation.pipeline": "Pipeline de generation",
+ "sidebar.generation.stageBase": "Base",
+ "sidebar.generation.stageTextToImage": "Texte vers image",
+ "sidebar.generation.stageImageToImage": "Image vers image",
+ "sidebar.generation.stageInpaint": "Inpaint",
+ "sidebar.generation.stageUpscale": "Upscale",
+ "sidebar.generation.stageRefine": "Refine",
+ "sidebar.generation.stageRefineUpscale": "Refine / Upscale",
+ "sidebar.generation.stagePassN": "Pass {n}",
+ "sidebar.generation.modelBranches": "Branches modele",
+ "sidebar.generation.highNoise": "High Noise",
+ "sidebar.generation.lowNoise": "Low Noise",
+ "sidebar.generation.loraStack": "Stack LoRA",
+ "sidebar.generation.modelLora": "Modele & LoRA",
+ "sidebar.generation.model": "Modele",
+ "sidebar.generation.sampling": "Sampling",
+ "sidebar.generation.audio": "Audio",
+ "sidebar.generation.image": "Image",
+ "sidebar.generation.notes": "Notes",
+ "sidebar.generation.ttsInstruction": "Instruction TTS",
+ "sidebar.generation.seed": "Seed",
+ "sidebar.generation.copySeedTooltip": "Cliquer pour copier le seed : {seed}",
+ "sidebar.generation.sourceFiles": "Fichiers source",
+ "sidebar.generation.customInfoN": "Info custom {n}",
+ "sidebar.generation.checkpoint": "Checkpoint",
+ "sidebar.generation.checkpointN": "Checkpoint {n}",
+ "sidebar.generation.upscaler": "Upscaler",
+ "sidebar.generation.loras": "LoRAs",
+ "sidebar.generation.sampler": "Sampler",
+ "sidebar.generation.steps": "Steps",
+ "sidebar.generation.cfgScale": "CFG Scale",
+ "sidebar.generation.cfgHighNoise": "CFG High Noise",
+ "sidebar.generation.cfgLowNoise": "CFG Low Noise",
+ "sidebar.generation.scheduler": "Scheduler",
+ "sidebar.generation.denoise": "Denoise",
+ "sidebar.generation.narratorVoice": "Voix narrateur",
+ "sidebar.generation.language": "Langue",
+ "sidebar.generation.repetitionPenalty": "Repetition Penalty",
+ "sidebar.generation.maxNewTokens": "Max New Tokens",
+ "sidebar.generation.device": "Device",
+ "sidebar.generation.voicePreset": "Voice Preset",
+ "sidebar.generation.compileMode": "Compile Mode",
+ "sidebar.generation.torchCompile": "Torch Compile",
+ "sidebar.generation.cudaGraphs": "CUDA Graphs",
+ "sidebar.generation.xVectorOnly": "X-Vector Only",
+ "sidebar.generation.chunking": "Chunking",
+ "sidebar.generation.maxCharsChunk": "Max Chars/Chunk",
+ "sidebar.generation.chunkMethod": "Methode chunk",
+ "sidebar.generation.silenceBetweenChunks": "Silence entre chunks (ms)",
+ "sidebar.generation.audioCache": "Cache audio",
+ "sidebar.generation.batchSize": "Batch Size",
+ "sidebar.generation.lyricsStrength": "Lyrics Strength",
+ "sidebar.generation.clipSkip": "Clip Skip",
+ "sidebar.generation.workflowNotes": "Notes workflow",
+ "sidebar.generation.temperature": "Temperature",
+ "sidebar.generation.dtype": "Dtype",
+ "sidebar.generation.attention": "Attention",
+ "viewer.mode": "Mode viewer",
+ "viewer.mode.simple": "Simple",
+ "viewer.mode.abCompare": "Comparaison A/B",
+ "viewer.mode.sideBySide": "Cote a cote",
+ "viewer.mode.grid": "Grille",
+ "viewer.pinSlots": "Epingler les slots A/B/C/D",
+ "workflowSidebar.nodes": "Noeuds",
+ "workflowSidebar.links": "Liens",
+ "workflowSidebar.groups": "Groupes",
+ "workflowSidebar.close": "Fermer la sidebar",
+ "workflowSidebar.graphMap": "Graph Map",
+ "workflowSidebar.comfyWorkflow": "Workflow ComfyUI",
+ "workflowSidebar.workflowNodes": "Noeuds du workflow",
+ "workflowSidebar.moreNodes": "+{count} noeuds en plus",
+ "workflowSidebar.sourceSynthetic": "Synthetique",
+ "workflowSidebar.sourceEmbedded": "Integre",
+ "workflowSidebar.sizeCompact": "Compact",
+ "workflowSidebar.sizeComfort": "Confort",
+ "workflowSidebar.sizeExpanded": "Etendu",
+ "workflowSidebar.minimapSizeTitle": "Mini-map {label}",
+ "workflowSidebar.nodeLabels": "Labels des noeuds",
+ "workflowSidebar.nodeColors": "Couleurs des noeuds",
+ "workflowSidebar.showLinks": "Afficher les liens",
+ "workflowSidebar.showFramesGroups": "Afficher frames/groupes",
+ "workflowSidebar.renderBypassState": "Afficher l'etat bypass",
+ "workflowSidebar.renderErrorState": "Afficher l'etat erreur",
+ "workflowSidebar.showViewport": "Afficher le viewport",
+ "workflowSidebar.minimapHint": "Cliquer/glisser pour naviguer - molette pour zoomer",
+ "workflowSidebar.showRawJson": "Afficher le JSON brut",
+ "genInfoOverride.autoFillFromWorkflow": "Auto-fill depuis le workflow",
+ "genInfoOverride.pick": "Choisir",
+ "genInfoOverride.pickField": "Choisir {field}",
+ "genInfoOverride.pickFromWorkflow": "Choisir Gen Info depuis le workflow",
+ "dialog.close": "Fermer",
+ "model3d.controlHint": "Rotation : drag gauche Pan : drag droit Zoom : molette",
+ "model3d.viewportAction": "Action viewport 3D",
+ "model3d.preview": "Preview 3D",
+ "model3d.unavailable": "Viewer 3D indisponible",
+ "model3d.background": "Fond",
+ "model3d.material": "Materiau",
+ "model3d.skeleton": "Squelette",
+ "model3d.lights": "Lumieres",
+ "model3d.intensity": "Intensite",
+ "model3d.play": "Lecture",
+ "model3d.pause": "Pause",
+ "model3d.playPause": "Lecture / Pause",
+ "model3d.playbackSpeed": "Vitesse de lecture",
+ "model3d.reset": "Reset",
+ "model3d.resetView": "Reset vue 3D",
+ "model3d.grid": "Grille",
+ "model3d.toggleGrid": "Afficher/masquer la grille",
+ "model3d.persp": "Persp",
+ "model3d.ortho": "Ortho",
+ "model3d.switchCamera": "Basculer perspective / orthographique",
+ "model3d.settings": "Parametres",
+ "model3d.downloadFile": "Telecharger {file}",
+ "badge.collisionName": "Nom : {name}",
+ "badge.collisionPaths": "Chemins :",
+ "badge.collisionSelect": "Cliquer pour selectionner les collisions dans la vue courante",
+ "badge.workflow.pendingParsing": "En attente : parsing des metadonnees...",
+ "badge.workflow.complete": "Complet : workflow + donnees de generation detectes",
+ "badge.workflow.partialWorkflowOnly": "Partiel : workflow seulement (donnees de generation manquantes)",
+ "badge.workflow.partialGenerationOnly": "Partiel : donnees de generation seulement (workflow manquant)",
+ "badge.workflow.none": "Aucun : aucun workflow ou donnees de generation trouves",
+ "badge.workflow.pendingNotParsed": "En attente : metadonnees pas encore parsees",
+ "badge.workflow.enrichmentQueued": "En attente : enrichissement des metadonnees en base ({count} en file)",
+ "badge.workflow.enrichment": "En attente : enrichissement des metadonnees en base",
+ "badge.workflow.aiTooltip": "{title}\nIA : {ai}\nCliquer pour rescanner ce fichier",
+ "badge.workflow.tooltip": "{title}\nCliquer pour rescanner ce fichier",
+ "badge.ai.vectorIndexed": "vecteur indexe",
+ "badge.ai.tagSuggestions": "suggestions de tags IA",
+ "badge.ai.enhancedPrompt": "prompt enrichi",
+ "badge.ai.indexed": "indexe",
+ "badge.rating": "Rating : {rating} etoile{plural}",
+ "badge.generationTimeMinutes": "Temps de generation : {minutes} minutes ({seconds}s)",
+ "badge.generationTimeSeconds": "Temps de generation : {seconds} secondes",
+ "badge.tags": "Tags : {tags}",
+ "weekday.monShort": "Lun",
+ "weekday.tueShort": "Mar",
+ "weekday.wedShort": "Mer",
+ "weekday.thuShort": "Jeu",
+ "weekday.friShort": "Ven",
+ "weekday.satShort": "Sam",
+ "weekday.sunShort": "Dim",
"setting.ai.vector.enabled.name": "Activer la recherche semantique IA",
"setting.ai.vector.enabled.desc": "Active la recherche semantique basee sur CLIP. Desactivez pour une recherche par mots-cles uniquement.",
"setting.viewer.pauseExecution.name": "Majoor : Pause du viewer principal pendant l'execution",
@@ -1752,7 +2577,7 @@ var N = {
"msg.newVersionDetail": "La version {latest} est disponible. Version installée : {current}.",
"tooltip.starGithub": "Ouvrir GitHub et mettre une etoile"
}
-}, Re = Object.freeze({
+}, vt = Object.freeze({
"en-US": "English",
"fr-FR": "Français",
"zh-CN": "Chinese (Simplified)",
@@ -1802,43 +2627,43 @@ var N = {
"ro-RO",
"el-GR"
].forEach((e) => {
- R[e] || (R[e] = {});
+ X[e] || (X[e] = {});
});
-var z = !1, ze = null;
-function Be(e) {
- z || (z = !0, Object.entries(e || {}).forEach(([e, t]) => {
- R[e] = {
- ...R[e] || {},
+var Z = !1, yt = null;
+function bt(e) {
+ Z || (Z = !0, Object.entries(e || {}).forEach(([e, t]) => {
+ X[e] = {
+ ...X[e] || {},
...t || {}
};
- }), Ve());
+ }), xt());
}
-function Ve() {
- let e = R["en-US"] || {};
- Object.keys(R).forEach((t) => {
- t !== "en-US" && (R[t] = {
+function xt() {
+ let e = X["en-US"] || {};
+ Object.keys(X).forEach((t) => {
+ t !== "en-US" && (X[t] = {
...e,
- ...R[t] || {}
+ ...X[t] || {}
});
});
}
-function He() {
- return z ? Promise.resolve() : (ze ||= import("./i18n.generated-DMwEk0Tb.js").then(({ GENERATED_TRANSLATIONS: e }) => {
- Be(e);
+function St() {
+ return Z ? Promise.resolve() : (yt ||= import("./i18n.generated-DMwEk0Tb.js").then(({ GENERATED_TRANSLATIONS: e }) => {
+ bt(e);
}).catch((e) => {
- console.warn("[Majoor i18n] Failed to load generated translations:", e), Ve();
- }), ze);
+ console.warn("[Majoor i18n] Failed to load generated translations:", e), xt();
+ }), yt);
}
-Ve();
-function B(e) {
- if (!e) return P;
+xt();
+function Q(e) {
+ if (!e) return K;
let t = String(e || "").trim(), n = t.toLowerCase();
- return Le[n] ? Le[n] : R[t] ? t : P;
+ return _t[n] ? _t[n] : X[t] ? t : K;
}
-function Ue() {
+function Ct() {
try {
- for (let e of Ne) {
- let t = String(N.get(e) || "").trim();
+ for (let e of pt) {
+ let t = String(G.get(e) || "").trim();
if (t) return t;
}
} catch (e) {
@@ -1846,16 +2671,16 @@ function Ue() {
}
return "";
}
-function We(e) {
+function wt(e) {
try {
- N.set(Ne[0], e), N.set(Ne[1], e);
+ G.set(pt[0], e), G.set(pt[1], e);
} catch (e) {
console.debug?.(e);
}
}
-function Ge() {
+function Tt() {
try {
- let e = String(N.get(Pe) || "").trim().toLowerCase();
+ let e = String(G.get(mt) || "").trim().toLowerCase();
return e ? ![
"0",
"false",
@@ -1867,14 +2692,14 @@ function Ge() {
}
return !0;
}
-function Ke(e) {
+function Et(e) {
try {
- N.set(Pe, e ? "1" : "0");
+ G.set(mt, e ? "1" : "0");
} catch (e) {
console.debug?.(e);
}
}
-function qe(e) {
+function Dt(e) {
let t = [], n = (e) => {
if (typeof e != "string") return;
let n = e.trim();
@@ -1886,10 +2711,10 @@ function qe(e) {
"Comfy.LocaleCode",
"ComfyUI.Locale",
"ComfyUI.Frontend.Locale"
- ]) n(me(e, t));
+ ]) n(Ae(e, t));
return n(e?.ui?.locale), n(e?.locale), n(e?.ui?.i18n?.locale), t;
}
-function Je() {
+function Ot() {
let e = [], t = (t) => {
if (typeof t != "string") return;
let n = t.trim();
@@ -1911,85 +2736,85 @@ function Je() {
}
return e;
}
-function Ye() {
+function kt() {
try {
if (typeof document < "u" && document.documentElement) {
- let e = Ie.has(F);
+ let e = gt.has(q);
document.documentElement.dir = e ? "rtl" : "ltr";
}
} catch (e) {
console.debug?.(e);
}
}
-var Xe = (e) => {
+var At = (e) => {
try {
- let t = Ge(), n = Ue(), r = B(n), i = () => {
- let t = qe(e);
+ let t = Tt(), n = Ct(), r = Q(n), i = () => {
+ let t = Dt(e);
for (let e of t) {
- let t = B(e);
- if (R[t]) return V(t), !0;
+ let t = Q(e);
+ if (X[t]) return $(t), !0;
}
return !1;
};
if (t) {
if (i()) return;
- if (n && R[r]) {
- V(r);
+ if (n && X[r]) {
+ $(r);
return;
}
- if (R[F]) return;
- V(P);
+ if (X[q]) return;
+ $(K);
return;
}
- if (n && R[r]) {
- V(r);
+ if (n && X[r]) {
+ $(r);
return;
}
if (i()) return;
- let a = Je();
+ let a = Ot();
for (let e of a) {
- let t = B(e);
- if (R[t]) {
- V(t);
+ let t = Q(e);
+ if (X[t]) {
+ $(t);
return;
}
}
- V(P);
+ $(K);
} catch (e) {
- console.warn("[Majoor i18n] Failed to detect language:", e), V(P);
+ console.warn("[Majoor i18n] Failed to detect language:", e), $(K);
}
-}, V = (e) => {
- R[e] || (console.warn(`[Majoor i18n] Unknown language: ${e}, falling back to ${P}`), e = P), F !== e && (F = e, We(e), Ye(), e !== P && !z && He().then(() => {
- Array.from(Me).forEach((t) => {
+}, $ = (e) => {
+ X[e] || (console.warn(`[Majoor i18n] Unknown language: ${e}, falling back to ${K}`), e = K), q !== e && (q = e, wt(e), kt(), e !== K && !Z && St().then(() => {
+ Array.from(ft).forEach((t) => {
try {
t(e);
} catch (e) {
console.debug?.(e);
}
});
- }), Array.from(Me).forEach((t) => {
+ }), Array.from(ft).forEach((t) => {
try {
t(e);
} catch (e) {
console.debug?.(e);
}
}));
-}, Ze = (e) => {
- Ke(!!e);
-}, Qe = (e) => {
+}, jt = (e) => {
+ Et(!!e);
+}, Mt = (e) => {
try {
- L &&= (clearInterval(L), null), typeof window < "u" && window.__MJR_COMFY_LANG_SYNC_TIMER__ && (clearInterval(window.__MJR_COMFY_LANG_SYNC_TIMER__), window.__MJR_COMFY_LANG_SYNC_TIMER__ = null);
+ 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);
} catch (e) {
console.debug?.(e);
}
- L = setInterval(() => {
+ Y = setInterval(() => {
try {
- if (!Ge()) return;
- let t = qe(e);
+ if (!Tt()) return;
+ let t = Dt(e);
for (let e of t) {
- let t = B(e);
- if (R[t] && t !== F) {
- V(t);
+ let t = Q(e);
+ if (X[t] && t !== q) {
+ $(t);
return;
}
}
@@ -1998,35 +2823,35 @@ var Xe = (e) => {
}
}, 2e3);
try {
- typeof window < "u" && (window.__MJR_COMFY_LANG_SYNC_TIMER__ = L);
+ typeof window < "u" && (window.__MJR_COMFY_LANG_SYNC_TIMER__ = Y);
} catch (e) {
console.debug?.(e);
}
-}, $e = () => F, et = () => Object.keys(R).map((e) => ({
+}, Nt = () => q, Pt = () => Object.keys(X).map((e) => ({
code: e,
- name: Re[e] || e
-})), H = (e, t, n) => {
- let r = R[F] || R[P], i = R[P], a = r[e] || i[e];
+ name: vt[e] || e
+})), Ft = (e, t, n) => {
+ let r = X[q] || X[K], i = X[K], a = r[e] || i[e];
if (!a) {
- let n = `${F}:${String(e || "")}`;
- if (!I.has(n)) {
- if (I.size >= Fe) {
- let e = Math.floor(Fe * .2), t = I.values();
+ let n = `${q}:${String(e || "")}`;
+ if (!J.has(n)) {
+ if (J.size >= ht) {
+ let e = Math.floor(ht * .2), t = J.values();
for (let n = 0; n < e; n++) {
let e = t.next().value;
- e && I.delete(e);
+ e && J.delete(e);
}
}
- I.add(n);
+ J.add(n);
try {
- console.warn(`[Majoor i18n] Missing translation key "${e}" for locale "${F}"`);
+ console.warn(`[Majoor i18n] Missing translation key "${e}" for locale "${q}"`);
} 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: F
+ locale: q
} }));
} catch (e) {
console.debug?.(e);
@@ -2038,1319 +2863,92 @@ var Xe = (e) => {
return o && typeof o == "object" && Object.entries(o).forEach(([e, t]) => {
a = a.replaceAll(`{${e}}`, String(t));
}), a;
-}, tt = "mjr_toast_history_v1", nt = "mjr_toast_history_last_read_v1", rt = 60, it = "mjr:toast-history-changed", U = null;
-function W(e) {
- return String(e || "").trim();
-}
-function at(e) {
- let t = W(e).toLowerCase();
- return t === "warn" ? "warning" : t === "danger" ? "error" : t || "info";
-}
-function ot(e) {
- let t = Number(e);
- return Number.isFinite(t) ? t : null;
-}
-function st(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 = W(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 ct(e, t, n) {
- return e && t ? `${e}: ${t}` : t || e || n || "";
-}
-function lt(e, t = "info", n = null) {
- if (!e || typeof e != "object") return null;
- let i = W(e.title || e.summary), a = W(e.detail), o = W(e.message || ct(i, a, W(e.fallbackMessage)));
- if (!o) return null;
- let s = ot(e.durationMs ?? e.duration ?? n), c = Number(e.createdAt), l = Number.isFinite(c) && c > 0 ? c : Date.now(), u = typeof e.persistent == "boolean" ? e.persistent : !(Number.isFinite(s) && (s ?? 0) > 0);
- return {
- id: W(e.id) || r(`th-${l}-`, 4),
- message: o,
- title: i,
- detail: a,
- type: at(e.type || t),
- createdAt: l,
- durationMs: s,
- persistent: u,
- source: W(e.source),
- trackId: W(e.trackId),
- status: W(e.status),
- operation: W(e.operation),
- progress: st(e.progress),
- forceStore: !!e.forceStore,
- actionLabel: W(e.actionLabel),
- actionUrl: W(e.actionUrl)
- };
-}
-function ut() {
- if (U === null) try {
- let e = localStorage.getItem(tt), t = e ? JSON.parse(e) : [];
- U = Array.isArray(t) ? t.map((e) => {
- if (e && typeof e == "object") return lt(e);
- let t = W(e);
- return t ? lt({ message: t }) : null;
- }).filter(Boolean) : [];
- } catch {
- U = [];
- }
-}
-function dt() {
- try {
- localStorage.setItem(tt, JSON.stringify(U));
- } catch {}
-}
-function ft() {
- try {
- window.dispatchEvent(new CustomEvent(it));
- } catch {}
-}
-function pt() {
- try {
- return Number(localStorage.getItem(nt)) || 0;
- } catch {
- return 0;
- }
-}
-function mt(e) {
- try {
- localStorage.setItem(nt, String(Number(e) || 0));
- } catch {}
-}
-function ht(e, t, n) {
- ut();
- let r = lt(e && typeof e == "object" ? e : {
- message: W(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 = U.findIndex((e) => String(e?.trackId || "").trim() === i);
- if (e >= 0) {
- let t = U[e] || {};
- U.splice(e, 1), r.id = String(t.id || r.id || "").trim() || r.id;
- }
- }
- U.unshift(r), U.length > rt && (U = U.slice(0, rt)), dt(), ft();
-}
-function gt() {
- return ut(), U.map((e) => ({ ...e }));
-}
-function _t() {
- ut();
- let e = pt();
- return U.filter((t) => t.createdAt > e).length;
-}
-function vt() {
- mt(Date.now()), ft();
-}
-function yt() {
- ut(), U = [], dt(), mt(Date.now()), ft();
-}
+}, It = 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: 120,
+ FEED_GRID_MIN_SIZE: 120,
+ GRID_GAP: 10,
+ GRID_SHOW_BADGES_EXTENSION: !0,
+ GRID_SHOW_BADGES_RATING: !0,
+ GRID_SHOW_BADGES_TAGS: !0,
+ GRID_SHOW_DETAILS: !0,
+ GRID_SHOW_DETAILS_FILENAME: !0,
+ GRID_SHOW_DETAILS_DATE: !0,
+ GRID_SHOW_DETAILS_DIMENSIONS: !0,
+ GRID_SHOW_DETAILS_GENTIME: !0,
+ GRID_SHOW_HOVER_INFO: !0,
+ GRID_SHOW_WORKFLOW_DOT: !0,
+ GRID_VIDEO_AUTOPLAY_MODE: "hover",
+ FEED_SHOW_INFO: !0,
+ FEED_SHOW_FILENAME: !1,
+ FEED_SHOW_DIMENSIONS: !0,
+ FEED_SHOW_DATE: !0,
+ FEED_SHOW_GENTIME: !0,
+ FEED_SHOW_WORKFLOW_DOT: !1,
+ FEED_SHOW_BADGES_EXTENSION: !0,
+ FEED_SHOW_BADGES_RATING: !0,
+ FEED_SHOW_BADGES_TAGS: !0,
+ UI_CARD_HOVER_COLOR: "#3D3D3D",
+ UI_CARD_SELECTION_COLOR: "#4A90E2",
+ UI_RATING_COLOR: "#FF9500",
+ UI_TAG_COLOR: "#4A90E2",
+ BADGE_STAR_COLOR: "#FFD45A",
+ BADGE_IMAGE_COLOR: "#2196F3",
+ BADGE_VIDEO_COLOR: "#9C27B0",
+ BADGE_AUDIO_COLOR: "#FF9800",
+ BADGE_MODEL3D_COLOR: "#4CAF50",
+ BADGE_DUPLICATE_ALERT_COLOR: "#FF1744",
+ DEFAULT_PAGE_SIZE: 80,
+ MAX_PAGE_SIZE: 2e3,
+ PREFETCH_NEXT_PAGE: !0,
+ PREFETCH_NEXT_PAGE_DELAY_MS: 700,
+ SEARCH_DEFAULT_LIMIT: 500,
+ INFINITE_SCROLL_ENABLED: !0,
+ INFINITE_SCROLL_ROOT_MARGIN: "800px",
+ INFINITE_SCROLL_THRESHOLD: .01,
+ BOTTOM_GAP_PX: 80,
+ STATUS_POLL_INTERVAL: 5e3,
+ AUTO_SCAN_ON_STARTUP: !1,
+ EXECUTION_GROUPING_ENABLED: !0,
+ EXECUTION_IDLE_GRACE_MS: 6e3,
+ DEFER_GRID_FETCH_DURING_EXECUTION: !1,
+ VIEWER_PAUSE_DURING_EXECUTION: !0,
+ FLOATING_VIEWER_PAUSE_DURING_EXECUTION: !1,
+ MFV_SIDEBAR_POSITION: "right",
+ MFV_LIVE_DEFAULT: !0,
+ MFV_PREVIEW_DEFAULT: !0,
+ MFV_LIVE_AUTO_OPEN: !1,
+ MFV_PREVIEW_AUTO_OPEN: !1,
+ MFV_NODE_STREAM_AUTO_OPEN: !1,
+ MFV_PREVIEW_METHOD: "auto",
+ RT_HYDRATE_CONCURRENCY: 2,
+ RT_HYDRATE_QUEUE_MAX: 100,
+ RT_HYDRATE_SEEN_MAX: 2e4,
+ RT_HYDRATE_PRUNE_BUDGET: 250,
+ RT_HYDRATE_SEEN_TTL_MS: 600 * 1e3,
+ VIEWER_META_TTL_MS: 3e4,
+ VIEWER_META_MAX_ENTRIES: 500,
+ WORKFLOW_MINIMAP_ENABLED: !0,
+ WATCHER_DEBOUNCE_MS: 3e3,
+ WATCHER_DEDUPE_TTL_MS: 3e3,
+ WATCHER_MAX_PENDING: 500,
+ WATCHER_MIN_SIZE: 100,
+ WATCHER_MAX_SIZE: 4294967296,
+ DB_TIMEOUT_MS: 5e3,
+ DB_MAX_CONNECTIONS: 10,
+ DB_QUERY_TIMEOUT_MS: 1e3,
+ SEARCH_REQUEST_LIMIT: 500,
+ DELETE_CONFIRMATION: !0,
+ DEBUG_VERBOSE_ERRORS: !1
+}), Lt = { ...It };
//#endregion
-//#region ui/app/toast.ts
-function bt(e) {
- let t = String(e || "info").trim().toLowerCase();
- return t === "warn" ? "warning" : t === "danger" ? "error" : t === "success" || t === "warning" || t === "error" ? t : "info";
-}
-function xt(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 St(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 = xt(e), a) : (a.title = String(i?.title || "").trim(), a.detail = String(i?.detail || "").trim(), a.message = xt(e), a);
-}
-function Ct(e, t = "info", n, r) {
- try {
- let i = St(e, t, n, r);
- i.forceStore = !0, ht(i, t, n ?? void 0);
- } catch {}
-}
-function wt(e) {
- switch (e) {
- case "success": return 2e3;
- case "info": return 3e3;
- case "warning": return 4e3;
- case "error": return 5e3;
- default: return 5e3;
- }
-}
-function Tt(e) {
- if (typeof e != "string") return e;
- let t = e.trim(), n = {
- "Failed to update rating": H("toast.ratingUpdateFailed", "Failed to update rating"),
- "Error updating rating": H("toast.ratingUpdateError", "Error updating rating"),
- "Rating cleared": H("toast.ratingCleared", "Rating cleared"),
- "Failed to update tags": H("toast.tagsUpdateFailed", "Failed to update tags"),
- "Tags updated": H("toast.tagsUpdated", "Tags updated"),
- "Failed to toggle watcher": H("toast.watcherToggleFailed", "Failed to toggle watcher"),
- "No valid assets selected.": H("toast.noValidAssetsSelected", "No valid assets selected."),
- "Name collision in current view": H("toast.nameCollisionInView", "Name collision in current view"),
- "Failed to create collection.": H("toast.failedCreateCollectionDot", "Failed to create collection."),
- "Failed to add assets to collection.": H("toast.failedAddAssetsToCollection", "Failed to add assets to collection."),
- "Failed to remove from collection.": H("toast.removeFromCollectionFailed", "Failed to remove from collection."),
- "Collection created": H("toast.collectionCreated", "Collection created"),
- "Added to collection": H("toast.addedToCollection", "Added to collection"),
- "Removed from collection": H("toast.removedFromCollection", "Removed from collection"),
- "File renamed successfully!": H("toast.fileRenamedSuccess", "File renamed successfully!"),
- "Failed to rename file": H("toast.fileRenameFailed", "Failed to rename file"),
- "Failed to rename file.": H("toast.fileRenameFailed", "Failed to rename file."),
- "File deleted successfully!": H("toast.fileDeletedSuccess", "File deleted successfully!"),
- "Failed to delete file.": H("toast.fileDeleteFailed", "Failed to delete file."),
- "Failed to delete file. ": H("toast.fileDeleteFailed", "Failed to delete file."),
- "File deleted": H("toast.deleted", "File deleted"),
- "File renamed": H("toast.renamed", "File renamed"),
- "Folder created": H("toast.folderCreated", "Folder created"),
- "Folder renamed": H("toast.folderRenamed", "Folder renamed"),
- "Folder moved": H("toast.folderMoved", "Folder moved"),
- "Folder deleted": H("toast.folderDeleted", "Folder deleted"),
- "Failed to create folder": H("toast.createFolderFailed", "Failed to create folder"),
- "Failed to rename folder": H("toast.renameFolderFailed", "Failed to rename folder"),
- "Failed to move folder": H("toast.moveFolderFailed", "Failed to move folder"),
- "Failed to delete folder": H("toast.deleteFolderFailed", "Failed to delete folder"),
- "Failed to pin folder": H("toast.pinFolderFailed", "Failed to pin folder"),
- "Failed to unpin folder": H("toast.unpinFolderFailed", "Failed to unpin folder"),
- "Folder pinned as browser root": H("toast.folderPinnedAsBrowserRoot", "Folder pinned as browser root"),
- "Folder added": H("toast.folderAdded", "Folder added"),
- "Folder removed": H("toast.folderRemoved", "Folder removed"),
- "Folder linked successfully": H("toast.folderLinked", "Folder linked successfully"),
- "An error occurred while adding the custom folder": H("toast.errorAddingFolder", "An error occurred while adding the custom folder"),
- "An error occurred while removing the custom folder": H("toast.errorRemovingFolder", "An error occurred while removing the custom folder"),
- "Failed to add custom folder": H("toast.failedAddFolder", "Failed to add custom folder"),
- "Failed to remove custom folder": H("toast.failedRemoveFolder", "Failed to remove custom folder"),
- "Native folder browser unavailable. Please enter path manually.": H("toast.nativeBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."),
- "Opened in folder": H("toast.openedInFolder", "Opened in folder"),
- "Failed to open folder": H("toast.openFolderFailed", "Failed to open folder"),
- "Failed to open folder.": H("toast.openFolderFailed", "Failed to open folder."),
- "File path copied to clipboard": H("toast.pathCopied", "File path copied to clipboard"),
- "Failed to copy path": H("toast.pathCopyFailed", "Failed to copy path"),
- "Failed to copy to clipboard": H("toast.copyClipboardFailed", "Failed to copy to clipboard"),
- "No file path available for this asset.": H("toast.noFilePath", "No file path available for this asset."),
- "Failed to refresh metadata.": H("toast.metadataRefreshFailed", "Failed to refresh metadata."),
- "Metadata refreshed": H("toast.metadataRefreshed", "Metadata refreshed"),
- "Duplicate analysis started": H("toast.dupAnalysisStarted", "Duplicate analysis started"),
- "Tags merged": H("toast.tagsMerged", "Tags merged"),
- "Duplicates deleted": H("toast.duplicatesDeleted", "Duplicates deleted"),
- "Rescanning file...": H("toast.rescanningFile", "Rescanning file..."),
- "Metadata enrichment complete": H("toast.enrichmentComplete", "Metadata enrichment complete"),
- "Playback speed is available for video media only": H("toast.playbackVideoOnly", "Playback speed is available for video media only"),
- "DB backup saved": H("toast.dbSaveSuccess", "DB backup saved"),
- "Failed to save DB backup": H("toast.dbSaveFailed", "Failed to save DB backup"),
- "DB restore started": H("toast.dbRestoreStarted", "DB restore started"),
- "Failed to restore DB backup": H("toast.dbRestoreFailed", "Failed to restore DB backup"),
- "Select a DB backup first": H("toast.dbRestoreSelect", "Select a DB backup first"),
- "Stopping running workers": H("toast.dbRestoreStopping", "Stopping running workers"),
- "Unlocking and resetting database": H("toast.dbRestoreResetting", "Unlocking and resetting database"),
- "Recreating database": H("toast.dbRestoreReplacing", "Recreating database"),
- "Replacing database files": H("toast.dbRestoreReplacing", "Replacing database files"),
- "Restarting scan": H("toast.dbRestoreRescan", "Restarting scan"),
- "Deleting database and rebuilding...": H("toast.dbDeleteTriggered", "Deleting database and rebuilding..."),
- "Database deleted and rebuilt. Files are being reindexed.": H("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed."),
- "Failed to delete database": H("toast.dbDeleteFailed", "Failed to delete database"),
- "Database backup restored": H("toast.dbRestoreSuccess", "Database backup restored"),
- "Index reset started. Files will be reindexed in the background.": H("toast.resetStarted", "Index reset started. Files will be reindexed in the background."),
- "Failed to reset index": H("toast.resetFailed", "Failed to reset index"),
- "Reset triggered: Reindexing all files...": H("toast.resetTriggered", "Reset triggered: Reindexing all files..."),
- "Reset failed - database is corrupted. Use the \"Delete DB\" button to force-delete and rebuild.": H("toast.resetFailedCorrupt", "Reset failed - database is corrupted. Use the \"Delete DB\" button to force-delete and rebuild."),
- "Scan started": H("toast.scanStarted", "Scan started"),
- "Scan complete": H("toast.scanComplete", "Scan complete"),
- "Scan failed": H("toast.scanFailed", "Scan failed"),
- "Permission denied": H("toast.permissionDenied", "Permission denied"),
- "Language changed. Reload the page for full effect.": H("toast.languageChanged", "Language changed. Reload the page for full effect."),
- "Tag added": H("toast.tagAdded", "Tag added"),
- "Tag removed": H("toast.tagRemoved", "Tag removed"),
- "Rating saved": H("toast.ratingSaved", "Rating saved"),
- "Failed to create collection": H("toast.failedCreateCollection", "Failed to create collection"),
- "Failed to delete collection": H("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 H("toast.ratingSetN", "Rating set to {n} stars", { n: Number(r[1]) });
- if (r = t.match(/Downloading (.+?)\.\.\./i), r) return H("toast.downloadingFile", "Downloading {filename}...", { filename: r[1] });
- if (r = t.match(/Playback ([0-9]+(?:\.[0-9]+)?)x/i), r) return H("toast.playbackRate", "Playback {rate}x", { rate: Number(r[1]).toFixed(2) });
- if (r = t.match(/Metadata refreshed(?:\s*(.*))?/i), r) return H("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: r[1] ? " (" + r[1] + ")" : "" });
- if (r = t.match(/Error renaming(?: file)?:\s*(.+)/i), r) return H("toast.errorRenaming", "Error renaming file: {error}", { error: r[1] });
- if (r = t.match(/Error deleting(?: files?| file)?:\s*(.+)/i), r) return H("toast.errorDeleting", "Error deleting file: {error}", { error: r[1] });
- if (r = t.match(/Tag merge failed:\s*(.+)/i), r) return H("toast.tagMergeFailed", "Tag merge failed: {error}", { error: r[1] });
- if (r = t.match(/Delete failed:\s*(.+)/i), r) return H("toast.deleteFailed", "Delete failed: {error}", { error: r[1] });
- if (r = t.match(/Analysis not started:\s*(.+)/i), r) return H("toast.analysisNotStarted", "Analysis not started: {error}", { error: r[1] });
- if (r = t.match(/(\d+)\s+files deleted successfully!/i), r) return H("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 H("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 H("toast.filesDeletedShort", "{n} files deleted", { n: Number(r[1]) });
- if (r = t.match(/(\d+)\s+deleted,\s+(\d+)\s+failed/i), r) return H("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 H("toast.copiedToClipboardNamed", "{name} copied to clipboard!", { name: r[1] });
- if (r = t.match(/Folder created:\s*(.+)/i), r) return H("toast.folderCreated", "Folder created: {name}", { name: r[1] });
- if (r = t.match(/Failed to create folder:\s*(.+)/i), r) return H("toast.createFolderFailedDetail", "Failed to create folder: {error}", { error: r[1] });
- if (r = t.match(/Failed to rename folder:\s*(.+)/i), r) return H("toast.renameFolderFailedDetail", "Failed to rename folder: {error}", { error: r[1] });
- if (r = t.match(/Failed to move folder:\s*(.+)/i), r) return H("toast.moveFolderFailedDetail", "Failed to move folder: {error}", { error: r[1] });
- if (r = t.match(/Failed to delete folder:\s*(.+)/i), r) return H("toast.deleteFolderFailedDetail", "Failed to delete folder: {error}", { error: r[1] });
- if (r = t.match(/Error removing from collection:\s*(.+)/i), r) return H("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": H("toast.failedAddFolder", "Failed to add custom folder"),
- "remove folder": H("toast.failedRemoveFolder", "Failed to remove custom folder"),
- "create collection": H("toast.failedCreateCollection", "Failed to create collection"),
- "delete collection": H("toast.failedDeleteCollection", "Failed to delete collection")
- };
- for (let [n, r] of Object.entries(t)) if (e.includes(n)) return r;
- }
- return t;
-}
-function Et(e, t = "info", n, r) {
- if (t = bt(t), e = Tt(e), n ??= wt(t), !r?.noHistory) try {
- ht(St(e, t, n, r), t, n ?? void 0);
- } catch {}
- let i = !(Number.isFinite(Number(n)) && Number(n) > 0), a = O();
- try {
- let r = ve(a);
- if (r && typeof r.add == "function") {
- let a = t;
- a === "warning" && (a = "warn");
- let o = H("manager.title"), s = e;
- if (typeof e == "object" && e?.summary) o = e.summary, s = e.detail || "";
- else if (typeof e != "string") try {
- s = e.message || String(e);
- } catch (e) {
- console.debug?.(e);
- }
- let c = {
- severity: a,
- summary: o,
- detail: s
- };
- i || (c.life = n), r.add(c);
- return;
- }
- } catch (e) {
- console.debug("Majoor: extensionManager.toast failed", e);
- }
- if (a?.ui?.toast) try {
- return a.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: xt(e),
- duration: i ? 0 : n
- });
-}
-//#endregion
-//#region ui/api/clientAuth.ts
-var Dt = 2e3, Ot = 15e3, kt = 8e3, At = "__mjr_write_token", G = "token", jt = null, K = null, Mt = null, q = x({
- ttlMs: Dt,
- maxSize: 1
-});
-function Nt() {
- try {
- return String(sessionStorage?.getItem?.(At) || "").trim();
- } catch {
- return "";
- }
-}
-function Pt(e) {
- let t = String(e || "").trim();
- try {
- return t ? sessionStorage?.setItem?.(At, t) : sessionStorage?.removeItem?.(At), !0;
- } catch {
- return !1;
- }
-}
-function Ft() {
- try {
- let e = localStorage?.getItem?.(a), 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?.(a, JSON.stringify(n)));
- } catch (e) {
- console.debug?.(e);
- }
-}
-function It() {
- try {
- q.delete(G);
- } catch (e) {
- console.debug?.(e);
- }
- Pt(""), Ft();
-}
-function Lt() {
- let e = q.get(G);
- if (e !== void 0) return e;
- let t = Date.now(), n = Nt();
- if (n) return q.set(G, n, { at: t }), n;
- try {
- let e = localStorage?.getItem?.(a), n = e ? JSON.parse(e) : null, r = n?.data && typeof n.data == "object" ? n.data : n, i = String(r?.security?.apiToken || "").trim();
- if (i) {
- Pt(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?.(a, JSON.stringify(e)), window?.dispatchEvent?.(new CustomEvent("mjr-settings-changed", { detail: { key: "security.apiToken" } })));
- } catch (e) {
- console.debug?.(e);
- }
- }
- return q.set(G, i, { at: t }), i;
- } catch {
- return q.set(G, "", { at: t }), "";
- }
-}
-function Rt(e) {
- let t = String(e || "").trim();
- if (!t) return !1;
- try {
- q.set(G, t), K = null, Pt(t), Ft();
- try {
- window?.dispatchEvent?.(new CustomEvent("mjr-settings-changed", { detail: { key: "security.apiToken" } }));
- } catch (e) {
- console.debug?.(e);
- }
- return !0;
- } catch {
- return !1;
- }
-}
-var zt = /^[A-Za-z0-9._\-~+/]+=*$/;
-function Bt(e) {
- let t = String(e || "").trim();
- return t ? zt.test(t) ? Rt(t) : (console.debug?.("[MJR auth] Rejected malformed security token (invalid characters)"), !1) : !1;
-}
-function Vt(e = {}) {
- K = {
- code: String(e?.code || "").trim().toUpperCase(),
- error: String(e?.error || "").trim(),
- status: Number(e?.status || 0) || 0,
- at: Date.now()
- };
-}
-function Ht() {
- let e = K;
- if (!e) return null;
- let t = Date.now() - (Number(e.at || 0) || 0);
- return t < 0 || t > Ot ? (K = null, null) : e;
-}
-function Ut(e) {
- let t = Ht(), 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 i === "FORBIDDEN" && (a.includes("already configured") || a.includes("rotate-token")) ? H("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")) ? H("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") ? H("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 Wt(e) {
- let t = String(e || "").trim();
- if (!t) return;
- let n = Date.now(), r = Mt;
- if (!(r && r.message === t && n - (Number(r.at || 0) || 0) < kt)) {
- Mt = {
- message: t,
- at: n
- };
- try {
- Et({
- summary: H("toast.writeAuthTitle", "Majoor remote write access"),
- detail: t
- }, "warning", 6500, { noHistory: !0 });
- } catch (e) {
- console.debug?.(e);
- }
- }
-}
-function Gt(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 = Ut(e);
- return i ? (Wt(i), {
- ...e,
- error: i
- }) : e;
-}
-async function Kt() {
- 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 Vt({
- 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 Vt({
- code: "INVALID_RESPONSE",
- error: "Bootstrap token response was invalid.",
- status: e.status
- }), {
- ok: !1,
- token: !1
- };
- if (!t.ok) return Vt({
- code: t?.code,
- error: t?.error,
- status: e.status
- }), {
- ok: !1,
- token: !1
- };
- let n = String(t?.data?.token || "").trim();
- return n ? {
- ok: Rt(n),
- token: !0
- } : (K = null, {
- ok: !0,
- token: !1
- });
- } catch (e) {
- return Vt({
- code: "NETWORK_ERROR",
- error: e?.message || "Bootstrap token request failed.",
- status: 0
- }), {
- ok: !1,
- token: !1
- };
- }
-}
-async function qt({ force: e = !1, allowCookieRefresh: t = !1 } = {}) {
- let n = Lt();
- if (n && !e) return n;
- let r = {
- ok: !1,
- token: !1
- };
- jt ||= (async () => {
- try {
- return await Kt();
- } finally {
- jt = null;
- }
- })();
- try {
- r = await jt || r;
- } catch (e) {
- console.debug?.(e);
- }
- if (e && r?.ok && !r?.token && n) It();
- else if (e && !r?.ok) {
- let e = Ht(), t = String(e?.code || "").trim().toUpperCase();
- (!t || !["NETWORK_ERROR", "INVALID_RESPONSE"].includes(t)) && It();
- }
- let i = Lt();
- return !i && t && r?.ok ? !0 : i;
-}
-function Jt() {
- q.clear();
-}
-//#endregion
-//#region ui/api/clientOps.ts
-async function Yt(e) {
- return !e || typeof e != "string" ? {
- ok: !1,
- error: "Missing mode",
- code: "INVALID_INPUT"
- } : Q("/mjr/am/settings/probe-backend", { mode: e });
-}
-async function Xt() {
- return Z(n.SETTINGS_METADATA_FALLBACK);
-}
-async function Zt({ image: e, media: t } = {}) {
- return Q(n.SETTINGS_METADATA_FALLBACK, {
- image: e,
- media: t
- });
-}
-async function Qt() {
- return Z(n.SETTINGS_VECTOR_SEARCH);
-}
-async function $t(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), Q(n.SETTINGS_VECTOR_SEARCH, t);
- }
- return Q(n.SETTINGS_VECTOR_SEARCH, { enabled: !!e });
-}
-async function en() {
- return Z(n.SETTINGS_EXECUTION_GROUPING);
-}
-async function tn(e = !0) {
- return Q(n.SETTINGS_EXECUTION_GROUPING, { enabled: !!e });
-}
-async function nn() {
- return Z(n.SETTINGS_HUGGINGFACE);
-}
-async function rn(e = "") {
- return Q(n.SETTINGS_HUGGINGFACE, { token: String(e ?? "").trim() });
-}
-async function an() {
- return Z(n.SETTINGS_AI_LOGGING);
-}
-async function on(e = !1) {
- return Q(n.SETTINGS_AI_LOGGING, { enabled: !!e });
-}
-async function sn() {
- return Z(n.SETTINGS_ROUTE_LOGGING);
-}
-async function cn(e = !1) {
- return Q(n.SETTINGS_ROUTE_LOGGING, { enabled: !!e });
-}
-async function ln() {
- return Z(n.SETTINGS_STARTUP_LOGGING);
-}
-async function un(e = !1) {
- return Q(n.SETTINGS_STARTUP_LOGGING, { enabled: !!e });
-}
-async function dn() {
- return Z(n.SETTINGS_LTXAV_RGB_FALLBACK);
-}
-async function fn(e = !1) {
- return Q(n.SETTINGS_LTXAV_RGB_FALLBACK, { enabled: !!e });
-}
-async function pn() {
- return Z(n.SETTINGS_OUTPUT_DIRECTORY);
-}
-async function mn(e, t = {}) {
- let r = String(e ?? "").trim();
- return Q(n.SETTINGS_OUTPUT_DIRECTORY, { output_directory: r }, t);
-}
-async function hn() {
- return Z(n.SETTINGS_INDEX_DIRECTORY);
-}
-async function gn(e, t = {}) {
- let r = String(e ?? "").trim();
- return Q(n.SETTINGS_INDEX_DIRECTORY, { index_directory: r }, t);
-}
-async function _n() {
- return Z("/mjr/am/settings/security");
-}
-async function vn(e) {
- return Q("/mjr/am/settings/security", e && typeof e == "object" ? e : {});
-}
-async function yn() {
- let e = await Q("/mjr/am/settings/security/bootstrap-token", {});
- if (e?.ok) try {
- let t = String(e?.data?.token || "").trim();
- t && Rt(t);
- } catch (e) {
- console.debug?.(e);
- }
- return e;
-}
-async function bn(e) {
- if (e && typeof e == "object") {
- let t = String(e.filepath || e.path || e?.file_info?.filepath || "").trim();
- return e.id == null ? Q("/mjr/am/open-in-folder", { filepath: t }) : Q("/mjr/am/open-in-folder", { asset_id: i(e.id) });
- }
- return Q("/mjr/am/open-in-folder", { asset_id: i(e) });
-}
-async function xn({ op: e = "", path: t = "", name: r = "", destination: i = "", recursive: a = !0 } = {}, o = {}) {
- let s = {
- op: String(e || "").trim().toLowerCase(),
- path: String(t || "").trim()
- };
- return r != null && String(r).trim() && (s.name = String(r).trim()), i != null && String(i).trim() && (s.destination = String(i).trim()), s.op === "delete" && (s.recursive = !!a), Q(n.BROWSER_FOLDER_OP, s, o);
-}
-async function Sn(e = {}) {
- let t = (e, t) => e == null ? t : !!e, r = String(e.scope || "output").trim().toLowerCase() || "output", i = e.customRootId ?? e.custom_root_id ?? e.rootId ?? e.root_id ?? e.customRoot ?? null, a = {
- scope: r,
- 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, r === "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 i && (a.custom_root_id = String(i)), Q(n.INDEX_RESET, a);
-}
-async function Cn({ scope: e = "output", customRootId: t = "" } = {}) {
- let r = String(e || "output").trim().toLowerCase() || "output", i = String(t || "").trim(), a = { scope: r };
- return i && (a.custom_root_id = i), Q(n.WATCHER_SCOPE, a);
-}
-async function wn(e = {}) {
- return Z(n.WATCHER_STATUS, e);
-}
-async function Tn(e = !0) {
- return Q(n.WATCHER_TOGGLE, { enabled: !!e });
-}
-async function En() {
- return Z(n.WATCHER_SETTINGS);
-}
-async function Dn(e = {}) {
- return Q(n.WATCHER_SETTINGS, e);
-}
-async function On(e = {}) {
- return Z(n.TOOLS_STATUS, e);
-}
-async function kn(e = {}) {
- return Z(n.STATUS, e);
-}
-async function An() {
- return Q("/mjr/am/db/force-delete", {});
-}
-async function jn(e = {}) {
- return Z(n.DB_BACKUPS, e);
-}
-async function Mn() {
- return Q(n.DB_BACKUP_SAVE, {});
-}
-async function Nn({ name: e = "", useLatest: t = !1 } = {}) {
- let r = {};
- return e && (r.name = String(e)), t && (r.use_latest = !0), Q(n.DB_BACKUP_RESTORE, r);
-}
-async function Pn(e = 250) {
- return Q("/mjr/am/duplicates/analyze", { limit: Math.max(10, Math.min(5e3, Number(e) || 250)) });
-}
-async function Fn({ 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)))}`, Z(a, i);
-}
-async function In(e, t = []) {
- return Q("/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 Ln(e) {
- let t, n;
- if (e && typeof e == "object") {
- t = i(e.id);
- let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim();
- n = t ? { asset_id: t } : { filepath: r };
- } else t = i(e), n = { asset_id: t };
- let r = await Q("/mjr/am/asset/delete", n);
- return r?.ok && t && zn([t]), r;
-}
-async function Rn(e) {
- let t = Array.isArray(e) ? e.map((e) => i(e)).filter(Boolean) : [], n = await Q("/mjr/am/assets/delete", { ids: t });
- return n?.ok && zn(t), n;
-}
-function zn(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 Bn(e, t) {
- let n;
- if (e && typeof e == "object") {
- n = i(e.id);
- let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(), a = n ? await Q("/mjr/am/asset/rename", {
- asset_id: n,
- new_name: t
- }) : await Q("/mjr/am/asset/rename", {
- filepath: r,
- new_name: t
- });
- if (a?.ok && n) try {
- let e = await Dr(n);
- e?.ok && e?.data && (a.data = {
- ...a.data || {},
- asset: e.data
- });
- } catch (e) {
- console.debug?.(e);
- }
- return a;
- }
- n = i(e);
- let r = await Q("/mjr/am/asset/rename", {
- asset_id: n,
- new_name: t
- });
- if (r?.ok && n) try {
- let e = await Dr(n);
- e?.ok && e?.data && (r.data = {
- ...r.data || {},
- asset: e.data
- });
- } catch (e) {
- console.debug?.(e);
- }
- return r;
-}
-async function Vn() {
- let e = typeof AbortController < "u" ? new AbortController() : null, t = null;
- try {
- return e && (t = setTimeout(() => e.abort(), 1e4)), await Z("/mjr/am/collections", e ? { signal: e.signal } : {});
- } finally {
- t && clearTimeout(t);
- }
-}
-async function Hn(e) {
- return Q("/mjr/am/collections", { name: String(e || "").trim() });
-}
-async function Un(e) {
- let t = String(e || "").trim();
- return Q(`/mjr/am/collections/${encodeURIComponent(t)}/delete`, {});
-}
-async function Wn(e, t) {
- let n = String(e || "").trim(), r = Array.isArray(t) ? t : [];
- return Q(`/mjr/am/collections/${encodeURIComponent(n)}/add`, { assets: r });
-}
-async function Gn(e, t) {
- let n = String(e || "").trim(), r = Array.isArray(t) ? t : [];
- return Q(`/mjr/am/collections/${encodeURIComponent(n)}/remove`, { filepaths: r });
-}
-async function Kn(e) {
- let t = String(e || "").trim();
- return Z(`/mjr/am/collections/${encodeURIComponent(t)}/assets`);
-}
-async function qn(e, r = 20) {
- let i = String(e || "").trim();
- if (!i) return {
- ok: !1,
- error: "Empty query"
- };
- let a = r && typeof r == "object" ? r : { topK: Number(r) }, o = Math.max(1, Math.min(200, Number(a?.topK ?? 20) || 20)), s = String(a?.scope || "").trim(), c = String(a?.customRootId || "").trim(), l = `${n.VECTOR_SEARCH}?q=${encodeURIComponent(i)}&top_k=${o}`;
- return s && (l += `&scope=${encodeURIComponent(s)}`), c && (l += `&custom_root_id=${encodeURIComponent(c)}`), l = t(l, {
- subfolder: a?.subfolder ?? null,
- kind: a?.kind ?? null,
- hasWorkflow: a?.hasWorkflow ?? null,
- minRating: a?.minRating ?? null,
- minSizeMB: a?.minSizeMB ?? null,
- maxSizeMB: a?.maxSizeMB ?? null,
- minWidth: a?.minWidth ?? null,
- minHeight: a?.minHeight ?? null,
- maxWidth: a?.maxWidth ?? null,
- maxHeight: a?.maxHeight ?? null,
- workflowType: a?.workflowType ?? null,
- dateRange: a?.dateRange ?? null,
- dateExact: a?.dateExact ?? null
- }), Z(l, { timeoutMs: 12e4 });
-}
-async function Jn(e, t = 20) {
- let r = String(e || "").trim();
- if (!r) return {
- ok: !1,
- error: "Missing asset ID"
- };
- let i = t && typeof t == "object" ? t : { topK: Number(t) }, a = Math.max(1, Math.min(200, Number(i?.topK ?? 20) || 20)), o = String(i?.scope || "").trim(), s = String(i?.customRootId || "").trim(), c = `${n.VECTOR_SIMILAR}/${encodeURIComponent(r)}?top_k=${a}`;
- return o && (c += `&scope=${encodeURIComponent(o)}`), s && (c += `&custom_root_id=${encodeURIComponent(s)}`), Z(c, { dedupeKey: `vec:${r}:${a}:${o}:${s}` });
-}
-async function Yn(e) {
- let t = String(e || "").trim();
- return t ? Z(`${n.VECTOR_ALIGNMENT}/${encodeURIComponent(t)}`) : {
- ok: !1,
- error: "Missing asset ID"
- };
-}
-async function Xn(e) {
- let t = String(e || "").trim();
- return t ? Q(`${n.VECTOR_INDEX}/${encodeURIComponent(t)}`, {}) : {
- ok: !1,
- error: "Missing asset ID"
- };
-}
-async function Zn() {
- return Z(n.VECTOR_STATS);
-}
-async function Qn(e = 64, t = {}) {
- let r = Math.max(1, Math.min(200, e)), i = typeof t?.onProgress == "function" ? t.onProgress : null, a = String(t?.scope || "").trim().toLowerCase(), o = String(t?.customRootId ?? t?.custom_root_id ?? "").trim(), s = `${n.VECTOR_BACKFILL}?batch_size=${r}&async=1`;
- a && (s += `&scope=${encodeURIComponent(a)}`), o && (s += `&custom_root_id=${encodeURIComponent(o)}`);
- let c = await Q(s, {}, { timeoutMs: 3e4 });
- if (!c?.ok) return c;
- let l = c?.data || {}, u = String(l?.status || "").toLowerCase(), d = String(l?.backfill_id || "").trim();
- try {
- i?.(l);
- } catch (e) {
- console.debug?.(e);
- }
- if (!d || ![
- "queued",
- "running",
- "pending"
- ].includes(u)) return c;
- let f = Number(t?.pollIntervalMs), p = Number(t?.pollTimeoutMs), m = Number.isFinite(f) ? Math.max(500, Math.min(1e4, Math.floor(f))) : or, h = Number.isFinite(p) ? Math.max(1e4, Math.min(cr, Math.floor(p))) : sr, g = Date.now(), _ = null;
- for (; Date.now() - g < h;) {
- await ee(m);
- let e = await Z(`${n.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 });
- if (!e?.ok) {
- _ = e;
- continue;
- }
- let t = e?.data || {}, r = String(t?.status || "").toLowerCase();
- _ = e;
- try {
- i?.(t);
- } catch (e) {
- console.debug?.(e);
- }
- if (r === "succeeded") return {
- ok: !0,
- data: t?.result || {},
- code: null,
- status: 200
- };
- if (r === "failed") return {
- ok: !1,
- error: String(t?.error || "Vector backfill failed"),
- code: String(t?.code || "DB_ERROR"),
- data: t,
- status: 500
- };
- }
- let v = await Z(`${n.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }), y = v?.data || _?.data || {}, b = String(y?.status || "").toLowerCase();
- if (v?.ok && [
- "queued",
- "running",
- "pending"
- ].includes(b)) {
- try {
- i?.(y);
- } catch (e) {
- console.debug?.(e);
- }
- return {
- ok: !0,
- code: "PENDING",
- status: 202,
- data: {
- ...y,
- pending: !0,
- timed_out: !0,
- poll_timeout_ms: h,
- backfill_id: String(y?.backfill_id || d),
- status: b || "running"
- },
- meta: { pending: !0 }
- };
- }
- return v?.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 ${h}ms`,
- code: "TIMEOUT",
- data: y || null,
- status: 408
- };
-}
-async function $n(e) {
- let t = String(e || "").trim();
- return t ? Q(`${n.VECTOR_CAPTION}/${encodeURIComponent(t)}`, {}) : {
- ok: !1,
- error: "Missing asset ID"
- };
-}
-async function er(e, { topK: r = 50, scope: i = "output", customRootId: a = "", subfolder: o = null, kind: s = null, hasWorkflow: c = null, minRating: l = null, minSizeMB: u = null, maxSizeMB: d = null, minWidth: f = null, minHeight: p = null, maxWidth: m = null, maxHeight: ee = null, workflowType: h = null, dateRange: g = null, dateExact: _ = null } = {}) {
- let v = String(e || "").trim();
- if (!v) return {
- ok: !1,
- error: "Empty query"
- };
- let y = `${n.HYBRID_SEARCH}?q=${encodeURIComponent(v)}&top_k=${Math.max(1, Math.min(200, r))}&scope=${encodeURIComponent(i)}`;
- return a && (y += `&custom_root_id=${encodeURIComponent(a)}`), y = t(y, {
- subfolder: o,
- kind: s,
- hasWorkflow: c,
- minRating: l,
- minSizeMB: u,
- maxSizeMB: d,
- minWidth: f,
- minHeight: p,
- maxWidth: m,
- maxHeight: ee,
- workflowType: h,
- dateRange: g,
- dateExact: _
- }), Z(y, { timeoutMs: 12e4 });
-}
-async function tr(e = 8) {
- return Q(n.VECTOR_SUGGEST_COLLECTIONS, { k: Math.max(2, Math.min(20, e)) });
-}
-//#endregion
-//#region ui/api/client.ts
-var nr = 3e4, rr = "__MJR_API_CLIENT__", ir = 2e3, ar = 200, or = 1e3, sr = 30 * 6e4, cr = 720 * 6e4, J = "settings", lr = "available-tags", Y = x({
- ttlMs: ir,
- maxSize: 1
-}), X = x({
- ttlMs: ir,
- maxSize: 1
-}), ur = x({
- ttlMs: () => mr(),
- maxSize: 1
-}), dr = new Set([
- "1",
- "true",
- "yes",
- "on"
-]), fr = new Set([
- "0",
- "false",
- "no",
- "off"
-]);
-function pr(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 (dr.has(t)) return !0;
- if (fr.has(t)) return !1;
- }
- return !!t;
-}
-function mr() {
- 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(10 * 6e4, Math.floor(r))) : nr;
- } catch {
- return nr;
- }
-}
-function hr() {
- Y.clear();
-}
-function gr() {
- X.clear();
-}
-function _r() {
- ur.clear();
-}
-function vr(e) {
- return String(e ?? "").trim().toLowerCase() || "";
-}
-function yr(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 = vr(e);
- !i || n.has(i) || (n.add(i), t.push(e));
- }
- return t;
-}
-try {
- let e = typeof window < "u" ? window : null;
- e && !e[rr] && (e[rr] = { initialized: !0 }, e.addEventListener?.("storage", (e) => {
- try {
- e?.key === "mjrSettings" && (hr(), gr(), _r(), Jt());
- } catch (e) {
- console.debug?.(e);
- }
- }), e.addEventListener?.("mjr-settings-changed", () => {
- hr(), gr(), _r(), Jt();
- }));
-} catch (e) {
- console.debug?.(e);
-}
-var br = () => {
- let e = Y.get(J);
- if (e !== void 0) return e;
- let t = Date.now();
- try {
- let e = localStorage?.getItem?.(a);
- if (!e) return Y.set(J, !1, { at: t }), !1;
- let n = !!JSON.parse(e)?.observability?.enabled;
- return Y.set(J, n, { at: t }), n;
- } catch {
- return Y.set(J, !1, { at: t }), !1;
- }
-}, xr = () => {
- let e = X.get(J);
- if (e !== void 0) return e;
- let t = Date.now();
- try {
- let e = localStorage?.getItem?.(a);
- if (!e) return X.set(J, !0, { at: t }), !0;
- let n = JSON.parse(e)?.ratingTagsSync?.enabled, r = n == null ? !0 : pr(n, !0);
- return X.set(J, r, { at: t }), r;
- } catch {
- return X.set(J, !0, { at: t }), !0;
- }
-}, Sr = se({
- readObsEnabled: br,
- readAuthToken: Lt,
- ensureWriteAuthToken: qt,
- normalizeWriteAuthFailure: Gt
-}), Cr = Sr.fetchAPI;
-async function Z(e, t = {}) {
- return Sr.get(e, t);
-}
-async function Q(e, t, n = {}) {
- return Sr.post(e, t, n);
-}
-async function wr(t, n, r = {}) {
- let a = xr(), o = t && typeof t == "object" ? t : null, s = i(o ? o.id : t), c = { rating: Math.max(0, Math.min(5, Number(n) || 0)) };
- return s ? c.asset_id = s : o && (c.filepath = o.filepath || o.path || o?.file_info?.filepath || "", c.type = o.type || "output", c.root_id = e(o)), Cr("/mjr/am/asset/rating", {
- ...r,
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- ...a ? { "X-MJR-RTSYNC": "on" } : {}
- },
- body: JSON.stringify(c)
- });
-}
-async function Tr(t, n, r = {}) {
- let a = xr(), o = t && typeof t == "object" ? t : null, s = i(o ? o.id : t), c = { tags: Array.isArray(n) ? n : [] };
- s ? c.asset_id = s : o && (c.filepath = o.filepath || o.path || o?.file_info?.filepath || "", c.type = o.type || "output", c.root_id = e(o));
- let l = await Cr("/mjr/am/asset/tags", {
- ...r,
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- ...a ? { "X-MJR-RTSYNC": "on" } : {}
- },
- body: JSON.stringify(c)
- });
- return l?.ok && _r(), l;
-}
-async function Er() {
- let e = ur.get(lr);
- if (Array.isArray(e)) return {
- ok: !0,
- data: e,
- error: null,
- code: "OK",
- meta: { cached: !0 }
- };
- let t = await Z("/mjr/am/tags");
- if (t?.ok && Array.isArray(t.data)) {
- let e = yr(t.data);
- return ur.set(lr, e), {
- ...t,
- data: e
- };
- }
- return t;
-}
-async function Dr(e, t = {}) {
- let n = encodeURIComponent(i(e));
- return Z(`/mjr/am/asset/${n}`, {
- ...t,
- dedupeKey: t?.dedupeKey || `meta:${n}`
- });
-}
-async function Or(e, t = {}) {
- let n = i(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: a, ...o } = t;
- return Z(r, o);
-}
-async function kr(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 >= ar)) break;
- }
- return r.length ? Q("/mjr/am/assets/batch", { asset_ids: r }, t) : {
- ok: !0,
- data: [],
- error: null,
- code: "OK"
- };
-}
-async function Ar({ 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)}`), Z(f, o);
-}
-async function jr({ filepath: e = "", root_id: t = "", subfolder: r = "" } = {}, i = {}) {
- try {
- if (globalThis.__mjrFolderInfoSupported === !1) return {
- ok: !1,
- data: null,
- error: "Folder info endpoint unavailable",
- code: "UNAVAILABLE"
- };
- if (globalThis.__mjrFolderInfoSupported == null) {
- let e = await Z("/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 a = String(e || "").trim(), o = String(t || "").trim(), s = String(r || "").trim(), c = n.FOLDER_INFO, l = [];
- a ? (l.push(`filepath=${encodeURIComponent(a)}`), l.push("browser_mode=1")) : (o && l.push(`root_id=${encodeURIComponent(o)}`), s && l.push(`subfolder=${encodeURIComponent(s)}`)), l.length && (c += `?${l.join("&")}`);
- let u = await Z(c, i);
- try {
- !u?.ok && Number(u?.status || 0) === 404 && (globalThis.__mjrFolderInfoSupported = !1);
- } catch (e) {
- console.debug?.(e);
- }
- return u;
-}
-//#endregion
-//#region ui/app/hostAdapter.ts
-var $ = null;
-function Mr(e, t) {
- try {
- return Ce(e || $ || O(), t);
- } catch {
- return !1;
- }
-}
-function Nr(e, t) {
- try {
- return be(e || $ || O(), t);
- } catch {
- return !1;
- }
-}
-function Pr(e, t) {
- try {
- return we(e || $ || O(), t);
- } catch {
- return !1;
- }
-}
-function Fr(e, t) {
- try {
- return xe(e || $ || O(), t);
- } catch {
- return !1;
- }
-}
-function Ir(e, t) {
- try {
- return Se(e || $ || O(), t);
- } catch {
- return !1;
- }
-}
-function Lr() {
- return $ || O() || null;
-}
-function Rr(e = null) {
- try {
- return D(e || $ || O()) || null;
- } catch {
- return null;
- }
-}
-async function zr(e = {}) {
- try {
- return await Oe(e);
- } catch {
- return null;
- }
-}
-function Br() {
- let e = $ || O() || 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 : {
- app: e,
- graphCanvas: t,
- ds: n,
- scale: i,
- width: a,
- height: o
- };
-}
-function Vr(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 Hr(e, t) {
- try {
- t?.setDirty?.(!0, !0);
- } catch (e) {
- console.debug?.(e);
- }
- try {
- e?.graph?.setDirtyCanvas?.(!0, !0);
- } catch (e) {
- console.debug?.(e);
- }
-}
-function Ur(e) {
- try {
- let t = Br();
- 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) || !Vr(t.ds, a, o) ? !1 : (Hr(t.app, t.graphCanvas), !0);
- } catch (e) {
- return console.debug?.(e), !1;
- }
-}
-function Wr() {
- try {
- let e = Br();
- 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 : {
- x0: -n / e.scale,
- y0: -r / e.scale,
- x1: (e.width - n) / e.scale,
- y1: (e.height - r) / e.scale
- };
- } catch (e) {
- return console.debug?.(e), null;
- }
-}
-//#endregion
-export { Sn as $, o as $t, Kn as A, yt as At, _n as B, H as Bt, xn as C, qn as Ct, Un as D, Et as Dt, Rn as E, Bt as Et, dn as F, et as Ft, wn as G, ye as Gt, On as H, fe as Ht, Xt as I, Xe as It, jn as J, ue as Jt, er as K, ve as Kt, pn as L, Ze as Lt, en as M, gt as Mt, nn as N, vt as Nt, An as O, Ct as Ot, hn as P, $e as Pt, Bn as Q, x as Qt, sn as R, V as Rt, yn as S, Xn as St, Ln as T, tr as Tt, Qt as U, D as Ut, ln as V, N as Vt, En as W, O as Wt, bn as X, Oe as Xt, In as Y, he as Yt, Gn as Z, De as Zt, Or as _, Dn as _t, Rr as a, gn as at, Tr as b, $n as bt, Ir as c, mn as ct, Z as d, vn as dt, a as en, Nn as et, Dr as f, un as ft, jr as g, Tn as gt, Ar as h, Pn as ht, Wr as i, rn as it, Fn as j, _t as jt, an as k, it as kt, Mr as l, Yt as lt, Er as m, Cn as mt, Nr as n, on as nt, Lr as o, fn as ot, kr as p, $t as pt, Vn as q, de as qt, Ur as r, tn as rt, Fr as s, Zt as st, Pr as t, Mn as tt, zr as u, cn as ut, Q as v, Qn as vt, Hn as w, Zn as wt, Wn as x, Yn as xt, wr as y, Jn as yt, kn as z, Qe as zt };
+export { ee as $, Ve as A, A as B, Oe as C, nt as D, Qe as E, Me as F, g as G, se as H, je as I, te as J, _ as K, De as L, z as M, Fe as N, Ue as O, Ie as P, S as Q, Re as R, Ge as S, Le as T, Te as U, ce as V, we as W, y as X, C as Y, x as Z, it as _, At as a, o as at, We as b, Mt as c, u as ct, Pe as d, ie as et, Ne as f, ze as g, at as h, Pt as i, d as it, rt as j, et as k, Ft as l, lt as m, It as n, v as nt, jt as o, s as ot, tt as p, ae as q, Nt as r, b as rt, $ as s, l as st, Lt as t, re as tt, G as u, $e as v, F as w, ke as x, ut as y, He as z };
diff --git a/dist/chunks/config-dvcltBqE.js b/dist/chunks/config-dvcltBqE.js
deleted file mode 100644
index ba56492c..00000000
--- a/dist/chunks/config-dvcltBqE.js
+++ /dev/null
@@ -1,369 +0,0 @@
-//#region ui/utils/ids.ts
-function e(e) {
- try {
- return String(e ?? "").trim();
- } catch {
- return "";
- }
-}
-var t = 0;
-function n(e) {
- let t = Math.max(4, Number(e) || 0);
- try {
- let e = globalThis.crypto;
- if (!e?.getRandomValues) return "";
- let n = new Uint8Array(t);
- return e.getRandomValues(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join("");
- } catch {
- return "";
- }
-}
-function r(e = "", t = 16) {
- let r = n(t);
- if (!r) throw Error("Secure token generation requires crypto.getRandomValues().");
- return `${String(e || "")}${r}`;
-}
-function i(e = "", r = 8) {
- let i = n(r);
- return i ? `${String(e || "")}${i}` : (t += 1, `${String(e || "")}${Date.now().toString(36)}_${t.toString(36)}`);
-}
-function a(t) {
- let n = e(t);
- if (!n || !/^\d+$/.test(n)) return "";
- try {
- let e = Number(n);
- return !Number.isSafeInteger(e) || e <= 0 ? "" : String(e);
- } catch {
- return "";
- }
-}
-function o(e) {
- return a(e);
-}
-function s(t) {
- try {
- if (!t) return "";
- let n = t, r = n.file_info;
- return e(n.root_id ?? n.rootId ?? n.custom_root_id ?? n.customRootId ?? n.customRoot ?? r?.root_id ?? r?.rootId ?? "");
- } catch {
- return "";
- }
-}
-//#endregion
-//#region ui/utils/path.ts
-function c(e) {
- return String(e || "").replace(/\\/g, "/");
-}
-function l(e) {
- let t = c(e).trim();
- if (!t) return {
- filename: "",
- subfolder: ""
- };
- let n = t.lastIndexOf("/");
- return n < 0 ? {
- filename: t,
- subfolder: ""
- } : {
- filename: t.slice(n + 1),
- subfolder: t.slice(0, n)
- };
-}
-function u(e) {
- return /^[a-zA-Z]:\//.test(String(e || ""));
-}
-//#endregion
-//#region ui/api/endpoints.ts
-var d = 200, f = 0, p = {
- HEALTH: "/mjr/am/health",
- HEALTH_COUNTERS: "/mjr/am/health/counters",
- HEALTH_DB: "/mjr/am/health/db",
- STATUS: "/mjr/am/status",
- RUNTIME_EXECUTION: "/mjr/am/runtime/execution",
- CONFIG: "/mjr/am/config",
- VERSION: "/mjr/am/version",
- SCAN: "/mjr/am/scan",
- INDEX_FILES: "/mjr/am/index-files",
- INDEX_RESET: "/mjr/am/index/reset",
- DB_RESET: "/mjr/am/db/reset",
- SEARCH: "/mjr/am/search",
- LIST: "/mjr/am/list",
- ROOTS: "/mjr/am/roots",
- CUSTOM_ROOTS: "/mjr/am/custom-roots",
- CUSTOM_ROOTS_REMOVE: "/mjr/am/custom-roots/remove",
- BROWSER_FOLDER_OP: "/mjr/am/browser/folder-op",
- BROWSE_FOLDER: "/mjr/sys/browse-folder",
- FOLDER_INFO: "/mjr/am/folder-info",
- METADATA: "/mjr/am/metadata",
- WORKFLOW_QUICK: "/mjr/am/workflow-quick",
- RETRY_SERVICES: "/mjr/am/retry-services",
- STAGE_TO_INPUT: "/mjr/am/stage-to-input",
- OPEN_IN_FOLDER: "/mjr/am/open-in-folder",
- TOOLS_STATUS: "/mjr/am/tools/status",
- SETTINGS_OUTPUT_DIRECTORY: "/mjr/am/settings/output-directory",
- SETTINGS_INDEX_DIRECTORY: "/mjr/am/settings/index-directory",
- SETTINGS_METADATA_FALLBACK: "/mjr/am/settings/metadata-fallback",
- SETTINGS_VECTOR_SEARCH: "/mjr/am/settings/vector-search",
- SETTINGS_EXECUTION_GROUPING: "/mjr/am/settings/execution-grouping",
- SETTINGS_HUGGINGFACE: "/mjr/am/settings/huggingface",
- SETTINGS_AI_LOGGING: "/mjr/am/settings/ai-logging",
- SETTINGS_ROUTE_LOGGING: "/mjr/am/settings/route-logging",
- SETTINGS_STARTUP_LOGGING: "/mjr/am/settings/startup-logging",
- SETTINGS_LTXAV_RGB_FALLBACK: "/mjr/am/settings/ltxav-rgb-fallback",
- VIEW: "/view",
- CUSTOM_VIEW: "/mjr/am/custom-view",
- VIEWER_INFO: "/mjr/am/viewer/info",
- VIEWER_RESOURCE: "/mjr/am/viewer/resource",
- UPLOAD_INPUT: "/mjr/am/upload_input",
- DOWNLOAD: "/mjr/am/download",
- DOWNLOAD_CLEAN: "/mjr/am/download-clean",
- BATCH_ZIP_CREATE: "/mjr/am/batch-zip",
- DATE_HISTOGRAM: "/mjr/am/date-histogram",
- ASSET_DELETE: "/mjr/am/asset/delete",
- ASSET_RENAME: "/mjr/am/asset/rename",
- WATCHER_STATUS: "/mjr/am/watcher/status",
- WATCHER_TOGGLE: "/mjr/am/watcher/toggle",
- WATCHER_SCOPE: "/mjr/am/watcher/scope",
- WATCHER_SETTINGS: "/mjr/am/watcher/settings",
- COLLECTIONS: "/mjr/am/collections",
- STACKS: "/mjr/am/stacks",
- STACKS_MERGE: "/mjr/am/stacks/merge",
- STACKS_DISSOLVE: "/mjr/am/stacks/dissolve",
- STACKS_AUTO_STACK: "/mjr/am/stacks/auto-stack",
- DUPLICATES_ALERTS: "/mjr/am/duplicates/alerts",
- DUPLICATES_ANALYZE: "/mjr/am/duplicates/analyze",
- DUPLICATES_MERGE_TAGS: "/mjr/am/duplicates/merge-tags",
- DB_BACKUPS: "/mjr/am/db/backups",
- DB_BACKUP_SAVE: "/mjr/am/db/backup-save",
- DB_BACKUP_RESTORE: "/mjr/am/db/backup-restore",
- VECTOR_SEARCH: "/mjr/am/vector/search",
- VECTOR_SIMILAR: "/mjr/am/vector/similar",
- VECTOR_ALIGNMENT: "/mjr/am/vector/alignment",
- VECTOR_AUTO_TAGS: "/mjr/am/vector/auto-tags",
- VECTOR_CAPTION: "/mjr/am/vector/caption",
- VECTOR_ENHANCED_PROMPT: "/mjr/am/vector/enhanced-prompt",
- VECTOR_INDEX: "/mjr/am/vector/index",
- VECTOR_STATS: "/mjr/am/vector/stats",
- VECTOR_SUGGEST_COLLECTIONS: "/mjr/am/vector/suggest-collections",
- VECTOR_BACKFILL: "/mjr/am/db/backfill-missing-vectors",
- VECTOR_BACKFILL_STATUS: "/mjr/am/db/backfill-missing-vectors/status",
- HYBRID_SEARCH: "/mjr/am/search/hybrid",
- AUDIT: "/mjr/am/audit"
-};
-function m(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, dateRange: g = null, dateExact: _ = 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(`date_range=${encodeURIComponent(String(g))}`), _ && i(`date_exact=${encodeURIComponent(String(_))}`), n;
-}
-function h(e, t = null, n = "output") {
- let r = String(e || "").trim();
- if (!r) return "";
- let i = `${p.VIEW}?filename=${encodeURIComponent(r)}`;
- return t && (i += `&subfolder=${encodeURIComponent(t)}`), i += `&type=${encodeURIComponent(n)}`, i;
-}
-function g(e = {}) {
- let { q: t = "*", limit: n = d, offset: r = f, scope: i = "output", subfolder: a = "", customRootId: o = null, kind: s = null, hasWorkflow: c = null, minRating: l = null, minSizeMB: u = null, maxSizeMB: h = null, resolutionCompare: g = null, minWidth: _ = null, minHeight: v = null, maxWidth: y = null, maxHeight: b = null, workflowType: x = null, dateRange: S = null, dateExact: C = null, sort: w = null, cursor: T = null, includeTotal: E = !0, groupStacks: D = !1 } = e, O = `${p.LIST}?q=${encodeURIComponent(t)}&limit=${n}&offset=${r}&scope=${encodeURIComponent(i)}`;
- return a && (O += `&subfolder=${encodeURIComponent(a)}`), o ? O += `&custom_root_id=${encodeURIComponent(o)}` : String(i || "").toLowerCase() === "custom" && (O += "&browser_mode=1"), O = m(O, {
- kind: s,
- hasWorkflow: c,
- minRating: l,
- minSizeMB: u,
- maxSizeMB: h,
- minWidth: _,
- minHeight: v,
- maxWidth: y,
- maxHeight: b,
- workflowType: x,
- dateRange: S,
- dateExact: C
- }), g && (O += `&resolution_compare=${encodeURIComponent(String(g))}`), w && (O += `&sort=${encodeURIComponent(String(w))}`), T && (O += `&cursor=${encodeURIComponent(String(T))}`), E === !1 && (O += "&include_total=0"), D && (O += "&group_stacks=1"), O;
-}
-function _(e, t = "", n = "") {
- let r = String(e || "").trim(), i = String(n || "").trim();
- if (!r || !i) return "";
- let a = `${p.CUSTOM_VIEW}?root_id=${encodeURIComponent(i)}&filename=${encodeURIComponent(r)}`;
- return t && (a += `&subfolder=${encodeURIComponent(t)}`), a;
-}
-function v(e) {
- return `${p.BATCH_ZIP_CREATE}/${encodeURIComponent(String(e || ""))}`;
-}
-function y(e) {
- return `${p.STACKS}/${encodeURIComponent(String(e || ""))}`;
-}
-function b(e) {
- return `${y(e)}/members`;
-}
-function x(e, t = {}) {
- let n = String(e || "").trim(), r = `${p.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 S(e, t = "") {
- let n = e && typeof e == "object" ? e : {}, r = String(t || "").trim();
- if (!r) return "";
- let i = o(n?.asset_id ?? n?.id ?? null), a = `${p.VIEWER_RESOURCE}?relpath=${encodeURIComponent(r)}`;
- if (i) return `${a}&asset_id=${encodeURIComponent(i)}`;
- let l = c(String(n?.filepath || n?.path || n?.fullpath || n?.full_path || n?.file_info?.filepath || n?.file_info?.path || "").trim());
- if (l) return `${a}&filepath=${encodeURIComponent(l)}`;
- let u = String(n?.filename || n?.name || n?.file_info?.filename || "").trim();
- if (!u) return "";
- a += `&filename=${encodeURIComponent(u)}`;
- let d = String(n?.subfolder || n?.file_info?.subfolder || "").trim();
- d && (a += `&subfolder=${encodeURIComponent(d)}`);
- let f = String(n?.type || n?.file_info?.type || "").trim().toLowerCase();
- f && f !== "custom" && (a += `&type=${encodeURIComponent(f)}`);
- let m = String(s(n) || n?.root_id || n?.custom_root_id || "").trim();
- return m && (a += `&root_id=${encodeURIComponent(m)}`), a;
-}
-function C(e = {}) {
- let { scope: t = "output", customRootId: n = null, month: r = "", kind: i = null, hasWorkflow: a = null, minRating: o = null } = e, s = `${p.DATE_HISTOGRAM}?scope=${encodeURIComponent(t)}&month=${encodeURIComponent(String(r || ""))}`;
- return n && (s += `&custom_root_id=${encodeURIComponent(n)}`), m(s, {
- subfolder: e.subfolder ?? null,
- kind: i,
- hasWorkflow: a,
- minRating: o,
- minSizeMB: e.minSizeMB ?? null,
- maxSizeMB: e.maxSizeMB ?? null,
- minWidth: e.minWidth ?? null,
- minHeight: e.minHeight ?? null,
- maxWidth: e.maxWidth ?? null,
- maxHeight: e.maxHeight ?? null,
- workflowType: e.workflowType ?? null,
- dateRange: e.dateRange ?? null,
- dateExact: e.dateExact ?? null
- });
-}
-function w(e) {
- let t = e?.mtime, n = (e) => !e || !t ? e : `${e}${e.includes("?") ? "&" : "?"}v=${encodeURIComponent(t)}`, r = c(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "").trim()), i = String(e?.filename || e?.name || e?.file_info?.filename || "").trim(), a = String(e?.subfolder || e?.file_info?.subfolder || "").trim(), o = ((e) => {
- let t = {
- type: "",
- subfolder: "",
- filename: ""
- }, n = c(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) : a >= 0 ? (t.type = "input", s = a + 7) : o >= 0 && (t.type = "temp", s = o + 6), 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 = l(n).filename;
- return t;
- })(r);
- if (!a && i.includes("/")) {
- let e = i.lastIndexOf("/");
- e > 0 && (a = i.slice(0, e), i = i.slice(e + 1));
- }
- if (!i && o.filename && (i = o.filename), !a && o.subfolder && (a = o.subfolder), !i) return "";
- let d = String(e?.type || e?.file_info?.type || "").toLowerCase().trim();
- d !== "input" && d !== "output" && d !== "temp" && d !== "custom" && (d = ""), !d && o.type && (d = o.type), !d && r && (r.includes("/input/") ? d = "input" : r.includes("/output/") ? d = "output" : r.includes("/temp/") && (d = "temp")), d ||= "output";
- let f = r.includes("/output/") || r.includes("/input/") || r.includes("/temp/"), m = u(a) || a.startsWith("/");
- if (r && d !== "custom" && (m || !f)) return n(T(r, { inline: !0 }));
- if (d === "custom") {
- let t = String(s(e) || "").trim();
- if (t) return n(_(i, a, t));
- if (r) return n(`${p.CUSTOM_VIEW}?filepath=${encodeURIComponent(r)}&browser_mode=1`);
- let c = o.type || "output";
- return n(h(i, a, c));
- }
- return r.includes("/output/") && (d = "output"), r.includes("/input/") && (d = "input"), r.includes("/temp/") && (d = "temp"), n(h(i, a, d));
-}
-function T(e, t = {}) {
- if (!e) return "";
- let n = !!t?.inline, r = `${p.DOWNLOAD}?filepath=${encodeURIComponent(e)}`;
- return n && (r += "&preview=1"), r;
-}
-function E(e) {
- return e ? `${p.DOWNLOAD_CLEAN}?filepath=${encodeURIComponent(e)}` : "";
-}
-//#endregion
-//#region ui/app/config.ts
-var D = 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: 120,
- FEED_GRID_MIN_SIZE: 120,
- GRID_GAP: 10,
- GRID_SHOW_BADGES_EXTENSION: !0,
- GRID_SHOW_BADGES_RATING: !0,
- GRID_SHOW_BADGES_TAGS: !0,
- GRID_SHOW_DETAILS: !0,
- GRID_SHOW_DETAILS_FILENAME: !0,
- GRID_SHOW_DETAILS_DATE: !0,
- GRID_SHOW_DETAILS_DIMENSIONS: !0,
- GRID_SHOW_DETAILS_GENTIME: !0,
- GRID_SHOW_HOVER_INFO: !0,
- GRID_SHOW_WORKFLOW_DOT: !0,
- GRID_VIDEO_AUTOPLAY_MODE: "hover",
- FEED_SHOW_INFO: !0,
- FEED_SHOW_FILENAME: !1,
- FEED_SHOW_DIMENSIONS: !0,
- FEED_SHOW_DATE: !0,
- FEED_SHOW_GENTIME: !0,
- FEED_SHOW_WORKFLOW_DOT: !1,
- FEED_SHOW_BADGES_EXTENSION: !0,
- FEED_SHOW_BADGES_RATING: !0,
- FEED_SHOW_BADGES_TAGS: !0,
- UI_CARD_HOVER_COLOR: "#3D3D3D",
- UI_CARD_SELECTION_COLOR: "#4A90E2",
- UI_RATING_COLOR: "#FF9500",
- UI_TAG_COLOR: "#4A90E2",
- BADGE_STAR_COLOR: "#FFD45A",
- BADGE_IMAGE_COLOR: "#2196F3",
- BADGE_VIDEO_COLOR: "#9C27B0",
- BADGE_AUDIO_COLOR: "#FF9800",
- BADGE_MODEL3D_COLOR: "#4CAF50",
- BADGE_DUPLICATE_ALERT_COLOR: "#FF1744",
- DEFAULT_PAGE_SIZE: 80,
- MAX_PAGE_SIZE: 2e3,
- PREFETCH_NEXT_PAGE: !0,
- PREFETCH_NEXT_PAGE_DELAY_MS: 700,
- SEARCH_DEFAULT_LIMIT: 500,
- INFINITE_SCROLL_ENABLED: !0,
- INFINITE_SCROLL_ROOT_MARGIN: "800px",
- INFINITE_SCROLL_THRESHOLD: .01,
- BOTTOM_GAP_PX: 80,
- STATUS_POLL_INTERVAL: 5e3,
- AUTO_SCAN_ON_STARTUP: !1,
- EXECUTION_GROUPING_ENABLED: !0,
- EXECUTION_IDLE_GRACE_MS: 6e3,
- DEFER_GRID_FETCH_DURING_EXECUTION: !1,
- VIEWER_PAUSE_DURING_EXECUTION: !0,
- FLOATING_VIEWER_PAUSE_DURING_EXECUTION: !1,
- MFV_SIDEBAR_POSITION: "right",
- MFV_LIVE_DEFAULT: !0,
- MFV_PREVIEW_DEFAULT: !0,
- MFV_LIVE_AUTO_OPEN: !1,
- MFV_PREVIEW_AUTO_OPEN: !1,
- MFV_NODE_STREAM_AUTO_OPEN: !1,
- MFV_PREVIEW_METHOD: "auto",
- RT_HYDRATE_CONCURRENCY: 2,
- RT_HYDRATE_QUEUE_MAX: 100,
- RT_HYDRATE_SEEN_MAX: 2e4,
- RT_HYDRATE_PRUNE_BUDGET: 250,
- RT_HYDRATE_SEEN_TTL_MS: 600 * 1e3,
- VIEWER_META_TTL_MS: 3e4,
- VIEWER_META_MAX_ENTRIES: 500,
- WORKFLOW_MINIMAP_ENABLED: !0,
- WATCHER_DEBOUNCE_MS: 3e3,
- WATCHER_DEDUPE_TTL_MS: 3e3,
- WATCHER_MAX_PENDING: 500,
- WATCHER_MIN_SIZE: 100,
- WATCHER_MAX_SIZE: 4294967296,
- DB_TIMEOUT_MS: 5e3,
- DB_MAX_CONNECTIONS: 10,
- DB_QUERY_TIMEOUT_MS: 1e3,
- SEARCH_REQUEST_LIMIT: 500,
- DELETE_CONFIRMATION: !0,
- DEBUG_VERBOSE_ERRORS: !1
-}), O = { ...D };
-//#endregion
-export { r as _, w as a, s as b, _ as c, g as d, x as f, c as g, S as h, m as i, C as l, h as m, D as n, v as o, b as p, p as r, E as s, O as t, T as u, i as v, o as y };
diff --git a/dist/chunks/floatingViewerManager-Oat0dyM2.js b/dist/chunks/floatingViewerManager-BSQ_h48I.js
similarity index 50%
rename from dist/chunks/floatingViewerManager-Oat0dyM2.js
rename to dist/chunks/floatingViewerManager-BSQ_h48I.js
index 44dcf682..10a622e0 100644
--- a/dist/chunks/floatingViewerManager-Oat0dyM2.js
+++ b/dist/chunks/floatingViewerManager-BSQ_h48I.js
@@ -1,5 +1,5 @@
-import { Dt as e, o as t, p as n } from "./hostAdapter-D6BwD-lN.js";
-import { t as r } from "./config-dvcltBqE.js";
+import { _t as e, r as t } from "./client-DZE_lzdb.js";
+import { A as n, t as r } from "./config-Cxv7acF8.js";
import { r as i } from "./events-BnkL6-b6.js";
//#region ui/utils/logging.ts
function a(e, ...t) {
@@ -67,7 +67,7 @@ function p(e) {
}
return t;
}
-function ee(e, t, n = "") {
+function m(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);
@@ -76,7 +76,7 @@ function ee(e, t, n = "") {
}
return r;
}
-function te(e, t, n) {
+function ee(e, t, n) {
if (!e) return;
let r = t instanceof Set ? t : new Set(Array.from(t || []).map(String));
try {
@@ -89,10 +89,10 @@ function te(e, t, n) {
console.debug?.(e);
}
}
-function ne(e, t, { activeId: n = "" } = {}, r) {
+function te(e, t, { activeId: n = "" } = {}, r) {
if (!e) return [];
- let i = new Set(Array.from(t || []).map(String).filter(Boolean)), a = ee(e, i, n);
- te(e, i, r);
+ let i = new Set(Array.from(t || []).map(String).filter(Boolean)), a = m(e, i, n);
+ ee(e, i, r);
let o = {
selectedIds: a,
activeId: n || a[0] || ""
@@ -111,53 +111,53 @@ function ne(e, t, { activeId: n = "" } = {}, r) {
}
//#endregion
//#region ui/features/panel/controllers/hotkeysState.ts
-var m = {
+var h = {
suspended: !1,
scope: null,
ratingHotkeysActive: !1
};
-function re() {
- return m;
+function ne() {
+ return h;
}
-function ie(e) {
- m.scope = e == null ? null : String(e);
+function re(e) {
+ h.scope = e == null ? null : String(e);
}
-function ae() {
- return !!m.suspended;
+function ie() {
+ return !!h.suspended;
}
-function oe(e) {
- m.ratingHotkeysActive = !!e;
+function ae(e) {
+ h.ratingHotkeysActive = !!e;
}
//#endregion
//#region ui/features/viewer/viewerRuntimeHosts.ts
-var h = null, g = null, se = ".mjr-viewer-overlay", ce = ".mjr-mfv";
-function le(e) {
+var g = null, _ = null, v = ".mjr-viewer-overlay", oe = ".mjr-mfv";
+function y(e) {
return !!e && typeof e.appendChild == "function";
}
-function _() {
+function b() {
return typeof document > "u" ? null : document?.body || null;
}
-function ue() {
+function se() {
return typeof document > "u" ? null : document?.body || document?.documentElement || null;
}
-function de(e) {
- return le(e) ? e === _() ? !0 : typeof e?.isConnected == "boolean" ? e.isConnected : !0 : !1;
+function ce(e) {
+ return y(e) ? e === b() ? !0 : typeof e?.isConnected == "boolean" ? e.isConnected : !0 : !1;
}
-function fe(e) {
- return le(e) ? e : null;
+function le(e) {
+ return y(e) ? e : null;
}
-function v(e) {
- return de(e) ? e : _();
+function x(e) {
+ return ce(e) ? e : b();
}
-function pe(e) {
- let t = ue();
- return de(t) ? t : v(e);
+function ue(e) {
+ let t = se();
+ return ce(t) ? t : x(e);
}
-function me(e, t, n = v) {
+function de(e, t, n = x) {
let r = [], i = /* @__PURE__ */ new Set();
for (let a of [
n(t),
- _(),
+ b(),
t
]) {
if (!a || i.has(a)) continue;
@@ -172,30 +172,30 @@ function me(e, t, n = v) {
}
return r;
}
-function he(e, t, n = v) {
+function fe(e, t, n = x) {
let r = n(t);
if (!r) return;
- let i = me(e, t, n);
+ let i = de(e, t, n);
for (let e of i) if (e && e.parentNode !== r) try {
r.appendChild(e);
} catch (e) {
console.debug?.(e);
}
}
-function ge(e) {
- return h = fe(e), he(se, h), () => _e(e);
+function pe(e) {
+ return g = le(e), fe(v, g), () => me(e);
}
-function _e(e) {
- (!e || h === e) && (h = null);
-}
-function ve(e) {
- return g = fe(e), he(ce, g, pe), () => ye(e);
-}
-function ye(e) {
+function me(e) {
(!e || g === e) && (g = null);
}
-function be(e) {
- let t = v(h);
+function he(e) {
+ return _ = le(e), fe(oe, _, ue), () => ge(e);
+}
+function ge(e) {
+ (!e || _ === e) && (_ = null);
+}
+function _e(e) {
+ let t = x(g);
try {
t?.appendChild?.(e);
} catch (e) {
@@ -203,8 +203,8 @@ function be(e) {
}
return t;
}
-function xe(e) {
- let t = pe(g);
+function ve(e) {
+ let t = ue(_);
try {
t?.appendChild?.(e);
} catch (e) {
@@ -212,76 +212,76 @@ function xe(e) {
}
return t;
}
-function Se() {
- return me(se, h);
+function ye() {
+ return de(v, g);
}
//#endregion
//#region ui/features/viewer/floatingViewerManager.ts
-var y = null, Ce = null;
-async function we() {
- return y || (Ce ||= import("./FloatingViewer-CY901ToM.js").then((e) => (y = e.FloatingViewer, y)), Ce);
+var S = null, be = null;
+async function xe() {
+ return S || (be ||= import("./FloatingViewer-A8uTs2JS.js").then((e) => (S = e.FloatingViewer, S)), be);
}
-var b = null, Te = null;
-async function Ee() {
- if (!b) return Te ||= import("./NodeStreamController-_rtriits.js").then((e) => {
- b = e.setNodeStreamActive;
- }), Te;
+var C = null, Se = null;
+async function Ce() {
+ if (!C) return Se ||= import("./NodeStreamController-EQygLyLg.js").then((e) => {
+ C = e.setNodeStreamActive;
+ }), Se;
}
-var x = Object.freeze({
+var w = Object.freeze({
SIMPLE: "simple",
AB: "ab",
SIDE: "side",
GRID: "grid",
GRAPH: "graph"
});
-function De(e) {
+function we(e) {
let t = String(e || "").trim().toLowerCase();
- return t === "sidebyside" ? x.SIDE : Object.values(x).includes(t) ? t : "";
+ return t === "sidebyside" ? w.SIDE : Object.values(w).includes(t) ? t : "";
}
-var S = null;
-function C() {
+var T = null;
+function E() {
return r.MFV_LIVE_DEFAULT !== !1;
}
-function w() {
+function D() {
return r.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);
+var O = E(), k = D(), A = !1, j = null, M = !1, N = null, P = 0;
+function Te() {
+ O = E(), k = D(), T?.setLiveActive(O), T?.setPreviewActive(k);
}
-async function M() {
- if (!S) {
- let e = await we();
- S || (S = new e({ controller: {
- close: () => Q.close(),
- toggle: () => Q.toggle(),
- toggleLive: () => Q.toggleLive(),
- togglePreview: () => Q.togglePreview(),
- toggleNodeStream: () => Q.toggleNodeStream(),
- popOut: () => Q.popOut(),
+async function F() {
+ if (!T) {
+ let e = await xe();
+ T || (T = 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();
+ T?.isVisible && e !== w.SIMPLE && H();
},
- handleForwardedKeydown: (e) => qe(e)
- } }), xe(S.render()));
+ handleForwardedKeydown: (e) => Q(e)
+ } }), ve(T.render()));
}
try {
- let e = S?.element || null;
- e?.isConnected === !1 && xe(e);
+ let e = T?.element || null;
+ e?.isConnected === !1 && ve(e);
} catch (e) {
console.debug?.(e);
}
- return S;
+ return T;
}
-function N() {
+function I() {
try {
- A?.abort();
+ N?.abort();
} catch (e) {
console.debug?.(e);
}
- A = null;
+ N = null;
}
-function P() {
+function L() {
try {
let e = window.__MJR_LAST_SELECTION_GRID__;
if (e?.isConnected) return e;
@@ -290,34 +290,34 @@ function P() {
}
return f();
}
-function ke() {
- if (S) {
+function Ee() {
+ if (T) {
try {
- S.dispose?.();
+ T.dispose?.();
} catch (e) {
console.debug?.(e);
}
- S = null;
+ T = null;
}
}
-function F(e) {
+function R(e) {
typeof window > "u" || window.dispatchEvent(new CustomEvent(i.MFV_VISIBILITY_CHANGED, { detail: { visible: !!e } }));
}
-function I(e) {
- e && (e.setLiveActive(T), e.setPreviewActive(E), e.setNodeStreamActive?.(D));
+function z(e) {
+ e && (e.setLiveActive(O), e.setPreviewActive(k), e.setNodeStreamActive?.(A));
}
-function L(e) {
- e?.setNodeStreamSelection && e.setNodeStreamSelection(O || null);
+function B(e) {
+ e?.setNodeStreamSelection && e.setNodeStreamSelection(j || null);
}
-function Ae(e, t) {
+function De(e, t) {
if (!e) return;
let n = e._mode;
- if (!(n === x.AB || n === x.SIDE || n === x.GRID)) {
+ if (!(n === w.AB || n === w.SIDE || n === w.GRID)) {
e.loadMediaA(t, { autoMode: !0 });
return;
}
let r = e.getPinnedSlots();
- if (n === x.GRID) {
+ if (n === w.GRID) {
let n = [
"A",
"B",
@@ -343,9 +343,9 @@ function Ae(e, t) {
e.loadMediaPair(e._mediaA, t);
}
}
-function je(e) {
+function Oe(e) {
try {
- let t = P();
+ 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;
@@ -355,30 +355,30 @@ function je(e) {
return console.debug?.("[MFV] _findAdjacentGridId error", e), null;
}
}
-async function R(e) {
- if (!e.length || !S) return;
- N();
- let t = ++j, r = typeof AbortController < "u" ? new AbortController() : null;
- A = r;
+async function V(e) {
+ if (!e.length || !T) return;
+ I();
+ let n = ++P, r = typeof AbortController < "u" ? new AbortController() : null;
+ N = r;
try {
- let i = S.getPinnedSlots(), a = i.size > 0, o = S._mode, s = o === x.GRID, c = o === x.AB || o === x.SIDE, l = s ? 4 : 2, u = e.slice(0, l);
+ let i = T.getPinnedSlots(), a = i.size > 0, o = T._mode, s = o === w.GRID, c = o === w.AB || o === w.SIDE, l = s ? 4 : 2, u = e.slice(0, l);
if (a && (c || s)) {
let e = l - i.size;
u = u.slice(0, Math.max(1, e));
} else if (u.length === 1 && c) {
- let e = je(u[0]);
+ let e = Oe(u[0]);
e && (u = [u[0], e]);
}
- let d = await n(u, r ? { signal: r.signal } : {});
- if (r?.signal.aborted || j !== t || !d?.ok || !Array.isArray(d.data) || !d.data.length || !S) return;
+ let d = await t(u, r ? { signal: r.signal } : {});
+ if (r?.signal.aborted || P !== n || !d?.ok || !Array.isArray(d.data) || !d.data.length || !T) return;
let f = d.data;
if (s) {
if (a) {
let e = {
- A: S._mediaA,
- B: S._mediaB,
- C: S._mediaC,
- D: S._mediaD
+ A: T._mediaA,
+ B: T._mediaB,
+ C: T._mediaC,
+ D: T._mediaD
}, t = [
"A",
"B",
@@ -386,211 +386,200 @@ async function R(e) {
"D"
].filter((e) => !i.has(e)), n = 0;
for (let r of t) n < f.length && (e[r] = f[n++]);
- S.loadMediaQuad(e.A, e.B, e.C, e.D);
- } else f.length >= 3 ? S.loadMediaQuad(f[0], f[1], f[2], f[3] || null) : f.length >= 2 ? S.loadMediaPair(f[0], f[1]) : S.loadMediaA(f[0], { autoMode: !0 });
+ T.loadMediaQuad(e.A, e.B, e.C, e.D);
+ } else f.length >= 3 ? T.loadMediaQuad(f[0], f[1], f[2], f[3] || null) : f.length >= 2 ? T.loadMediaPair(f[0], f[1]) : T.loadMediaA(f[0], { autoMode: !0 });
return;
}
- if (i.has("A") && i.has("B") && S._mediaA && S._mediaB) return;
- i.has("A") && S._mediaA ? S.loadMediaPair(S._mediaA, f[0]) : i.has("B") && S._mediaB ? S.loadMediaPair(f[0], S._mediaB) : u.length >= 2 && f.length >= 2 ? S.loadMediaPair(f[0], f[1]) : S.loadMediaA(f[0], { autoMode: !0 });
+ if (i.has("A") && i.has("B") && T._mediaA && T._mediaB) return;
+ i.has("A") && T._mediaA ? T.loadMediaPair(T._mediaA, f[0]) : i.has("B") && T._mediaB ? T.loadMediaPair(f[0], T._mediaB) : u.length >= 2 && f.length >= 2 ? T.loadMediaPair(f[0], f[1]) : T.loadMediaA(f[0], { autoMode: !0 });
} catch (e) {
e?.name !== "AbortError" && o(e, "floatingViewerManager._loadFromIds");
} finally {
- A === r && (A = null);
+ N === r && (N = null);
}
}
-function z() {
+function H() {
try {
- let e = P();
+ let e = L();
if (!e) return;
let t = p(e);
if (!t.size) return;
- R(Array.from(t));
+ V(Array.from(t));
} catch (e) {
console.debug?.("[MFV] Error reading current grid selection", e);
}
}
-function Me(e) {
- if (!S?.isVisible) return;
+function ke(e) {
+ if (!T?.isVisible) 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);
+ V(r);
return;
}
try {
- let e = P();
+ let e = L();
if (!e) return;
let t = Array.from(p(e)).map(String).filter(Boolean);
if (!t.length) return;
- R(t);
+ V(t);
} catch (e) {
console.debug?.("[MFV] selection fallback failed", e);
}
}
-function B() {
- k || typeof window > "u" || (window.addEventListener(i.SELECTION_CHANGED, Me), k = !0);
+function U() {
+ M || typeof window > "u" || (window.addEventListener(i.SELECTION_CHANGED, ke), M = !0);
}
-function Ne() {
- typeof window < "u" && window.removeEventListener(i.SELECTION_CHANGED, Me), k = !1, N();
+function Ae() {
+ typeof window < "u" && window.removeEventListener(i.SELECTION_CHANGED, ke), M = !1, I();
}
-var V = !1, H = null, U = null, W = null, G = !1, K = !1, q = !1, J = null, Y = null, X = "";
-function Z() {
- S?.isVisible && S.refreshSidebar?.();
+var W = !1, G = null, K = null, q = "";
+function je() {
+ T?.isVisible && T.refreshSidebar?.();
}
-function Pe() {
- Fe();
+function Me() {
+ Ne();
let e = typeof window < "u" ? window : globalThis;
if (typeof e.requestAnimationFrame == "function") {
- X = "raf", Y = e.requestAnimationFrame(() => {
- Y = null, X = "", Z();
+ q = "raf", K = e.requestAnimationFrame(() => {
+ K = null, q = "", je();
});
return;
}
- X = "timeout", Y = e.setTimeout(() => {
- Y = null, X = "", Z();
+ q = "timeout", K = e.setTimeout(() => {
+ K = null, q = "", je();
}, 16);
}
-function Fe() {
- if (Y == null) return;
+function Ne() {
+ if (K == null) return;
let e = typeof window < "u" ? window : globalThis;
try {
- X === "raf" && typeof e.cancelAnimationFrame == "function" ? e.cancelAnimationFrame(Y) : typeof e.clearTimeout == "function" && e.clearTimeout(Y);
+ q === "raf" && typeof e.cancelAnimationFrame == "function" ? e.cancelAnimationFrame(K) : typeof e.clearTimeout == "function" && e.clearTimeout(K);
} catch (e) {
console.debug?.(e);
}
- Y = null, X = "";
+ K = null, q = "";
}
-function Ie() {
- if (!V) try {
- let e = t()?.canvas;
- if (!e) return;
- G = Object.prototype.hasOwnProperty.call(e, "onNodeSelected"), K = Object.prototype.hasOwnProperty.call(e, "onSelectionChange"), q = Object.prototype.hasOwnProperty.call(e, "onNodeDeselected"), H = e.onNodeSelected, U = e.onSelectionChange, W = e.onNodeDeselected, e.onNodeSelected = function(e) {
- H?.call(this, e), Z();
- }, e.onSelectionChange = function(e) {
- U?.call(this, e), Z();
- }, e.onNodeDeselected = function(e) {
- W?.call(this, e), Z();
- };
- let n = e.canvas;
- n?.addEventListener && (J = Pe, n.addEventListener("pointerup", J)), V = !0;
+function J() {
+ if (!W) try {
+ G = n(Me, { includePointerFallback: !0 }), W = typeof G == "function";
} catch (e) {
console.debug?.("[MFV] _bindNodeSelectionListener error", e);
}
}
-function Le() {
- if (V) {
- Fe();
+function Pe() {
+ if (W) {
+ Ne();
try {
- let e = t()?.canvas;
- e && (G ? e.onNodeSelected = H : delete e.onNodeSelected, K ? e.onSelectionChange = U : delete e.onSelectionChange, q ? e.onNodeDeselected = W : delete e.onNodeDeselected, J && e.canvas?.removeEventListener && e.canvas.removeEventListener("pointerup", J));
+ G?.();
} catch (e) {
console.debug?.("[MFV] _unbindNodeSelectionListener error", e);
}
- H = null, U = null, W = null, G = !1, K = !1, q = !1, J = null, V = !1;
+ G = null, W = !1;
}
}
-var Q = {
+var Y = {
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 = De(r);
- c && a.setMode(c), a.show(), I(a), B(), Ie();
+ let a = await F(), o = !!a.isVisible, s = Math.max(0, Math.min(Number(n) || 0, i.length - 1)), c = we(r);
+ c && a.setMode(c), a.show(), z(a), U(), 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;
+ 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 M();
- e.show(), I(e), B(), Ie(), V || requestAnimationFrame(() => Ie()), z(), D && L(e), F(!0);
+ let e = await F();
+ e.show(), z(e), U(), J(), W || requestAnimationFrame(() => J()), H(), A && B(e), R(!0);
},
close() {
- if (S) try {
- S.isPopped && S.popIn(), S.hide();
+ if (T) try {
+ T.isPopped && T.popIn(), T.hide();
} catch (e) {
console.debug?.(e);
}
- Ne(), S?.setNodeStreamSelection?.(null), Le(), F(!1);
+ Ae(), T?.setNodeStreamSelection?.(null), Pe(), R(!1);
},
async toggle() {
- S?.isVisible ? Q.close() : await Q.open();
+ T?.isVisible ? Y.close() : await Y.open();
},
toggleLive() {
- Q.setLiveActive(!T);
+ Y.setLiveActive(!O);
},
togglePreview() {
- Q.setPreviewActive(!E);
+ Y.setPreviewActive(!k);
},
async toggleCompareAB() {
- let e = await M();
+ let e = await F();
if (!e.isVisible) {
- e.setMode(x.AB), e.show(), I(e), B(), z(), F(!0);
+ e.setMode(w.AB), e.show(), z(e), U(), H(), R(!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();
+ [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 && H();
},
async upsertWithContent(e) {
- let t = await M(), n = !!t.isVisible;
- !n && r.MFV_LIVE_AUTO_OPEN === !1 || (t.show(), I(t), B(), Ae(t, e), n || F(!0));
+ let t = await F(), n = !!t.isVisible;
+ !n && r.MFV_LIVE_AUTO_OPEN === !1 || (t.show(), z(t), U(), De(t, e), n || R(!0));
},
setLiveActive(e) {
- T = !!e, S?.setLiveActive(T);
+ O = !!e, T?.setLiveActive(O);
},
getLiveActive() {
- return T;
+ return O;
},
async popOut() {
- let e = await M();
- e.isPopped ? e.popIn() : (e.isVisible || await Q.open(), e.popOut());
+ let e = await F();
+ e.isPopped ? e.popIn() : (e.isVisible || await Y.open(), e.popOut());
},
setPreviewActive(e) {
- E = !!e, S?.setPreviewActive(E);
+ k = !!e, T?.setPreviewActive(k);
},
getPreviewActive() {
- return E;
+ return k;
},
async feedPreviewBlob(e, t = {}) {
- if (!E) return;
- let n = await M(), i = !!n.isVisible;
- !i && r.MFV_PREVIEW_AUTO_OPEN === !1 || (n.isVisible || n.show(), I(n), n.loadPreviewBlob(e, ...Object.keys(t).length ? [t] : []), i || F(!0));
+ if (!k) return;
+ let n = await F(), i = !!n.isVisible;
+ !i && r.MFV_PREVIEW_AUTO_OPEN === !1 || (n.isVisible || n.show(), z(n), n.loadPreviewBlob(e, ...Object.keys(t).length ? [t] : []), i || R(!0));
},
toggleNodeStream() {
- Q.setNodeStreamActive(!D);
+ Y.setNodeStreamActive(!A);
},
setNodeStreamActive(e) {
- D = !!e, D || (O = null), Ee().then(() => {
- b && b(D);
- }), S?.setNodeStreamActive?.(D), D ? S && L(S) : S?.setNodeStreamSelection?.(null);
+ A = !!e, A || (j = null), Ce().then(() => {
+ C && C(A);
+ }), T?.setNodeStreamActive?.(A), A ? T && B(T) : T?.setNodeStreamSelection?.(null);
},
getNodeStreamActive() {
- return D;
+ return A;
},
setNodeStreamSelection(e, t, n) {
- O = e == null || e === "" ? null : {
+ j = e == null || e === "" ? null : {
nodeId: e,
classType: t,
title: n
};
- let r = S;
- r && L(r);
+ let r = T;
+ r && B(r);
},
async feedNodeStream(e) {
- if (!D) return;
- let t = await M(), n = !!t.isVisible;
- !n && r.MFV_NODE_STREAM_AUTO_OPEN === !1 || (t.isVisible || (t.show(), B()), I(t), L(t), Ae(t, e), n || F(!0));
+ if (!A) return;
+ let t = await F(), n = !!t.isVisible;
+ !n && r.MFV_NODE_STREAM_AUTO_OPEN === !1 || (t.isVisible || (t.show(), U()), z(t), B(t), De(t, e), n || R(!0));
}
-}, $ = !1, Re = () => Q.open(), ze = () => Q.close(), Be = () => Q.toggle(), Ve = () => Q.toggleLive(), He = () => Q.togglePreview(), Ue = () => Q.toggleNodeStream(), We = () => Q.popOut(), Ge = () => {
+}, X = !1, Fe = () => Y.open(), Ie = () => Y.close(), Le = () => Y.toggle(), Re = () => Y.toggleLive(), ze = () => Y.togglePreview(), Be = () => Y.toggleNodeStream(), Z = () => Y.popOut(), Ve = () => {
try {
- S?.isPopped && S.popIn();
+ T?.isPopped && T.popIn();
} catch {}
-}, Ke = (e) => {
+}, He = (e) => {
let t = String(e?.detail?.key || "");
- (!t || t === "viewer" || t === "viewer.mfvLiveDefault" || t === "viewer.mfvPreviewDefault") && Oe();
-}, qe = (e) => {
- if (!S?.isVisible || ae() || re().scope === "viewer") return;
+ (!t || t === "viewer" || t === "viewer.mfvLiveDefault" || t === "viewer.mfvPreviewDefault") && Te();
+}, Q = (e) => {
+ if (!T?.isVisible || ie() || ne().scope === "viewer") return;
let t = e?.key?.toLowerCase?.() || "";
if (e?.target?.isContentEditable || e?.target?.closest?.("input, textarea, select, [contenteditable='true']")) return;
let n = () => {
@@ -598,49 +587,49 @@ var Q = {
};
if (!e?.ctrlKey && !e?.metaKey && !e?.altKey && !e?.shiftKey) {
if (t === "v") {
- n(), Q.toggle();
+ n(), Y.toggle();
return;
}
if (t === "k") {
- n(), Q.togglePreview();
+ n(), Y.togglePreview();
return;
}
if (t === "l") {
- n(), Q.toggleLive();
+ n(), Y.toggleLive();
return;
}
if (t === "n") {
- n(), Q.toggleNodeStream();
+ n(), Y.toggleNodeStream();
return;
}
- t === "c" && (n(), Q.toggleCompareAB());
+ t === "c" && (n(), Y.toggleCompareAB());
return;
}
};
-function Je() {
- $ || typeof window > "u" || !window?.addEventListener || (window.addEventListener(i.MFV_OPEN, Re), window.addEventListener(i.MFV_CLOSE, ze), window.addEventListener(i.MFV_TOGGLE, Be), window.addEventListener(i.MFV_LIVE_TOGGLE, Ve), window.addEventListener(i.MFV_PREVIEW_TOGGLE, He), window.addEventListener(i.MFV_NODESTREAM_TOGGLE, Ue), window.addEventListener(i.MFV_POPOUT, We), window.addEventListener(i.SETTINGS_CHANGED, Ke), window.addEventListener("keydown", qe, !0), window.addEventListener("beforeunload", Ge), $ = !0);
+function $() {
+ X || typeof window > "u" || !window?.addEventListener || (window.addEventListener(i.MFV_OPEN, Fe), window.addEventListener(i.MFV_CLOSE, Ie), window.addEventListener(i.MFV_TOGGLE, Le), window.addEventListener(i.MFV_LIVE_TOGGLE, Re), window.addEventListener(i.MFV_PREVIEW_TOGGLE, ze), window.addEventListener(i.MFV_NODESTREAM_TOGGLE, Be), window.addEventListener(i.MFV_POPOUT, Z), window.addEventListener(i.SETTINGS_CHANGED, He), window.addEventListener("keydown", Q, !0), window.addEventListener("beforeunload", Ve), X = !0);
}
-function Ye() {
+function Ue() {
if (typeof window > "u" || !window?.removeEventListener) {
- $ = !1;
+ X = !1;
return;
}
- window.removeEventListener(i.MFV_OPEN, Re), window.removeEventListener(i.MFV_CLOSE, ze), window.removeEventListener(i.MFV_TOGGLE, Be), window.removeEventListener(i.MFV_LIVE_TOGGLE, Ve), window.removeEventListener(i.MFV_PREVIEW_TOGGLE, He), window.removeEventListener(i.MFV_NODESTREAM_TOGGLE, Ue), window.removeEventListener(i.MFV_POPOUT, We), window.removeEventListener(i.SETTINGS_CHANGED, Ke), window.removeEventListener("keydown", qe, !0), window.removeEventListener("beforeunload", Ge), $ = !1;
+ window.removeEventListener(i.MFV_OPEN, Fe), window.removeEventListener(i.MFV_CLOSE, Ie), window.removeEventListener(i.MFV_TOGGLE, Le), window.removeEventListener(i.MFV_LIVE_TOGGLE, Re), window.removeEventListener(i.MFV_PREVIEW_TOGGLE, ze), window.removeEventListener(i.MFV_NODESTREAM_TOGGLE, Be), window.removeEventListener(i.MFV_POPOUT, Z), window.removeEventListener(i.SETTINGS_CHANGED, He), window.removeEventListener("keydown", Q, !0), window.removeEventListener("beforeunload", Ve), X = !1;
}
-function Xe({ reinstallGlobalHandlers: e = !1 } = {}) {
- let t = !!S?.isVisible;
+function We({ reinstallGlobalHandlers: e = !1 } = {}) {
+ let t = !!T?.isVisible;
try {
- S?.isPopped && S.popIn();
+ T?.isPopped && T.popIn();
} catch (e) {
console.debug?.(e);
}
- Ye(), Ne(), Le(), N(), j += 1, T = C(), E = w(), D = !1;
+ Ue(), Ae(), Pe(), I(), P += 1, O = E(), k = D(), A = !1;
try {
- b && b(!1);
+ C && C(!1);
} catch (e) {
console.debug?.(e);
}
- ke(), t && F(!1), e && Je();
+ Ee(), t && R(!1), e && $();
}
//#endregion
-export { u as _, Se as a, re as c, oe as d, p as f, f as g, d as h, be as i, ae as l, ne as m, Je as n, ve as o, ee as p, Xe as r, ge as s, Q as t, ie as u, a as v, o as y };
+export { u as _, ye as a, ne as c, ae as d, p as f, f as g, d as h, _e as i, ie as l, te as m, $ as n, he as o, m as p, We as r, pe as s, Y as t, re as u, a as v, o as y };
diff --git a/dist/chunks/genInfo-DPkTyDKA.js b/dist/chunks/genInfo-oNZ5Okna.js
similarity index 70%
rename from dist/chunks/genInfo-DPkTyDKA.js
rename to dist/chunks/genInfo-oNZ5Okna.js
index 4e26eda2..d261e704 100644
--- a/dist/chunks/genInfo-DPkTyDKA.js
+++ b/dist/chunks/genInfo-oNZ5Okna.js
@@ -1,14 +1,14 @@
import { t as e } from "./rolldown-runtime-Dy4uBu1J.js";
-import { t } from "./config-dvcltBqE.js";
-import { S as n, c as r, l as i, p as a, s as o, t as s } from "./SidebarWorkflowSection-CxD2u7Bb.js";
-import { C as c, F as l, S as u, T as d, at as f, ot as p, w as m, x as h } from "./mjr-primevue-DeVPqKdl.js";
+import { l as t, t as n } from "./config-Cxv7acF8.js";
+import { C as r, c as i, l as a, m as o, s, t as c } from "./SidebarWorkflowSection-na0bq_pe.js";
+import { C as l, F as u, S as d, T as f, at as p, ot as m, rt as h, w as g, x as _ } from "./mjr-primevue-DeVPqKdl.js";
//#region ui/vue/components/viewer/ViewerMetadataBlock.vue
-var g = { style: {
+var v = { style: {
display: "flex",
"flex-direction": "column",
gap: "10px",
"margin-bottom": "14px"
-} }, _ = {
+} }, y = {
key: 0,
style: {
"font-size": "12px",
@@ -16,7 +16,7 @@ var g = { style: {
"letter-spacing": "0.02em",
color: "rgba(255,255,255,0.86)"
}
-}, v = {
+}, b = {
key: 1,
style: {
padding: "10px 12px",
@@ -26,10 +26,21 @@ var g = { style: {
color: "rgba(255,255,255,0.86)",
"white-space": "pre-wrap"
}
-}, y = { style: {
+}, x = { style: {
+ "font-size": "12px",
+ "font-weight": "700",
+ "margin-bottom": "6px"
+} }, S = { style: {
+ "font-size": "12px",
+ opacity: "0.88"
+} }, C = { style: {
+ "font-size": "12px",
+ "font-weight": "700",
+ "margin-bottom": "6px"
+} }, w = { style: {
"font-size": "12px",
opacity: "0.9"
-} }, b = {
+} }, T = {
key: 6,
style: {
padding: "10px 12px",
@@ -38,7 +49,7 @@ var g = { style: {
background: "rgba(255,255,255,0.06)",
color: "rgba(255,255,255,0.72)"
}
-}, x = {
+}, E = {
key: 7,
style: {
border: "1px solid rgba(255,255,255,0.10)",
@@ -46,7 +57,12 @@ var g = { style: {
background: "rgba(255,255,255,0.04)",
overflow: "hidden"
}
-}, S = { style: {
+}, D = { style: {
+ cursor: "pointer",
+ padding: "10px 12px",
+ color: "rgba(255,255,255,0.78)",
+ "user-select": "none"
+} }, O = { style: {
margin: "0",
padding: "10px 12px",
"max-height": "280px",
@@ -54,7 +70,7 @@ var g = { style: {
"font-size": "11px",
"line-height": "1.35",
color: "rgba(255,255,255,0.86)"
-} }, C = {
+} }, k = {
__name: "ViewerMetadataBlock",
props: {
title: {
@@ -75,8 +91,8 @@ var g = { style: {
}
},
setup(e) {
- let n = e;
- function a(e) {
+ let r = e;
+ function o(e) {
try {
if (!e || typeof e != "object") return null;
let t = e?.metadata_raw;
@@ -85,7 +101,7 @@ var g = { style: {
return null;
}
}
- function C(e) {
+ function k(e) {
let t = e?.metadata_raw ?? null;
if (!t) return null;
if (typeof t == "object") return t;
@@ -99,7 +115,7 @@ var g = { style: {
return null;
}
}
- function w(e) {
+ function A(e) {
try {
let t = Object.entries(e || {});
if (!t.length) return !1;
@@ -110,8 +126,8 @@ var g = { style: {
}
return !1;
}
- function T(e) {
- let t = C(e), n = e?.workflow || e?.Workflow || e?.comfy_workflow || t?.workflow || t?.Workflow || t?.comfy_workflow || null;
+ function j(e) {
+ let t = k(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;
@@ -123,94 +139,81 @@ var g = { style: {
return null;
}
}
- function E(e) {
- let t = C(e), n = e?.prompt || e?.Prompt || t?.prompt || t?.Prompt || null;
+ function M(e) {
+ let t = k(e), n = e?.prompt || e?.Prompt || t?.prompt || t?.Prompt || null;
if (!n) return null;
- if (typeof n == "object") return w(n) ? n : 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 w(e) ? e : null;
+ return A(e) ? e : null;
} catch {
return null;
}
}
- function D(e) {
- return !!(T(e) || E(e));
+ function N(e) {
+ return !!(j(e) || M(e));
}
- function O(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.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 k(e) {
+ 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 A() {
- typeof n.onRetry == "function" && n.onRetry();
+ function I() {
+ typeof r.onRetry == "function" && r.onRetry();
}
- let j = h(() => a(n.asset)), M = h(() => r(n.asset)), N = h(() => M.value.kind !== "empty"), P = h(() => O(n.asset)), F = h(() => t.WORKFLOW_MINIMAP_ENABLED !== !1 && D(n.asset)), I = h(() => j.value && typeof j.value == "object" && j.value.kind === "fetch_error"), L = h(() => k(n.asset?.metadata_raw)), R = h(() => !n.loading && !I.value && !P.value && !N.value && !F.value), z = h(() => {
- if (!I.value) return "";
- let e = String(j.value?.message || j.value?.error || "Failed to load generation data."), t = String(j.value?.code || j.value?.stage || "").trim();
- return t ? `${e}\n\nCode: ${t}\nClick to retry.` : `${e}\n\nClick to retry.`;
+ let L = _(() => o(r.asset)), R = _(() => i(r.asset)), z = _(() => R.value.kind !== "empty"), B = _(() => P(r.asset)), V = _(() => n.WORKFLOW_MINIMAP_ENABLED !== !1 && N(r.asset)), H = _(() => L.value && typeof L.value == "object" && L.value.kind === "fetch_error"), U = _(() => F(r.asset?.metadata_raw)), W = _(() => !r.loading && !H.value && !B.value && !z.value && !V.value), G = _(() => {
+ 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, t) => (l(), d("div", g, [
- n.title ? (l(), d("div", _, p(n.title), 1)) : m("", !0),
- n.loading ? (l(), d("div", v, [...t[0] ||= [u("div", { style: {
- "font-size": "12px",
- "font-weight": "700",
- "margin-bottom": "6px"
- } }, "Loading", -1), u("div", { style: {
- "font-size": "12px",
- opacity: "0.88"
- } }, "Loading generation data...", -1)]])) : m("", !0),
- I.value ? (l(), d("div", {
+ return (e, n) => (u(), f("div", v, [
+ r.title ? (u(), f("div", y, m(r.title), 1)) : g("", !0),
+ r.loading ? (u(), f("div", b, [d("div", x, m(h(t)("status.loading", "Loading")), 1), d("div", S, m(h(t)("viewer.loadingGenerationData", "Loading generation data...")), 1)])) : g("", !0),
+ H.value ? (u(), f("div", {
key: 2,
- style: f([{
+ style: p([{
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: n.onRetry ? "pointer" : "default" }]),
- onClick: A
- }, [t[1] ||= u("div", { style: {
- "font-size": "12px",
- "font-weight": "700",
- "margin-bottom": "6px"
- } }, "Error Loading Metadata", -1), u("div", y, p(z.value), 1)], 4)) : m("", !0),
- P.value ? (l(), c(i, {
+ }, { cursor: r.onRetry ? "pointer" : "default" }]),
+ onClick: I
+ }, [d("div", C, m(h(t)("viewer.errorLoadingMetadata", "Error Loading Metadata")), 1), d("div", w, m(G.value), 1)], 4)) : g("", !0),
+ B.value ? (u(), l(a, {
key: 3,
- asset: n.asset
- }, null, 8, ["asset"])) : m("", !0),
- N.value ? (l(), c(o, {
+ asset: r.asset
+ }, null, 8, ["asset"])) : g("", !0),
+ z.value ? (u(), l(s, {
key: 4,
- asset: n.asset
- }, null, 8, ["asset"])) : m("", !0),
- F.value ? (l(), c(s, {
+ asset: r.asset
+ }, null, 8, ["asset"])) : g("", !0),
+ V.value ? (u(), l(c, {
key: 5,
- asset: n.asset
- }, null, 8, ["asset"])) : m("", !0),
- R.value ? (l(), d("div", b, " No generation data found for this file. ")) : m("", !0),
- L.value ? (l(), d("details", x, [t[2] ||= u("summary", { style: {
- cursor: "pointer",
- padding: "10px 12px",
- color: "rgba(255,255,255,0.78)",
- "user-select": "none"
- } }, " Raw metadata ", -1), u("pre", S, p(L.value), 1)])) : m("", !0)
+ asset: r.asset
+ }, null, 8, ["asset"])) : g("", !0),
+ W.value ? (u(), f("div", T, m(h(t)("viewer.noGenerationDataFile", "No generation data found for this file.")), 1)) : g("", !0),
+ U.value ? (u(), f("details", E, [d("summary", D, m(h(t)("msg.rawMetadata", "Raw metadata")), 1), d("pre", O, m(U.value), 1)])) : g("", !0)
]));
}
-}, w = /* @__PURE__ */ e({
- buildViewerMetadataBlocks: () => G,
- ensureViewerMetadataAsset: () => W
-}), T = (e, t = null) => {
- let r = n(e);
- return r === void 0 ? t : r;
-}, E = t?.VIEWER_GENINFO_TTL_MS ?? 3e4, D = t?.VIEWER_GENINFO_ERROR_TTL_MS ?? 8e3, O = t?.VIEWER_GENINFO_MAX_ENTRIES ?? 300, k = /* @__PURE__ */ new Map(), A = /* @__PURE__ */ new Map(), j = /* @__PURE__ */ new Map(), M = (e, t, n) => {
+}, A = /* @__PURE__ */ e({
+ buildViewerMetadataBlocks: () => Z,
+ ensureViewerMetadataAsset: () => X
+}), j = (e, t = null) => {
+ let n = r(e);
+ return n === void 0 ? t : n;
+}, M = n?.VIEWER_GENINFO_TTL_MS ?? 3e4, N = n?.VIEWER_GENINFO_ERROR_TTL_MS ?? 8e3, P = n?.VIEWER_GENINFO_MAX_ENTRIES ?? 300, F = /* @__PURE__ */ new Map(), I = /* @__PURE__ */ new Map(), L = /* @__PURE__ */ new Map(), R = (e, t, n) => {
try {
let r = Date.now();
for (let [n, i] of e.entries()) {
@@ -229,27 +232,27 @@ var g = { style: {
} catch (e) {
console.debug?.(e);
}
-}, N = (e, t, n) => {
+}, z = (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;
}
-}, P = (e, t, n, r, i) => {
+}, B = (e, t, n, r, i) => {
try {
e.set(t, {
at: Date.now(),
data: n
- }), M(e, r, i);
+ }), R(e, r, i);
} catch (e) {
console.debug?.(e);
}
-}, F = (e) => {
+}, V = (e) => {
try {
let t = e?.id;
if (t != null) return `id:${t}`;
- let n = z(e);
+ let n = G(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}`;
@@ -257,7 +260,7 @@ var g = { style: {
console.debug?.(e);
}
return null;
-}, I = (e) => {
+}, H = (e) => {
try {
if (!e || typeof e != "object") return null;
let t = e?.metadata_raw;
@@ -265,7 +268,7 @@ var g = { style: {
} catch {
return null;
}
-}, L = (e, t) => {
+}, U = (e, t) => {
try {
if (!e || typeof e != "object" || !t || typeof t != "object") return;
try {
@@ -291,7 +294,7 @@ var g = { style: {
} catch (e) {
console.debug?.(e);
}
-}, R = (e) => {
+}, W = (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;
@@ -328,13 +331,13 @@ var g = { style: {
} catch {
return !1;
}
-}, z = (e) => {
+}, G = (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;
-}, B = (e) => {
+}, K = (e) => {
try {
if (String(e?.mime || e?.mimetype || e?.type || "").toLowerCase().startsWith("video/")) return !0;
- let t = (z(e) || String(e?.filename || e?.name || "")).split(".").pop()?.toLowerCase?.() || "";
+ let t = (G(e) || String(e?.filename || e?.name || "")).split(".").pop()?.toLowerCase?.() || "";
return [
"mp4",
"webm",
@@ -347,19 +350,19 @@ var g = { style: {
} catch {
return !1;
}
-}, V = (e) => {
+}, q = (e) => {
if (!e) return null;
if (typeof e == "object") return e;
if (typeof e != "string") return null;
let t = e.trim();
- return t ? T(() => {
+ return t ? j(() => {
let e = JSON.parse(t);
return e && typeof e == "object" ? e : null;
}, null) : null;
-}, H = (e) => {
+}, J = (e) => {
try {
- if (!B(e) || e?.geninfo || e?.prompt || e?.workflow || e?.metadata) return;
- let t = V(e?.metadata_raw) || {};
+ if (!K(e) || e?.geninfo || e?.prompt || e?.workflow || e?.metadata) return;
+ let t = q(e?.metadata_raw) || {};
if (t.geninfo_status) return;
if (e?.geninfo_status) {
t.geninfo_status = e.geninfo_status, e.metadata_raw = t;
@@ -369,7 +372,7 @@ var g = { style: {
} catch (e) {
console.debug?.(e);
}
-}, U = (e, t) => {
+}, Y = (e, t) => {
let n = t && typeof t == "object" ? t : null;
if (!n) return e;
try {
@@ -405,7 +408,7 @@ var g = { style: {
try {
if (e.metadata_raw == null) e.metadata_raw = n;
else {
- let t = V(e.metadata_raw);
+ let t = q(e.metadata_raw);
if (t && typeof t == "object") {
for (let e of [
"geninfo_status",
@@ -421,58 +424,58 @@ var g = { style: {
}
return e;
};
-async function W(e, { getAssetMetadata: t, getFileMetadataScoped: n, metadataCache: r, signal: i } = {}) {
+async function X(e, { getAssetMetadata: t, getFileMetadataScoped: n, metadataCache: r, signal: i } = {}) {
if (!e || typeof e != "object") return e;
- let a = e?.id ?? null, o = F(e), s = e, c = o ? N(k, o, E) : null;
+ let a = e?.id ?? null, o = V(e), s = e, c = o ? z(F, o, M) : null;
if (c && typeof c == "object") return {
...e,
...c
};
- let l = o ? N(A, o, D) : null;
+ let l = o ? z(I, o, N) : null;
if (l) {
try {
- L(s, l);
+ U(s, l);
} catch (e) {
console.debug?.(e);
}
return s;
}
- if (o && j.has(o)) try {
- let e = j.get(o);
+ if (o && L.has(o)) try {
+ let e = L.get(o);
if (e && typeof e.then == "function") return await e;
} catch (e) {
console.debug?.(e);
}
let u = async () => {
- let c = a == null ? null : T(() => r?.getCached?.(a)?.data || null, null);
+ let c = a == null ? null : j(() => 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 && (!R(s) || l && !u)) {
- let e = await T(() => t?.(a, i ? { signal: i } : {}), null);
+ if (a != null && (!W(s) || l && !u)) {
+ let e = await j(() => t?.(a, i ? { signal: i } : {}), null);
e?.ok && e.data && typeof e.data == "object" ? (s = {
...s,
...e.data
- }, T(() => r?.setCached?.(a, e.data))) : e && e?.code !== "ABORTED" && (d = {
+ }, j(() => 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 (!R(s)) try {
+ if (!W(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 T(() => n?.({
+ let c = await j(() => n?.({
type: e,
filename: t,
subfolder: r,
root_id: a,
filepath: o
}, i ? { signal: i } : {}), null);
- c?.ok && c.data ? s = U({ ...s }, c.data) : c && c?.code !== "ABORTED" && (d = {
+ c?.ok && c.data ? s = Y({ ...s }, c.data) : c && c?.code !== "ABORTED" && (d = {
kind: "fetch_error",
stage: "file_scoped",
code: c?.code || "FETCH_ERROR",
@@ -482,16 +485,16 @@ async function W(e, { getAssetMetadata: t, getFileMetadataScoped: n, metadataCac
} catch (e) {
console.debug?.(e);
}
- if (H(s), !R(s) && d) {
- let e = I(s);
- e && e.kind === "media_pipeline" || L(s, d);
+ if (J(s), !W(s) && d) {
+ let e = H(s);
+ e && e.kind === "media_pipeline" || U(s, d);
}
- return R(s) && o ? P(k, o, s, E, O) : d && o && P(A, o, d, D, O), s;
+ return W(s) && o ? B(F, o, s, M, P) : d && o && B(I, o, d, N, P), s;
};
if (o) {
let e = () => {
try {
- j.delete(o);
+ L.delete(o);
} catch (e) {
console.debug?.(e);
}
@@ -508,19 +511,19 @@ async function W(e, { getAssetMetadata: t, getFileMetadataScoped: n, metadataCac
console.debug?.(e);
}
try {
- j.delete(o);
+ L.delete(o);
} catch (e) {
console.debug?.(e);
}
});
- return j.set(o, t), await t;
+ return L.set(o, t), await t;
}
return await u();
}
-function G({ title: e, asset: t, ui: n } = {}) {
+function Z({ title: e, asset: t, ui: n } = {}) {
let r = document.createElement("div");
try {
- let { app: i } = a(C, {
+ let { app: i } = o(k, {
title: e,
asset: t,
loading: !!n?.loading,
@@ -541,18 +544,18 @@ function G({ title: e, asset: t, ui: n } = {}) {
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 o = t?.metadata_raw;
- if (o != null) {
+ 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 o == "string" ? o : JSON.stringify(o, null, 2);
+ 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;
}
//#endregion
-export { w as n, W as t };
+export { A as n, X as t };
diff --git a/dist/chunks/geninfoParser-5vKgjqjD.js b/dist/chunks/geninfoParser-5vKgjqjD.js
new file mode 100644
index 00000000..b3388261
--- /dev/null
+++ b/dist/chunks/geninfoParser-5vKgjqjD.js
@@ -0,0 +1,477 @@
+//#region 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;
+}
+//#endregion
+//#region 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 = [], o = r(e), l = [];
+ for (let r of u(e)) {
+ if (!r || typeof r != "object") continue;
+ let e = m(r);
+ if (!e || typeof e != "object") continue;
+ let u = String(r?.class_type || r?.type || "").toLowerCase(), d = String(r?.title || r?._meta?.title || "").toLowerCase(), f = (e, n) => {
+ if (t[e] || typeof n != "string") return;
+ let r = n.trim();
+ r && (/^[\d\s.,+-]+$/.test(r) || (t[e] = r));
+ };
+ if ((u.includes("cliptextencode") || u.includes("clip_text_encode") || d.includes("clip text encode")) && typeof e.text == "string") {
+ let t = d.includes("negative");
+ d.includes("positive") || d.includes("(prompt)") || d.includes("prompt"), f(t ? "negative_prompt" : "prompt", e.text);
+ }
+ if (f("negative_prompt", e.negative_prompt), f("negative_prompt", e.negative), !t.prompt && typeof e.text == "string") {
+ let t = e.text.trim();
+ (u.includes("prompt") || u.includes("encode") || u.includes("positive") || u.includes("negative") || d.includes("prompt") || d.includes("positive") || d.includes("negative")) && t.length >= 12 && /[a-zA-Z]/.test(t) && f("prompt", t);
+ }
+ if (e.seed !== void 0 && t.seed === void 0 && (t.seed = e.seed), e.steps !== void 0 && t.steps === void 0 && (t.steps = e.steps), e.cfg !== void 0 && t.cfg === void 0 && (t.cfg = e.cfg), e.sampler_name && !t.sampler && (t.sampler = e.sampler_name), e.scheduler && !t.scheduler && (t.scheduler = e.scheduler), e.denoise !== void 0 && t.denoise === void 0 && (t.denoise = e.denoise), i(u)) {
+ let t = a(r, o), n = s(r, o), i = c(r?.inputs?.model, o);
+ l.push({
+ sampler_name: e.sampler_name || n.sampler_name || e.sampler,
+ scheduler: e.scheduler || n.scheduler,
+ steps: e.steps ?? n.steps,
+ cfg: e.cfg,
+ denoise: e.denoise ?? n.denoise,
+ seed: e.seed ?? e.noise_seed,
+ model: i,
+ pass_stage: t
+ });
+ }
+ e.width !== void 0 && t.width === void 0 && (t.width = e.width), e.height !== void 0 && t.height === void 0 && (t.height = e.height);
+ let p = (e, n) => {
+ if (t[e] || typeof n != "string") return;
+ let r = n.trim();
+ r && (t[e] = r);
+ }, h = [
+ e.ckpt_name,
+ e.checkpoint,
+ e.checkpoint_name,
+ e.model_name,
+ e.model
+ ];
+ for (let e of h) t.model || p("model", e);
+ if (p("vae", e.vae_name || e.vae), p("clip", e.clip_name || e.clip), p("unet", e.unet_name || e.unet), p("diffusion", e.diffusion_name || e.diffusion_model || e.diffusion), u.includes("lora") || u.includes("loraloader")) {
+ let t = e.lora_name || e.lora || e.name || null, r = e.strength_model ?? e.strength ?? e.weight ?? e.lora_strength ?? null;
+ t && n.push({
+ name: t,
+ weight: r
+ });
+ }
+ }
+ return n.length && (t.loras = n), l.length > 1 && (t.all_samplers = l), Object.keys(t).length > 0 ? t : null;
+}
+function r(e) {
+ if (!e || typeof e != "object") return null;
+ let n = e.prompt && typeof e.prompt == "object" ? e.prompt : e;
+ return t(n) ? n : null;
+}
+function i(e) {
+ return e.includes("ksamplerselect") || e.includes("samplerselect") ? !1 : e.includes("ksampler") || e.includes("samplercustom") || e.includes("sampler_custom");
+}
+function a(e, t) {
+ if (!t) return "";
+ let n = c(e?.inputs?.model, t).toLowerCase();
+ if (/\b(upscale|upscaler|_to_\d{3,5}|to[_-]?\d{3,5})\b/i.test(n)) return "upscale";
+ let r = o(e, t).join(" ");
+ if (/\b(pidconditioning|upscale|latentupscale|imageupscalewithmodel)\b/i.test(r)) return "upscale";
+ let i = o(e, t, "latent_image").join(" ");
+ return /\b(inpaint|vaeencodeforinpaint|setlatentnoise mask|masktoimage)\b/i.test(i) ? "inpaint" : /\b(upscale|latentupscale|imageupscalewithmodel|ultimate|supir|esrgan|realesrgan)\b/i.test(i) ? "upscale" : /\b(vaeencode|loadimage|imagebatch|imagetolatent)\b/i.test(i) ? "img2img" : /\b(emptylatentimage|emptysd3latentimage|emptychromaradiancelatentimage|empty latent)\b/i.test(i) ? "txt2img" : "";
+}
+function o(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 = l(e, t);
+ n && o(n);
+ }
+ };
+ for (let e of r) {
+ let n = l(e, t);
+ n && o(n);
+ }
+ return i;
+}
+function s(e, t) {
+ let n = {};
+ if (!t) return n;
+ let r = l(e?.inputs?.sampler, t)?.inputs || {};
+ r.sampler_name && (n.sampler_name = r.sampler_name);
+ let i = l(e?.inputs?.sigmas, t)?.inputs || {};
+ return i.scheduler && (n.scheduler = i.scheduler), i.steps !== void 0 && (n.steps = i.steps), i.denoise !== void 0 && (n.denoise = i.denoise), n;
+}
+function c(e, t) {
+ if (!t) return "";
+ let n = /* @__PURE__ */ new Set(), r = (e) => {
+ let i = l(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 || {}, 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 l(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 u(e, n = /* @__PURE__ */ new WeakSet()) {
+ if (!e || typeof e != "object" || n.has(e)) return [];
+ n.add(e);
+ let r = [], i = (e.prompt && typeof e.prompt == "object" ? e.prompt : null) || (t(e) ? e : null);
+ i && r.push(...Object.values(i));
+ for (let t of d(e)) {
+ let e = Array.isArray(t?.nodes) ? t.nodes.filter(Boolean) : [];
+ r.push(...e);
+ for (let t of e) for (let e of p(t)) r.push(...u(e, n));
+ for (let e of f(t)) r.push(...u(e, n));
+ }
+ return r;
+}
+function d(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 f(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 p(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(h);
+ 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 h(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);
+}
+//#endregion
+//#region ui/components/sidebar/parsers/geninfoParser.ts
+var g = /^(?:[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, _ = /^(?!.*[,;])(?!.*\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;
+function v(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 b = i.seed?.value ?? i.seed ?? null;
+ b != null && (e.seed = b), n("seed", i.seed);
+ let x = i.voice?.name ?? i.voice?.value ?? i.voice ?? null;
+ x != null && String(x).trim() && (e.voice = String(x).trim());
+ let S = i.language?.value ?? i.language ?? null;
+ S != null && String(S).trim() && (e.language = String(S).trim());
+ let C = i.temperature?.value ?? i.temperature ?? null;
+ C != null && (e.temperature = C);
+ let w = i.top_k?.value ?? i.top_k ?? null;
+ w != null && (e.top_k = w);
+ let T = i.top_p?.value ?? i.top_p ?? null;
+ T != null && (e.top_p = T);
+ let E = i.repetition_penalty?.value ?? i.repetition_penalty ?? null;
+ E != null && (e.repetition_penalty = E);
+ let D = i.max_new_tokens?.value ?? i.max_new_tokens ?? null;
+ D != null && (e.max_new_tokens = D);
+ let O = i.device?.value ?? i.device ?? null;
+ O != null && String(O).trim() && (e.device = String(O).trim());
+ let k = i.voice_preset?.value ?? i.voice_preset ?? null;
+ k != null && String(k).trim() && (e.voice_preset = String(k).trim());
+ let A = i.instruct?.value ?? i.instruct ?? null;
+ A != null && String(A).trim() && (e.instruct = String(A).trim());
+ let j = i.dtype?.value ?? i.dtype ?? null;
+ j != null && String(j).trim() && (e.dtype = String(j).trim());
+ let M = i.attn_implementation?.value ?? i.attn_implementation ?? null;
+ M != null && String(M).trim() && (e.attn_implementation = String(M).trim());
+ let N = i.x_vector_only_mode?.value ?? i.x_vector_only_mode ?? null;
+ N != null && (e.x_vector_only_mode = N);
+ let P = i.use_torch_compile?.value ?? i.use_torch_compile ?? null;
+ P != null && (e.use_torch_compile = P);
+ let F = i.use_cuda_graphs?.value ?? i.use_cuda_graphs ?? null;
+ F != null && (e.use_cuda_graphs = F);
+ let I = i.compile_mode?.value ?? i.compile_mode ?? null;
+ I != null && String(I).trim() && (e.compile_mode = String(I).trim());
+ let L = i.enable_chunking?.value ?? i.enable_chunking ?? null;
+ L != null && (e.enable_chunking = L);
+ let R = i.max_chars_per_chunk?.value ?? i.max_chars_per_chunk ?? null;
+ R != null && (e.max_chars_per_chunk = R);
+ let z = i.chunk_combination_method?.value ?? i.chunk_combination_method ?? null;
+ z != null && String(z).trim() && (e.chunk_combination_method = String(z).trim());
+ let B = i.silence_between_chunks_ms?.value ?? i.silence_between_chunks_ms ?? null;
+ B != null && (e.silence_between_chunks_ms = B);
+ let V = i.enable_audio_cache?.value ?? i.enable_audio_cache ?? null;
+ V != null && (e.enable_audio_cache = V);
+ let H = i.batch_size?.value ?? i.batch_size ?? null;
+ H != null && (e.batch_size = H);
+ let U = i.denoise?.value ?? i.denoise ?? null;
+ U != null && (e.denoise = U), 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);
+ let K = i.lyrics?.value ?? i.lyrics ?? null;
+ typeof K == "string" && K.trim() && (e.lyrics = K);
+ let q = i.lyrics_strength?.value ?? i.lyrics_strength ?? null;
+ q != null && (e.lyrics_strength = q);
+ let J = i.notes?.value ?? i.workflow_notes?.value ?? i.notes ?? i.workflow_notes ?? null;
+ typeof J == "string" && J.trim() && (e.workflow_notes = J.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 Y = i.size || null;
+ if (Y && typeof Y == "object" && (Y.width !== void 0 && (e.width = Y.width), Y.height !== void 0 && (e.height = Y.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)), y(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;
+ }
+ 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 o = r.parameters || r["PNG:Parameters"] || r["EXIF:UserComment"] || r.UserComment || r.ImageDescription || null;
+ if (typeof o == "string") {
+ let t = e(o);
+ if (t) return t;
+ }
+ let s = r.workflow || r.Workflow || r.comfy || r.comfyui || r.ComfyUI || null;
+ if (s && typeof s == "object") {
+ let e = n(s);
+ 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 v(JSON.parse(t));
+ } catch {
+ return null;
+ }
+ return { prompt: t };
+ }
+ return null;
+}
+function y(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 b(e) {
+ let t = typeof e == "string" ? e.trim() : "";
+ return !t || t.includes("\n") ? !1 : g.test(t) || _.test(t);
+}
+function x(e) {
+ let t = typeof e == "string" ? e.trim() : "";
+ return t ? b(t) ? "" : t : "";
+}
+function S(e, t) {
+ let n = x(e), r = x(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 = x(i)), !r && s && (r = x(s));
+ }
+ }
+ return n && r && n.trim() === r.trim() && (r = ""), {
+ positive: n,
+ negative: r
+ };
+}
+function C(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 w(e) {
+ if (!e) return "";
+ if (typeof e == "string") return C(e);
+ let t = C(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=${r}`), i != null && e.push(`c=${i}`), e.length ? `${t} (${e.join(", ")})` : t;
+ }
+ return n == null ? t : `${t} (${n})`;
+}
+function T(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 E(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 D(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 = T(n) || n, a = E(t?.api_provider), o = r === "api" ? `API ${i || "Workflow"}` : i;
+ return {
+ workflowType: n,
+ workflowLabel: String(o || n).trim(),
+ workflowBadge: a
+ };
+}
+//#endregion
+export { S as a, v as i, w as n, x as o, C as r, D as t };
diff --git a/dist/chunks/geninfoParser-BE5lWeGw.js b/dist/chunks/geninfoParser-BE5lWeGw.js
deleted file mode 100644
index 38c4b865..00000000
--- a/dist/chunks/geninfoParser-BE5lWeGw.js
+++ /dev/null
@@ -1,372 +0,0 @@
-//#region 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;
-}
-//#endregion
-//#region 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 = [];
- for (let i of r(e)) {
- if (!i || typeof i != "object") continue;
- let e = s(i);
- if (!e || typeof e != "object") continue;
- let r = String(i?.class_type || i?.type || "").toLowerCase(), a = String(i?.title || i?._meta?.title || "").toLowerCase(), o = (e, n) => {
- if (t[e] || typeof n != "string") return;
- let r = n.trim();
- r && (/^[\d\s.,+-]+$/.test(r) || (t[e] = r));
- };
- if ((r.includes("cliptextencode") || r.includes("clip_text_encode") || a.includes("clip text encode")) && typeof e.text == "string") {
- let t = a.includes("negative");
- a.includes("positive") || a.includes("(prompt)") || a.includes("prompt"), o(t ? "negative_prompt" : "prompt", e.text);
- }
- if (o("negative_prompt", e.negative_prompt), o("negative_prompt", e.negative), !t.prompt && typeof e.text == "string") {
- let t = e.text.trim();
- (r.includes("prompt") || r.includes("encode") || r.includes("positive") || r.includes("negative") || a.includes("prompt") || a.includes("positive") || a.includes("negative")) && t.length >= 12 && /[a-zA-Z]/.test(t) && o("prompt", t);
- }
- e.seed !== void 0 && t.seed === void 0 && (t.seed = e.seed), e.steps !== void 0 && t.steps === void 0 && (t.steps = e.steps), e.cfg !== void 0 && t.cfg === void 0 && (t.cfg = e.cfg), e.sampler_name && !t.sampler && (t.sampler = e.sampler_name), e.scheduler && !t.scheduler && (t.scheduler = e.scheduler), e.denoise !== void 0 && t.denoise === void 0 && (t.denoise = e.denoise), e.width !== void 0 && t.width === void 0 && (t.width = e.width), e.height !== void 0 && t.height === void 0 && (t.height = e.height);
- let c = (e, n) => {
- if (t[e] || typeof n != "string") return;
- let r = n.trim();
- r && (t[e] = r);
- }, l = [
- e.ckpt_name,
- e.checkpoint,
- e.checkpoint_name,
- e.model_name,
- e.model
- ];
- for (let e of l) t.model || c("model", e);
- if (c("vae", e.vae_name || e.vae), c("clip", e.clip_name || e.clip), c("unet", e.unet_name || e.unet), c("diffusion", e.diffusion_name || e.diffusion_model || e.diffusion), r.includes("lora") || r.includes("loraloader")) {
- let t = e.lora_name || e.lora || e.name || null, r = e.strength_model ?? e.strength ?? e.weight ?? e.lora_strength ?? null;
- t && n.push({
- name: t,
- weight: r
- });
- }
- }
- return n.length && (t.loras = n), Object.keys(t).length > 0 ? t : null;
-}
-function r(e, n = /* @__PURE__ */ new WeakSet()) {
- if (!e || typeof e != "object" || n.has(e)) return [];
- n.add(e);
- let s = [], c = (e.prompt && typeof e.prompt == "object" ? e.prompt : null) || (t(e) ? e : null);
- c && s.push(...Object.values(c));
- for (let t of i(e)) {
- let e = Array.isArray(t?.nodes) ? t.nodes.filter(Boolean) : [];
- s.push(...e);
- for (let t of e) for (let e of o(t)) s.push(...r(e, n));
- for (let e of a(t)) s.push(...r(e, n));
- }
- return s;
-}
-function i(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 o(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 s(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(c);
- 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 c(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);
-}
-//#endregion
-//#region ui/components/sidebar/parsers/geninfoParser.ts
-var l = /^(?:[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, u = /^(?!.*[,;])(?!.*\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;
-function d(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);
- }, r = i.positive?.value ?? i.positive?.text ?? null, a = i.negative?.value ?? i.negative?.text ?? null;
- typeof r == "string" && r.trim() && (e.prompt = r), typeof a == "string" && a.trim() && (e.negative_prompt = a), n("prompt", i.positive), n("negative_prompt", i.negative);
- let o = i.checkpoint?.name ?? i.checkpoint ?? null;
- typeof o == "string" && o.trim() && (e.model = o), n(["model", "checkpoint"], i.checkpoint);
- let s = i.clip?.name ?? i.clip ?? null;
- typeof s == "string" && s.trim() && (e.clip = s), n("clip", i.clip);
- let c = i.vae?.name ?? i.vae ?? null;
- typeof c == "string" && c.trim() && (e.vae = c), n("vae", i.vae);
- let l = i.models;
- l && typeof l == "object" && (e.models = l);
- let u = Array.isArray(i.model_groups) ? i.model_groups : null;
- u && u.length && (e.model_groups = u);
- let d = Array.isArray(i.loras) ? i.loras : null;
- d && (e.loras = d), d?.some((e) => e?.confidence === "override" || e?.source === "majoor_geninfo") && t.add("loras");
- let f = i.sampler?.name ?? i.sampler ?? null;
- typeof f == "string" && f.trim() && (e.sampler = f), n("sampler", i.sampler);
- let p = i.scheduler?.name ?? i.scheduler ?? null;
- typeof p == "string" && p.trim() && (e.scheduler = p), n("scheduler", i.scheduler);
- let m = i.steps?.value ?? i.steps ?? null;
- m != null && (e.steps = m), n("steps", i.steps);
- let h = i.cfg?.value ?? i.cfg ?? null;
- h != null && (e.cfg = h), n(["cfg", "cfg_scale"], i.cfg);
- let g = i.cfg_high_noise?.value ?? i.cfg_high_noise ?? null;
- g != null && (e.cfg_high_noise = g);
- let _ = i.cfg_low_noise?.value ?? i.cfg_low_noise ?? null;
- _ != null && (e.cfg_low_noise = _);
- let v = i.seed?.value ?? i.seed ?? null;
- v != null && (e.seed = v), n("seed", i.seed);
- let y = i.voice?.name ?? i.voice?.value ?? i.voice ?? null;
- y != null && String(y).trim() && (e.voice = String(y).trim());
- let b = i.language?.value ?? i.language ?? null;
- b != null && String(b).trim() && (e.language = String(b).trim());
- let x = i.temperature?.value ?? i.temperature ?? null;
- x != null && (e.temperature = x);
- let S = i.top_k?.value ?? i.top_k ?? null;
- S != null && (e.top_k = S);
- let C = i.top_p?.value ?? i.top_p ?? null;
- C != null && (e.top_p = C);
- let w = i.repetition_penalty?.value ?? i.repetition_penalty ?? null;
- w != null && (e.repetition_penalty = w);
- let T = i.max_new_tokens?.value ?? i.max_new_tokens ?? null;
- T != null && (e.max_new_tokens = T);
- let E = i.device?.value ?? i.device ?? null;
- E != null && String(E).trim() && (e.device = String(E).trim());
- let D = i.voice_preset?.value ?? i.voice_preset ?? null;
- D != null && String(D).trim() && (e.voice_preset = String(D).trim());
- let O = i.instruct?.value ?? i.instruct ?? null;
- O != null && String(O).trim() && (e.instruct = String(O).trim());
- let k = i.dtype?.value ?? i.dtype ?? null;
- k != null && String(k).trim() && (e.dtype = String(k).trim());
- let A = i.attn_implementation?.value ?? i.attn_implementation ?? null;
- A != null && String(A).trim() && (e.attn_implementation = String(A).trim());
- let j = i.x_vector_only_mode?.value ?? i.x_vector_only_mode ?? null;
- j != null && (e.x_vector_only_mode = j);
- let M = i.use_torch_compile?.value ?? i.use_torch_compile ?? null;
- M != null && (e.use_torch_compile = M);
- let N = i.use_cuda_graphs?.value ?? i.use_cuda_graphs ?? null;
- N != null && (e.use_cuda_graphs = N);
- let P = i.compile_mode?.value ?? i.compile_mode ?? null;
- P != null && String(P).trim() && (e.compile_mode = String(P).trim());
- let F = i.enable_chunking?.value ?? i.enable_chunking ?? null;
- F != null && (e.enable_chunking = F);
- let I = i.max_chars_per_chunk?.value ?? i.max_chars_per_chunk ?? null;
- I != null && (e.max_chars_per_chunk = I);
- let L = i.chunk_combination_method?.value ?? i.chunk_combination_method ?? null;
- L != null && String(L).trim() && (e.chunk_combination_method = String(L).trim());
- let R = i.silence_between_chunks_ms?.value ?? i.silence_between_chunks_ms ?? null;
- R != null && (e.silence_between_chunks_ms = R);
- let z = i.enable_audio_cache?.value ?? i.enable_audio_cache ?? null;
- z != null && (e.enable_audio_cache = z);
- let B = i.batch_size?.value ?? i.batch_size ?? null;
- B != null && (e.batch_size = B);
- let V = i.denoise?.value ?? i.denoise ?? null;
- V != null && (e.denoise = V), n(["denoise", "denoising"], i.denoise);
- let H = i.clip_skip?.value ?? i.clip_skip ?? i.clipSkip ?? null;
- H != null && (e.clip_skip = H);
- let U = i.inputs;
- Array.isArray(U) && (e.inputs = U);
- let W = i.lyrics?.value ?? i.lyrics ?? null;
- typeof W == "string" && W.trim() && (e.lyrics = W);
- let G = i.lyrics_strength?.value ?? i.lyrics_strength ?? null;
- G != null && (e.lyrics_strength = G);
- let K = i.notes?.value ?? i.workflow_notes?.value ?? i.notes ?? i.workflow_notes ?? null;
- typeof K == "string" && K.trim() && (e.workflow_notes = K.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 q = i.size || null;
- if (q && typeof q == "object" && (q.width !== void 0 && (e.width = q.width), q.height !== void 0 && (e.height = q.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)), Object.keys(e).length) return e;
- }
- 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 a = n(r);
- if (a) return a;
- if (t(r)) {
- let e = n({ prompt: r });
- if (e) return e;
- }
- let o = r.parameters || r["PNG:Parameters"] || r["EXIF:UserComment"] || r.UserComment || r.ImageDescription || null;
- if (typeof o == "string") {
- let t = e(o);
- if (t) return t;
- }
- let s = r.workflow || r.Workflow || r.comfy || r.comfyui || r.ComfyUI || null;
- if (s && typeof s == "object") {
- let e = n(s);
- 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 d(JSON.parse(t));
- } catch {
- return null;
- }
- return { prompt: t };
- }
- return null;
-}
-function f(e) {
- let t = typeof e == "string" ? e.trim() : "";
- return !t || t.includes("\n") ? !1 : l.test(t) || u.test(t);
-}
-function p(e) {
- let t = typeof e == "string" ? e.trim() : "";
- return t ? f(t) ? "" : t : "";
-}
-function m(e, t) {
- let n = p(e), r = p(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 = p(i)), !r && s && (r = p(s));
- }
- }
- return n && r && n.trim() === r.trim() && (r = ""), {
- positive: n,
- negative: r
- };
-}
-function h(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 g(e) {
- if (!e) return "";
- if (typeof e == "string") return h(e);
- let t = h(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=${r}`), i != null && e.push(`c=${i}`), e.length ? `${t} (${e.join(", ")})` : t;
- }
- return n == null ? t : `${t} (${n})`;
-}
-function _(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 v(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 y(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 = _(n) || n, a = v(t?.api_provider), o = r === "api" ? `API ${i || "Workflow"}` : i;
- return {
- workflowType: n,
- workflowLabel: String(o || n).trim(),
- workflowBadge: a
- };
-}
-//#endregion
-export { m as a, d as i, g as n, p as o, h as r, y as t };
diff --git a/dist/chunks/graphTraversal-HdtD9lDa.js b/dist/chunks/graphTraversal-CjIZsRsP.js
similarity index 99%
rename from dist/chunks/graphTraversal-HdtD9lDa.js
rename to dist/chunks/graphTraversal-CjIZsRsP.js
index 64c7f819..35ef668e 100644
--- a/dist/chunks/graphTraversal-HdtD9lDa.js
+++ b/dist/chunks/graphTraversal-CjIZsRsP.js
@@ -1,5 +1,5 @@
//#region ui/app/graphTraversal.ts
-function e(e) {
+function e(e = null) {
return e?.rootGraph ?? e?.graph?.rootGraph ?? e?.graph ?? e?.canvas?.graph ?? null;
}
function t(e) {
diff --git a/dist/chunks/model3dRenderer-DtGg_3hW.js b/dist/chunks/model3dRenderer-BtzSm2ZA.js
similarity index 57%
rename from dist/chunks/model3dRenderer-DtGg_3hW.js
rename to dist/chunks/model3dRenderer-BtzSm2ZA.js
index a91a3375..c15fcde8 100644
--- a/dist/chunks/model3dRenderer-DtGg_3hW.js
+++ b/dist/chunks/model3dRenderer-BtzSm2ZA.js
@@ -1,9 +1,9 @@
import { t as e } from "./rolldown-runtime-Dy4uBu1J.js";
-import { h as t, t as n } from "./config-dvcltBqE.js";
-import { r } from "./events-BnkL6-b6.js";
-import { n as i } from "./state-DPiaUMw1.js";
+import { l as t, rt as n, t as r } from "./config-Cxv7acF8.js";
+import { r as i } from "./events-BnkL6-b6.js";
+import { n as a } from "./state-DPiaUMw1.js";
//#region ui/features/viewer/model3dCore.ts
-function a(e, t) {
+function o(e, t) {
if (!(!e || typeof t != "function")) try {
e.traverse?.((e) => {
(e?.isMesh || e?.isPoints || e?.isLine) && t(e);
@@ -12,7 +12,7 @@ function a(e, t) {
console.debug?.(e);
}
}
-function o(e) {
+function s(e) {
let t = !1;
try {
e.traverse?.((e) => {
@@ -23,14 +23,14 @@ function o(e) {
}
return t;
}
-function s(e) {
+function c(e) {
let t = /* @__PURE__ */ new Map();
- return a(e, (e) => {
+ return o(e, (e) => {
t.set(e.uuid, e.material);
}), t;
}
-function c(e, t, n, r, i) {
- a(t, (t) => {
+function l(e, t, n, r, i) {
+ o(t, (t) => {
try {
if (n === "original") {
let e = r?.get(t.uuid);
@@ -61,7 +61,7 @@ function c(e, t, n, r, i) {
}
});
}
-function l(e) {
+function u(e) {
if (e) {
for (let t of e) try {
t?.dispose?.();
@@ -71,7 +71,7 @@ function l(e) {
e.clear();
}
}
-function u(e, t) {
+function d(e, t) {
try {
if (t === "gltf" || t === "fbx") return Array.isArray(e?.animations) ? e.animations : [];
} catch (e) {
@@ -79,7 +79,7 @@ function u(e, t) {
}
return [];
}
-function d(e, t) {
+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);
@@ -91,12 +91,12 @@ function d(e, t) {
radius: Math.max(a * .72, .5)
};
}
-function f(e, t, n, r) {
+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 p(e, t, n, r) {
+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({
@@ -105,7 +105,7 @@ function p(e, t, n, r) {
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 m(e, t, n) {
+function h(e, t, n) {
if (!n) return null;
if (t === "gltf") return n.scene || null;
if (t === "obj" || t === "fbx") return n;
@@ -133,8 +133,8 @@ function m(e, t, n) {
}
//#endregion
//#region ui/features/viewer/model3dLoaders.ts
-var h = "/mjr/am/vendor/three", g = null;
-function ee(e, t, n) {
+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);
@@ -144,7 +144,7 @@ function ee(e, t, n) {
default: return null;
}
}
-function _(e, t, n) {
+function ee(e, t, n) {
return new Promise((t, r) => {
if (!e || !n) {
r(/* @__PURE__ */ Error("Missing loader or URL"));
@@ -158,38 +158,38 @@ function _(e, t, n) {
});
}
function te() {
- return g || (g = Promise.all([
+ return _ || (_ = Promise.all([
import(
/* @vite-ignore */
- `${h}/three.module.js`
+ `${g}/three.module.js`
),
import(
/* @vite-ignore */
- `${h}/addons/controls/OrbitControls.js`
+ `${g}/addons/controls/OrbitControls.js`
),
import(
/* @vite-ignore */
- `${h}/addons/loaders/GLTFLoader.js`
+ `${g}/addons/loaders/GLTFLoader.js`
),
import(
/* @vite-ignore */
- `${h}/addons/loaders/FBXLoader.js`
+ `${g}/addons/loaders/FBXLoader.js`
),
import(
/* @vite-ignore */
- `${h}/addons/loaders/OBJLoader.js`
+ `${g}/addons/loaders/OBJLoader.js`
),
import(
/* @vite-ignore */
- `${h}/addons/loaders/MTLLoader.js`
+ `${g}/addons/loaders/MTLLoader.js`
),
import(
/* @vite-ignore */
- `${h}/addons/loaders/STLLoader.js`
+ `${g}/addons/loaders/STLLoader.js`
),
import(
/* @vite-ignore */
- `${h}/addons/loaders/PLYLoader.js`
+ `${g}/addons/loaders/PLYLoader.js`
)
]).then(([e, t, n, r, i, a, o, s]) => ({
THREE: e,
@@ -200,11 +200,11 @@ function te() {
MTLLoader: a.MTLLoader,
STLLoader: o.STLLoader,
PLYLoader: s.PLYLoader
- })), g);
+ })), _);
}
//#endregion
//#region ui/features/viewer/processorUtils.ts
-function v(e, t, n) {
+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)));
@@ -214,7 +214,7 @@ function v(e, t, n) {
}
//#endregion
//#region ui/features/viewer/imageProcessor.ts
-function y(e, t, n) {
+function b(e, t, n) {
if (!e) return;
try {
e.width > 1 && e.height > 1 || (e.width = 960, e.height = 540);
@@ -255,7 +255,7 @@ function y(e, t, n) {
}
}
}
-function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: a, maxProcPixels: o, onReady: s } = {}) {
+function x({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: i, maxProcPixels: o, onReady: s } = {}) {
let c = new Image();
try {
c.decoding = "async";
@@ -295,7 +295,7 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap:
if (e?.isConnected) {
f._connectRAF = null, f._connectTries = 0;
let e = f._pendingParams;
- f._pendingParams = null, e && _(e);
+ f._pendingParams = null, e && v(e);
return;
}
} catch (e) {
@@ -315,7 +315,7 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap:
}
}
}
- }, m = (e, t) => v(o, e, t), h = () => {
+ }, m = (e, t) => y(o, e, t), h = () => {
if (f.srcData) return f.srcData;
if (!d || !f.ready) return null;
try {
@@ -353,11 +353,11 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap:
} catch {
return null;
}
- }, ee = (t, a) => {
+ }, _ = (t, i) => {
if (!l || f._destroyed) return;
if (!e?.isConnected) {
try {
- f._pendingParams = a || f.lastParams || n?.() || null;
+ f._pendingParams = i || f.lastParams || n?.() || null;
} catch (e) {
console.debug?.(e);
}
@@ -370,7 +370,7 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap:
let s = u.width, c = u.height;
if (!(s > 0 && c > 0)) return;
try {
- let t = a || n?.() || {};
+ let t = i || n?.() || {};
if (typeof r == "function" && r(t)) {
l.clearRect(0, 0, e.width, e.height), l.drawImage(u, 0, 0);
return;
@@ -389,27 +389,27 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap:
}
}
if (!d) return;
- let m = a || n?.() || {}, g = Number(m.exposureEV) || 0, ee = 1 / Math.max(.1, Math.min(3, Number(m.gamma) || 1)), _ = String(m.channel || "rgb"), te = String(m.analysisMode || "none"), v = i(m.zebraThreshold ?? .95), y = 2 ** g, b = new Float32Array(256);
- for (let e = 0; e < 256; e++) b[e] = (e / 255) ** ee;
+ 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 = 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, a = e * y, o = t * y, c = n * y, l = .2126 * a + .7152 * o + .0722 * c;
- if (te === "zebra") if (i(l) >= v) {
+ 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;
- a = +!!e, o = +!!e, c = +!!e;
- } else a = b[i(a) * 255 + .5 | 0], o = b[i(o) * 255 + .5 | 0], c = b[i(c) * 255 + .5 | 0];
- else a = b[i(a) * 255 + .5 | 0], o = b[i(o) * 255 + .5 | 0], c = b[i(c) * 255 + .5 | 0];
- if (_ === "r") o = a, c = a;
- else if (_ === "g") a = o, c = o;
- else if (_ === "b") a = c, o = c;
- else if (_ === "a") a = r, o = r, c = r;
- else if (_ === "l") {
- let e = b[i(l) * 255 + .5 | 0];
- a = e, o = e, c = e;
+ 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 = b[a(l) * 255 + .5 | 0];
+ i = e, o = e, c = e;
}
- x[w] = Math.round(i(a) * 255), x[w + 1] = Math.round(i(o) * 255), x[w + 2] = Math.round(i(c) * 255), x[w + 3] = 255;
+ 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 {
@@ -430,7 +430,7 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap:
} catch (e) {
console.debug?.(e);
}
- }, _ = (t) => {
+ }, v = (t) => {
if (f._destroyed) return;
if (f.lastParams = t || f.lastParams || n?.() || null, !e?.isConnected) {
try {
@@ -444,11 +444,11 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap:
f.jobId++;
let r = f.jobId;
try {
- ee(r, f.lastParams);
+ _(r, f.lastParams);
} catch (e) {
console.debug?.(e);
}
- }, te = () => {
+ }, 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);
@@ -459,7 +459,7 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap:
} catch (e) {
console.debug?.(e);
}
- f.ready = !0, f.srcData = null, h(), _(f.lastParams || n?.());
+ f.ready = !0, f.srcData = null, h(), v(f.lastParams || n?.());
} finally {
try {
s?.({
@@ -471,16 +471,16 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap:
console.debug?.(e);
}
}
- }, b = () => {
+ }, te = () => {
f.ready = !1;
try {
- y(e, "Failed to load image");
+ b(e, "Failed to load image");
} catch (e) {
console.debug?.(e);
}
};
try {
- c.onload = te, c.onerror = b;
+ c.onload = ee, c.onerror = te;
} catch (e) {
console.debug?.(e);
}
@@ -490,7 +490,7 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap:
console.debug?.(e);
}
return {
- setParams: _,
+ setParams: v,
sampleAtOriginal: g,
getInfo: () => ({ ...f }),
destroy: () => {
@@ -537,14 +537,14 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap:
}
//#endregion
//#region ui/features/viewer/model3dSupport.ts
-var x = [
+var S = [
.25,
.5,
1,
1.5,
2
-], S = 44;
-function C(e, { preventDefault: t = !1, immediate: n = !1 } = {}) {
+], C = 44;
+function w(e, { preventDefault: t = !1, immediate: n = !1 } = {}) {
if (e) {
try {
t && e.preventDefault?.();
@@ -558,13 +558,13 @@ function C(e, { preventDefault: t = !1, immediate: n = !1 } = {}) {
}
}
}
-function w(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 T(e, t) {
- let n = document.createElement("button");
- return n.type = "button", n.textContent = String(e || ""), n.title = String(t || e || ""), n.setAttribute("aria-label", String(t || e || "3D viewport action")), n.style.cssText = [
+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",
@@ -579,14 +579,14 @@ function T(e, t) {
"align-items:center",
"justify-content:center",
"box-shadow:0 4px 18px rgba(0,0,0,0.24)"
- ].join(";"), n;
+ ].join(";"), r;
}
-function ne(e, t) {
+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 E(e, t, n = "", r = "#4CAF50") {
+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);
@@ -594,30 +594,30 @@ function E(e, t, n = "", r = "#4CAF50") {
} catch (e) {
console.debug?.(e);
}
- let i = (() => {
+ let a = (() => {
try {
return e.getContext("2d");
} catch {
return null;
}
})();
- if (!i) return;
- let a = Number(e.width) || 960, o = Number(e.height) || 540, s = a / 2, c = o / 2;
+ if (!a) return;
+ let o = Number(e.width) || 960, s = Number(e.height) || 540, c = o / 2, l = s / 2;
try {
- let e = i.createLinearGradient(0, 0, a, o);
- e.addColorStop(0, "#0f1419"), e.addColorStop(1, "#11181f"), i.fillStyle = e, i.fillRect(0, 0, a, o), i.save(), i.translate(s, c - 32), i.strokeStyle = r, i.lineWidth = 3, i.globalAlpha = .95, i.beginPath(), i.moveTo(0, -44), i.lineTo(42, -22), i.lineTo(42, 22), i.lineTo(0, 44), i.lineTo(-42, 22), i.lineTo(-42, -22), i.closePath(), i.stroke(), i.beginPath(), i.moveTo(0, -44), i.lineTo(0, 0), i.lineTo(42, 22), i.moveTo(0, 0), i.lineTo(-42, 22), i.moveTo(-42, -22), i.lineTo(0, 0), i.moveTo(42, -22), i.lineTo(0, 0), i.stroke(), i.restore(), i.fillStyle = "rgba(255,255,255,0.94)", i.font = "600 18px system-ui, sans-serif", i.textAlign = "center", i.textBaseline = "middle", i.fillText(String(t || "3D preview"), s, c + 44), n && (i.fillStyle = "rgba(255,255,255,0.62)", i.font = "13px system-ui, sans-serif", i.fillText(String(n), s, c + 72));
- } catch (r) {
- console.debug?.(r);
+ 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 {
- y(e, t, n || "3D viewer unavailable");
+ b(e, n, r || t("model3d.unavailable", "3D viewer unavailable"));
} catch (e) {
console.debug?.(e);
}
}
}
-function re({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: n, hasSkeleton: r } = {}) {
- let i = document.createElement("div");
- i.className = "mjr-model3d-settings", i.style.cssText = [
+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",
@@ -650,9 +650,9 @@ function re({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: n, hasSke
"dragover",
"drop"
].forEach((e) => {
- i.addEventListener(e, (e) => C(e, { preventDefault: !1 }));
+ a.addEventListener(e, (e) => w(e, { preventDefault: !1 }));
});
- let a = (e) => {
+ let o = (e) => {
let t = document.createElement("div");
t.style.cssText = [
"font:700 10px system-ui,sans-serif",
@@ -660,15 +660,15 @@ function re({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: n, hasSke
"color:rgba(255,255,255,0.40)",
"text-transform:uppercase",
"margin:10px 0 6px 0"
- ].join(";"), t.textContent = e, i.appendChild(t);
+ ].join(";"), 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;", i.appendChild(n);
- }, o = (e, t) => {
+ 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), i.appendChild(n), n;
- }, s = (e, t) => {
+ 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)",
@@ -686,7 +686,7 @@ function re({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: n, hasSke
e.value = r, e.textContent = i, r === t && (e.selected = !0), n.appendChild(e);
}
return n;
- }, c = (e, t, n, r) => {
+ }, 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");
@@ -700,18 +700,18 @@ function re({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: n, hasSke
valLbl: o
};
};
- a("Scene");
- let l = document.createElement("input");
- l.type = "color", l.value = e || "#282828", l.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;", o("Background", l), a("Model");
- let u = s([
+ 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");
- o("Material", u);
- let d = s([
+ s(t("model3d.material", "Material"), d);
+ let f = c([
["original", "Original"],
["+y", "+Y (default)"],
["-y", "-Y"],
@@ -720,33 +720,33 @@ function re({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: n, hasSke
["+x", "+X"],
["-x", "-X"]
], "original");
- o("Up", d);
- let f = null, p = null;
- r && (p = document.createElement("input"), p.type = "checkbox", p.checked = !1, p.style.cssText = "cursor:pointer;accent-color:#4CAF50;flex-shrink:0;", f = o("Skeleton", p)), a("Camera");
- let m = c(15, 120, 1, t ?? 75);
- o("FOV", m.wrap), a("Lights");
- let h = c(0, 5, .1, n ?? 1);
- return o("Intensity", h.wrap), {
- panel: i,
- bgInput: l,
- materialSel: u,
- upSel: d,
- skeletonToggle: p,
- skeletonRow: f,
- fovSlider: m.slider,
- fovValLbl: m.valLbl,
- lightSlider: h.slider,
- lightValLbl: h.valLbl
+ 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 ie() {
+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:${S}px`,
+ `height:${C}px`,
"display:none",
"align-items:center",
"gap:7px",
@@ -765,10 +765,10 @@ function ie() {
"wheel",
"click"
].forEach((t) => {
- e.addEventListener(t, (e) => C(e, { preventDefault: !1 }));
+ e.addEventListener(t, (e) => w(e, { preventDefault: !1 }));
});
- let t = document.createElement("button");
- t.type = "button", t.textContent = "Play", t.title = "Play / Pause", t.style.cssText = [
+ 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%",
@@ -784,8 +784,8 @@ function ie() {
"align-items:center",
"justify-content:center"
].join(";");
- let n = document.createElement("select");
- n.title = "Playback speed", n.style.cssText = [
+ 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)",
@@ -796,12 +796,12 @@ function ie() {
"width:52px",
"flex-shrink:0"
].join(";");
- for (let e of x) {
+ for (let e of S) {
let t = document.createElement("option");
- t.value = String(e), t.textContent = `${e}x`, e === 1 && (t.selected = !0), n.appendChild(t);
+ t.value = String(e), t.textContent = `${e}x`, e === 1 && (t.selected = !0), r.appendChild(t);
}
- let r = document.createElement("select");
- r.title = "Animation clip", r.style.cssText = [
+ 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)",
@@ -813,26 +813,26 @@ function ie() {
"flex-shrink:1",
"min-width:0"
].join(";");
- let i = document.createElement("input");
- i.type = "range", i.min = "0", i.max = "1000", i.value = "0", i.style.cssText = "flex:1;min-width:50px;cursor:pointer;accent-color:#4CAF50;height:3px;";
- let a = document.createElement("span");
- return a.style.cssText = [
+ 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"
- ].join(";"), a.textContent = "0s / 0s", e.appendChild(t), e.appendChild(n), e.appendChild(r), e.appendChild(i), e.appendChild(a), {
+ ].join(";"), o.textContent = "0s / 0s", e.appendChild(n), e.appendChild(r), e.appendChild(i), e.appendChild(a), e.appendChild(o), {
bar: e,
- playBtn: t,
- speedSel: n,
- animSel: r,
- progressSlider: i,
- timeLbl: a
+ playBtn: n,
+ speedSel: r,
+ animSel: i,
+ progressSlider: a,
+ timeLbl: o
};
}
//#endregion
//#region ui/features/viewer/model3dRenderer.impl.ts
-var ae = Object.freeze({
+var ie = Object.freeze({
".gltf": "gltf",
".glb": "gltf",
".obj": "obj",
@@ -842,13 +842,13 @@ var ae = Object.freeze({
".splat": "splat",
".ksplat": "splat",
".spz": "splat"
-}), D = new Set(Object.keys(ae)), oe = new Set([
+}), k = new Set(Object.keys(ie)), ae = new Set([
"gltf",
"obj",
"fbx",
"stl",
"ply"
-]), se = "#282828", ce = "Rotate: left drag Pan: right drag Zoom: wheel", O = Object.freeze({
+]), oe = "#282828", se = t("model3d.controlHint", "Rotate: left drag Pan: right drag Zoom: wheel"), A = Object.freeze({
PERSPECTIVE: "perspective",
ORTHOGRAPHIC: "orthographic"
});
@@ -859,7 +859,7 @@ Object.freeze({
WIREFRAME: "wireframe",
POINTCLOUD: "pointcloud"
});
-var le = Object.freeze({
+var ce = Object.freeze({
original: [
0,
0,
@@ -895,7 +895,7 @@ var le = Object.freeze({
0,
-Math.PI / 2
]
-}), ue = 75, de = 1, k = Object.freeze({
+}), le = 75, ue = 1, j = Object.freeze({
ambient: .5,
main: .8,
fill: .3,
@@ -903,7 +903,7 @@ var le = Object.freeze({
rim: .3,
bottom: .2
});
-function fe(e) {
+function de(e) {
try {
let t = String(e?.ext || "").trim().toLowerCase();
if (t) return t.startsWith(".") ? t : `.${t}`;
@@ -918,23 +918,23 @@ function fe(e) {
}
return "";
}
-function pe(e) {
+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?.loader || e?.viewer_info?.loader || "").trim().toLowerCase() || ae[fe(e)] || "";
+ return String(e?.kind || "").toLowerCase() === "model3d" ? !0 : k.has(de(e));
}
function he(e) {
- return String(e?.kind || "").toLowerCase() === "model3d" ? !0 : D.has(fe(e));
+ return pe(e) || "gltf";
}
-function ge(e) {
- return me(e) || "gltf";
+function M() {
+ return se;
}
-function A() {
- return ce;
-}
-function j(e) {
+function N(e) {
try {
if (e?.classList?.contains?.("mjr-model3d-render-canvas")) return e;
} catch (e) {
@@ -946,14 +946,14 @@ function j(e) {
return null;
}
}
-function M(e) {
+function P(e) {
try {
return !!e?.closest?.(".mjr-model3d-host, .mjr-viewer-model3d-host, .mjr-mfv-model3d-host");
} catch {
return !1;
}
}
-function _e(e, t) {
+function ge(e, t) {
let n = t || {
ROTATE: 0,
DOLLY: 1,
@@ -965,9 +965,9 @@ function _e(e, t) {
RIGHT: n.PAN
};
}
-function N(e, i, a = {}) {
- let h = a?.pauseDuringExecution == null ? !!n?.VIEWER_PAUSE_DURING_EXECUTION : !!a.pauseDuringExecution, g = document.createElement("div");
- g.className = a.hostClassName || "mjr-model3d-host mjr-viewer-model3d-host", g.style.cssText = a.hostStyle || [
+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",
@@ -978,9 +978,9 @@ function N(e, i, a = {}) {
"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)"
- ].join(";"), g.setAttribute("data-capture-wheel", "true"), g.tabIndex = -1;
- let v = document.createElement("canvas");
- v.className = a.canvasClassName || "mjr-viewer-media mjr-model3d-render-canvas", v.style.cssText = a.canvasStyle || [
+ ].join(";"), _.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%",
@@ -988,15 +988,15 @@ function N(e, i, a = {}) {
"max-height:100%",
"outline:none",
"touch-action:none"
- ].join(";"), v.tabIndex = 0, v._mjrDisableViewerTransform = a.disableViewerTransform !== !1;
+ ].join(";"), y.tabIndex = 0, y._mjrDisableViewerTransform = o.disableViewerTransform !== !1;
try {
- e?.id != null && (v.dataset.mjrAssetId = String(e.id));
+ e?.id != null && (y.dataset.mjrAssetId = String(e.id));
} catch (e) {
console.debug?.(e);
}
- g.appendChild(v);
- let y = document.createElement("canvas");
- y.className = "mjr-model3d-status", y.style.cssText = [
+ _.appendChild(y);
+ let b = document.createElement("canvas");
+ b.className = "mjr-model3d-status", b.style.cssText = [
"position:absolute",
"inset:0",
"display:block",
@@ -1004,11 +1004,11 @@ function N(e, i, a = {}) {
"height:100%",
"pointer-events:none",
"z-index:1"
- ].join(";"), g.appendChild(y);
- let b = fe(e).replace(".", "").toUpperCase();
- if (b) {
+ ].join(";"), _.appendChild(b);
+ let x = de(e).replace(".", "").toUpperCase();
+ if (x) {
let e = document.createElement("div");
- e.className = "mjr-model3d-badge", e.textContent = b, e.style.cssText = [
+ e.className = "mjr-model3d-badge", e.textContent = x, e.style.cssText = [
"position:absolute",
"top:10px",
"left:10px",
@@ -1020,10 +1020,10 @@ function N(e, i, a = {}) {
"background:rgba(76,175,80,0.9)",
"pointer-events:none",
"z-index:2"
- ].join(";"), g.appendChild(e);
+ ].join(";"), _.appendChild(e);
}
- let x = document.createElement("div");
- x.className = "mjr-model3d-toolbar", x.style.cssText = [
+ let S = document.createElement("div");
+ S.className = "mjr-model3d-toolbar", S.style.cssText = [
"position:absolute",
"top:10px",
"right:10px",
@@ -1034,12 +1034,12 @@ function N(e, i, a = {}) {
"pointer-events:none",
"z-index:5"
].join(";");
- let S = document.createElement("div");
- S.style.cssText = "display:flex;align-items:center;gap:6px;flex-wrap:wrap;pointer-events:auto;";
- let ae = T("Reset", "Reset 3D view"), D = T("Grid", "Toggle grid"), me = T("Persp", "Switch perspective / orthographic"), he = T("Settings", "Settings");
- S.append(ae, D, me, he), x.appendChild(S), g.appendChild(x);
- let A = document.createElement("div");
- A.className = "mjr-model3d-hint", A.textContent = a.hintText || ce, A.style.cssText = [
+ 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",
@@ -1052,141 +1052,141 @@ function N(e, i, a = {}) {
"pointer-events:none",
"z-index:2",
"transition:bottom 0.2s"
- ].join(";"), g.appendChild(A);
- let j = re({
- defaultBgColor: se,
- defaultFov: ue,
- defaultLightIntensity: de,
+ ].join(";"), _.appendChild(M);
+ let N = ne({
+ defaultBgColor: oe,
+ defaultFov: le,
+ defaultLightIntensity: ue,
hasSkeleton: !1
});
- g.appendChild(j.panel);
- let M = ie();
- g.appendChild(M.bar);
- let N = !1, ve = null, P = null, F = null, I = null, L = null, R = null, z = null, B = null, V = null, ye = null, be = !1, H = null, xe = null, U = null, W = null, Se = null, G = null, K = 0, q = O.PERSPECTIVE, Ce = /* @__PURE__ */ new Map(), we = /* @__PURE__ */ new Set(), J = null, Te = !1, Ee = null, De = [], Y = de, X = null, Oe = null, Z = [], Q = [], $ = 0, ke = 1, Ae = !1, je = !1, Me = !1, Ne = String(e?.filename || "3D model"), Pe = () => {
+ _.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 {
- a.scheduleOverlayRedraw?.();
+ o.scheduleOverlayRedraw?.();
} catch (e) {
console.debug?.(e);
}
- }, Fe = (e, t = "", n = "#4CAF50") => {
- H = {
+ }, Ie = (e, t = "", n = "#4CAF50") => {
+ be = {
title: e,
hintText: t,
accent: n
- }, y.style.display = "block", E(y, e, t, n);
- }, Ie = () => {
- H = null, y.style.display = "none";
+ }, b.style.display = "block", O(b, e, t, n);
}, Le = () => {
+ be = null, b.style.display = "none";
+ }, Re = () => {
try {
- let e = g.getBoundingClientRect();
- v._mjrNaturalW = Math.max(1, Math.round(e.width || v.width || 1)), v._mjrNaturalH = Math.max(1, Math.round(e.height || v.height || 1));
+ 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 {
- H && E(y, H.title, H.hintText, H.accent);
+ be && O(b, be.title, be.hintText, be.accent);
} catch (e) {
console.debug?.(e);
}
- }, Re = (e, t) => {
- if (!z || !(K > 0)) return;
- let n = Math.max(1e-4, (Number(e) || 1) / Math.max(1, Number(t) || 1)), r = K * n;
- z.left = -r / 2, z.right = r / 2, z.top = K / 2, z.bottom = -K / 2, z.updateProjectionMatrix();
- }, ze = () => {
- if (!(!W || !B || !G)) {
- if (q === O.ORTHOGRAPHIC) {
- let e = g.getBoundingClientRect();
- K = p(z, B, G, Math.max(1e-4, (e.width || 1) / Math.max(1, e.height || 1))) || K, L = z;
- } else f(P, R, B, G), L = R;
+ }, 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 {
- B.object = L, B.update();
+ H.object = z, H.update();
} catch (e) {
console.debug?.(e);
}
}
- }, Be = (e, { refit: t = !0 } = {}) => {
- q = e === O.ORTHOGRAPHIC ? O.ORTHOGRAPHIC : O.PERSPECTIVE, L = q === O.ORTHOGRAPHIC ? z : R;
+ }, Ve = (e, { refit: t = !0 } = {}) => {
+ q = e === A.ORTHOGRAPHIC ? A.ORTHOGRAPHIC : A.PERSPECTIVE, z = q === A.ORTHOGRAPHIC ? V : B;
try {
- B && (B.object = L);
+ H && (H.object = z);
} catch (e) {
console.debug?.(e);
}
- if (t) ze();
+ if (t) Be();
else {
try {
- L?.updateProjectionMatrix?.();
+ z?.updateProjectionMatrix?.();
} catch (e) {
console.debug?.(e);
}
try {
- B?.update?.();
+ H?.update?.();
} catch (e) {
console.debug?.(e);
}
}
- Ye(), Pe();
- }, Ve = (e) => {
+ Xe(), Fe();
+ }, He = (e) => {
Y = Math.max(0, Math.min(10, Number(e) || 0));
try {
- Ee && (Ee.intensity = k.ambient * Y);
+ De && (De.intensity = j.ambient * Y);
} catch (e) {
console.debug?.(e);
}
let t = [
- k.main,
- k.back,
- k.fill,
- k.fill,
- k.bottom
+ j.main,
+ j.back,
+ j.fill,
+ j.fill,
+ j.bottom
];
- De.forEach((e, n) => {
+ Oe.forEach((e, n) => {
try {
- e && (e.intensity = (t[n] ?? k.fill) * Y);
+ e && (e.intensity = (t[n] ?? j.fill) * Y);
} catch (e) {
console.debug?.(e);
}
});
- }, He = (e) => {
- !Se || !P || (l(we), c(P, Se, e, Ce, we), Pe());
}, Ue = (e) => {
- if (!W) return;
- let t = le[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 {
- W.rotation.set(t[0], t[1], t[2]), W.updateMatrixWorld(!0);
+ G.rotation.set(t[0], t[1], t[2]), G.updateMatrixWorld(!0);
} catch (e) {
console.debug?.(e);
}
- P && (G = d(P, W)), ze();
- }, We = (e) => {
+ I && (K = f(I, G)), Be();
+ }, Ge = (e) => {
if (J) try {
J.visible = !!e;
} catch (e) {
console.debug?.(e);
}
- }, Ge = () => {
+ }, Ke = () => {
if (!X || Z.length === 0) return;
let e = Q[$];
if (!e) return;
let t = Z[$]?.duration || 0, n = e.time || 0;
try {
- M.timeLbl.textContent = `${w(n)} / ${w(t)}`;
+ P.timeLbl.textContent = `${T(n)} / ${T(t)}`;
} catch (e) {
console.debug?.(e);
}
- if (!je && t > 0) try {
- let e = Number(M.progressSlider.max) || 1e3;
- M.progressSlider.value = String(Math.round(n / t * 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);
}
- }, Ke = (e) => {
+ }, qe = (e) => {
if (!X || !Z.length) return;
- let t = Z[e];
- if (!t) return;
+ let n = Z[e];
+ if (!n) return;
Q.forEach((e) => {
try {
e?.stop();
@@ -1194,99 +1194,99 @@ function N(e, i, a = {}) {
console.debug?.(e);
}
});
- let n = X.clipAction(t);
- n.timeScale = ke, n.clampWhenFinished = !1, n.loop = P?.LoopRepeat ?? 2201, n.play(), Q[e] = n, $ = e, Ae = !0, M.playBtn.textContent = "Pause";
+ 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((t.duration || 1) * 100)));
- M.progressSlider.max = String(e);
+ let e = Math.max(100, Math.min(1e4, Math.round((n.duration || 1) * 100)));
+ P.progressSlider.max = String(e);
} catch {}
- }, qe = () => {
- !X || !Z.length || (Ae ? (X.timeScale = 0, Ae = !1, M.playBtn.textContent = "Play") : (X.timeScale = ke, Q[$]?.isRunning?.() ? (Ae = !0, M.playBtn.textContent = "Pause") : Ke($)));
- }, Je = (e, t) => {
- !e || e.length === 0 || !P || (Z = e, X = new P.AnimationMixer(t), Oe = new P.Clock(), Q = Array(e.length).fill(null), M.animSel.innerHTML = "", e.forEach((e, t) => {
+ }, 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}`, M.animSel.appendChild(n);
- }), M.animSel.style.display = e.length > 1 ? "" : "none", M.bar.style.display = "flex", A.style.bottom = "54px", Ke(0), M.playBtn.addEventListener("click", (e) => {
- C(e), qe();
- }), M.speedSel.addEventListener("change", () => {
- ke = Number(M.speedSel.value) || 1, X.timeScale = Ae ? ke : 0;
+ 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 = ke);
- }), M.animSel.addEventListener("change", () => {
- Ke(Number(M.animSel.value) || 0);
- }), M.progressSlider.addEventListener("pointerdown", () => {
- je = !0;
- }), M.progressSlider.addEventListener("pointerup", () => {
- je = !1;
+ e && (e.timeScale = Ae);
+ }), P.animSel.addEventListener("change", () => {
+ qe(Number(P.animSel.value) || 0);
+ }), P.progressSlider.addEventListener("pointerdown", () => {
+ Me = !0;
+ }), P.progressSlider.addEventListener("pointerup", () => {
+ Me = !1;
let e = Q[$], t = Z[$];
if (e && t) {
- let n = Number(M.progressSlider.max) || 1e3, r = Number(M.progressSlider.value) / n * t.duration;
+ 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));
}
- }), M.progressSlider.addEventListener("input", () => {
+ }), P.progressSlider.addEventListener("input", () => {
let e = Q[$], t = Z[$];
- if (e && t && je) {
- let n = Number(M.progressSlider.max) || 1e3, r = Number(M.progressSlider.value) / n * t.duration;
- e.time = Math.max(0, Math.min(r, t.duration)), M.timeLbl.textContent = `${w(r)} / ${w(t.duration)}`;
+ 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)}`;
}
}));
- }, Ye = () => {
- ne(D, !!U?.visible), ne(me, q === O.ORTHOGRAPHIC), me.textContent = q === O.ORTHOGRAPHIC ? "Ortho" : "Persp", ne(he, Me);
+ }, 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);
};
- j.bgInput.addEventListener("input", () => {
- let e = j.bgInput.value;
+ N.bgInput.addEventListener("input", () => {
+ let e = N.bgInput.value;
try {
- I && (I.background = new (P?.Color || Object)(e));
+ R && (R.background = new (I?.Color || Object)(e));
} catch (e) {
console.debug?.(e);
}
- }), j.materialSel.addEventListener("change", () => {
- He(j.materialSel.value);
- }), j.upSel.addEventListener("change", () => {
- Ue(j.upSel.value);
- }), j.skeletonToggle && j.skeletonToggle.addEventListener("change", () => {
- We(j.skeletonToggle.checked);
- }), j.fovSlider.addEventListener("input", () => {
- let e = Math.max(1, Math.min(179, Number(j.fovSlider.value) || ue));
+ }), 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 {
- R && (R.fov = e, R.updateProjectionMatrix());
+ B && (B.fov = e, B.updateProjectionMatrix());
} catch (e) {
console.debug?.(e);
}
- }), j.lightSlider.addEventListener("input", () => {
- Ve(Number(j.lightSlider.value));
+ }), N.lightSlider.addEventListener("input", () => {
+ He(Number(N.lightSlider.value));
});
- let Xe = () => {
+ let Ze = () => {
let e = [], t = (t, n, r, i) => {
t.addEventListener(n, r, i), e.push(() => t.removeEventListener(n, r, i));
};
- return t(g, "pointerdown", () => {
+ return t(_, "pointerdown", () => {
try {
- v.focus?.();
+ y.focus?.();
} catch (e) {
console.debug?.(e);
}
- }), t(g, "wheel", (e) => C(e)), t(g, "contextmenu", (e) => C(e, { preventDefault: !0 })), t(g, "dragstart", (e) => C(e, { preventDefault: !0 })), t(g, "dragover", (e) => C(e, { preventDefault: !0 })), t(g, "dragleave", (e) => C(e)), t(g, "drop", (e) => C(e, { preventDefault: !0 })), () => {
+ }), 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);
}
};
- }, Ze = () => {
- N = !0;
+ }, Qe = () => {
+ F = !0;
try {
- window.removeEventListener(r.RUNTIME_STATUS, et);
+ window.removeEventListener(i.RUNTIME_STATUS, tt);
} catch {}
try {
- g._mjr3D = null;
+ _._mjr3D = null;
} catch {}
try {
- V != null && cancelAnimationFrame(V);
+ U != null && cancelAnimationFrame(U);
} catch (e) {
console.debug?.(e);
}
- V = null;
+ U = null;
try {
xe?.();
} catch (e) {
@@ -1294,17 +1294,17 @@ function N(e, i, a = {}) {
}
xe = null;
try {
- ve?.disconnect?.();
+ _e?.disconnect?.();
} catch (e) {
console.debug?.(e);
}
- ve = null;
+ _e = null;
try {
- B?.dispose?.();
+ H?.dispose?.();
} catch (e) {
console.debug?.(e);
}
- B = null;
+ H = null;
try {
X?.stopAllAction?.(), X?.uncacheRoot?.(X.getRoot?.());
} catch (e) {
@@ -1324,15 +1324,15 @@ function N(e, i, a = {}) {
} catch (e) {
console.debug?.(e);
}
- X = null, Q = [], Z = [], l(we);
+ X = null, Q = [], Z = [], u(Te);
try {
- J && (I?.remove?.(J), J.dispose?.());
+ J && (R?.remove?.(J), J.dispose?.());
} catch (e) {
console.debug?.(e);
}
J = null;
try {
- I?.traverse?.((e) => {
+ R?.traverse?.((e) => {
try {
e.geometry?.dispose?.();
} catch {}
@@ -1353,7 +1353,7 @@ function N(e, i, a = {}) {
console.debug?.(e);
}
try {
- g._mjrAxisScene &&= (g._mjrAxisScene.traverse?.((e) => {
+ _._mjrAxisScene &&= (_._mjrAxisScene.traverse?.((e) => {
try {
e.geometry?.dispose?.();
} catch {}
@@ -1365,58 +1365,58 @@ function N(e, i, a = {}) {
console.debug?.(e);
}
try {
- F?.dispose?.();
+ L?.dispose?.();
} catch (e) {
console.debug?.(e);
}
- F = null, I = null, L = null, R = null, z = null, Se = null, W = null, G = null, ye = null;
+ L = null, R = null, z = null, B = null, V = null, Se = null, G = null, K = null, ve = null;
try {
- let e = v.getContext("webgl2") || v.getContext("webgl");
+ let e = y.getContext("webgl2") || y.getContext("webgl");
e && e.getExtension("WEBGL_lose_context")?.loseContext?.();
} catch (e) {
console.debug?.(e);
}
- }, Qe = () => {
- be = !0;
- try {
- V != null && cancelAnimationFrame(V);
- } catch (e) {
- console.debug?.(e);
- }
- V = null;
}, $e = () => {
- if (be = !1, !(N || V != null || typeof ye != "function")) try {
- V = requestAnimationFrame(ye);
+ ye = !0;
+ try {
+ U != null && cancelAnimationFrame(U);
} catch (e) {
console.debug?.(e);
}
- }, et = (e) => {
- if (h) {
+ U = null;
+ }, et = () => {
+ if (ye = !1, !(F || U != null || typeof ve != "function")) try {
+ U = requestAnimationFrame(ve);
+ } catch (e) {
+ console.debug?.(e);
+ }
+ }, tt = (e) => {
+ if (g) {
if (String(e?.detail?.active_prompt_id || "").trim()) {
- Qe();
+ $e();
return;
}
- $e();
+ et();
}
};
- v._mjrProc = {
+ y._mjrProc = {
setParams: () => {},
- destroy: Ze,
- captureCanvas: () => v,
- pause: Qe,
- resume: $e
+ destroy: Qe,
+ captureCanvas: () => y,
+ pause: $e,
+ resume: et
};
try {
- h && (window.addEventListener(r.RUNTIME_STATUS, et), String(window.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (be = !0));
+ g && (window.addEventListener(i.RUNTIME_STATUS, tt), String(window.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (ye = !0));
} catch (e) {
console.debug?.(e);
}
- return Fe("Preparing 3D preview", Ne), Promise.resolve().then(async () => {
- let n = ge(e);
- if (!oe.has(n)) {
- if (Fe("3D preview unavailable", `${n.toUpperCase()} is not supported in the embedded viewer.`), A.style.display = "none", i) try {
- let t = document.createElement("a");
- t.href = i, t.download = String(e?.filename || "model"), t.textContent = `Download ${String(e?.filename || "file")}`, t.style.cssText = [
+ return Ie("Preparing 3D preview", Pe), Promise.resolve().then(async () => {
+ let r = he(e);
+ if (!ae.has(r)) {
+ 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%",
@@ -1429,121 +1429,121 @@ function N(e, i, a = {}) {
"text-decoration:none",
"pointer-events:auto",
"z-index:3"
- ].join(";"), g.appendChild(t);
+ ].join(";"), _.appendChild(n);
} catch {}
return;
}
try {
- let r = await te();
- if (N) return;
- let c = r.THREE;
- P = c;
- let l = new c.LoadingManager();
- l.setURLModifier((n) => {
- if (!n || pe(n)) return n;
- let r = t(e, n);
+ 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(n, i).href;
+ return new URL(t, a).href;
} catch {
- return n;
+ return t;
}
- }), F = new c.WebGLRenderer({
- canvas: v,
+ }), L = new i.WebGLRenderer({
+ canvas: y,
antialias: !0,
alpha: !0,
preserveDrawingBuffer: !0
- }), F.outputColorSpace = c.SRGBColorSpace, F.setPixelRatio(Math.min(2, window.devicePixelRatio || 1)), I = new c.Scene(), I.background = new c.Color(se), R = new c.PerspectiveCamera(ue, 16 / 9, .01, 1e4), z = new c.OrthographicCamera(-1, 1, 1, -1, -1e4, 1e4), L = R, B = new r.OrbitControls(L, v), B.enableDamping = !0, B.dampingFactor = .08, B.rotateSpeed = .82, B.zoomSpeed = 1, B.panSpeed = .9, B.screenSpacePanning = !0, B.mouseButtons = _e(null, c.MOUSE), xe = Xe(), Ee = new c.AmbientLight(16777215, k.ambient * Y), I.add(Ee);
- let f = new c.DirectionalLight(16777215, k.main * Y);
- f.position.set(0, 10, 10);
- let p = new c.DirectionalLight(16777215, k.back * Y);
+ }), 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 h = new c.DirectionalLight(15266047, k.fill * Y);
- h.position.set(10, 5, -5);
- let y = new c.DirectionalLight(16773352, k.fill * Y);
- y.position.set(-10, 5, 5);
- let b = new c.DirectionalLight(16777215, k.bottom * Y);
- b.position.set(0, -10, 0), De = [
- f,
+ 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,
- h,
- y,
+ m,
+ g,
b
- ], De.forEach((e) => I.add(e)), U = new c.GridHelper(20, 20, 5068128, 3094338), I.add(U);
+ ], Oe.forEach((e) => R.add(e)), W = new i.GridHelper(20, 20, 5068128, 3094338), R.add(W);
let x = () => {
- if (N || !F || !L) return;
- let e = g.getBoundingClientRect(), t = Math.max(1, Math.round(e.width || v.clientWidth || 1)), n = Math.max(1, Math.round(e.height || v.clientHeight || 1));
- F.setSize(t, n, !1), R && (R.aspect = t / n, R.updateProjectionMatrix()), Re(t, n), Le(), Pe();
+ 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" && (ve = new ResizeObserver(() => x()), ve.observe(g));
- let S = ee(r, n, l);
+ typeof ResizeObserver < "u" && (_e = new ResizeObserver(() => x()), _e.observe(_));
+ let S = v(t, r, l);
if (!S) {
- Fe("3D loader unavailable", `${n.toUpperCase()} loader could not be created.`), A.style.display = "none";
+ Ie("3D loader unavailable", `${r.toUpperCase()} loader could not be created.`), M.style.display = "none";
return;
}
- if (n === "obj" && r.MTLLoader) try {
- let e = i.replace(/\.obj(\?.*)?$/i, (e, t) => `.mtl${t || ""}`), t = new r.MTLLoader(l), n = await new Promise((n) => {
- t.load(e, n, void 0, () => n(null));
+ 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));
});
- n && !N && (n.preload(), S.setMaterials(n));
+ r && !F && (r.preload(), S.setMaterials(r));
} catch (e) {
console.debug?.("[MJR 3D] MTL load skipped:", e?.message);
}
- let w = await _(S, n, i);
- if (N) return;
- let T = m(c, n, w);
+ let C = await ee(S, r, a);
+ if (F) return;
+ let T = h(i, r, C);
if (!T) {
- Fe("Empty 3D scene", "The loader returned no renderable object."), A.style.display = "none";
+ Ie("Empty 3D scene", "The loader returned no renderable object."), M.style.display = "none";
return;
}
try {
- let e = new c.Box3().setFromObject(T);
+ let e = new i.Box3().setFromObject(T);
if (!e.isEmpty()) {
- let t = e.getSize(new c.Vector3()), n = e.getCenter(new c.Vector3()), r = 5 / Math.max(t.x, t.y, t.z, .001);
+ 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, W = new c.Group(), W.add(T), I.add(W), Ce = s(T), Te = o(T), Te) {
- J = new c.SkeletonHelper(T), J.visible = !1, I.add(J);
- let e = re({
- defaultBgColor: se,
- defaultFov: ue,
- defaultLightIntensity: de,
+ 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
});
- g.replaceChild(e.panel, j.panel), Object.assign(j, e), j.bgInput.addEventListener("input", () => {
+ _.replaceChild(e.panel, N.panel), Object.assign(N, e), N.bgInput.addEventListener("input", () => {
try {
- I && (I.background = new c.Color(j.bgInput.value));
+ R && (R.background = new i.Color(N.bgInput.value));
} catch (e) {
console.debug?.(e);
}
- }), j.materialSel.addEventListener("change", () => {
- He(j.materialSel.value);
- }), j.upSel.addEventListener("change", () => {
- Ue(j.upSel.value);
- }), j.skeletonToggle && j.skeletonToggle.addEventListener("change", () => {
- We(j.skeletonToggle.checked);
- }), j.fovSlider.addEventListener("input", () => {
- let e = Math.max(1, Math.min(179, Number(j.fovSlider.value) || ue));
+ }), 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 {
- R && (R.fov = e, R.updateProjectionMatrix());
+ B && (B.fov = e, B.updateProjectionMatrix());
} catch (e) {
console.debug?.(e);
}
- }), j.lightSlider.addEventListener("input", () => {
- Ve(Number(j.lightSlider.value));
+ }), N.lightSlider.addEventListener("input", () => {
+ He(Number(N.lightSlider.value));
});
}
- G = d(c, W), G && (U.position.y = G.box.min.y), q = O.PERSPECTIVE, ze(), x(), Ie(), Ye();
- let ne = u(w, n);
- ne.length > 0 && Je(ne, T);
- let E = new c.Scene();
- g._mjrAxisScene = E;
- let ie = new c.PerspectiveCamera(50, 1, .1, 100);
- ie.position.set(0, 0, 3.2), ie.lookAt(0, 0, 0);
- let oe = [
+ 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,
@@ -1568,94 +1568,94 @@ function N(e, i, a = {}) {
],
color: 5605631
}
- ], ce = new c.SphereGeometry(.1, 12, 8), le = new c.SphereGeometry(.08, 10, 6), fe = new c.MeshBasicMaterial({ color: 13421772 });
- E.add(new c.Mesh(le, fe));
- for (let { dir: e, color: t } of oe) {
- let n = new c.LineBasicMaterial({ color: t }), r = [new c.Vector3(0, 0, 0), new c.Vector3(e[0], e[1], e[2])], i = new c.BufferGeometry().setFromPoints(r);
- E.add(new c.Line(i, n));
- let a = new c.MeshBasicMaterial({ color: t }), o = new c.Mesh(ce, a);
- o.position.set(e[0], e[1], e[2]), E.add(o);
+ ], 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);
}
- g._mjr3D = {
- controls: B,
+ _._mjr3D = {
+ controls: H,
get camera() {
- return L;
+ return z;
}
};
try {
- a.onReady?.({
- canvas: v,
- host: g,
- object: W,
- renderer: F,
- camera: L,
- controls: B
+ o.onReady?.({
+ canvas: y,
+ host: _,
+ object: G,
+ renderer: L,
+ camera: z,
+ controls: H
});
} catch (e) {
console.debug?.(e);
}
- Pe();
- let ge = () => {
- if (!(N || be || !F || !I || !L)) {
+ Fe();
+ let de = () => {
+ if (!(F || ye || !L || !R || !z)) {
try {
- if (B?.update?.(), X && Oe) {
- let e = Oe.getDelta();
- Ae && X.update(e), Ge();
+ if (H?.update?.(), X && ke) {
+ let e = ke.getDelta();
+ je && X.update(e), Ke();
}
- F.setScissorTest(!1), F.setViewport(0, 0, v.width, v.height), F.render(I, L);
+ 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);
- F.setScissorTest(!0), F.setScissor(0, 0, t, t), F.setViewport(0, 0, t, t), F.setClearColor(0, 0), F.clear(!0, !0, !1);
- let n = L.quaternion;
- ie.position.set(0, 0, 3.2).applyQuaternion(n), ie.quaternion.copy(n), F.render(E, ie), F.setScissorTest(!1);
+ 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 {
- F.setClearColor(I.background || 0, 1);
+ L.setClearColor(R.background || 0, 1);
} catch {}
- Le();
+ Re();
} catch (e) {
console.debug?.(e);
}
- be || (V = requestAnimationFrame(ge));
+ ye || (U = requestAnimationFrame(de));
}
};
- ye = ge;
- let M = (e) => C(e, { preventDefault: !0 });
- ae.addEventListener("click", (e) => {
- M(e), ze(), Ye();
- }), D.addEventListener("click", (e) => {
- M(e), U && (U.visible = !U.visible), Ye(), Pe();
+ 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) => {
- M(e), Be(q === O.PERSPECTIVE ? O.ORTHOGRAPHIC : O.PERSPECTIVE);
- }), he.addEventListener("click", (e) => {
- M(e), Me = !Me, j.panel.style.display = Me ? "block" : "none", Ye();
- }), be || ge();
+ he(e), Ne = !Ne, N.panel.style.display = Ne ? "block" : "none", Xe();
+ }), ye || de();
} catch (e) {
- console.warn("[MJR 3D] preview init failed", e), Fe("Failed to load 3D preview", String(e?.message || "Three.js initialization failed.")), A.style.display = "none";
+ 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";
}
}).catch((e) => {
- if (!N) {
+ if (!F) {
console.warn("[MJR 3D] preview init unhandled error", e);
try {
- Fe("Failed to load 3D preview", String(e?.message || "Initialization failed."));
+ Ie("Failed to load 3D preview", String(e?.message || "Initialization failed."));
} catch {}
try {
- A.style.display = "none";
+ M.style.display = "none";
} catch {}
}
- }), g;
+ }), _;
}
//#endregion
//#region ui/features/viewer/model3dRenderer.ts
-var ve = /* @__PURE__ */ e({
- MODEL3D_EXTS: () => D,
- MODEL3D_EXT_TO_LOADER: () => ae,
- PREVIEWABLE_MODEL3D_LOADERS: () => oe,
- buildModel3DMouseButtons: () => _e,
- createModel3DMediaElement: () => N,
- findModel3DCanvas: () => j,
- getModel3DDefaultControlHint: () => A,
- isModel3DAsset: () => he,
- isModel3DInteractionTarget: () => M,
- resolveModel3DLoader: () => ge
+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
});
//#endregion
-export { M as a, v as c, he as i, D as n, b as o, N as r, y as s, ve as t };
+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/openMajoorSettings-CGhSTA_W.js b/dist/chunks/openMajoorSettings-BeNfIQfY.js
similarity index 68%
rename from dist/chunks/openMajoorSettings-CGhSTA_W.js
rename to dist/chunks/openMajoorSettings-BeNfIQfY.js
index 6bca6e7d..c044adef 100644
--- a/dist/chunks/openMajoorSettings-CGhSTA_W.js
+++ b/dist/chunks/openMajoorSettings-BeNfIQfY.js
@@ -1,21 +1,20 @@
-import { Bt as e, Wt as t, a as n, o as r, u as i } from "./hostAdapter-D6BwD-lN.js";
-import { t as a } from "./config-dvcltBqE.js";
-import { B as o, S as s, b as c, g as l, x as u } from "./SidebarWorkflowSection-CxD2u7Bb.js";
-import { a as d, n as f } from "./graphTraversal-HdtD9lDa.js";
-import { n as p, t as m } from "./state-DPiaUMw1.js";
+import { R as e, T as t, b as n, h as r, k as i, l as a, t as o, w as s, z as c } from "./config-Cxv7acF8.js";
+import { a as l, n as u } from "./graphTraversal-CjIZsRsP.js";
+import { C as d, S as f, V as p, _ as m, x as h } from "./SidebarWorkflowSection-na0bq_pe.js";
+import { n as g, t as _ } from "./state-DPiaUMw1.js";
//#region ui/features/viewer/floatingViewerProgress.ts
-var h = "progress-update", g = Symbol.for("mjr.mfv.progress.queuePromptPatch"), _ = "__MJR_MFV_PROGRESS_SERVICE__";
-function v() {
+var v = "progress-update", y = "__MJR_MFV_PROGRESS_SERVICE__";
+function b() {
return typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : {};
}
-function y(e, t) {
+function x(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 ee = class {
- constructor(e, t = () => r()) {
- 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;
+ constructor(e, n = () => t()) {
+ this.id = String(e || ""), this.promptApi = null, this.executedNodeIds = [], this.totalNodes = 0, this.currentlyExecuting = null, this.errorDetails = null, this._getApp = typeof n == "function" ? n : () => null;
}
setPrompt(e) {
let t = e && typeof e == "object" ? e.output : null;
@@ -27,7 +26,7 @@ var ee = class {
getNodeLabel(e) {
let t = this.getApiNode(e), n = t?._meta?.title || t?.class_type || "";
if (!n) {
- let t = this._getApp?.(), r = f(d(t), e);
+ let t = this._getApp?.(), r = u(l(t), e);
n = r?.title || r?.type || "";
}
return String(n || "").trim();
@@ -62,9 +61,9 @@ var ee = class {
error(e) {
this.errorDetails = e || null;
}
-}, b = class extends EventTarget {
- constructor({ getApi: e = (e) => n(e), getApp: t = () => r(), waitForApi: a = (e) => i(e) } = {}) {
- super(), this._getApi = e, this._getApp = t, this._waitForApi = a, this.promptsMap = /* @__PURE__ */ new Map(), this.currentExecution = null, this.lastQueueRemaining = 0, this._api = null, this._listenerEntries = [], this._initPromise = null;
+}, S = class extends EventTarget {
+ constructor({ getApi: n = (e) => s(e), getApp: r = () => t(), 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._queuePromptBinding = null;
}
getSnapshot() {
return {
@@ -108,35 +107,32 @@ var ee = class {
}), this._api = e, this._patchQueuePrompt(e), this._attachApiListeners(e));
}
_patchQueuePrompt(e) {
- if (!e || typeof e.queuePrompt != "function") return;
- let t = e.queuePrompt?.[g];
- if (t?.service === this || t?.service && t.service !== this) return;
- let n = e.queuePrompt, r = this, i = async function(e, t, ...i) {
- let a;
- try {
- a = await n.apply(this, [
- e,
- t,
- ...i
- ]);
- } catch (e) {
- let t = r.getOrMakePrompt("error");
- throw t.error({ exception_type: "Unknown." }), r.currentExecution = t, r.dispatchProgressUpdate(), e;
+ let t = this;
+ this._queuePromptBinding = c({
+ 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(x("queue-prompt", { prompt: e })), t.dispatchProgressUpdate();
+ }
+ return a;
+ };
}
- let o = String(a?.prompt_id || a?.promptId || "").trim();
- if (o) {
- let e = r.getOrMakePrompt(o);
- e.setPrompt(t), r.currentExecution ||= e, r.dispatchEvent(y("queue-prompt", { prompt: e })), r.dispatchProgressUpdate();
- }
- return a;
- };
- Object.defineProperty(i, g, {
- configurable: !0,
- value: {
- service: r,
- originalQueuePrompt: n
- }
- }), e.queuePrompt = i;
+ });
}
_attachApiListeners(e) {
this._attachListener(e, "status", (e) => {
@@ -177,7 +173,7 @@ var ee = class {
});
}
dispatchProgressUpdate() {
- this.dispatchEvent(y(h, this.getSnapshot()));
+ this.dispatchEvent(x(v, this.getSnapshot()));
}
dispose({ resetPatchedQueuePrompt: e = !1, keepState: t = !1 } = {}) {
for (let { api: e, type: t, handler: n } of this._listenerEntries.splice(0)) try {
@@ -185,18 +181,17 @@ var ee = class {
} catch (e) {
console.debug?.(e);
}
- if (e && this._api?.queuePrompt?.[g]?.service === this) try {
- let e = this._api.queuePrompt[g]?.originalQueuePrompt || null;
- typeof e == "function" && (this._api.queuePrompt = e);
+ if (e && this._queuePromptBinding?.owner === this) try {
+ this._queuePromptBinding.restore?.();
} catch (e) {
console.debug?.(e);
}
- this._api = null, t || (this.promptsMap.clear(), this.currentExecution = null, this.lastQueueRemaining = 0);
+ this._queuePromptBinding = null, this._api = null, t || (this.promptsMap.clear(), this.currentExecution = null, this.lastQueueRemaining = 0);
}
-}, x = v(), S = x[_] || new b();
-x[_] || (x[_] = S);
-function C(e = {}) {
- return S.ensureInitialized(e);
+}, C = b(), w = C[y] || new S();
+C[y] || (C[y] = w);
+function T(e = {}) {
+ return w.ensureInitialized(e);
}
function te(e) {
let t = Math.max(0, Number(e?.queue) || 0), n = e?.prompt || null;
@@ -222,7 +217,7 @@ function te(e) {
}
return t > 0 ? `(${t}) Running... in another tab` : "Idle";
}
-function w(e) {
+function ne(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();
@@ -233,7 +228,7 @@ function w(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 T(e, t) {
+function re(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) {
@@ -245,21 +240,20 @@ function T(e, t) {
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 = te(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 = w(t);
+ let n = ne(t);
e._mediaProgressTextEl.textContent = n, e._mediaProgressEl.title = n || "", e._mediaProgressEl.classList.toggle("is-error", o), e._mediaProgressEl.classList.toggle("is-visible", !!n);
}
}
-function ne(e, t) {
- let n = String(t || "").trim();
- if (!n) return !1;
+function ie(e, n) {
+ let i = String(n || "").trim();
+ if (!i) return !1;
try {
- let e = r(), t = e?.canvas || null, i = f(d(e), n);
- return !i || typeof t?.centerOnNode != "function" ? !1 : (t.centerOnNode(i), !0);
+ return r(i, t());
} catch (e) {
return console.debug?.(e), !1;
}
}
-function re(e) {
+function ae(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");
@@ -270,22 +264,22 @@ function re(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 && ne(e, e._progressCurrentNodeId) && (t.preventDefault(), t.stopPropagation());
- }), e._progressEl = t, e._progressNodesEl = n, e._progressStepsEl = r, e._progressTextEl = a, e._progressUpdateHandler && S.removeEventListener(h, e._progressUpdateHandler), e._progressUpdateHandler = (t) => {
- T(e, t?.detail || S.getSnapshot());
- }, S.addEventListener(h, e._progressUpdateHandler), C({ timeoutMs: 4e3 }).catch((e) => {
+ t.button === 0 && ie(e, e._progressCurrentNodeId) && (t.preventDefault(), t.stopPropagation());
+ }), e._progressEl = t, e._progressNodesEl = n, e._progressStepsEl = r, e._progressTextEl = a, e._progressUpdateHandler && w.removeEventListener(v, e._progressUpdateHandler), e._progressUpdateHandler = (t) => {
+ re(e, t?.detail || w.getSnapshot());
+ }, w.addEventListener(v, e._progressUpdateHandler), T({ timeoutMs: 4e3 }).catch((e) => {
console.debug?.(e);
- }), T(e, S.getSnapshot()), t;
+ }), re(e, w.getSnapshot()), t;
}
-function ie(e) {
+function oe(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, T(e, S.getSnapshot()), t;
+ return n.className = "mjr-mfv-media-progress-text", t.appendChild(n), e._mediaProgressEl = t, e._mediaProgressTextEl = n, re(e, w.getSnapshot()), t;
}
-function ae(e) {
+function se(e) {
if (e?._progressUpdateHandler) try {
- S.removeEventListener(h, e._progressUpdateHandler);
+ w.removeEventListener(v, e._progressUpdateHandler);
} catch (e) {
console.debug?.(e);
}
@@ -293,10 +287,10 @@ function ae(e) {
}
//#endregion
//#region ui/components/VideoControls.ts
-var oe = 400, se = 1e3, ce = 220;
-function le(e, t, n) {
+var ce = 400, le = 1e3, ue = 220;
+function de(e, t, n) {
try {
- if (e?.aborted) return c;
+ if (e?.aborted) return h;
let r = setTimeout(() => {
try {
if (e?.aborted) return;
@@ -329,20 +323,20 @@ function le(e, t, n) {
}
};
} catch {
- return c;
+ return h;
}
}
function E(e) {
let t = Math.floor(Number(e) || 0);
return t < 10 ? `0${t}` : String(t);
}
-function ue(e) {
+function fe(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}:${E(i)}:${E(a)}` : `${i}:${E(a)}`;
}
-function de(e, t, n) {
+function pe(e, t, n) {
let r = document.createElement("button");
r.type = "button", r.className = `mjr-video-btn ${e || ""}`.trim(), n && (r.title = n);
try {
@@ -352,7 +346,7 @@ function de(e, t, n) {
}
return r.textContent = t, r;
}
-function fe(e, t, n, r) {
+function me(e, t, n, r) {
let i = document.createElement("button");
i.type = "button", i.className = `mjr-video-btn ${e || ""}`.trim(), n && (i.title = n);
try {
@@ -366,18 +360,18 @@ function fe(e, t, n, r) {
icon: a
};
}
-function pe(e, { min: t, max: n, step: r, value: i, title: a, ariaLabel: o, widthPx: s } = {}) {
+function he(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 me(e) {
+function ge(e) {
try {
return e?.variant === "preview" ? "preview" : e?.variant === "viewerbar" ? "viewerbar" : "viewer";
} catch {
return "viewer";
}
}
-function he(e) {
+function _e(e) {
try {
let t = Number(e?.initialFps);
return Number.isFinite(t) && t > 0 ? t : null;
@@ -385,24 +379,24 @@ function he(e) {
return null;
}
}
-function ge(t, n) {
- let r = [];
+function ve(e, t) {
+ let n = [];
try {
- t.controls = !1, t.loop = !0, t.muted = !0, t.playsInline = !0, t.autoplay = !0;
+ e.controls = !1, e.loop = !0, e.muted = !0, e.playsInline = !0, e.autoplay = !0;
} catch (e) {
console.debug?.(e);
}
- let i = document.createElement("div");
- i.className = "mjr-video-controls mjr-video-controls--preview";
+ let r = document.createElement("div");
+ r.className = "mjr-video-controls mjr-video-controls--preview";
try {
- i.setAttribute("role", "group"), i.setAttribute("aria-label", e("video.previewControls", "Video preview controls"));
+ r.setAttribute("role", "group"), r.setAttribute("aria-label", a("video.previewControls", "Video preview controls"));
} catch (e) {
console.debug?.(e);
}
- let a = document.createElement("button");
- a.type = "button", a.className = "mjr-video-preview-btn", a.title = e("video.playPause", "Play/Pause");
+ let i = document.createElement("button");
+ i.type = "button", i.className = "mjr-video-preview-btn", i.title = a("video.playPause", "Play/Pause");
try {
- a.setAttribute("aria-label", e("video.playPause", "Play/Pause"));
+ i.setAttribute("aria-label", a("video.playPause", "Play/Pause"));
} catch (e) {
console.debug?.(e);
}
@@ -413,154 +407,154 @@ function ge(t, n) {
} catch (e) {
console.debug?.(e);
}
- a.appendChild(o), i.appendChild(a);
- let c = () => {
+ i.appendChild(o), r.appendChild(i);
+ let s = () => {
try {
- o.className = `pi ${t?.paused ? "pi-play" : "pi-pause"}`;
+ o.className = `pi ${e?.paused ? "pi-play" : "pi-pause"}`;
} catch (e) {
console.debug?.(e);
}
- }, l = () => {
+ }, c = () => {
try {
- let e = t.play?.();
- e && typeof e.catch == "function" && e.catch(() => {});
+ let t = e.play?.();
+ t && typeof t.catch == "function" && t.catch(() => {});
} catch (e) {
console.debug?.(e);
}
- }, d = (e) => {
+ }, l = (t) => {
try {
- e?.stopPropagation?.();
+ t?.stopPropagation?.();
} catch (e) {
console.debug?.(e);
}
try {
- t.paused ? l() : t.pause?.();
+ e.paused ? c() : e.pause?.();
} catch (e) {
console.debug?.(e);
}
- c();
+ s();
};
try {
- n.appendChild(i);
+ t.appendChild(r);
} catch (e) {
console.debug?.(e);
}
- try {
- l();
- } catch (e) {
- console.debug?.(e);
- }
- r.push(u(t, "loadedmetadata", () => l(), { passive: !0 })), r.push(u(t, "canplay", () => l(), { passive: !0 })), r.push(u(a, "click", d)), r.push(u(t, "play", c, { passive: !0 })), r.push(u(t, "pause", c, { passive: !0 })), r.push(u(t, "ended", () => l(), { passive: !0 }));
try {
c();
} catch (e) {
console.debug?.(e);
}
+ n.push(f(e, "loadedmetadata", () => c(), { passive: !0 })), n.push(f(e, "canplay", () => c(), { passive: !0 })), n.push(f(i, "click", l)), n.push(f(e, "play", s, { passive: !0 })), n.push(f(e, "pause", s, { passive: !0 })), n.push(f(e, "ended", () => c(), { passive: !0 }));
+ try {
+ s();
+ } catch (e) {
+ console.debug?.(e);
+ }
return {
- controlsEl: i,
+ controlsEl: r,
destroy: () => {
try {
- for (let e of r) s(() => e?.());
+ for (let e of n) d(() => e?.());
} catch (e) {
console.debug?.(e);
}
try {
- i.remove?.();
+ r.remove?.();
} catch (e) {
console.debug?.(e);
}
}
};
}
-function _e(t, n = {}) {
+function D(e, t = {}) {
try {
- let r = me(n), i = String(n?.mediaKind || "video").toLowerCase() === "audio", a = r === "viewerbar", o = r !== "preview" && !i, d = he(n), f = n?.hostEl || t?.parentElement;
- if (!t || !f) return {
+ let n = ge(t), r = String(t?.mediaKind || "video").toLowerCase() === "audio", i = n === "viewerbar", o = n !== "preview" && !r, s = _e(t), c = t?.hostEl || e?.parentElement;
+ if (!e || !c) return {
controlsEl: null,
- destroy: c
+ destroy: h
};
- if (r === "preview") return ge(t, f);
+ if (n === "preview") return ve(e, c);
try {
- t.loop = !1;
+ e.loop = !1;
} catch (e) {
console.debug?.(e);
}
- s(() => f.classList?.add("mjr-video-host")), s(() => t.classList?.add("mjr-video-el")), s(() => {
- window.getComputedStyle?.(f)?.position === "static" && (f.style.position = "relative");
+ d(() => c.classList?.add("mjr-video-host")), d(() => e.classList?.add("mjr-video-el")), d(() => {
+ window.getComputedStyle?.(c)?.position === "static" && (c.style.position = "relative");
});
- let h = document.createElement("div");
- h.className = `mjr-video-controls mjr-video-controls--${r}`, a && h.classList.add("mjr-video-controls--modern"), h.dataset.mjrLayout = "regular", h.setAttribute("role", "group"), h.setAttribute("aria-label", i ? e("video.audioControls", "Audio controls") : e("video.controls", "Video controls"));
- let g = document.createElement("div");
- g.className = "mjr-video-row mjr-video-row--top";
- let _ = document.createElement("div");
- _.className = "mjr-video-row mjr-video-row--bottom", h.appendChild(g), h.appendChild(_);
+ let l = document.createElement("div");
+ l.className = `mjr-video-controls mjr-video-controls--${n}`, i && l.classList.add("mjr-video-controls--modern"), l.dataset.mjrLayout = "regular", l.setAttribute("role", "group"), l.setAttribute("aria-label", r ? a("video.audioControls", "Audio controls") : a("video.controls", "Video controls"));
+ let u = document.createElement("div");
+ u.className = "mjr-video-row mjr-video-row--top";
+ let p = document.createElement("div");
+ p.className = "mjr-video-row mjr-video-row--bottom", l.appendChild(u), l.appendChild(p);
let v = document.createElement("div");
v.className = "mjr-video-seek-wrap";
let y = document.createElement("input");
- y.className = "mjr-video-range mjr-video-range--seek", y.type = "range", y.min = "0", y.max = String(se), y.step = "1", y.value = "0", y.setAttribute("aria-label", e("video.seek", "Seek")), y.title = i ? e("video.seekThroughAudio", "Seek through audio") : e("video.seekThrough", "Seek through video");
- let ee = document.createElement("div");
- ee.className = "mjr-video-seek-overlay";
- let b = null, x = null, S = null, C = null;
- o && (b = document.createElement("div"), b.className = "mjr-video-seek-zones", x = document.createElement("div"), x.className = "mjr-video-seek-zone mjr-video-seek-zone--leftTrim", S = document.createElement("div"), S.className = "mjr-video-seek-zone mjr-video-seek-zone--selected", C = document.createElement("div"), C.className = "mjr-video-seek-zone mjr-video-seek-zone--rightTrim", b.appendChild(x), b.appendChild(S), b.appendChild(C));
- let te = document.createElement("div");
- te.className = "mjr-video-seek-ticks";
+ y.className = "mjr-video-range mjr-video-range--seek", y.type = "range", y.min = "0", y.max = String(le), y.step = "1", y.value = "0", y.setAttribute("aria-label", a("video.seek", "Seek")), y.title = r ? a("video.seekThroughAudio", "Seek through audio") : a("video.seekThrough", "Seek through video");
+ let b = document.createElement("div");
+ b.className = "mjr-video-seek-overlay";
+ let x = null, ee = null, S = null, C = null;
+ o && (x = document.createElement("div"), x.className = "mjr-video-seek-zones", ee = document.createElement("div"), ee.className = "mjr-video-seek-zone mjr-video-seek-zone--leftTrim", S = document.createElement("div"), S.className = "mjr-video-seek-zone mjr-video-seek-zone--selected", C = document.createElement("div"), C.className = "mjr-video-seek-zone mjr-video-seek-zone--rightTrim", x.appendChild(ee), x.appendChild(S), x.appendChild(C));
let w = document.createElement("div");
- w.className = "mjr-video-seek-labels";
+ w.className = "mjr-video-seek-ticks";
let T = document.createElement("div");
- T.className = "mjr-video-seek-mark mjr-video-seek-mark--in";
+ T.className = "mjr-video-seek-labels";
+ let te = document.createElement("div");
+ te.className = "mjr-video-seek-mark mjr-video-seek-mark--in";
let ne = document.createElement("div");
ne.className = "mjr-video-seek-mark mjr-video-seek-mark--out";
let re = document.createElement("div");
re.className = "mjr-video-seek-playhead";
let ie = document.createElement("div");
- ie.className = "mjr-video-seek-playhead-label", ee.appendChild(te), ee.appendChild(w), ee.appendChild(re), ee.appendChild(ie);
+ ie.className = "mjr-video-seek-playhead-label", b.appendChild(w), b.appendChild(T), b.appendChild(re), b.appendChild(ie);
let ae = document.createElement("div");
- ae.className = "mjr-video-seek-handle mjr-video-seek-handle--in", ae.title = e("video.dragSetIn", "Drag to set In"), ae.setAttribute("aria-label", e("video.dragSetIn", "Drag to set In"));
- let E = document.createElement("div");
- E.className = "mjr-video-seek-handle mjr-video-seek-handle--out", E.title = e("video.dragSetOut", "Drag to set Out"), E.setAttribute("aria-label", e("video.dragSetOut", "Drag to set Out")), v.appendChild(y), b && v.appendChild(b), v.appendChild(ee), v.appendChild(T), v.appendChild(ne), v.appendChild(ae), v.appendChild(E);
- let _e = document.createElement("span");
- _e.className = "mjr-video-time", _e.textContent = "0:00 / 0:00", _e.title = e("video.currentTimeTotal", "Current time / Total duration");
- let D = document.createElement("span");
- D.className = "mjr-video-range-count", D.textContent = "";
+ ae.className = "mjr-video-seek-handle mjr-video-seek-handle--in", ae.title = a("video.dragSetIn", "Drag to set In"), ae.setAttribute("aria-label", a("video.dragSetIn", "Drag to set In"));
+ let oe = document.createElement("div");
+ oe.className = "mjr-video-seek-handle mjr-video-seek-handle--out", oe.title = a("video.dragSetOut", "Drag to set Out"), oe.setAttribute("aria-label", a("video.dragSetOut", "Drag to set Out")), v.appendChild(y), x && v.appendChild(x), v.appendChild(b), v.appendChild(te), v.appendChild(ne), v.appendChild(ae), v.appendChild(oe);
+ let se = document.createElement("span");
+ se.className = "mjr-video-time", se.textContent = "0:00 / 0:00", se.title = a("video.currentTimeTotal", "Current time / Total duration");
+ let E = document.createElement("span");
+ E.className = "mjr-video-range-count", E.textContent = "";
try {
- D.style.display = "none";
+ E.style.display = "none";
} catch (e) {
console.debug?.(e);
}
- let ve = document.createElement("div");
- ve.className = "mjr-video-timegroup", ve.appendChild(_e), o && ve.appendChild(D);
+ let D = document.createElement("div");
+ D.className = "mjr-video-timegroup", D.appendChild(se), o && D.appendChild(E);
let O = document.createElement("span");
- O.className = "mjr-video-frame", O.textContent = "F: 0", O.title = e("video.currentFrame", "Current frame number");
- let ye = de("mjr-video-btn--play", e("btn.play", "Play"), e("video.playPauseSpace", "Play/Pause (Space)")), be = de("mjr-video-btn--step", "<", e("video.stepBack", "Step back")), xe = de("mjr-video-btn--step", ">", e("video.stepForward", "Step forward")), Se = de("mjr-video-btn--jump mjr-video-btn--in", "|<", e("video.goToIn", "Go to In")), Ce = de("mjr-video-btn--jump mjr-video-btn--out", ">|", e("video.goToOut", "Go to Out")), we = de("mjr-video-btn--mark mjr-video-btn--in", "I", e("video.setInFromCurrent", "Set In from current frame")), Te = de("mjr-video-btn--mark mjr-video-btn--out", "O", e("video.setOutFromCurrent", "Set Out from current frame")), Ee = fe("mjr-video-btn--toggle", "pi-refresh", e("video.loopPlaybackInRange", "Loop playback in range"), e("video.loop", "Loop")), De = Ee.btn, k = pe("mjr-video-num--in", {
+ O.className = "mjr-video-frame", O.textContent = "F: 0", O.title = a("video.currentFrame", "Current frame number");
+ let ye = pe("mjr-video-btn--play", a("btn.play", "Play"), a("video.playPauseSpace", "Play/Pause (Space)")), be = pe("mjr-video-btn--step", "<", a("video.stepBack", "Step back")), xe = pe("mjr-video-btn--step", ">", a("video.stepForward", "Step forward")), Se = pe("mjr-video-btn--jump mjr-video-btn--in", "|<", a("video.goToIn", "Go to In")), Ce = pe("mjr-video-btn--jump mjr-video-btn--out", ">|", a("video.goToOut", "Go to Out")), we = pe("mjr-video-btn--mark mjr-video-btn--in", "I", a("video.setInFromCurrent", "Set In from current frame")), Te = pe("mjr-video-btn--mark mjr-video-btn--out", "O", a("video.setOutFromCurrent", "Set Out from current frame")), Ee = me("mjr-video-btn--toggle", "pi-refresh", a("video.loopPlaybackInRange", "Loop playback in range"), a("video.loop", "Loop")), De = Ee.btn, Oe = he("mjr-video-num--in", {
min: 0,
step: 1,
value: 0,
- title: e("video.inFrame", "In frame"),
- ariaLabel: e("video.inFrame", "In frame"),
+ title: a("video.inFrame", "In frame"),
+ ariaLabel: a("video.inFrame", "In frame"),
widthPx: 72
- }), Oe = pe("mjr-video-num--out", {
+ }), ke = he("mjr-video-num--out", {
min: 0,
step: 1,
value: 0,
- title: e("video.outFrame", "Out frame"),
- ariaLabel: e("video.outFrame", "Out frame"),
+ title: a("video.outFrame", "Out frame"),
+ ariaLabel: a("video.outFrame", "Out frame"),
widthPx: 72
- }), A = pe("mjr-video-num--step", {
+ }), k = he("mjr-video-num--step", {
min: 1,
step: 1,
value: 1,
- title: e("video.frameIncrement", "Frame increment"),
- ariaLabel: e("video.frameIncrement", "Frame increment"),
+ title: a("video.frameIncrement", "Frame increment"),
+ ariaLabel: a("video.frameIncrement", "Frame increment"),
widthPx: 56
- }), j = pe("mjr-video-num--fps", {
+ }), A = he("mjr-video-num--fps", {
min: 1,
step: .001,
- value: l(d || 30),
- title: e("video.fpsStepping", "FPS (used for frame stepping)"),
- ariaLabel: e("video.fps", "FPS"),
+ value: m(s || 30),
+ title: a("video.fpsStepping", "FPS (used for frame stepping)"),
+ ariaLabel: a("video.fps", "FPS"),
widthPx: 56
- }), M = document.createElement("select");
- M.className = "mjr-video-num mjr-video-num--speed", M.title = e("video.playbackSpeed", "Playback speed"), M.setAttribute("aria-label", e("video.playbackSpeed", "Playback speed")), M.style.width = "74px";
+ }), j = document.createElement("select");
+ j.className = "mjr-video-num mjr-video-num--speed", j.title = a("video.playbackSpeed", "Playback speed"), j.setAttribute("aria-label", a("video.playbackSpeed", "Playback speed")), j.style.width = "74px";
for (let e of [
.25,
.5,
@@ -571,40 +565,40 @@ function _e(t, n = {}) {
2
]) {
let t = document.createElement("option");
- t.value = String(e), t.textContent = `${e}x`, M.appendChild(t);
+ t.value = String(e), t.textContent = `${e}x`, j.appendChild(t);
}
- let ke = fe("mjr-video-btn--mute", "pi-volume-up", e("video.mute", "Mute"), e("video.mute", "Mute")), N = ke.btn, P = document.createElement("div");
- P.className = "mjr-video-volume-wrap", P.style.cssText = "display:none; align-items:center; position:relative;";
- let F = null;
- F = document.createElement("input"), F.className = "mjr-video-range mjr-video-range--volume", F.type = "range", F.min = "0", F.max = "1", F.step = "0.02", F.value = String(p(Number(t.volume) || 0)), F.setAttribute("aria-label", e("video.volume", "Volume")), F.title = e("video.volume", "Volume");
+ let Ae = me("mjr-video-btn--mute", "pi-volume-up", a("video.mute", "Mute"), a("video.mute", "Mute")), M = Ae.btn, N = document.createElement("div");
+ N.className = "mjr-video-volume-wrap", N.style.cssText = "display:none; align-items:center; position:relative;";
+ let P = null;
+ P = document.createElement("input"), P.className = "mjr-video-range mjr-video-range--volume", P.type = "range", P.min = "0", P.max = "1", P.step = "0.02", P.value = String(g(Number(e.volume) || 0)), P.setAttribute("aria-label", a("video.volume", "Volume")), P.title = a("video.volume", "Volume");
try {
- F.style.width = "120px";
+ P.style.width = "120px";
} catch (e) {
console.debug?.(e);
}
- P.appendChild(F);
+ N.appendChild(P);
+ let F = document.createElement("div");
+ F.className = "mjr-video-group mjr-video-group--in";
+ let je = document.createElement("span");
+ je.textContent = "In", je.title = a("video.resetInToStart", "Reset In to start"), je.style.cssText = "cursor:pointer; user-select:none;", o && (F.appendChild(je), F.appendChild(Oe));
let I = document.createElement("div");
- I.className = "mjr-video-group mjr-video-group--in";
- let Ae = document.createElement("span");
- Ae.textContent = "In", Ae.title = e("video.resetInToStart", "Reset In to start"), Ae.style.cssText = "cursor:pointer; user-select:none;", o && (I.appendChild(Ae), I.appendChild(k));
- let je = document.createElement("div");
- je.className = "mjr-video-group mjr-video-group--out";
+ I.className = "mjr-video-group mjr-video-group--out";
let Me = document.createElement("span");
- Me.textContent = "Out", Me.title = e("video.resetOutToEnd", "Reset Out to end"), Me.style.cssText = "cursor:pointer; user-select:none;", o && (je.appendChild(Me), je.appendChild(Oe));
+ Me.textContent = "Out", Me.title = a("video.resetOutToEnd", "Reset Out to end"), Me.style.cssText = "cursor:pointer; user-select:none;", o && (I.appendChild(Me), I.appendChild(ke));
let L = document.createElement("div");
- L.className = "mjr-video-group mjr-video-group--adjust-left", o && (L.appendChild(we), L.appendChild(document.createTextNode(e("video.step", "Step"))), L.appendChild(A), L.appendChild(document.createTextNode(e("video.fps", "FPS"))), L.appendChild(j), L.appendChild(O));
+ L.className = "mjr-video-group mjr-video-group--adjust-left", o && (L.appendChild(we), L.appendChild(document.createTextNode(a("video.step", "Step"))), L.appendChild(k), L.appendChild(document.createTextNode(a("video.fps", "FPS"))), L.appendChild(A), L.appendChild(O));
let Ne = document.createElement("div");
- Ne.className = "mjr-video-group mjr-video-group--adjust-right", o && (Ne.appendChild(ve), Ne.appendChild(De));
+ Ne.className = "mjr-video-group mjr-video-group--adjust-right", o && (Ne.appendChild(D), Ne.appendChild(De));
let Pe = document.createElement("div");
- Pe.className = "mjr-video-group mjr-video-group--speed", Pe.appendChild(document.createTextNode(e("video.speed", "Speed"))), Pe.appendChild(M);
+ Pe.className = "mjr-video-group mjr-video-group--speed", Pe.appendChild(document.createTextNode(a("video.speed", "Speed"))), Pe.appendChild(j);
let Fe = document.createElement("div");
Fe.className = "mjr-video-bottom mjr-video-bottom--left";
let R = document.createElement("div");
R.className = "mjr-video-transport";
let z = document.createElement("div");
- if (z.className = "mjr-video-bottom mjr-video-bottom--right", i || (R.appendChild(Se), R.appendChild(be)), R.appendChild(ye), i || (R.appendChild(xe), R.appendChild(Ce)), o && Fe.appendChild(L), o && z.appendChild(Ne), z.appendChild(Pe), z.appendChild(N), o && z.appendChild(Te), F && z.appendChild(P), a) {
+ if (z.className = "mjr-video-bottom mjr-video-bottom--right", r || (R.appendChild(Se), R.appendChild(be)), R.appendChild(ye), r || (R.appendChild(xe), R.appendChild(Ce)), o && Fe.appendChild(L), o && z.appendChild(Ne), z.appendChild(Pe), z.appendChild(M), o && z.appendChild(Te), P && z.appendChild(N), i) {
let e = document.createElement("div");
- e.className = "mjr-video-bar-timeline", o && e.appendChild(I), e.appendChild(v), o && e.appendChild(je);
+ e.className = "mjr-video-bar-timeline", o && e.appendChild(F), e.appendChild(v), o && e.appendChild(I);
let t = document.createElement("div");
t.className = "mjr-video-bar-actions";
let n = document.createElement("div");
@@ -612,8 +606,8 @@ function _e(t, n = {}) {
let r = document.createElement("div");
r.className = "mjr-video-bar-center", r.appendChild(R);
let i = document.createElement("div");
- i.className = "mjr-video-bar-side mjr-video-bar-side--right", o && i.appendChild(Ne), i.appendChild(Pe), i.appendChild(N), o && i.appendChild(Te), F && i.appendChild(P), t.appendChild(n), t.appendChild(r), t.appendChild(i), h.replaceChildren(e, t);
- } else o && g.appendChild(O), o && g.appendChild(I), g.appendChild(v), o && g.appendChild(je), g.appendChild(ve), _.appendChild(Fe), _.appendChild(R), _.appendChild(z);
+ i.className = "mjr-video-bar-side mjr-video-bar-side--right", o && i.appendChild(Ne), i.appendChild(Pe), i.appendChild(M), o && i.appendChild(Te), P && i.appendChild(N), t.appendChild(n), t.appendChild(r), t.appendChild(i), l.replaceChildren(e, t);
+ } else o && u.appendChild(O), o && u.appendChild(F), u.appendChild(v), o && u.appendChild(I), u.appendChild(D), p.appendChild(Fe), p.appendChild(R), p.appendChild(z);
let B = (e) => {
try {
e.stopPropagation?.();
@@ -634,10 +628,10 @@ function _e(t, n = {}) {
return {
signal: {
aborted: !1,
- addEventListener: c,
- removeEventListener: c
+ addEventListener: h,
+ removeEventListener: h
},
- abort: c
+ abort: h
};
}
})();
@@ -650,21 +644,21 @@ function _e(t, n = {}) {
});
let Le = () => {
try {
- let e = Number(f?.clientWidth) || Number(h?.clientWidth) || 0, t = "regular";
- e > 0 && e < 560 ? t = "stacked" : e > 0 && e < 860 && (t = "compact"), h.dataset.mjrLayout = t;
+ 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);
}
};
Le();
try {
- if (typeof ResizeObserver == "function" && f) {
+ 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, Le();
});
} : () => Le());
- r.observe(f), H.push(() => {
+ r.observe(c), H.push(() => {
try {
n && t && t(n), r.disconnect();
} catch (e) {
@@ -675,18 +669,18 @@ function _e(t, n = {}) {
} catch (e) {
console.debug?.(e);
}
- H.push(u(h, "pointerdown", B)), H.push(u(h, "dblclick", V, { capture: !0 })), H.push(u(h, "wheel", V, {
+ H.push(f(l, "pointerdown", B)), H.push(f(l, "dblclick", V, { capture: !0 })), H.push(f(l, "wheel", V, {
capture: !0,
passive: !1
- })), H.push(u(window, "dblclick", (e) => {
+ })), H.push(f(window, "dblclick", (e) => {
try {
- h.contains?.(e?.target) && V(e);
+ l.contains?.(e?.target) && V(e);
} catch (e) {
console.debug?.(e);
}
- }, { capture: !0 })), H.push(u(window, "wheel", (e) => {
+ }, { capture: !0 })), H.push(f(window, "wheel", (e) => {
try {
- h.contains?.(e?.target) && V(e);
+ l.contains?.(e?.target) && V(e);
} catch (e) {
console.debug?.(e);
}
@@ -700,7 +694,7 @@ function _e(t, n = {}) {
loop: o,
pingpong: !1,
once: !1,
- playbackRate: Math.max(.25, Math.min(2, Number(n?.initialPlaybackRate) || 1)),
+ playbackRate: Math.max(.25, Math.min(2, Number(t?.initialPlaybackRate) || 1)),
_seeking: !1,
_ppReverse: !1,
_ppRafId: null,
@@ -709,7 +703,7 @@ function _e(t, n = {}) {
if (!U._userInteracted) {
U._userInteracted = !0;
try {
- t.muted && (t.muted = !1, Qe?.());
+ e.muted && (e.muted = !1, Qe?.());
} catch (e) {
console.debug?.(e);
}
@@ -722,7 +716,7 @@ function _e(t, n = {}) {
} catch (e) {
console.debug?.(e);
}
- ze = le(Ie.signal, ce, () => {
+ ze = de(Ie.signal, ue, () => {
try {
O.classList.remove("is-step");
} catch (e) {
@@ -753,19 +747,19 @@ function _e(t, n = {}) {
} catch (e) {
console.debug?.(e);
}
- }, He = (e) => {
+ }, He = (t) => {
try {
- let n = Number(e);
+ let n = Number(t);
if (!Number.isFinite(n) || n <= 0) return U.playbackRate;
let r = Math.max(.25, Math.min(2, Math.round(n * 100) / 100));
U.playbackRate = r;
try {
- t.playbackRate = r;
+ e.playbackRate = r;
} catch (e) {
console.debug?.(e);
}
try {
- M.matches?.(":focus") || (M.value = String(r));
+ j.matches?.(":focus") || (j.value = String(r));
} catch (e) {
console.debug?.(e);
}
@@ -777,7 +771,7 @@ function _e(t, n = {}) {
try {
Ve(De, !!(U.loop || U.pingpong));
try {
- Ee?.icon && (U.pingpong ? (Ee.icon.className = "pi pi-sort-alt", De.title = e("video.pingpongPlayback", "Ping-pong playback (forward then reverse)")) : (Ee.icon.className = "pi pi-refresh", De.title = e("video.loopPlaybackInRange", "Loop playback in range")));
+ Ee?.icon && (U.pingpong ? (Ee.icon.className = "pi pi-sort-alt", De.title = a("video.pingpongPlayback", "Ping-pong playback (forward then reverse)")) : (Ee.icon.className = "pi pi-refresh", De.title = a("video.loopPlaybackInRange", "Loop playback in range")));
} catch (e) {
console.debug?.(e);
}
@@ -786,28 +780,28 @@ function _e(t, n = {}) {
}
}, We = () => {
try {
- let e = Number(U.frameCount);
- if (Number.isFinite(e) && e > 0) return Math.max(1, Math.floor(e));
- let n = Number(t?.duration), r = l(U.fps, 30);
+ let t = Number(U.frameCount);
+ if (Number.isFinite(t) && t > 0) return Math.max(1, Math.floor(t));
+ let n = Number(e?.duration), r = m(U.fps, 30);
return !Number.isFinite(n) || n <= 0 ? 0 : Math.max(0, Math.floor(n * r));
} catch {
return 0;
}
- }, W = (e = null) => {
+ }, W = (t = null) => {
try {
- let n = e ?? t?.currentTime, r = Number(n), i = l(U.fps, 30);
+ let n = t ?? e?.currentTime, r = Number(n), i = m(U.fps, 30);
return !Number.isFinite(r) || r < 0 ? 0 : Math.max(0, Math.floor(r * i + 1e-6));
} catch {
return 0;
}
}, Ge = (e) => {
- let t = l(U.fps, 30);
+ let t = m(U.fps, 30);
return Math.max(0, Number(e) || 0) / t;
}, G = () => {
try {
let e = We();
if (e <= 0) return;
- let t = U.inFrame == null ? 0 : m(U.inFrame, 0, e), n = U.outFrame == null ? e : m(U.outFrame, 0, e);
+ let t = U.inFrame == null ? 0 : _(U.inFrame, 0, e), n = U.outFrame == null ? e : _(U.outFrame, 0, e);
n < t ? (U.inFrame = n, U.outFrame = t) : (U.inFrame = t, U.outFrame = n);
} catch (e) {
console.debug?.(e);
@@ -816,8 +810,8 @@ function _e(t, n = {}) {
try {
let e = We();
return {
- inF: U.inFrame == null ? 0 : m(U.inFrame, 0, e),
- outF: U.outFrame == null ? e : m(U.outFrame, 0, e),
+ inF: U.inFrame == null ? 0 : _(U.inFrame, 0, e),
+ outF: U.outFrame == null ? e : _(U.outFrame, 0, e),
maxF: e
};
} catch {
@@ -829,28 +823,28 @@ function _e(t, n = {}) {
}
}, q = () => {
try {
- ye.textContent = !t?.paused || U._ppReverse ? e("video.pause", "Pause") : e("video.play", "Play");
+ ye.textContent = !e?.paused || U._ppReverse ? a("video.pause", "Pause") : a("video.play", "Play");
} catch (e) {
console.debug?.(e);
}
}, Ke = () => {
try {
- let n = !!t?.muted || (Number(t?.volume) || 0) <= .001;
+ let t = !!e?.muted || (Number(e?.volume) || 0) <= .001;
try {
- ke.icon.className = `pi ${n ? "pi-volume-off" : "pi-volume-up"}`;
+ Ae.icon.className = `pi ${t ? "pi-volume-off" : "pi-volume-up"}`;
} catch (e) {
console.debug?.(e);
}
- let r = n ? e("video.unmute", "Unmute") : e("video.mute", "Mute");
- N.title = r, N.setAttribute("aria-label", r);
+ let n = t ? a("video.unmute", "Unmute") : a("video.mute", "Mute");
+ M.title = n, M.setAttribute("aria-label", n);
} catch (e) {
console.debug?.(e);
}
- }, J = (e = null) => {
+ }, J = (t = null) => {
try {
- let n = Number(t?.duration), r = e ?? t?.currentTime, i = Number(r), a = Number.isFinite(n) && n > 0;
- if (_e.textContent = `${ue(i)} / ${a ? ue(n) : "0:00"}`, y.disabled = !a, a) {
- let e = p((i || 0) / n), t = Math.round(e * 1e3);
+ let n = Number(e?.duration), r = t ?? e?.currentTime, i = Number(r), a = Number.isFinite(n) && n > 0;
+ if (se.textContent = `${fe(i)} / ${a ? fe(n) : "0:00"}`, y.disabled = !a, a) {
+ let e = g((i || 0) / n), t = Math.round(e * 1e3);
!Number.isNaN(t) && !U._seeking && !y.matches?.(":active") && (y.value = String(t));
try {
re.style.left = `${e * 100}%`;
@@ -870,16 +864,16 @@ function _e(t, n = {}) {
O.textContent = `F: ${t} / ${e}`;
try {
if (Number.isFinite(n) && n > 0) {
- let e = p((i || 0) / n);
+ let e = g((i || 0) / n);
ie.style.left = `${e * 100}%`, ie.textContent = String(t), ie.style.display = "";
} else ie.style.display = "none";
} catch (e) {
console.debug?.(e);
}
- k.matches?.(":focus") || (k.value = String(U.inFrame ?? 0)), Oe.matches?.(":focus") || (Oe.value = String(U.outFrame ?? e));
+ Oe.matches?.(":focus") || (Oe.value = String(U.inFrame ?? 0)), ke.matches?.(":focus") || (ke.value = String(U.outFrame ?? e));
try {
let { inF: e, outF: t, maxF: n } = K(), r = e <= 0 && t >= n, i = Math.max(0, Math.floor(t) - Math.floor(e) + 1);
- !r && n > 0 ? (D.textContent = `R: ${i}f`, D.style.display = "") : D.style.display = "none";
+ !r && n > 0 ? (E.textContent = `R: ${i}f`, E.style.display = "") : E.style.display = "none";
} catch (e) {
console.debug?.(e);
}
@@ -891,18 +885,18 @@ function _e(t, n = {}) {
if (o) try {
let { inF: e, outF: t, maxF: n } = K();
if (!Number.isFinite(n) || n <= 0) return;
- let r = p(e / n) * 100, i = p(t / n) * 100, a = e <= 0 && t >= n;
+ let r = g(e / n) * 100, i = g(t / n) * 100, a = e <= 0 && t >= n;
try {
y.style.background = "";
} catch (e) {
console.debug?.(e);
}
try {
- let e = p(r / 100) * 100, t = p(i / 100) * 100, n = Math.min(e, t), o = Math.max(e, t);
- if (b && x && S && C) {
- x.style.left = "0%", x.style.width = `${n}%`, S.style.left = `${n}%`, S.style.width = `${Math.max(0, o - n)}%`, C.style.left = `${o}%`, C.style.width = `${Math.max(0, 100 - o)}%`;
+ let e = g(r / 100) * 100, t = g(i / 100) * 100, n = Math.min(e, t), o = Math.max(e, t);
+ if (x && ee && S && C) {
+ ee.style.left = "0%", ee.style.width = `${n}%`, S.style.left = `${n}%`, S.style.width = `${Math.max(0, o - n)}%`, C.style.left = `${o}%`, C.style.width = `${Math.max(0, 100 - o)}%`;
try {
- b.classList.toggle("is-trimmed", !a), b.classList.toggle("is-fullrange", a);
+ x.classList.toggle("is-trimmed", !a), x.classList.toggle("is-fullrange", a);
} catch (e) {
console.debug?.(e);
}
@@ -911,31 +905,31 @@ function _e(t, n = {}) {
console.debug?.(e);
}
try {
- T.style.left = `${r}%`, ne.style.left = `${i}%`;
+ te.style.left = `${r}%`, ne.style.left = `${i}%`;
} catch (e) {
console.debug?.(e);
}
try {
- ae.style.left = `${r}%`, E.style.left = `${i}%`;
+ ae.style.left = `${r}%`, oe.style.left = `${i}%`;
} catch (e) {
console.debug?.(e);
}
try {
- let e = Math.max(1, Math.floor(n / oe)), t = Math.max(e, Math.floor(Number(U.step) || 1)), r = t / n * 100, i = r * 10;
+ let e = Math.max(1, Math.floor(n / ce)), t = Math.max(e, Math.floor(Number(U.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}%)`;
- te.style.backgroundImage = `${t}, ${e}`;
- } else te.style.backgroundImage = "";
+ w.style.backgroundImage = `${t}, ${e}`;
+ } else w.style.backgroundImage = "";
(() => {
try {
let e = `${n}|${t}`;
- if (w?.dataset?.mjrLabelKey === e) return;
- w.dataset.mjrLabelKey = e;
+ if (T?.dataset?.mjrLabelKey === e) return;
+ T.dataset.mjrLabelKey = e;
} catch (e) {
console.debug?.(e);
}
try {
- w.replaceChildren();
+ T.replaceChildren();
} catch (e) {
console.debug?.(e);
}
@@ -948,21 +942,21 @@ function _e(t, n = {}) {
let r = (e) => {
let t = document.createElement("span");
t.className = "mjr-video-seek-label";
- let r = p(e / n) * 100;
+ let r = g(e / n) * 100;
return t.style.left = `${r}%`, t.textContent = String(Math.floor(e)), t;
};
try {
- w.appendChild(r(0));
+ T.appendChild(r(0));
} catch (e) {
console.debug?.(e);
}
for (let t = e; t < n; t += e) try {
- w.appendChild(r(t));
+ T.appendChild(r(t));
} catch (e) {
console.debug?.(e);
}
try {
- w.appendChild(r(n));
+ T.appendChild(r(n));
} catch (e) {
console.debug?.(e);
}
@@ -1004,21 +998,21 @@ function _e(t, n = {}) {
H.push(Ye);
let Xe = () => {
try {
- Ye(), U._ppReverse = !0, t.pause?.(), q();
- let e = 1e3 / (l(U.fps, 30) * Math.max(.25, Number(U.playbackRate) || 1)), n = performance.now(), r = (i) => {
+ Ye(), U._ppReverse = !0, e.pause?.(), q();
+ let t = 1e3 / (m(U.fps, 30) * Math.max(.25, Number(U.playbackRate) || 1)), n = performance.now(), r = (i) => {
try {
if (!U._ppReverse || !U.pingpong) {
U._ppReverse = !1, q();
return;
}
let a = i - n;
- if (a >= e) {
- n = i - a % e;
+ if (a >= t) {
+ n = i - a % t;
let { inF: r } = K(), o = W();
if (o <= r) {
U._ppReverse = !1, Z(r);
- let e = t.play?.();
- e && typeof e.catch == "function" && e.catch(() => {}), q(), J();
+ let t = e.play?.();
+ t && typeof t.catch == "function" && t.catch(() => {}), q(), J();
return;
}
Z(o - Math.max(1, Math.floor(Number(U.step) || 1))), J();
@@ -1037,12 +1031,12 @@ function _e(t, n = {}) {
let e = We();
U.inFrame = 0, U.outFrame = e > 0 ? e : null, U.step = 1, U.loop = !!o, U.pingpong = !1, U._ppReverse = !1, Ye(), U.once = !1, He(1);
try {
- A.value = "1";
+ k.value = "1";
} catch (e) {
console.debug?.(e);
}
try {
- M.matches?.(":focus") || (M.value = "1");
+ j.matches?.(":focus") || (j.value = "1");
} catch (e) {
console.debug?.(e);
}
@@ -1052,9 +1046,9 @@ function _e(t, n = {}) {
}
}, Qe = () => {
try {
- let e = p(Number(t?.volume) || 0);
+ let t = g(Number(e?.volume) || 0);
try {
- F && !F.matches?.(":active") && (F.value = String(e));
+ P && !P.matches?.(":active") && (P.value = String(t));
} catch (e) {
console.debug?.(e);
}
@@ -1062,21 +1056,21 @@ function _e(t, n = {}) {
} catch (e) {
console.debug?.(e);
}
- }, Z = (e) => {
+ }, Z = (t) => {
try {
let { maxF: n } = K();
- t.currentTime = Ge(m(e, 0, n > 0 ? n : Infinity));
+ e.currentTime = Ge(_(t, 0, n > 0 ? n : Infinity));
} catch (e) {
console.debug?.(e);
}
J();
- }, $e = (e) => {
+ }, $e = (t) => {
Re();
try {
- let n = Math.max(1, Math.floor(Number(U.step) || 1)), { inF: r, outF: i } = K(), a = W() + e * n;
- U.loop ? (a < r && (a = i), a > i && (a = r)) : a = m(a, r, i);
+ let n = Math.max(1, Math.floor(Number(U.step) || 1)), { inF: r, outF: i } = K(), a = W() + t * n;
+ U.loop ? (a < r && (a = i), a > i && (a = r)) : a = _(a, r, i);
try {
- t.pause?.();
+ e.pause?.();
} catch (e) {
console.debug?.(e);
}
@@ -1099,46 +1093,46 @@ function _e(t, n = {}) {
U._ppReverse = !1, Ye(), q();
return;
}
- if (t.paused) {
+ if (e.paused) {
et();
- let e = t.play?.();
- e && typeof e.catch == "function" && e.catch(() => {});
- } else t.pause?.();
+ let t = e.play?.();
+ t && typeof t.catch == "function" && t.catch(() => {});
+ } else e.pause?.();
} catch (e) {
console.debug?.(e);
}
q();
};
- H.push(u(t, "click", (e) => {
+ H.push(f(e, "click", (t) => {
try {
- if (e?.target !== t) return;
+ if (t?.target !== e) return;
} catch (e) {
console.debug?.(e);
}
tt();
- })), H.push(u(ye, "click", (e) => {
+ })), H.push(f(ye, "click", (e) => {
B(e), tt();
- })), H.push(u(be, "click", (e) => {
+ })), H.push(f(be, "click", (e) => {
B(e), $e(-1);
- })), H.push(u(xe, "click", (e) => {
+ })), H.push(f(xe, "click", (e) => {
B(e), $e(1);
- })), H.push(u(Se, "click", (e) => {
+ })), H.push(f(Se, "click", (e) => {
B(e);
let { inF: t } = K();
Z(t), Be();
- })), H.push(u(Ce, "click", (e) => {
+ })), H.push(f(Ce, "click", (e) => {
B(e);
let { outF: t } = K();
Z(t), Be();
}));
- let nt = (e) => {
+ let nt = (t) => {
try {
- let n = Number(t?.duration);
+ let n = Number(e?.duration);
if (!Number.isFinite(n) || n <= 0) return !1;
let r = v.getBoundingClientRect?.(), i = Number(r?.width) || 0;
if (!(i > 0)) return !1;
- let a = p(m((Number(e) || 0) - Number(r.left || 0), 0, i) / i), o = a * n;
- return t.currentTime = o, y.value = String(Math.round(a * se)), J(o), !0;
+ let a = g(_((Number(t) || 0) - Number(r.left || 0), 0, i) / i), o = a * n;
+ return e.currentTime = o, y.value = String(Math.round(a * le)), J(o), !0;
} catch (e) {
return console.debug?.(e), !1;
}
@@ -1165,7 +1159,7 @@ function _e(t, n = {}) {
}, it = (e) => {
Q.active && (V(e), nt(e.clientX));
};
- if (H.push(() => rt()), H.push(u(v, "pointerdown", (e) => {
+ if (H.push(() => rt()), H.push(f(v, "pointerdown", (e) => {
try {
if (e?.button != null && e.button !== 0 || e?.target?.closest?.(".mjr-video-seek-handle, .mjr-video-seek-mark")) return;
} catch (e) {
@@ -1200,157 +1194,157 @@ function _e(t, n = {}) {
} catch (e) {
console.debug?.(e);
}
- }, { passive: !1 })), H.push(u(y, "pointerdown", () => {
+ }, { passive: !1 })), H.push(f(y, "pointerdown", () => {
U._seeking = !0;
- })), H.push(u(y, "pointerup", () => {
+ })), H.push(f(y, "pointerup", () => {
Q.active || (U._seeking = !1);
- })), H.push(u(y, "pointercancel", () => {
+ })), H.push(f(y, "pointercancel", () => {
Q.active || (U._seeking = !1);
- })), H.push(u(y, "input", (e) => {
- B(e), Re();
+ })), H.push(f(y, "input", (t) => {
+ B(t), Re();
try {
- let e = Number(t?.duration);
- if (!Number.isFinite(e) || e <= 0) return;
+ let t = Number(e?.duration);
+ if (!Number.isFinite(t) || t <= 0) return;
let n = Number(y.value);
- t.currentTime = p((Number.isFinite(n) ? n : 0) / 1e3) * e;
+ e.currentTime = g((Number.isFinite(n) ? n : 0) / 1e3) * t;
} catch (e) {
console.debug?.(e);
}
J();
})), o) {
- H.push(u(we, "click", (e) => {
+ H.push(f(we, "click", (e) => {
B(e), U.inFrame = W(), G(), J(), Y(), X({ prefer: "in" });
- })), H.push(u(Te, "click", (e) => {
+ })), H.push(f(Te, "click", (e) => {
B(e), U.outFrame = W(), G(), J(), Y(), X({ prefer: "out" });
- })), H.push(u(k, "change", (e) => {
+ })), H.push(f(Oe, "change", (e) => {
B(e);
try {
- let e = Number(k.value);
+ let e = Number(Oe.value);
U.inFrame = Number.isFinite(e) ? Math.max(0, Math.floor(e)) : null, G();
} catch (e) {
console.debug?.(e);
}
J(), Y(), X({ prefer: "in" });
- })), H.push(u(Oe, "change", (e) => {
+ })), H.push(f(ke, "change", (e) => {
B(e);
try {
- let e = Number(Oe.value);
+ let e = Number(ke.value);
U.outFrame = Number.isFinite(e) ? Math.max(0, Math.floor(e)) : null, G();
} catch (e) {
console.debug?.(e);
}
J(), Y(), X({ prefer: "out" });
- })), H.push(u(A, "change", (e) => {
+ })), H.push(f(k, "change", (e) => {
B(e);
try {
- U.step = Math.max(1, Math.floor(Number(A.value) || 1)), A.value = String(U.step);
+ U.step = Math.max(1, Math.floor(Number(k.value) || 1)), k.value = String(U.step);
} catch (e) {
console.debug?.(e);
}
- })), H.push(u(j, "change", (e) => {
+ })), H.push(f(A, "change", (e) => {
B(e);
try {
- U.fps = l(j.value, 30), j.value = String(U.fps), G();
+ U.fps = m(A.value, 30), A.value = String(U.fps), G();
} catch (e) {
console.debug?.(e);
}
J(), Y();
- })), H.push(u(De, "click", (e) => {
+ })), H.push(f(De, "click", (e) => {
B(e), !U.loop && !U.pingpong ? (U.loop = !0, U.pingpong = !1) : U.loop && !U.pingpong ? (U.loop = !1, U.pingpong = !0) : (U.loop = !1, U.pingpong = !1), (U.loop || U.pingpong) && (U.once = !1), U.pingpong || (U._ppReverse = !1, Ye()), Ue();
- })), H.push(u(Ae, "click", (e) => {
+ })), H.push(f(je, "click", (e) => {
B(e), qe();
- })), H.push(u(Me, "click", (e) => {
+ })), H.push(f(Me, "click", (e) => {
B(e), Je();
- })), H.push(u(D, "click", (e) => {
+ })), H.push(f(E, "click", (e) => {
B(e), Ze();
}));
try {
- D.title = e("video.resetPlayerControls", "Reset player controls"), D.style.cursor = "pointer", D.style.userSelect = "none";
+ E.title = a("video.resetPlayerControls", "Reset player controls"), E.style.cursor = "pointer", E.style.userSelect = "none";
} catch (e) {
console.debug?.(e);
}
}
- H.push(u(N, "click", (e) => {
- B(e);
+ H.push(f(M, "click", (t) => {
+ B(t);
try {
- t.muted = !t.muted, P && (P.style.display = t.muted ? "none" : "inline-flex");
+ e.muted = !e.muted, N && (N.style.display = e.muted ? "none" : "inline-flex");
} catch (e) {
console.debug?.(e);
}
Qe();
- })), H.push(u(N, "contextmenu", (e) => {
+ })), H.push(f(M, "contextmenu", (e) => {
V(e);
try {
- if (!P) return;
- let e = P.style.display !== "none";
- P.style.display = e ? "none" : "inline-flex";
+ if (!N) return;
+ let e = N.style.display !== "none";
+ N.style.display = e ? "none" : "inline-flex";
} catch (e) {
console.debug?.(e);
}
Qe();
- })), H.push(u(window, "pointerdown", (e) => {
+ })), H.push(f(window, "pointerdown", (e) => {
try {
- if (!P || P.style.display === "none" || N.contains?.(e?.target) || P.contains?.(e?.target)) return;
- P.style.display = "none";
+ if (!N || N.style.display === "none" || M.contains?.(e?.target) || N.contains?.(e?.target)) return;
+ N.style.display = "none";
} catch (e) {
console.debug?.(e);
}
- }, { capture: !0 })), F && H.push(u(F, "input", (e) => {
- B(e);
+ }, { capture: !0 })), P && H.push(f(P, "input", (t) => {
+ B(t);
try {
- let e = p(Number(F.value) || 0);
- t.volume = e, e > .001 && (t.muted = !1);
+ let t = g(Number(P.value) || 0);
+ e.volume = t, t > .001 && (e.muted = !1);
} catch (e) {
console.debug?.(e);
}
Qe();
- })), H.push(u(M, "change", (e) => {
+ })), H.push(f(j, "change", (e) => {
B(e);
try {
- He(Number(M.value) || 1);
+ He(Number(j.value) || 1);
} catch (e) {
console.debug?.(e);
}
- })), H.push(u(t, "ratechange", () => {
+ })), H.push(f(e, "ratechange", () => {
try {
- He(Number(t.playbackRate) || U.playbackRate || 1);
+ He(Number(e.playbackRate) || U.playbackRate || 1);
} catch (e) {
console.debug?.(e);
}
}));
let at = () => {
if (o) try {
- if (U._seeking || t?.paused) return;
- let { inF: e, outF: n, maxF: r } = K();
- if (r <= 0 || e <= 0 && n >= r && !U.loop && !U.pingpong && !U.once || U._ppReverse) return;
+ if (U._seeking || e?.paused) return;
+ let { inF: t, outF: n, maxF: r } = K();
+ if (r <= 0 || t <= 0 && n >= r && !U.loop && !U.pingpong && !U.once || U._ppReverse) return;
let i = W();
if (i >= n - Math.max(1, Math.floor(Number(U.step) || 1))) if (U.pingpong) {
Xe();
return;
} else if (U.loop) {
- Z(e);
+ Z(t);
try {
- let e = t.play?.();
- e && typeof e.catch == "function" && e.catch(() => {});
+ let t = e.play?.();
+ t && typeof t.catch == "function" && t.catch(() => {});
} catch (e) {
console.debug?.(e);
}
} else if (U.once) {
try {
- t.pause?.();
+ e.pause?.();
} catch (e) {
console.debug?.(e);
}
Z(n);
} else {
try {
- t.pause?.();
+ e.pause?.();
} catch (e) {
console.debug?.(e);
}
Z(n);
}
- else i < e && Z(e);
+ else i < t && Z(t);
} catch (e) {
console.debug?.(e);
}
@@ -1359,7 +1353,7 @@ function _e(t, n = {}) {
rvfcId: null
}, ot = () => {
try {
- $.rvfcId != null && typeof t?.cancelVideoFrameCallback == "function" && t.cancelVideoFrameCallback($.rvfcId);
+ $.rvfcId != null && typeof e?.cancelVideoFrameCallback == "function" && e.cancelVideoFrameCallback($.rvfcId);
} catch (e) {
console.debug?.(e);
}
@@ -1370,66 +1364,66 @@ function _e(t, n = {}) {
console.debug?.(e);
}
$.rafId = null;
- }, st = (e = 0, n = null) => {
+ }, st = (t = 0, n = null) => {
$.rafId = null, $.rvfcId = null;
try {
- s(J, n?.mediaTime), s(at);
+ d(J, n?.mediaTime), d(at);
} catch (e) {
console.debug?.(e);
}
- if (!(!(U._ppReverse || !t?.paused) || Ie.signal?.aborted)) {
+ if (!(!(U._ppReverse || !e?.paused) || Ie.signal?.aborted)) {
try {
- if (typeof t?.requestVideoFrameCallback == "function" && !U._ppReverse) {
- $.rvfcId = t.requestVideoFrameCallback(st);
+ if (typeof e?.requestVideoFrameCallback == "function" && !U._ppReverse) {
+ $.rvfcId = e.requestVideoFrameCallback(st);
return;
}
} catch (e) {
console.debug?.(e);
}
try {
- typeof requestAnimationFrame == "function" && ($.rafId = requestAnimationFrame((e) => {
- st(e, { mediaTime: Number(t?.currentTime) || 0 });
+ typeof requestAnimationFrame == "function" && ($.rafId = requestAnimationFrame((t) => {
+ st(t, { mediaTime: Number(e?.currentTime) || 0 });
}));
} catch (e) {
console.debug?.(e);
}
}
}, ct = () => {
- ot(), !(!(U._ppReverse || !t?.paused) || Ie.signal?.aborted) && st(0, { mediaTime: Number(t?.currentTime) || 0 });
+ ot(), !(!(U._ppReverse || !e?.paused) || Ie.signal?.aborted) && st(0, { mediaTime: Number(e?.currentTime) || 0 });
};
- H.push(ot), H.push(u(t, "play", () => {
- s(q), ct();
+ H.push(ot), H.push(f(e, "play", () => {
+ d(q), ct();
}));
- for (let e of ["pause", "ended"]) H.push(u(t, e, () => {
- ot(), s(q), s(J);
+ for (let t of ["pause", "ended"]) H.push(f(e, t, () => {
+ ot(), d(q), d(J);
}));
- for (let e of [
+ for (let t of [
"timeupdate",
"loadedmetadata",
"durationchange",
"seeked"
- ]) H.push(u(t, e, () => s(J)));
- H.push(u(t, "timeupdate", at)), H.push(u(t, "ended", () => {
+ ]) H.push(f(e, t, () => d(J)));
+ H.push(f(e, "timeupdate", at)), H.push(f(e, "ended", () => {
if (o) try {
- let { inF: e, outF: n, maxF: r } = K(), i = e <= 0 && n >= r;
+ let { inF: t, outF: n, maxF: r } = K(), i = t <= 0 && n >= r;
if (U.pingpong && !U._ppReverse) {
Xe();
return;
}
if (!U.loop && !i) return;
- Z(e);
+ Z(t);
try {
- let e = t.play?.();
- e && typeof e.catch == "function" && e.catch(() => {});
+ let t = e.play?.();
+ t && typeof t.catch == "function" && t.catch(() => {});
} catch (e) {
console.debug?.(e);
}
} catch (e) {
console.debug?.(e);
}
- }, { passive: !0 })), o && H.push(u(t, "mjr:frameStep", () => {
- s(Be);
- })), o && (H.push(u(t, "loadedmetadata", () => {
+ }, { passive: !0 })), o && H.push(f(e, "mjr:frameStep", () => {
+ d(Be);
+ })), o && (H.push(f(e, "loadedmetadata", () => {
try {
let e = We();
e > 0 && U.inFrame == null && U.outFrame == null && (U.inFrame = 0, U.outFrame = e, G());
@@ -1437,16 +1431,16 @@ function _e(t, n = {}) {
console.debug?.(e);
}
Y();
- })), H.push(u(t, "durationchange", () => s(Y))));
- for (let e of ["volumechange"]) H.push(u(t, e, () => s(Qe)));
+ })), H.push(f(e, "durationchange", () => d(Y))));
+ for (let t of ["volumechange"]) H.push(f(e, t, () => d(Qe)));
try {
- U.fps = l(j.value, 30), U.step = Math.max(1, Math.floor(Number(A.value) || 1)), G(), Ue(), He(U.playbackRate);
+ U.fps = m(A.value, 30), U.step = Math.max(1, Math.floor(Number(k.value) || 1)), G(), Ue(), He(U.playbackRate);
} catch (e) {
console.debug?.(e);
}
- s(q), s(J), s(Y), s(Qe);
+ d(q), d(J), d(Y), d(Qe);
try {
- (!t?.paused || U._ppReverse) && ct();
+ (!e?.paused || U._ppReverse) && ct();
} catch (e) {
console.debug?.(e);
}
@@ -1460,9 +1454,9 @@ function _e(t, n = {}) {
try {
let t = Number(e?.fps);
if (Number.isFinite(t) && t > 0) {
- U.fps = l(t, U.fps || 30);
+ U.fps = m(t, U.fps || 30);
try {
- j?.matches?.(":focus") || (j.value = String(U.fps));
+ A?.matches?.(":focus") || (A.value = String(U.fps));
} catch (e) {
console.debug?.(e);
}
@@ -1485,10 +1479,10 @@ function _e(t, n = {}) {
};
try {
if (o) {
- let e = Number(n?.initialFps), t = Number(n?.initialFrameCount);
- (Number.isFinite(e) || Number.isFinite(t)) && lt({
+ let e = Number(t?.initialFps), n = Number(t?.initialFrameCount);
+ (Number.isFinite(e) || Number.isFinite(n)) && lt({
fps: e,
- frameCount: t
+ frameCount: n
});
}
} catch (e) {
@@ -1503,8 +1497,8 @@ function _e(t, n = {}) {
captureEl: null
}, t = (e) => {
try {
- let t = v.getBoundingClientRect(), n = m((Number(e) || 0) - t.left, 0, t.width || 1), r = t.width > 0 ? n / t.width : 0, { maxF: i } = K();
- return m(Math.round(r * i), 0, i);
+ let t = v.getBoundingClientRect(), n = _((Number(e) || 0) - t.left, 0, t.width || 1), r = t.width > 0 ? n / t.width : 0, { maxF: i } = K();
+ return _(Math.round(r * i), 0, i);
} catch {
return 0;
}
@@ -1583,10 +1577,10 @@ function _e(t, n = {}) {
e.ac = null;
}
};
- H.push(u(ae, "pointerdown", (e) => n(e, "in"), { passive: !1 })), H.push(u(E, "pointerdown", (e) => n(e, "out"), { passive: !1 })), H.push(u(T, "pointerdown", (e) => n(e, "in"), { passive: !1 })), H.push(u(ne, "pointerdown", (e) => n(e, "out"), { passive: !1 })), H.push(u(v, "pointermove", r, { passive: !1 })), H.push(u(v, "pointerup", i, { passive: !1 })), H.push(u(v, "pointercancel", i, { passive: !1 }));
+ H.push(f(ae, "pointerdown", (e) => n(e, "in"), { passive: !1 })), H.push(f(oe, "pointerdown", (e) => n(e, "out"), { passive: !1 })), H.push(f(te, "pointerdown", (e) => n(e, "in"), { passive: !1 })), H.push(f(ne, "pointerdown", (e) => n(e, "out"), { passive: !1 })), H.push(f(v, "pointermove", r, { passive: !1 })), H.push(f(v, "pointerup", i, { passive: !1 })), H.push(f(v, "pointercancel", i, { passive: !1 }));
}
- return s(() => f.appendChild(h)), {
- controlsEl: h,
+ return d(() => c.appendChild(l)), {
+ controlsEl: l,
setMediaInfo: lt,
setPlaybackRate: (e) => {
try {
@@ -1659,24 +1653,24 @@ function _e(t, n = {}) {
}
},
destroy: () => {
- for (let e of H) s(e);
- s(() => h.remove());
+ for (let e of H) d(e);
+ d(() => l.remove());
}
};
} catch {
return {
controlsEl: null,
- destroy: c
+ destroy: h
};
}
}
//#endregion
//#region ui/features/viewer/mediaPlayer.ts
-function D(e) {
+function O(e) {
let t = String(e || "").toLowerCase();
return t === "video" || t === "audio";
}
-function ve({ mode: e, VIEWER_MODES: t, singleView: n, abView: r, sideView: i } = {}) {
+function ye({ 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") || []) : [];
@@ -1684,7 +1678,7 @@ function ve({ mode: e, VIEWER_MODES: t, singleView: n, abView: r, sideView: i }
return [];
}
}
-function O(e) {
+function be(e) {
try {
let t = Array.isArray(e) ? e : [];
return t.find((e) => String(e?.dataset?.mjrCompareRole || "") === "A") || t[0] || null;
@@ -1692,11 +1686,11 @@ function O(e) {
return null;
}
}
-function ye(e, t = {}) {
+function xe(e, t = {}) {
try {
if (!e) return null;
let n = String(t?.mediaKind || "").toLowerCase();
- return _e(e, {
+ return D(e, {
...t,
mediaKind: n
});
@@ -1706,7 +1700,7 @@ function ye(e, t = {}) {
}
//#endregion
//#region ui/utils/tooltipShortcuts.ts
-function be(e, t) {
+function Se(e, t) {
let n = String(e || "").trim(), r = String(t || "").trim();
if (!r) return n;
if (!n) return r;
@@ -1716,25 +1710,25 @@ function be(e, t) {
} else if (n.toLowerCase().includes(r.toLowerCase())) return n;
return `${n} (${r})`;
}
-function xe(e, t, n, { setAriaLabel: r = !0, ariaLabel: i = null } = {}) {
+function Ce(e, t, n, { setAriaLabel: r = !0, ariaLabel: i = null } = {}) {
if (!e) return "";
- let a = be(t, n);
+ let a = Se(t, n);
if (e.title = a, r) {
let r = i ?? t;
- e.setAttribute("aria-label", be(r, n));
+ e.setAttribute("aria-label", Se(r, n));
}
return a;
}
//#endregion
//#region ui/features/viewer/videoSync.ts
-var Se = () => {
+var we = () => {
try {
- return !!a?.DEBUG_VIEWER;
+ return !!o?.DEBUG_VIEWER;
} catch {
return !1;
}
};
-function Ce(e, t, { threshold: n = .15 } = {}) {
+function Te(e, t, { threshold: n = .15 } = {}) {
let r = new AbortController();
try {
if (!e) return r;
@@ -1864,7 +1858,7 @@ function Ce(e, t, { threshold: n = .15 } = {}) {
console.debug?.(e);
}
} catch (e) {
- if (Se()) try {
+ if (we()) try {
console.warn("[Viewer] follower video sync setup failed", e);
} catch (e) {
console.debug?.(e);
@@ -1874,7 +1868,7 @@ function Ce(e, t, { threshold: n = .15 } = {}) {
}
//#endregion
//#region ui/utils/dom.ts
-function we(e, t) {
+function Ee(e, t) {
if (!t) return null;
try {
if (!e) return null;
@@ -1886,7 +1880,7 @@ function we(e, t) {
}
return null;
}
-function Te(e) {
+function De(e) {
let t = String(e ?? "");
try {
if (typeof CSS?.escape == "function") return CSS.escape(t);
@@ -1895,7 +1889,7 @@ function Te(e) {
}
return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1");
}
-async function Ee(e) {
+async function Oe(e) {
try {
return navigator?.clipboard?.writeText ? (await navigator.clipboard.writeText(String(e ?? "")), !0) : !1;
} catch {
@@ -1904,44 +1898,42 @@ async function Ee(e) {
}
//#endregion
//#region ui/features/viewer/workflowSidebar/widgetAdapters.ts
-function De(e, t, n = null) {
+function ke(e, t, n = null) {
switch (String(e?.type || "").toLowerCase()) {
case "number":
case "int":
- case "float": return A(e, t, n);
- case "combo": return j(e, t, n);
+ case "float": return j(e, t, n);
+ case "combo": return Ae(e, t, n);
case "text":
case "string":
case "customtext": return M(e, t, n);
case "toggle":
- case "boolean": return ke(e, t, n);
- default: return N(e);
+ case "boolean": return N(e, t, n);
+ default: return P(e);
}
}
-function k(e, t, n = null) {
+function k(e, t, r = null) {
if (!e) return !1;
- let i = String(e.type || "").toLowerCase();
- if (i === "number" || i === "int" || i === "float") {
+ let a = String(e.type || "").toLowerCase();
+ if (a === "number" || a === "int" || a === "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 i === "toggle" || i === "boolean" ? e.value = !!t : e.value = t;
+ let r = e.options ?? {}, i = r.min ?? -Infinity, o = r.max ?? Infinity, s = Math.min(o, Math.max(i, n));
+ (a === "int" || r.precision === 0 || r.round === 1) && (s = Math.round(s)), e.value = s;
+ } else a === "toggle" || a === "boolean" ? e.value = !!t : e.value = t;
try {
- let t = r(), a = t?.canvas ?? null, o = n ?? e?.parent ?? null, s = e.value;
- e.callback?.(e.value, a, o, null, e), (i === "number" || i === "int" || i === "float") && (e.value = s), Oe(e), a?.setDirty?.(!0, !0), a?.draw?.(!0, !0);
- let c = o?.graph ?? null;
- c && c !== t?.graph && (c.setDirtyCanvas?.(!0, !0), c.change?.()), t?.graph?.setDirtyCanvas?.(!0, !0), t?.graph?.change?.();
+ let t = n(), o = r ?? e?.parent ?? null, s = e.value;
+ e.callback?.(e.value, t, o, null, e), (a === "number" || a === "int" || a === "float") && (e.value = s), A(e), i(o);
} catch (e) {
console.debug?.("[MFV] writeWidgetValue", e);
}
return !0;
}
-function Oe(e) {
+function A(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 A(e, t, n = null) {
+function j(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;
@@ -1957,7 +1949,7 @@ function A(e, t, n = null) {
k(e, r.value, n) && (r.value = String(e.value), t?.(e.value));
}), r;
}
-function j(e, t, n = null) {
+function Ae(e, t, n = null) {
let r = document.createElement("select");
r.className = "mjr-ws-input";
let i = e.options?.values ?? [];
@@ -1989,7 +1981,7 @@ function M(e, t, n = null) {
k(e, i.value, n), t?.(e.value), a();
}), r.appendChild(i), r._mjrAutoFit = a, i._mjrAutoFit = a, requestAnimationFrame(a), r;
}
-function ke(e, t, n = null) {
+function N(e, t, n = null) {
let r = document.createElement("label");
r.className = "mjr-ws-toggle-label";
let i = document.createElement("input");
@@ -1997,13 +1989,13 @@ function ke(e, t, n = null) {
k(e, i.checked, n) && t?.(e.value);
}), r.appendChild(i), r;
}
-function N(e) {
+function P(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;
}
//#endregion
//#region ui/app/settings/MajoorSettingsDialog.ts
-var P = "mjr-settings-dialog", F = "mjr-settings-dialog-style", I = null, Ae = {
+var F = "mjr-settings-dialog", je = "mjr-settings-dialog-style", I = null, Me = {
Cards: {
icon: "pi pi-th-large",
label: "Cards"
@@ -2057,11 +2049,11 @@ var P = "mjr-settings-dialog", F = "mjr-settings-dialog-style", I = null, Ae = {
label: "General"
}
};
-function je() {
- if (typeof document > "u" || document.getElementById(F)) return;
+function L() {
+ if (typeof document > "u" || document.getElementById(je)) return;
let e = document.createElement("style");
- e.id = F, e.textContent = `
-#${P} {
+ e.id = je, e.textContent = `
+#${F} {
position: fixed;
inset: 0;
z-index: 10080;
@@ -2071,8 +2063,8 @@ function je() {
color: var(--fg-color, #ddd);
font: 13px/1.4 system-ui, -apple-system, Segoe UI, sans-serif;
}
-#${P}[hidden] { display: none; }
-#${P} .mjr-settings-panel {
+#${F}[hidden] { display: none; }
+#${F} .mjr-settings-panel {
width: min(860px, calc(100vw - 32px));
max-height: min(780px, calc(100vh - 32px));
display: grid;
@@ -2083,21 +2075,21 @@ function je() {
box-shadow: 0 18px 60px rgba(0, 0, 0, 0.45);
overflow: hidden;
}
-#${P} .mjr-settings-head,
-#${P} .mjr-settings-tools {
+#${F} .mjr-settings-head,
+#${F} .mjr-settings-tools {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 12px;
border-bottom: 1px solid rgba(255, 255, 255, 0.10);
}
-#${P} .mjr-settings-title {
+#${F} .mjr-settings-title {
font-weight: 700;
font-size: 14px;
flex: 1;
}
-#${P} .mjr-settings-close,
-#${P} .mjr-settings-reset {
+#${F} .mjr-settings-close,
+#${F} .mjr-settings-reset {
border: 1px solid rgba(255, 255, 255, 0.14);
background: rgba(255, 255, 255, 0.06);
color: inherit;
@@ -2106,11 +2098,11 @@ function je() {
padding: 0 10px;
cursor: pointer;
}
-#${P} .mjr-settings-close {
+#${F} .mjr-settings-close {
width: 30px;
padding: 0;
}
-#${P} .mjr-settings-search {
+#${F} .mjr-settings-search {
flex: 1;
min-width: 160px;
height: 30px;
@@ -2120,21 +2112,21 @@ function je() {
color: inherit;
padding: 0 10px;
}
-#${P} .mjr-settings-body {
+#${F} .mjr-settings-body {
overflow: auto;
padding: 12px;
}
-#${P} .mjr-settings-stack {
+#${F} .mjr-settings-stack {
display: grid;
gap: 10px;
}
-#${P} .mjr-settings-group {
+#${F} .mjr-settings-group {
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 8px;
background: rgba(255, 255, 255, 0.035);
overflow: hidden;
}
-#${P} .mjr-settings-group summary {
+#${F} .mjr-settings-group summary {
min-height: 42px;
display: grid;
grid-template-columns: 28px 1fr auto 18px;
@@ -2145,10 +2137,10 @@ function je() {
user-select: none;
background: rgba(255, 255, 255, 0.045);
}
-#${P} .mjr-settings-group summary::-webkit-details-marker {
+#${F} .mjr-settings-group summary::-webkit-details-marker {
display: none;
}
-#${P} .mjr-settings-group-icon {
+#${F} .mjr-settings-group-icon {
width: 28px;
height: 28px;
display: grid;
@@ -2157,27 +2149,27 @@ function je() {
background: rgba(255, 255, 255, 0.07);
color: var(--input-text, #fff);
}
-#${P} .mjr-settings-group-title {
+#${F} .mjr-settings-group-title {
color: var(--input-text, #fff);
font-weight: 700;
}
-#${P} .mjr-settings-group-meta {
+#${F} .mjr-settings-group-meta {
opacity: 0.68;
font-size: 12px;
}
-#${P} .mjr-settings-chevron {
+#${F} .mjr-settings-chevron {
transition: transform 0.16s ease;
}
-#${P} details[open] > summary .mjr-settings-chevron {
+#${F} details[open] > summary .mjr-settings-chevron {
transform: rotate(90deg);
}
-#${P} .mjr-settings-group-body {
+#${F} .mjr-settings-group-body {
padding: 4px 11px 11px;
}
-#${P} .mjr-settings-subgroup {
+#${F} .mjr-settings-subgroup {
margin-top: 8px;
}
-#${P} .mjr-settings-subgroup-title {
+#${F} .mjr-settings-subgroup-title {
display: flex;
align-items: center;
gap: 8px;
@@ -2188,13 +2180,13 @@ function je() {
text-transform: uppercase;
opacity: 0.86;
}
-#${P} .mjr-settings-subgroup-title::after {
+#${F} .mjr-settings-subgroup-title::after {
content: "";
height: 1px;
flex: 1;
background: rgba(255, 255, 255, 0.10);
}
-#${P} .mjr-settings-row {
+#${F} .mjr-settings-row {
display: grid;
grid-template-columns: minmax(220px, 1fr) minmax(180px, 280px);
align-items: center;
@@ -2202,17 +2194,17 @@ function je() {
padding: 9px 0;
border-top: 1px solid rgba(255, 255, 255, 0.07);
}
-#${P} .mjr-settings-name {
+#${F} .mjr-settings-name {
font-weight: 600;
color: var(--p-primary-color, var(--comfy-accent, #8ab4f8));
}
-#${P} .mjr-settings-tip {
+#${F} .mjr-settings-tip {
margin-top: 2px;
opacity: 0.72;
font-size: 12px;
}
-#${P} input,
-#${P} select {
+#${F} input,
+#${F} select {
min-height: 30px;
border-radius: 6px;
border: 1px solid rgba(255, 255, 255, 0.16);
@@ -2220,41 +2212,41 @@ function je() {
color: inherit;
padding: 0 8px;
}
-#${P} input[type="checkbox"] {
+#${F} input[type="checkbox"] {
justify-self: end;
width: 18px;
min-height: 18px;
}
-#${P} input[type="color"] {
+#${F} input[type="color"] {
padding: 2px;
width: 56px;
justify-self: end;
}
@media (max-width: 620px) {
- #${P} .mjr-settings-row {
+ #${F} .mjr-settings-row {
grid-template-columns: 1fr;
gap: 8px;
}
}
`, document.head.appendChild(e);
}
-function Me(e) {
+function Ne(e) {
return String(e || "").replace(/^\s*Majoor:\s*/i, "").trim();
}
-function L(e) {
+function Pe(e) {
let t = Array.isArray(e?.category) ? e.category : [];
return String(t[1] || "General").trim() || "General";
}
-function Ne(e) {
+function Fe(e) {
return (Array.isArray(e?.category) ? e.category : []).slice(2).filter(Boolean).join(" / ") || "General";
}
-function Pe(e) {
- return Ae[e] || {
+function R(e) {
+ return Me[e] || {
icon: "pi pi-sliders-h",
label: e || "General"
};
}
-function Fe(e, t) {
+function z(e, t) {
return t ? [
e?.id,
e?.name,
@@ -2262,7 +2254,7 @@ function Fe(e, t) {
...Array.isArray(e?.category) ? e.category : []
].join(" ").toLowerCase().includes(t) : !0;
}
-function R(e, t) {
+function B(e, t) {
if (typeof e?.onChange == "function") {
e.defaultValue = t;
try {
@@ -2275,38 +2267,38 @@ function R(e, t) {
}
}
}
-function z(e) {
+function V(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", () => R(e, r.checked)), r;
+ if (t === "boolean") return r = document.createElement("input"), r.type = "checkbox", r.checked = !!n, r.addEventListener("change", () => B(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", () => R(e, r.value)), r;
+ return r.value = String(n ?? ""), r.addEventListener("change", () => B(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, () => {
- R(e, t === "number" ? Number(r.value) : r.value);
+ B(e, t === "number" ? Number(r.value) : r.value);
}), r;
}
-function B(e, t, n = "") {
+function H(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 (!Fe(e, n)) continue;
- let t = L(e), r = Ne(e);
+ if (!z(e, n)) continue;
+ let t = Pe(e), r = Fe(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 = Pe(e), o = document.createElement("details");
+ let i = Array.from(t.values()).flat(), a = R(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";
@@ -2329,60 +2321,60 @@ function B(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 = Me(e?.name) || e?.id || "Setting", r.appendChild(i), e?.tooltip) {
+ if (i.className = "mjr-settings-name", i.textContent = Ne(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(z(e)), t.appendChild(n);
+ n.appendChild(r), n.appendChild(V(e)), t.appendChild(n);
}
p.appendChild(t);
}
o.appendChild(p), r.appendChild(o);
}
}
-function V() {
- je();
- let t = document.createElement("div");
- t.id = P, t.hidden = !0, t.addEventListener("click", (e) => {
- e.target === t && H();
+function Ie() {
+ L();
+ let e = document.createElement("div");
+ e.id = F, e.hidden = !0, e.addEventListener("click", (t) => {
+ t.target === e && Le();
});
+ 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-panel", n.setAttribute("role", "dialog"), n.setAttribute("aria-modal", "true");
+ n.className = "mjr-settings-head";
let r = document.createElement("div");
- r.className = "mjr-settings-head";
- let i = document.createElement("div");
- i.className = "mjr-settings-title", i.textContent = e("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", e("btn.close", "Close")), a.addEventListener("click", H), r.append(i, a);
+ r.className = "mjr-settings-title", r.textContent = a("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", a("btn.close", "Close")), i.addEventListener("click", Le), n.append(r, i);
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 = e("placeholder.searchSettings", "Search settings"), o.appendChild(s);
+ s.type = "search", s.className = "mjr-settings-search", s.placeholder = a("placeholder.searchSettings", "Search settings"), o.appendChild(s);
let c = document.createElement("div");
- return c.className = "mjr-settings-body", n.append(r, o, c), t.appendChild(n), document.body.appendChild(t), {
+ return c.className = "mjr-settings-body", t.append(n, o, c), e.appendChild(t), document.body.appendChild(e), {
body: c,
- root: t,
+ root: e,
search: s
};
}
-function H() {
+function Le() {
I?.root && (I.root.hidden = !0);
}
-function Ie(e = t()) {
+function U(e = t()) {
if (typeof document > "u") return !1;
- I?.root?.isConnected || (I = V());
- let n = o(e), r = () => B(I.body, n, String(I.search.value || "").trim().toLowerCase());
+ I?.root?.isConnected || (I = Ie());
+ let n = p(e), r = () => H(I.body, n, String(I.search.value || "").trim().toLowerCase());
return I.search.oninput = r, I.search.value = "", r(), I.root.hidden = !1, setTimeout(() => I?.search?.focus?.(), 0), !0;
}
//#endregion
//#region ui/app/openMajoorSettings.ts
-function Le(e = t()) {
- return Ie(e);
+function Re(e = t()) {
+ return U(e);
}
try {
- typeof window < "u" && (window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.openSettings = Le);
+ typeof window < "u" && (window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.openSettings = Re);
} catch (e) {
console.debug?.(e);
}
//#endregion
-export { ae as _, we as a, be as c, D as d, ye as f, re as g, ie as h, Ee as i, xe as l, _e as m, De as n, Te as o, O as p, k as r, Ce as s, Le as t, ve as u, C as v, S as y };
+export { se as _, Ee as a, Se as c, O as d, xe as f, ae as g, oe as h, Oe as i, Ce as l, D as m, ke as n, De as o, be as p, k as r, Te as s, Re as t, ye as u, T as v, w as y };
diff --git a/dist/chunks/sideBySide-DX0t_oIi.js b/dist/chunks/sideBySide-Dp8qRb0r.js
similarity index 98%
rename from dist/chunks/sideBySide-DX0t_oIi.js
rename to dist/chunks/sideBySide-Dp8qRb0r.js
index ef41ed8c..552b136f 100644
--- a/dist/chunks/sideBySide-DX0t_oIi.js
+++ b/dist/chunks/sideBySide-Dp8qRb0r.js
@@ -1,5 +1,5 @@
-import { i as e } from "./model3dRenderer-DtGg_3hW.js";
-import { i as t, o as n } from "./geninfoParser-BE5lWeGw.js";
+import { i as e } from "./model3dRenderer-BtzSm2ZA.js";
+import { i as t, o as n } from "./geninfoParser-5vKgjqjD.js";
//#region ui/features/viewer/sideBySide.ts
function r(e) {
if (!e) return null;
diff --git a/dist/entry.js b/dist/entry.js
index 8f43a42d..e88051dc 100644
--- a/dist/entry.js
+++ b/dist/entry.js
@@ -1,14 +1,14 @@
-import { $ as e, A as t, At as n, Bt as r, C as i, Ct as a, D as o, Dt as s, E as c, G as l, H as u, J as d, Jt as f, K as p, Mt as m, Nt as h, O as g, Ot as _, Q as v, Qt as y, St as b, T as x, Tt as S, Ut as C, Vt as w, Wt as T, X as E, Xt as D, Y as O, Z as k, Zt as A, _ as j, b as M, c as N, d as P, et as F, f as ee, g as te, gt as ne, h as re, ht as ie, j as ae, jt as oe, kt as se, l as ce, m as le, mt as ue, n as de, o as fe, p as pe, q as me, qt as he, s as ge, t as _e, tt as ve, v as ye, vt as be, w as xe, wt as Se, x as Ce, y as we, yt as Te } from "./chunks/hostAdapter-D6BwD-lN.js";
-import { _ as Ee, a as De, b as Oe, c as ke, d as Ae, f as je, g as Me, l as Ne, m as Pe, o as Fe, p as Ie, r as Le, s as Re, t as I, u as ze, v as Be, y as Ve } from "./chunks/config-dvcltBqE.js";
-import { _ as He, a as Ue, c as We, d as Ge, f as Ke, g as qe, h as Je, i as Ye, l as L, m as Xe, n as Ze, o as Qe, p as $e, r as et, s as tt, t as nt, u as rt, v as it, y as at } from "./chunks/floatingViewerManager-Oat0dyM2.js";
-import { A as ot, B as st, C as ct, D as lt, E as ut, F as dt, G as ft, H as pt, I as mt, J as ht, K as gt, L as _t, M as vt, N as yt, O as bt, P as xt, R as St, S as R, T as Ct, U as wt, V as Tt, W as Et, _ as Dt, b as Ot, d as kt, f as At, h as jt, j as Mt, k as Nt, l as Pt, m as Ft, p as It, q as Lt, s as Rt, t as zt, u as Bt, v as Vt, w as Ht, x as z, y as Ut, z as Wt } from "./chunks/SidebarWorkflowSection-CxD2u7Bb.js";
-import { i as Gt, n as Kt, r as B, t as qt } from "./chunks/events-BnkL6-b6.js";
-import { a as Jt, i as Yt, n as Xt, t as Zt } from "./chunks/graphTraversal-HdtD9lDa.js";
-import { a as Qt, c as $t, d as en, f as tn, l as nn, m as rn, o as an, p as on, r as sn, s as cn, t as ln, u as un, v as dn } from "./chunks/openMajoorSettings-CGhSTA_W.js";
-import { $ as fn, A as pn, B as mn, C as hn, D as V, E as gn, F as H, H as U, I as _n, L as vn, M as yn, N as bn, O as xn, P as Sn, Q as Cn, R as wn, S as W, T as G, U as Tn, V as En, X as Dn, Y as On, Z as K, _ as kn, at as An, b as jn, it as Mn, j as Nn, nt as Pn, ot as q, rt as J, v as Fn, w as Y, x as X, y as In, z as Ln } from "./chunks/mjr-primevue-DeVPqKdl.js";
-import { n as Rn, r as zn } from "./chunks/mjr-vue-vendor--o0qJuos.js";
+import { B as e, Ct as t, F as n, G as r, H as i, I as a, L as o, M as s, R as c, St as l, U as u, V as d, W as f, _ as p, _t as m, a as h, at as g, b as _, bt as v, c as y, ct as b, d as x, ft as S, g as C, h as w, ht as T, i as E, it as D, l as O, lt as k, m as A, mt as j, n as M, o as N, ot as P, p as F, pt as I, r as ee, s as te, t as ne, u as re, v as ie, vt as ae, wt as oe, x as se, xt as ce, yt as le, z as ue } from "./chunks/client-DZE_lzdb.js";
+import { $ as de, B as fe, F as pe, G as L, H as me, J as he, L as ge, N as _e, P as ve, Q as ye, T as be, U as xe, V as Se, W as Ce, X as we, Y as Te, Z as Ee, at as De, ct as Oe, d as ke, et as Ae, f as je, it as Me, l as R, nt as Ne, ot as Pe, q as Fe, st as Ie, t as z, tt as Le, u as Re, w as ze } from "./chunks/config-Cxv7acF8.js";
+import { a as Be, i as Ve, n as He, t as Ue } from "./chunks/graphTraversal-CjIZsRsP.js";
+import { _ as We, a as Ge, c as Ke, d as B, f as qe, g as Je, h as Ye, i as Xe, l as Ze, m as Qe, n as $e, o as et, p as tt, r as nt, s as rt, t as it, u as at, v as ot, y as st } from "./chunks/floatingViewerManager-BSQ_h48I.js";
+import { A as ct, B as lt, C as V, D as ut, E as dt, F as ft, G as pt, H as mt, I as ht, J as gt, K as _t, L as vt, M as yt, N as bt, O as xt, P as St, R as Ct, S as wt, T as Tt, U as Et, V as Dt, W as Ot, Y as kt, b as At, d as jt, f as Mt, g as Nt, h as Pt, j as Ft, k as It, l as Lt, m as Rt, p as zt, q as Bt, s as Vt, t as Ht, u as Ut, v as Wt, w as Gt, x as Kt, y as qt, z as Jt } from "./chunks/SidebarWorkflowSection-na0bq_pe.js";
+import { i as Yt, n as Xt, r as H, t as Zt } from "./chunks/events-BnkL6-b6.js";
+import { a as Qt, c as $t, d as en, f as tn, l as nn, m as rn, o as an, p as on, r as sn, s as cn, t as ln, u as un, v as dn } from "./chunks/openMajoorSettings-BeNfIQfY.js";
+import { $ as fn, A as pn, B as mn, C as hn, D as U, E as gn, F as W, H as G, I as _n, L as vn, M as yn, N as bn, O as xn, P as Sn, Q as Cn, R as wn, S as K, T as q, U as Tn, V as En, X as Dn, Y as On, Z as J, _ as kn, at as An, b as jn, it as Mn, j as Nn, nt as Pn, ot as Y, rt as X, v as Fn, w as In, x as Z, y as Ln, z as Rn } from "./chunks/mjr-primevue-DeVPqKdl.js";
+import { r as zn } from "./chunks/mjr-vue-vendor--o0qJuos.js";
import { n as Bn, r as Vn } from "./chunks/state-DPiaUMw1.js";
-import { a as Hn, c as Un, i as Wn, o as Gn, r as Kn, s as qn } from "./chunks/model3dRenderer-DtGg_3hW.js";
+import { a as Hn, c as Un, i as Wn, o as Gn, r as Kn, s as qn } from "./chunks/model3dRenderer-BtzSm2ZA.js";
import { app as Jn } from "../../scripts/app.js";
function Yn(e = null) {
return null;
@@ -17,7 +17,7 @@ function Xn() {
return null;
}
try {
- typeof window < "u" && Le && Le.LIST;
+ typeof window < "u" && L && L.LIST;
} catch {}
//#endregion
//#region ui/integration/comfy_send_to_am.ts
@@ -32,6 +32,10 @@ var Zn = "MajoorAssetsManager.SendTo", Qn = "Send to Asset Manager", $n = new Se
"SaveAudio"
]);
function er(e) {
+ let t = String(e?.comfyClass || e?.type || "").trim();
+ return $n.has(t);
+}
+function tr(e) {
let t = [];
try {
let n = e?.imgs && Array.isArray(e.imgs) ? e.imgs : null, r = [];
@@ -59,17 +63,24 @@ function er(e) {
} catch {}
return t;
}
-async function tr(e) {
- let t = T(), n = C(t);
+async function nr(e) {
+ let t = be(), n = ze(t);
if (!e.length) {
- try {
- t?.extensionManager?.toast?.add?.({
- severity: "warn",
- summary: "Majoor Assets Manager",
- detail: "No output to send (run the node first).",
- life: 3500
- });
- } catch {}
+ ge({
+ severity: "warn",
+ summary: "Majoor Assets Manager",
+ detail: "No output to send (run the node first).",
+ life: 3500
+ });
+ return;
+ }
+ if (!n || typeof n.fetchApi != "function") {
+ ge({
+ severity: "error",
+ summary: "Majoor Assets Manager",
+ detail: "ComfyUI API unavailable.",
+ life: 4e3
+ });
return;
}
try {
@@ -79,17 +90,14 @@ async function tr(e) {
body: JSON.stringify({ items: e })
});
if (!r.ok && r.status !== 404) throw Error(`HTTP ${r.status}`);
- try {
- t?.extensionManager?.sidebarTab?.toggleSidebarTab?.("majoor-assets");
- } catch {}
- t?.extensionManager?.toast?.add?.({
+ je(t, "majoor-assets"), ge({
severity: "success",
summary: "Majoor Assets Manager",
detail: `Sent ${e.length} item(s) to the asset grid.`,
life: 2500
});
} catch (e) {
- t?.extensionManager?.toast?.add?.({
+ ge({
severity: "error",
summary: "Majoor Assets Manager",
detail: `Failed to send: ${e?.message || e}`,
@@ -97,40 +105,33 @@ async function tr(e) {
});
}
}
-function nr() {
- let e = T();
+function rr() {
+ let e = be();
if (!e || typeof e.registerExtension != "function") {
- setTimeout(nr, 100);
+ setTimeout(rr, 100);
return;
}
e.registerExtension({
name: Zn,
- async beforeRegisterNodeDef(e, t) {
+ getNodeMenuItems(e) {
try {
- let n = String(t?.name || "");
- if (!$n.has(n)) return;
- let r = e.prototype.getExtraMenuOptions;
- e.prototype.getExtraMenuOptions = function(e, t) {
- if (typeof r == "function") try {
- r.apply(this, arguments);
- } catch {}
- let n = this;
- t.push({
- content: Qn,
- callback: () => {
- tr(er(n));
- }
- });
- };
- } catch {}
+ return er(e) ? [{
+ content: Qn,
+ callback: () => {
+ nr(tr(e));
+ }
+ }] : [];
+ } catch {
+ return [];
+ }
}
});
}
-nr();
+rr();
//#endregion
//#region ui/app/bootstrap.ts
-var rr = !1, ir = null, ar = !1, or = null;
-function sr() {
+var ir = !1, ar = null, or = !1, sr = null;
+function cr() {
try {
let e = window?.__MJR_EXECUTION_RUNTIME__;
return !String(e?.active_prompt_id || "").trim();
@@ -138,31 +139,31 @@ function sr() {
return console.debug?.(e), !0;
}
}
-async function cr(e = {}) {
- if (!I || typeof I != "object" || !I.AUTO_SCAN_ON_STARTUP || rr) return;
+async function lr(e = {}) {
+ if (!z || typeof z != "object" || !z.AUTO_SCAN_ON_STARTUP || ir) return;
let t = Math.max(0, Number(e?.delayMs) || 0), n = e?.idleOnly !== !1;
if (t > 0) {
- ir && clearTimeout(ir), ir = setTimeout(() => {
- ir = null, cr({
+ ar && clearTimeout(ar), ar = setTimeout(() => {
+ ar = null, lr({
...e,
delayMs: 0
});
}, t);
return;
}
- if (n && !sr()) {
- ir && clearTimeout(ir), ir = setTimeout(() => {
- ir = null, cr({
+ if (n && !cr()) {
+ ar && clearTimeout(ar), ar = setTimeout(() => {
+ ar = null, lr({
...e,
delayMs: 0
});
}, 5e3);
return;
}
- rr = !0;
+ ir = !0;
try {
- it("[Majoor] Starting startup scan of output directory...");
- let e = await ye(Le.SCAN, {
+ ot("[Majoor] Starting startup scan of output directory...");
+ let e = await y(L.SCAN, {
recursive: !0,
incremental: !0,
fast: !0,
@@ -170,29 +171,29 @@ async function cr(e = {}) {
});
if (e.ok) {
let t = e.data;
- it(`[Majoor] Startup scan complete - added: ${t.added}, updated: ${t.updated}, skipped: ${t.skipped}`);
+ ot(`[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 lr() {
+async function ur() {
try {
await Promise.allSettled([
- P(Le.HEALTH),
- P(`${Le.HEALTH_COUNTERS}?scope=output`),
- P(Le.HEALTH_DB)
+ ne(L.HEALTH),
+ ne(`${L.HEALTH_COUNTERS}?scope=output`),
+ ne(L.HEALTH_DB)
]);
} catch (e) {
console.debug?.(e);
}
}
-async function ur(e = {}) {
- return ar ? or || Promise.resolve() : (ar = !0, or = (async () => {
- await dr(), await lr(), await cr(e);
- })(), or);
+async function dr(e = {}) {
+ return or ? sr || Promise.resolve() : (or = !0, sr = (async () => {
+ await fr(), await ur(), await lr(e);
+ })(), sr);
}
-function dr() {
+function fr() {
return new Promise((e) => {
try {
if (typeof window > "u") {
@@ -211,25 +212,25 @@ function dr() {
}
});
}
-async function fr() {
+async function pr() {
try {
- it("[Majoor] Testing API connection...");
- let e = await P(Le.HEALTH);
- e?.ok ? it("[Majoor] API connection successful, health:", e.data.overall) : console.error("[Majoor] ERROR: API health check failed:", e?.error);
+ ot("[Majoor] Testing API connection...");
+ let e = await ne(L.HEALTH);
+ e?.ok ? ot("[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);
}
}
//#endregion
//#region ui/app/versionCheck.ts
-var pr = "mjr:version-update-available", mr = "__MJR_VERSION_UPDATE_STATE__", hr = "https://api.github.com/repos/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/latest", gr = "https://api.github.com/repos/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/tags/nightly", _r = "majoor_last_update_check", vr = "majoor_version_toast_notice_version", yr = "majoor_nightly_release_marker", br = 1440 * 60 * 1e3, xr = {
+var mr = "mjr:version-update-available", hr = "__MJR_VERSION_UPDATE_STATE__", gr = "https://api.github.com/repos/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/latest", _r = "https://api.github.com/repos/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/tags/nightly", vr = "majoor_last_update_check", yr = "majoor_version_toast_notice_version", br = "majoor_nightly_release_marker", xr = 1440 * 60 * 1e3, Sr = {
available: !1,
timestamp: Date.now()
};
-function Sr(e) {
+function Cr(e) {
return e ? String(e).trim().replace(/^v/i, "") : "";
}
-function Cr(e, t) {
+function wr(e, t) {
let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(), i = [
"nightly",
"dev",
@@ -238,15 +239,15 @@ function Cr(e, t) {
].some((e) => n.includes(e) || r.includes(e)), a = n.includes("+") || n.length > 10 && /^[a-f0-9]+$/i.test(n);
return i || a;
}
-function wr(e) {
+function Tr(e) {
return String(e || "").split("-")[0].split(".").map((e) => {
let t = parseInt(e, 10);
return Number.isFinite(t) ? Math.max(0, t) : 0;
});
}
-function Tr(e, t) {
+function Er(e, t) {
if (!e || !t) return !1;
- let n = wr(e), r = wr(t), i = Math.max(n.length, r.length);
+ let n = Tr(e), r = Tr(t), i = Math.max(n.length, r.length);
for (let e = 0; e < i; e += 1) {
let t = Number.isFinite(n[e]) ? n[e] : 0, i = Number.isFinite(r[e]) ? r[e] : 0;
if (t > i) return !0;
@@ -254,7 +255,7 @@ function Tr(e, t) {
}
return !1;
}
-function Er(e) {
+function Dr(e) {
let t = Math.max(1, Number(e) || 1e4);
try {
if (typeof AbortSignal < "u" && typeof AbortSignal.timeout == "function") return {
@@ -292,8 +293,8 @@ function Er(e) {
cleanup: () => {}
};
}
-async function Dr(e) {
- let { signal: t, cleanup: n } = Er(1e4), r = await fetch(e, {
+async function Or(e) {
+ let { signal: t, cleanup: n } = Dr(1e4), r = await fetch(e, {
cache: "no-cache",
signal: t,
headers: { Accept: "application/vnd.github+json" }
@@ -303,108 +304,108 @@ async function Dr(e) {
if (!i || typeof i != "object") throw Error("GitHub release returned invalid payload");
return i;
}
-async function Or() {
- return Sr((await Dr(hr)).tag_name);
-}
async function kr() {
- let e = await Dr(gr);
+ return Cr((await Or(gr)).tag_name);
+}
+async function Ar() {
+ let e = await Or(_r);
return String(e.published_at || e.created_at || e.updated_at || e.target_commitish || e.tag_name || "").trim();
}
-function Ar(e) {
- xr = {
+function jr(e) {
+ Sr = {
...e,
timestamp: Date.now()
};
let t = typeof window < "u" ? window : null;
if (t) {
try {
- t[mr] = xr;
+ t[hr] = Sr;
} catch (e) {
console.debug?.(e);
}
try {
- t.dispatchEvent(new CustomEvent(pr, { detail: xr }));
+ t.dispatchEvent(new CustomEvent(mr, { detail: Sr }));
} catch (e) {
console.debug?.(e);
}
}
}
-function jr() {
- return xr;
+function Mr() {
+ return Sr;
}
-async function Mr({ force: e = !1 } = {}) {
+async function Nr({ force: e = !1 } = {}) {
if (typeof window > "u") return null;
let t, n;
try {
- let e = await P(Le.VERSION);
- if (!e?.ok) return Ar({ available: !1 }), null;
- t = Sr(e.data?.version), n = String(e.data?.branch || "").trim().toLowerCase();
+ let e = await ne(L.VERSION);
+ if (!e?.ok) return jr({ available: !1 }), null;
+ t = Cr(e.data?.version), n = String(e.data?.branch || "").trim().toLowerCase();
} catch {
- return Ar({ available: !1 }), null;
+ return jr({ available: !1 }), null;
}
- let i = !1;
+ let r = !1;
try {
if (!e) {
- let e = Number(w.get(_r) || 0);
- Number.isFinite(e) && Date.now() - e < br && (i = !0);
+ let e = Number(Re.get(vr) || 0);
+ Number.isFinite(e) && Date.now() - e < xr && (r = !0);
}
} catch {}
- if (!t || Cr(t, n)) {
- if (i) return Ar({ available: !1 }), null;
+ if (!t || wr(t, n)) {
+ if (r) return jr({ available: !1 }), null;
let e;
try {
- e = await kr();
- let n = String(w.get(yr) || "").trim(), i = !!(n && e && n !== e);
- if (Ar({
- available: i,
+ e = await Ar();
+ let n = String(Re.get(br) || "").trim(), r = !!(n && e && n !== e);
+ if (jr({
+ available: r,
current: t || "nightly",
latest: "nightly",
channel: "nightly"
- }), i && s({
- summary: r("msg.nightlyUpdateTitle", "Nightly update available"),
- detail: r("msg.nightlyUpdateDetail", "A newer nightly build is available. Download it here: https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/tag/nightly")
+ }), r && m({
+ summary: R("msg.nightlyUpdateTitle", "Nightly update available"),
+ detail: R("msg.nightlyUpdateDetail", "A newer nightly build is available. Download it here: https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/tag/nightly")
}, "info", 0), e) try {
- w.set(yr, e);
+ Re.set(br, e);
} catch (e) {
console.debug?.(e);
}
} catch (e) {
- console.warn("Unable to check Majoor nightly updates:", e), Ar({ available: !1 });
+ console.warn("Unable to check Majoor nightly updates:", e), jr({ available: !1 });
} finally {
try {
- w.set(_r, String(Date.now()));
+ Re.set(vr, String(Date.now()));
} catch {}
}
return null;
}
- if (i) return null;
- let a;
+ if (r) return null;
+ let i;
try {
- a = await Or();
+ i = await kr();
} catch (e) {
- return console.warn("Unable to check Majoor updates:", e), Ar({ available: !1 }), null;
+ return console.warn("Unable to check Majoor updates:", e), jr({ available: !1 }), null;
} finally {
try {
- w.set(_r, String(Date.now()));
+ Re.set(vr, String(Date.now()));
} catch {}
}
- if (!a || !Tr(a, t)) return Ar({ available: !1 }), null;
- Ar({
+ if (!i || !Er(i, t)) return jr({ available: !1 }), null;
+ jr({
available: !0,
current: t,
- latest: a
+ latest: i
});
try {
- if (String(w.get(vr) || "").trim() !== a) {
- s({
- summary: r("msg.newVersionTitle", "Majoor Assets Manager update available"),
- detail: r("msg.newVersionDetail", "Version {latest} is available. You are currently using {current}.", {
- latest: a,
+ if (String(Re.get(yr) || "").trim() !== i) {
+ m({
+ summary: R("msg.newVersionTitle", "Majoor Assets Manager update available"),
+ detail: R("msg.newVersionDetail", "Version {latest} is available. You are currently using {current}.", {
+ latest: i,
current: t
})
}, "info", 0);
try {
- w.set(vr, a);
+ Re.set(yr, i);
} catch (e) {
console.debug?.(e);
}
@@ -414,26 +415,26 @@ async function Mr({ force: e = !1 } = {}) {
}
return {
current: t,
- latest: a
+ latest: i
};
}
//#endregion
//#region ui/app/style.ts
-function Nr() {
+function Pr() {
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 Pr({ enabled: e = !0 } = {}) {
+function Fr({ enabled: e = !0 } = {}) {
if (!e) return;
let t = "mjr-theme-comfy-css";
if (document.getElementById(t)) {
- Nr();
+ Pr();
return;
}
try {
- let e = new URL("data:text/css;base64,LyoqCiAqIE1ham9vciBBc3NldHMgTWFuYWdlciDigJQgQ29tZnktbGlrZSB0aGVtZSBsYXllcgogKgogKiBSVUxFUzoKICogLSBEbyBOT1QgaGFyZGNvZGUgYSBjdXN0b20gcGFsZXR0ZTsgdXNlIGV4aXN0aW5nIENvbWZ5VUkgQ1NTIHZhcmlhYmxlcyB2aWEgdmFyKC4uLikuCiAqIC0gS2VlcCBldmVyeXRoaW5nIHNjb3BlZCB1bmRlciBgLm1qci1hc3NldHMtbWFuYWdlcmAgdG8gYXZvaWQgbGVha2luZyBzdHlsZXMgdG8gQ29tZnlVSSAoZXhjZXB0IGAubWpyLXBvcG92ZXIqYCB3aGljaCBjYW4gYmUgcG9ydGFsZWQgdG8gYGRvY3VtZW50LmJvZHlgKS4KICovCgoubWpyLWFzc2V0cy1tYW5hZ2VyIHsKICAgIC8qIFR5cG9ncmFwaHkgKi8KICAgIGZvbnQtZmFtaWx5OiB2YXIoCiAgICAgICAgLS1jb21meS1mb250LAogICAgICAgIHZhcigKICAgICAgICAgICAgLS1mb250LWludGVyLAogICAgICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgICAgICBzeXN0ZW0tdWksCiAgICAgICAgICAgIC1hcHBsZS1zeXN0ZW0sCiAgICAgICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgICAgIFJvYm90bywKICAgICAgICAgICAgQXJpYWwsCiAgICAgICAgICAgIHNhbnMtc2VyaWYKICAgICAgICApCiAgICApOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsIHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKSk7CgogICAgLyoKICAgICAqIFN1cmZhY2VzIOKAlCBwcmlvcml0eTogQ29tZnlVSSB2MS40MiBkZXNpZ24tc3lzdGVtIHRva2VuIOKGkiBsZWdhY3kgdG9rZW4g4oaSIGhhcmQgZmFsbGJhY2sKICAgICAqIE5ldyB0b2tlbnM6IC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwKICAgICAqICAgICAgICAgICAgIC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAtLWJ1dHRvbi1zdXJmYWNlLCAtLWJ1dHRvbi1ob3Zlci1zdXJmYWNlLAogICAgICogICAgICAgICAgICAgLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgLS1wcmltYXJ5LWJhY2tncm91bmQsIC0tbXV0ZWQtZm9yZWdyb3VuZCwKICAgICAqICAgICAgICAgICAgIC0tYm9yZGVyLWRlZmF1bHQsIC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCAtLXdhcm5pbmctYmFja2dyb3VuZCwgLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kCiAgICAgKi8KICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxZTFlMWUpKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpKTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKSk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIC0tbWpyLWFjY2VudC1ob3ZlcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWhvdmVyLCB2YXIoLS1jb21meS1hY2NlbnQsICM3ZWM4ZmYpKTsKICAgIC0tbWpyLWJ0bi1zdXJmYWNlOiB2YXIoLS1idXR0b24tc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItYnRuLWhvdmVyOiB2YXIoLS1idXR0b24taG92ZXItc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItc2VsZWN0ZWQtc3VyZmFjZTogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE1KSk7CgogICAgLyogUmFkaWkg4oCUIHVzZSBDb21meVVJIGRlc2lnbi1zeXN0ZW0gcmFkaXVzIHRva2VucyB3aGVuIGF2YWlsYWJsZSAqLwogICAgLS1tanItci1zbTogdmFyKC0tcmFkaXVzLXNtLCA4cHgpOwogICAgLS1tanItci1tZDogdmFyKC0tcmFkaXVzLW1kLCAxMHB4KTsKICAgIC0tbWpyLXItbGc6IHZhcigtLXJhZGl1cy1sZywgMTJweCk7CgogICAgLyogU3BhY2luZyAqLwogICAgLS1tanItcGFkLXNtOiA4cHg7CiAgICAtLW1qci1wYWQtbWQ6IDEycHg7CiAgICAtLW1qci1wYWQtbGc6IDE2cHg7CgogICAgLyogU2VtYW50aWMgU3RhdHVzIENvbG9ycyDigJQgcHJlZmVyIENvbWZ5VUkgdjEuNDIgc2VtYW50aWMgdG9rZW5zICovCiAgICAtLW1qci1zdGF0dXMtc3VjY2VzczogdmFyKC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtc3VjY2VzcywgIzRjYWY1MCkpOwogICAgLS1tanItc3RhdHVzLXdhcm5pbmc6IHZhcigtLXdhcm5pbmctYmFja2dyb3VuZCwgdmFyKC0tY29tZnktc3RhdHVzLXdhcm5pbmcsICNmZmE3MjYpKTsKICAgIC0tbWpyLXN0YXR1cy1lcnJvcjogdmFyKC0tZGVzdHJ1Y3RpdmUtYmFja2dyb3VuZCwgdmFyKC0tY29tZnktc3RhdHVzLWVycm9yLCAjZjQ0MzM2KSk7CiAgICAtLW1qci1zdGF0dXMtaW5mbzogdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpOwogICAgLS1tanItc3RhdHVzLW5ldXRyYWw6IHZhcigtLWNvbWZ5LXN0YXR1cy1uZXV0cmFsLCAjOWU5ZTllKTsKICAgIC0tbWpyLXN0YXItYWN0aXZlOiAjZmZkNDVhOwoKICAgIC8qIEJhZGdlIGNvbG9ycyAob3ZlcnJpZGRlbiBieSBzZXR0aW5ncykgKi8KICAgIC0tbWpyLWJhZGdlLWltYWdlOiAjMjE5NmYzOwogICAgLS1tanItYmFkZ2UtdmlkZW86ICM5YzI3YjA7CiAgICAtLW1qci1iYWRnZS1hdWRpbzogI2ZmOTgwMDsKICAgIC0tbWpyLWJhZGdlLW1vZGVsM2Q6ICM0Y2FmNTA7CiAgICAtLW1qci1jYXJkLWhvdmVyLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgIzNkM2QzZCk7CiAgICAtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsICM0YTkwZTIpOwogICAgLS1tanItcmF0aW5nLWNvbG9yOiAjZmY5NTAwOwogICAgLS1tanItdGFnLWNvbG9yOiAjNGE5MGUyOwp9CgovKiBNYWtlIHRoZSB0aGVtZSB2aXNpYmx5IGFwcGx5IGV2ZW4gd2l0aCBpbmxpbmUgc3R5bGVzICovCi5tanItYXNzZXRzLW1hbmFnZXIgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyLm1qci1hbS1jb250YWluZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyIHsKICAgIHBhZGRpbmc6IDE0cHggMTZweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgZmxleDogMCAwIGF1dG87CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICByb3ctZ2FwOiAxMHB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLWxlZnQgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgZmxleDogMCAwIGF1dG87CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItdG9vbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWJzIHsKICAgIC8qIFF1ZXVlLWxpa2UgdGFicyAoYWN0aXZlIHBpbGwsIG90aGVycyBhcyB0ZXh0KSAqLwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgZ2FwOiAxMHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiczo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWIgewogICAgcGFkZGluZzogNnB4IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYi5pcy1hY3RpdmUgewogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODUlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0biB7CiAgICB3aWR0aDogMjhweDsKICAgIGhlaWdodDogMjhweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgOCUpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLWNvbnRleHQtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDg1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEZsb2F0aW5nIFZpZXdlciBidXR0b24g4oCUIHRlYWwgZ2xvdyB3aGVuIHZpZXdlciBpcyBvcGVuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItbWZ2LWJ0bi1hY3RpdmUgewogICAgY29sb3I6ICM0ZGQ5YzA7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzcsIDIxNywgMTkyLCAwLjU1KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzcsIDIxNywgMTkyLCAwLjEpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoNzcsIDIxNywgMTkyLCAwLjI1KTsKfQoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1mdi1idG4tYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1lc3NhZ2UtYnRuIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiB2aXNpYmxlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1lc3NhZ2UtaGFzLXVucmVhZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA3NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3MiUsIHZhcigtLW1qci1hY2NlbnQpIDExJSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZXNzYWdlLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIHJpZ2h0OiAtNnB4OwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgcGFkZGluZzogMCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA1NSUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKSk7CiAgICBiYWNrZ3JvdW5kOiAjZWY1MzUwOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bjpkaXNhYmxlZCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWNvbnRyb2w6ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC41OwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgIHRyYW5zZm9ybTogbm9uZTsKICAgIGZpbHRlcjogZ3JheXNjYWxlKDAuNDUpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODglLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA5MiUsIHRyYW5zcGFyZW50KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQgLm1qci1haS1jb250cm9sOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQtYmxvY2sgewogICAgb3BhY2l0eTogMC41ODsKICAgIGZpbHRlcjogZ3JheXNjYWxlKDAuNDUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQtYmxvY2sgLm1qci1haS1jb250cm9sLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQtYmxvY2sgYnV0dG9uIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgovKiBQb3BvdmVycyBjYW4gYmUgbW92ZWQgdG8gYGRvY3VtZW50LmJvZHlgIChwb3J0YWwpIHRvIGF2b2lkIGJlaW5nIGNsaXBwZWQuICovCi5tanItcG9wb3ZlciB7CiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB2YXIoCiAgICAgICAgICAgIC0tZm9udC1pbnRlciwKICAgICAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICAgICAgc3lzdGVtLXVpLAogICAgICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgICAgICBSb2JvdG8sCiAgICAgICAgICAgIEFyaWFsLAogICAgICAgICAgICBzYW5zLXNlcmlmCiAgICAgICAgKQogICAgKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSkpOwoKICAgIC8qIFByb3ZpZGUgZmFsbGJhY2tzIHdoZW4gb3V0c2lkZSBgLm1qci1hc3NldHMtbWFuYWdlcmAgc2NvcGUgKi8KICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItZGVmYXVsdCwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICAtLW1qci1tdXRlZDogdmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCwgdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7CiAgICAtLW1qci1hY2NlbnQ6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSk7CiAgICAtLW1qci1wb3BvdmVyLXotaW5kZXg6IDIxNDc0ODM2NDc7CgogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIHdpZHRoOiBtaW4oMjgwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBtYXgtd2lkdGg6IG1pbigzNjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICB6LWluZGV4OiB2YXIoLS1tanItcG9wb3Zlci16LWluZGV4KTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAzNDBweDsKICAgIHdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMnB4Owp9CgoubWpyLXNvcnQtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDIyMHB4OwogICAgd2lkdGg6IG1pbigyNjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItY29sbGVjdGlvbnMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDI4MHB4OwogICAgd2lkdGg6IG1pbigzMjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItbWVzc2FnZXMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgd2lkdGg6IG1pbig0NjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItaW5saW5lLWRpYWxvZy1tYXNrIHsKICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgIGluc2V0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKfQoKLm1qci1pbmxpbmUtZGlhbG9nLXJvb3QgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgIHdpZHRoOiAxMDAlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItaW5saW5lLWRpYWxvZy1jb250ZW50IHsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItbWVzc2FnZXMtaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLW1lc3NhZ2VzLXRhYnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZXNzYWdlcy10YWIgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA3NiUsIHRyYW5zcGFyZW50KTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTRzIGVhc2UsCiAgICAgICAgY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNHMgZWFzZTsKfQoKLm1qci1tZXNzYWdlcy10YWI6aG92ZXIsCi5tanItbWVzc2FnZXMtdGFiOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmMWYxZjEpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzQlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVzc2FnZXMtcGFuZWxzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKICAgIG1heC1oZWlnaHQ6IG1pbig1MnZoLCA0MjBweCk7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCwKLm1qci1tZXNzYWdlcy1zaG9ydGN1dHMtcGFuZWwgewogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItdGFiLWNvdW50LWJhZGdlIHsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyOCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2VzLXRpdGxlIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA4MiUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLW1lc3NhZ2VzLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLW1lc3NhZ2VzLW1hcmstcmVhZC1idG4gewogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjNjODRiIDQyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmM2M4NGIgMTIlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rOmhvdmVyLAoubWpyLW1lc3NhZ2VzLXN0YXItbGluazpmb2N1cy12aXNpYmxlIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWljb24gewogICAgY29sb3I6ICNmM2M4NGI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWVzc2FnZXMtZW1wdHkgewogICAgcGFkZGluZzogOHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItbWVzc2FnZS1pdGVtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODYlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi5tanItbWVzc2FnZS1pdGVtLS11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDYyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1lc3NhZ2UtaXRlbS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KCi5tanItbWVzc2FnZS1pdGVtLWVtb2ppIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItbWVzc2FnZS1pdGVtLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7Cn0KCi5tanItbWVzc2FnZS1pdGVtLWNhdGVnb3J5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA4NiUsIHRyYW5zcGFyZW50KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZS1pdGVtLW1ldGEgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYm9keSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS1hY3Rpb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBUb2FzdCBIaXN0b3J5IHRhYiDigJQgdW5yZWFkIGluZGljYXRvciBkb3QgKi8KLm1qci10YWItdW5yZWFkLWRvdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogNnB4OwogICAgaGVpZ2h0OiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi8qIEhpc3RvcnkgcGFuZWwgKi8KLm1qci1tZXNzYWdlcy1oaXN0b3J5LXBhbmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItaGlzdG9yeS1oZWFkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgcGFkZGluZzogNHB4IDAgNnB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItaGlzdG9yeS1oZWFkLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBvcGFjaXR5OiAwLjYyOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07Cn0KCi5tanItaGlzdG9yeS1jbGVhci1idG4gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgcGFkZGluZzogMnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBjb2xvcjogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItaGlzdG9yeS1jbGVhci1idG46aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1oaXN0b3J5LWxpc3QgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47Cn0KCi5tanItaGlzdG9yeS1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMiwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSk7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5tanItaGlzdG9yeS1pdGVtLS1lcnJvciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjM2YjZiIDUwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLWhpc3RvcnktaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDUwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLWhpc3RvcnktaXRlbS0tc3VjY2VzcyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjNThjMDdkIDUwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLWhpc3RvcnktaXRlbS1pY29uIHsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tY29udGVudCB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItaGlzdG9yeS1pdGVtLW1zZyB7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLWhpc3RvcnktaXRlbS10aXRsZSB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG9wYWNpdHk6IDAuOTY7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tZGV0YWlsIHsKICAgIG9wYWNpdHk6IDAuODQ7CiAgICBsaW5lLWhlaWdodDogMS40NTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tbWV0YSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWhpc3RvcnktaXRlbS10aW1lIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIG9wYWNpdHk6IDAuNTI7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWNoaXAgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBwYWRkaW5nOiAycHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMywgdmFyKC0tbWpyLXN1cmZhY2UtMikpIDc4JSwgdHJhbnNwYXJlbnQpOwogICAgb3BhY2l0eTogMC43NjsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tYWN0aW9uIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItaGlzdG9yeS1pdGVtLXByb2dyZXNzLXN1bW1hcnkgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43NDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLXByb2dyZXNzLWJhciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogNnB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1maWxsIHsKICAgIGhlaWdodDogMTAwJTsKICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgOTBkZWcsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZiksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsICM1OGMwN2QgNzIlLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSkKICAgICk7Cn0KCi5tanItc2hvcnRjdXQtZ3VpZGUgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogOHB4Owp9CgoubWpyLXNob3J0Y3V0LWd1aWRlLWludHJvIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1OwogICAgb3BhY2l0eTogMC44NDsKfQoKLm1qci1zaG9ydGN1dC1zZWN0aW9uIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODQlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMywgdmFyKC0tbWpyLXN1cmZhY2UtMikpIDcyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXNob3J0Y3V0LXNlY3Rpb24tdGl0bGUgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA4OCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zaG9ydGN1dC1saXN0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1zaG9ydGN1dC1yb3cgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDEzMnB4LCAxNjBweCkgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKfQoKLm1qci1zaG9ydGN1dC1rZXkgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogM3B4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM4JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDEyJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA5MCUsIHRyYW5zcGFyZW50KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMS4yNTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7Cn0KCi5tanItc2hvcnRjdXQtZGVzYyB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgb3BhY2l0eTogMC45MjsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDU2MHB4KSB7CiAgICAubWpyLXNob3J0Y3V0LXJvdyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9CgogICAgLm1qci1zaG9ydGN1dC1rZXkgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIH0KfQoKLm1qci1maWx0ZXItZ3JvdXAgewogICAgcGFkZGluZzogMTBweCAwIDhweDsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1maWx0ZXItZ3JvdXA6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIHBhZGRpbmctYm90dG9tOiAycHg7Cn0KCi5tanItZmlsdGVyLWdyb3VwLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4zNXB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNzglLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKfQoKLm1qci1wb3BvdmVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItcG9wb3Zlci1yb3c6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLXBvcG92ZXItbGFiZWwgewogICAgd2lkdGg6IDU2cHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci1wb3BvdmVyLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKfQoKLm1qci1wb3BvdmVyLXRvZ2dsZSBpbnB1dFt0eXBlPSJjaGVja2JveCJdIHsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItaWNvbiB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXRpdGxlIHsKICAgIG1hcmdpbjogMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcGFkZGluZzogMTZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1icm93c2UgewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKICAgIHBhZGRpbmctdG9wOiA0cHg7Cn0KCi8qIFNjcm9sbGJhcnMgKG1hdGNoIENvbWZ5VUkgZmVlbCkgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWdyaWQtc2Nyb2xsIHsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODUlLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSkgdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDEwcHg7CiAgICBoZWlnaHQ6IDEwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwogICAgYm9yZGVyOiAycHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDpob3Zlcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLWNvcm5lciB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWN1c3RvbS1jb250cm9scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoIHsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoIHsKICAgIHBhZGRpbmctYm90dG9tOiA2cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBtYXJnaW4tYm90dG9tOiA2cHg7Cn0KCi8qIENhcmQgTWV0YWRhdGEgQ29sb3JzICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZXRhLWR1cmF0aW9uIHsKICAgIGNvbG9yOiAjZmZhNzI2OyAvKiBPcmFuZ2UgZm9yIGR1cmF0aW9uICovCiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1yZXMgewogICAgY29sb3I6ICM0ZmMzZjc7IC8qIExpZ2h0IEJsdWUgZm9yIHJlc29sdXRpb24gKi8KICAgIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZXRhLWRhdGUgewogICAgY29sb3I6ICNiOWY2Y2E7IC8qIFBhbGUgR3JlZW4gZm9yIGRhdGUgKi8KICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS10aW1lIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpOwogICAgZm9udC1zaXplOiAwLjllbTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnkgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW46IDAgMCA2cHggMDsKICAgIHBhZGRpbmc6IDAgMCA0cHggMDsKICAgIG1pbi1oZWlnaHQ6IDE2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNjUlLCB0cmFuc3BhcmVudCk7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLyogVG9hc3RzIChnbG9iYWw6IGNhbiBiZSBtb3VudGVkIHVuZGVyIGRvY3VtZW50LmJvZHkpICovCi5tanItdG9hc3QtY29udGFpbmVyIHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMTZweDsKICAgIGxlZnQ6IDUwJTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHotaW5kZXg6IDEwMDAwMDE7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci10b2FzdCB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICMzYTNhM2EpOwogICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1tanItdG9hc3Qtc3RyaXApOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCAjZWZlZmVmKTsKICAgIGZvbnQtZmFtaWx5OiB2YXIoCiAgICAgICAgLS1jb21meS1mb250LAogICAgICAgIHVpLXNhbnMtc2VyaWYsCiAgICAgICAgc3lzdGVtLXVpLAogICAgICAgIC1hcHBsZS1zeXN0ZW0sCiAgICAgICAgIlNlZ29lIFVJIiwKICAgICAgICBSb2JvdG8sCiAgICAgICAgQXJpYWwsCiAgICAgICAgc2Fucy1zZXJpZgogICAgKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjUpOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTVweCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4ycyBlYXNlLW91dCwKICAgICAgICB0cmFuc2Zvcm0gMC4ycyBlYXNlLW91dDsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7CiAgICBtaW4td2lkdGg6IG1pbigyNTBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIG1heC13aWR0aDogbWluKDQwMHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDRweCk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci10b2FzdC5pcy12aXNpYmxlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7Cn0KCi5tanItdG9hc3QtdGV4dCB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLyogVG9hc3QgaWNvbiBzdHlsaW5nICovCi5tanItdG9hc3QtdGV4dDo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1pY29uKTsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgY29sb3I6IHZhcigtLW1qci10b2FzdC1pY29uLWNvbG9yKTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLXdpZHRoOiAxNnB4Owp9CgoubWpyLXRvYXN0LXN1Y2Nlc3MgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcywgdmFyKC0tY29tZnktc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcywgdmFyKC0tY29tZnktc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApKTsKfQoKLm1qci10b2FzdC1lcnJvciB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgdmFyKC0tY29tZnktc3RhdHVzLWVycm9yLCAjZjQ0MzM2KSk7CiAgICAtLW1qci10b2FzdC1pY29uLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLWVycm9yLCB2YXIoLS1jb21meS1zdGF0dXMtZXJyb3IsICNmNDQzMzYpKTsKfQoKLm1qci10b2FzdC13YXJuaW5nIHsKICAgIC0tbWpyLXRvYXN0LXN0cmlwOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsIHZhcigtLWNvbWZ5LXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KSk7CiAgICAtLW1qci10b2FzdC1pY29uLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsIHZhcigtLWNvbWZ5LXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KSk7Cn0KCi5tanItdG9hc3QtaW5mbyB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS10ZXh0IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGV4dC1waWxscyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHJvdy1nYXA6IDRweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTAuNXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtaW4taGVpZ2h0OiAyMnB4OwogICAgbWF4LXdpZHRoOiAyMjBweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbDpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA3NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1MCUsIHZhcigtLW1qci1hY2NlbnQpIDE0JSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwtdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3BhY2l0eTogMC45MjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbC14IHsKICAgIHdpZHRoOiAyMHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsLXg6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXBpbGwgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBoZWlnaHQ6IDEuNzVyZW07CiAgICBwYWRkaW5nOiAwIDEwcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZywgMC41cmVtKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtdG9vbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXBvcG92ZXItYW5jaG9yIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1hZ2VuZGEtaW5wdXQgewogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlLAogICAgICAgIGNvbG9yIDAuMnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4ycyBlYXNlOwp9Ci5tanItYWdlbmRhLWlucHV0Lm1qci1hZ2VuZGEtZmlsbGVkIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDQwJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA2MCUKICAgICk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDgwJSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKQogICAgKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoubWpyLWFnZW5kYS1pbnB1dC5tanItYWdlbmRhLWVtcHR5IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NSUsIHRyYW5zcGFyZW50IDE1JSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1ib3JkZXIpOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7Cn0KCi5tanItYWdlbmRhLWNvbnRhaW5lciB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1hZ2VuZGEtY2FsZW5kYXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFnZW5kYS1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLm1qci1hZ2VuZGEtbW9udGggewogICAgZmxleDogMTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1hZ2VuZGEtbmF2IHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7Cn0KCi5tanItYWdlbmRhLWdyaWQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDcsIG1pbm1heCgwLCAxZnIpKTsKICAgIGdhcDogNnB4OwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItYWdlbmRhLXdlZWtkYXkgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1hZ2VuZGEtZGF5IHsKICAgIGhlaWdodDogMzBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1hZ2VuZGEtZGF5LWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIHJpZ2h0OiAtNXB4OwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgcGFkZGluZzogMCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6ICNlNTM5MzU7CiAgICBjb2xvcjogI2ZmZjsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCAjZTUzOTM1IDY1JSwgI2ZmZmZmZiAzNSUpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoubWpyLWFnZW5kYS1kYXk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKSA1NSUsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNDUlCiAgICApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMikgNDUlLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDEwJQogICAgKTsKfQoKLm1qci1hZ2VuZGEtZGF5OmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1ibGFuayB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1oYXMtYXNzZXRzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgODAlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgMTglLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIpIDgyJQogICAgKTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1zZWxlY3RlZCB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4CiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDU1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFnZW5kYS1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogOHB4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLWFnZW5kYS1jbGVhciwKLm1qci1hZ2VuZGEtcmVmcmVzaCB7CiAgICBmbGV4OiAxOwp9CgoubWpyLW1lbnUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItcHJpbWUtbWVudS1saXN0LAoubWpyLXNvcnQtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItcHJpbWUtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJpdGVtIl0sCi5tanItcHJpbWUtbWVudS1saXN0IFtkYXRhLXBjLXNlY3Rpb249Iml0ZW0iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXByaW1lLW1lbnUgW2RhdGEtcGMtc2VjdGlvbj0iaXRlbWNvbnRlbnQiXSB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1tZW51LWl0ZW0sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1tZW51LWl0ZW06aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW06aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVudS1pdGVtOmFjdGl2ZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbTphY3RpdmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtLWxhYmVsIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZW51LWl0ZW0tY2hlY2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0tY2hlY2sgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgd2lkdGg6IDE2cHg7CiAgICBmbGV4OiAwIDAgMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG9wYWNpdHk6IDA7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDcyJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1tZW51LWl0ZW0gLnBpLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtIC5waSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItY29sbGVjdGlvbnMtbWVudSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLS1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLS1pY29uIC5waSB7CiAgICB3aWR0aDogMTZweDsKICAgIGZsZXg6IDAgMCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLW1lbnUtaXRlbS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1tZW51LWl0ZW0taGludCB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDYyJSwgdmFyKC0tbWpyLW11dGVkKSk7CiAgICBvcGFjaXR5OiAwLjcyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZW51LWl0ZW0tY2hlY2stLXZpc2libGUsCi5tanItbWVudS1pdGVtLmlzLWFjdGl2ZSAubWpyLW1lbnUtaXRlbS1jaGVjayB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1lbnUtZGl2aWRlciB7CiAgICBoZWlnaHQ6IDFweDsKICAgIG1hcmdpbjogNHB4IDA7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbXV0ZWQgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1zdGF0ZS1ibG9jayB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgYm9yZGVyOiAxcHggZGFzaGVkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgbWFyZ2luOiA0cHggMDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zdGF0ZS1ibG9jay5pcy1lcnJvciwKLm1qci1jb250ZXh0LW1lbnUtbm90ZS5pcy1lcnJvciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDgyJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi5tanItY29sbGVjdGlvbi1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiA0OHB4Owp9CgoubWpyLWNvbGxlY3Rpb25zLXZpcnR1YWwtbGlzdCB7CiAgICB3aWR0aDogMTAwJTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLWRlbGV0ZS1idG4gewogICAgd2lkdGg6IDQycHg7CiAgICBmbGV4OiAwIDAgNDJweDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA2NSUsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDQ1JSk7Cn0KCi5tanItZGVsZXRlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA0MCUsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDY1JSk7Cn0KCi5tanItZGVsZXRlLWJ0biAucGkgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yKSA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweCAycHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNnB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIG9wYWNpdHk6IDAuODg7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDcyJSwgdmFyKC0tbWpyLW11dGVkKSk7Cn0KCi5tanItc2VjdGlvbi10aXRsZS0tY3lhbiB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICM2ZmQ0ZmYgNzglLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItc2VjdGlvbi10aXRsZS0tdmlvbGV0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2M0OGRmZiA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLWhpbnQgewogICAgcGFkZGluZzogMCAxMHB4IDRweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDU1JSwgdmFyKC0tbWpyLW11dGVkKSk7Cn0KCi5tanItbWVudS1pdGVtLS1zbWFydCwKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXIgewogICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLW1lbnUtaXRlbS0tY2x1c3RlciB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0IC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICM2ZmQ0ZmYgNzQlLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItbWVudS1pdGVtLS1jbHVzdGVyIC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICNjNDhkZmYgNzQlLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItbWVudS1pdGVtLS1zbWFydDpob3Zlcjpub3QoOmRpc2FibGVkKSwKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXI6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItY2x1c3Rlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1jbHVzdGVyLXRodW1icyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAzcHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1jbHVzdGVyLXRodW1iIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDYwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWNsdXN0ZXItaW5mbyB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWNsdXN0ZXItbmFtZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKfQoKLm1qci1jbHVzdGVyLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNTglLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1jbHVzdGVyLWNyZWF0ZS1idG4gewogICAgZmxleC1zaHJpbms6IDA7CiAgICBwYWRkaW5nOiAzcHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgb3BhY2l0eSAxMjBtcyBlYXNlOwp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjYyOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtaWNvbiAucGkgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtcGlsbCAubWpyLWlucHV0IHsKICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXBpbGw6Zm9jdXMtd2l0aGluIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDY1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBtYXJnaW4tdG9wOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgcGFkZGluZy1yaWdodDogNHB4OwogICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlOwp9CgovKiBHcmlkIGxheW91dCAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgLyogQXZvaWQgb3ZlcmZsb3cgd2hlbiB0aGUgcGFuZWwgYmVjb21lcyBuYXJyb3dlciB0aGFuIHRoZSBtaW4gY2FyZCBzaXplICovCiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgKICAgICAgICBhdXRvLWZpbGwsCiAgICAgICAgbWlubWF4KG1pbigxMDAlLCB2YXIoLS1tanItZ3JpZC1taW4tc2l6ZSwgMTgwcHgpKSwgMWZyKQogICAgKTsKICAgIGdhcDogdmFyKC0tbWpyLWdyaWQtZ2FwLCAxMHB4KTsKICAgIG1hcmdpbi10b3A6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi8qIENhcmQgc2VsZWN0aW9uICsgZm9jdXMgKGtlZXBzIGEgdmlzaWJsZSBpbmRpY2F0b3Igd2hlbiBzaWRlYmFyIGlzIG9wZW4pICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIHsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkLmlzLXNlbGVjdGVkIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDgwJSwgdmFyKC0tY29udGVudC1mZykpLAogICAgICAgIDAgMCAwIDZweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkyKSAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTA7CiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQ6Zm9jdXMtdmlzaWJsZSB7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMCAwIDNweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAxMHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45MikgIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwOwp9CgpAa2V5ZnJhbWVzIG1qci1saXZlLXBsYWNlaG9sZGVyLXNoZWVuIHsKICAgIDAlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTU4JSk7CiAgICAgICAgb3BhY2l0eTogMC4xODsKICAgIH0KICAgIDUwJSB7CiAgICAgICAgb3BhY2l0eTogMC4zNDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1OCUpOwogICAgICAgIG9wYWNpdHk6IDAuMTg7CiAgICB9Cn0KCkBrZXlmcmFtZXMgbWpyLWxpdmUtcGxhY2Vob2xkZXItcHVsc2UgewogICAgMCUsCiAgICAxMDAlIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAxcHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjM0KSwKICAgICAgICAgICAgMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIH0KICAgIDUwJSB7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgICAgMCAwIDAgMXB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC41MiksCiAgICAgICAgICAgIDAgMCAwIDRweCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMTIpLAogICAgICAgICAgICAwIDEycHggMzBweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgfQp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gewogICAgYW5pbWF0aW9uOiBtanItbGl2ZS1wbGFjZWhvbGRlci1wdWxzZSAxLjlzIGVhc2UtaW4tb3V0IGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gLm1qci10aHVtYiB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1wbGFjZWhvbGRlci13YXNoIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAtOCU7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDE7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTE1ZGVnLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwKSAwJSwKICAgICAgICByZ2JhKDk4LCAxOTksIDI1NSwgMC4wOCkgMzAlLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgNTAlLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwLjEyKSA3MCUsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDApIDEwMCUKICAgICk7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXNoZWVuIDIuMnMgbGluZWFyIGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1waWxsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNnB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDEyOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogMCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDE0LCAyMCwgMC43OCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMzQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWxpdmUtcGlsbC1kb3QgewogICAgd2lkdGg6IDdweDsKICAgIGhlaWdodDogN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiAjNzZkNmZmOwogICAgYm94LXNoYWRvdzogMCAwIDAgNHB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4xNik7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItbGl2ZS1wbGFjZWhvbGRlcj0idHJ1ZSJdIC5tanItYXNzZXQtc3RhdHVzLWRvdCB7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXB1bHNlIDEuOXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7Cn0KCi8qIEdyaWQgbG9hZGluZyBvdmVybGF5ICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLWxvYWRpbmctb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgIzAwMCAzNSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjNweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDJweCk7Cn0KCkBrZXlmcmFtZXMgbWpyLXNrZWxldG9uLXNoaW1tZXIgewogICAgMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDEyMCUgMDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjAlIDA7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgewogICAgd2lsbC1jaGFuZ2U6IGJhY2tncm91bmQtcG9zaXRpb247Cn0KCi8qIEdlbmVyaWMgaGVhZGluZ3MgaW5zaWRlIHBhbmVsICovCi5tanItYXNzZXRzLW1hbmFnZXIgaDMsCi5tanItYXNzZXRzLW1hbmFnZXIgaDQgewogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgovKiBQYW5lbHMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXBhbmVsIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZyk7CiAgICBib3gtc2hhZG93OiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtYm94LXNoYWRvdywgMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKfQoKLyogVG9vbGJhciAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdG9vbGJhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IHZhcigtLW1qci1wYWQtbWQpOwp9CgovKiBCdXR0b25zICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA3cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bjphY3RpdmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC41NTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4ubWpyLXByaW1hcnkgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTQlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4gewogICAgLyogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBpZiBwcmVzZW50ICovCiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKfQoKLyogSW5wdXRzIC8gc2VsZWN0cyAodXNlZCBpbnNpZGUgcG9ydGFsZWQgcG9wb3ZlcnMgdG9vKSAqLwoubWpyLWlucHV0LAoubWpyLXNlbGVjdCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc2VsZWN0IHsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgb3V0bGluZTogbm9uZTsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQ6OnBsYWNlaG9sZGVyIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW11dGVkKSA4MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1pbnB1dDpmb2N1cywKLm1qci1zZWxlY3Q6Zm9jdXMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dDpmb2N1cywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXNlbGVjdDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaW5wdXQsCi5tanItc2VsZWN0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zZWxlY3QgewogICAgLyogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBpZiBwcmVzZW50ICovCiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDhweDsKICAgIG1pbi1oZWlnaHQ6IDM0cHg7CiAgICBwYWRkaW5nOiAwIDlweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0W2RhdGEtcC1kaXNhYmxlZD0idHJ1ZSJdIHsKICAgIG9wYWNpdHk6IDAuNTU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0IFtkYXRhLXBjLXNlY3Rpb249ImxhYmVsIl0gewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdCBbZGF0YS1wYy1zZWN0aW9uPSJkcm9wZG93biJdIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMThweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgewogICAgbWluLXdpZHRoOiB2YXIoLS1wLXNlbGVjdC1vdmVybGF5LXdpZHRoLCAxMnJlbSk7CiAgICBtYXgtd2lkdGg6IG1pbigzMjBweCwgY2FsYygxMDB2dyAtIDMycHgpKTsKICAgIG1heC1oZWlnaHQ6IG1pbigzMjBweCwgY2FsYygxMDB2aCAtIDMycHgpKTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgcGFkZGluZzogNHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM4KTsKICAgIHotaW5kZXg6IGNhbGModmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCwgMjE0NzQ4MzY0NykgKyAxKTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXBjLXNlY3Rpb249Imxpc3QiXSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbjogMDsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXSB7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogY2FsYyh2YXIoLS1tanItci1tZCkgLSAycHgpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuMjU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcGMtc2VjdGlvbj0ib3B0aW9uIl06aG92ZXIsCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wLWhpZ2hsaWdodD0idHJ1ZSJdIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoKLyogVGFiczogb3ZlcnJpZGRlbiBhYm92ZSB3aXRoIHF1ZXVlLWxpa2Ugc3R5bGUgKi8KCi8qIFJlbW92ZWQgcmVkdW5kYW50IHRhYiBkZWNsYXJhdGlvbnMgdGhhdCB3ZXJlIHVzaW5nICFpbXBvcnRhbnQgKi8KCi8qIE11dGVkIHRleHQgaGVscGVyICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tdXRlZCB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKfQoKLyogR3JpZCArIGNhcmRzIChvdmVycmlkZSBpbmxpbmUgc3R5bGVzIGZyb20gQ2FyZC5qcykgKi8KLm1qci1hc3NldHMtbWFuYWdlciAjbWpyLWFzc2V0cy1ncmlkIHsKICAgIGdhcDogMTBweCAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSkgIWltcG9ydGFudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZykgIWltcG9ydGFudDsKICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAxMjBtcyBlYXNlICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkOmhvdmVyLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA1NSUsCiAgICAgICAgdmFyKC0tbWpyLWJvcmRlcikKICAgICkgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1qci1jYXJkLWhvdmVyLWNvbG9yKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCA4cHggMjJweCByZ2JhKDAsIDAsIDAsIDAuMjUpICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIGltZywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgdmlkZW8sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYi1tZWRpYSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgIG9iamVjdC1maXQ6IGNvdmVyICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiB7CiAgICB3aWR0aDogMTAwJTsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODAlLCB0cmFuc3BhcmVudCk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBLZWVwIGdlbmVyYXRpb24tdGltZSBiYWRnZSBwaW5uZWQgdG8gdGhlIHRodW1ibmFpbCBjb3JuZXIgYWNyb3NzIGdyaWQvZmVlZCB2YXJpYW50cy4KICAgVGhlICFpbXBvcnRhbnQgb3ZlcnJpZGVzIGFyZSBpbnRlbnRpb25hbDogR2VuVGltZUJhZGdlLnZ1ZSB1c2VzIDxzdHlsZSBzY29wZWQ+IHdob3NlCiAgIGhhc2hlZCBjbGFzcyBoYXMgdGhlIHNhbWUgc3BlY2lmaWNpdHkgYXMgZ2xvYmFsIHNlbGVjdG9ycy4gV2l0aG91dCAhaW1wb3J0YW50LCBhCiAgIGNvbmZsaWN0aW5nIHJ1bGUgKGUuZy4gZnJvbSBhIHRoZW1lIGV4dGVuc2lvbiBvciBhbiBvbGRlciBub24tc2NvcGVkIGNvbnRleHQpIHRoYXQgc2V0cwogICBsZWZ0OjAvdG9wOjAgd291bGQgd2luLiBsZWZ0OmF1dG8gKyB0b3A6YXV0byBleHBsaWNpdGx5IGNhbmNlbCBhbnkgc3VjaCBhY2NpZGVudGFsIHJlc2V0LiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLWdlbnRpbWUtYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItZ2VudGltZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgIHJpZ2h0OiA2cHggIWltcG9ydGFudDsKICAgIGJvdHRvbTogNnB4ICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB0b3A6IGF1dG8gIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAycHggNnB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSAhaW1wb3J0YW50OwogICAgZm9udC13ZWlnaHQ6IDgwMCAhaW1wb3J0YW50OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE1ZW07CiAgICB0ZXh0LXNoYWRvdzoKICAgICAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjkpLAogICAgICAgIDAgMCAxMHB4IGNvbG9yLW1peChpbiBzcmdiLCBjdXJyZW50Q29sb3IgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEtlZXAgcmF0aW5nL3RhZ3MgYmFkZ2VzIGFuY2hvcmVkIGV2ZW4gd2hlbiBzY29wZWQgVnVlIHN0eWxlcyBhcmUgbm90IGFwcGxpZWQgYWZ0ZXIgcmVsb2FkLgogICBEbyBub3QgZm9yY2UgZGlzcGxheSBoZXJlIHNvIGdyaWQgdmlzaWJpbGl0eSB0b2dnbGVzICgubWpyLXNob3ctYmFkZ2VzLSopIHN0aWxsIGNvbnRyb2wgc2hvdy9oaWRlLiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLXJhdGluZy1iYWRnZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iID4gLm1qci1yYXRpbmctYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICB0b3A6IDZweCAhaW1wb3J0YW50OwogICAgcmlnaHQ6IDZweCAhaW1wb3J0YW50OwogICAgbGVmdDogYXV0byAhaW1wb3J0YW50OwogICAgYm90dG9tOiBhdXRvICFpbXBvcnRhbnQ7CiAgICB6LWluZGV4OiAxMCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yNSk7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggNnB4IHJnYmEoMCwgMCwgMCwgMC42KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iID4gLm1qci10YWdzLWJhZGdlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWIgPiAubWpyLXRhZ3MtYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiA2cHggIWltcG9ydGFudDsKICAgIGJvdHRvbTogNnB4ICFpbXBvcnRhbnQ7CiAgICByaWdodDogYXV0byAhaW1wb3J0YW50OwogICAgdG9wOiBhdXRvICFpbXBvcnRhbnQ7CiAgICB6LWluZGV4OiAxMCAhaW1wb3J0YW50OwogICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA1NnB4KTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMyk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYi1wbGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZ3JpZDsKICAgIHBsYWNlLWl0ZW1zOiBjZW50ZXI7CiAgICBmb250LXNpemU6IDI4cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgdGV4dC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC43KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlOwp9CgovKiDilIDilIDilIAgSG92ZXIgaW5mbyBvdmVybGF5IChwb3NpdGl2ZSBwcm9tcHQgKyBnZW4gdGltZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgIFNsaWRlcyB1cCBmcm9tIHRoZSBib3R0b20gb2YgLm1qci10aHVtYiBvbiBjYXJkIGhvdmVyLgogICBwb2ludGVyLWV2ZW50czogbm9uZSAg4oaSIG5ldmVyIGJsb2NrcyB2aWRlbyBtb3VzZWVudGVyIC8gcGxheS1vbi1ob3Zlci4KICAgei1pbmRleDogMiAgICAgICAgICAg4oaSIHNpdHMgYWJvdmUgdGhlIHRodW1ibmFpbCBpbWFnZSwgYmVsb3cgdGhlIHBsYXkgaWNvbi4KICAgQ29udHJvbGxlZCBieSB0aGUgLm1qci1zaG93LWhvdmVyLWluZm8gY2xhc3Mgb24gdGhlIGdyaWQgY29udGFpbmVyLCB3aGljaAogICBpcyB0b2dnbGVkIHZpYSB0aGUgIlNob3cgcHJvbXB0IG9uIGhvdmVyIiBzZXR0aW5nLgogICDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3R0b206IDA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBwYWRkaW5nOiAyMnB4IDhweCA3cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCB0cmFuc3BhcmVudCAwJSwgcmdiYSgwLCAwLCAwLCAwLjc4KSAxMDAlKTsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg1cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDE1MG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDE1MG1zIGVhc2U7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogM3B4OwogICAgei1pbmRleDogMjsKfQovKiBPbmx5IHJldmVhbCBvbiBob3ZlciB3aGVuIHRoZSBzZXR0aW5nIGlzIGVuYWJsZWQgKGNsYXNzIG9uIGdyaWQgY29udGFpbmVyKSAqLwoubWpyLWdyaWQubWpyLXNob3ctaG92ZXItaW5mbyAubWpyLWNhcmQ6aG92ZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gewogICAgb3BhY2l0eTogMTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKfQoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIC5tanItaG92ZXItcHJvbXB0IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDsKICAgIC13ZWJraXQtbGluZS1jbGFtcDogMjsKICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgb3BhY2l0eTogMC45OwogICAgZm9udC1zaXplOiA5LjVweDsKfQoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIC5tanItaG92ZXItZ2VudGltZSB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIxMCwgMTIwLCAwLjk1KTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDlweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07Cn0KQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gewogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMG1zOwogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgIH0KfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtbWV0YSB7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luLWJvdHRvbTogMnB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1kZXRhaWxzIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG9wYWNpdHk6IDAuODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUtdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgovKiBSYXRpbmcgJiBUYWdzIEVkaXRvcnMgKi8KQGtleWZyYW1lcyBmYWRlSW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KLyoqCiAqIEFyY2hpdmVkIENTUyBTdHlsZXMgLSBSYXRpbmcgYW5kIFRhZ3MKICogVGhlc2Ugc3R5bGVzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZW1lLWNvbWZ5LmNzcwogKi8KCi8qIEFuaW1hdGlvbnMgKi8KQGtleWZyYW1lcyBzbGlkZUluUmlnaHQgewogICAgZnJvbSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICB9Cn0KCi8qIFBvcG92ZXJzICovCi5tanItcmF0aW5nLXBvcG92ZXIsCi5tanItdGFncy1wb3BvdmVyIHsKICAgIGFuaW1hdGlvbjogZmFkZUluIDAuMnMgZWFzZTsKfQoKLm1qci1yYXRpbmctcG9wb3ZlciwKLm1qci10YWdzLXBvcG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHBhZGRpbmc6IDhweDsKfQoKLyogUmF0aW5nIEVkaXRvciAqLwoubWpyLXJhdGluZy1lZGl0b3IgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAycHg7Cn0KCi5tanItcmF0aW5nLXN0YXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2U7Cn0KCi5tanItcmF0aW5nLXN0YXI6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSAzNSUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb21meS1tZW51LXNlY29uZGFyeS1iZywgIzMzMykgNjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItcmF0aW5nLWVkaXRvciAubWpyLXJhdGluZy1zdGFyOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4yKSAhaW1wb3J0YW50Owp9CgoubWpyLXJhdGluZy1lZGl0b3IgLm1qci1yYXRpbmctc3RhcjphY3RpdmUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KSAhaW1wb3J0YW50Owp9CgovKiBUYWdzIEVkaXRvciAqLwoubWpyLXRhZ3MtZWRpdG9yIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgbWluLXdpZHRoOiAyNTBweDsKICAgIG1heC13aWR0aDogbWluKDM1MHB4LCBjYWxjKDEwMHZ3IC0gMjBweCkpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7Cn0KCi5tanItdGFncy1lZGl0b3IuaXMtZGlzYWJsZWQgewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCi5tanItdGFncy1kaXNwbGF5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDMycHg7Cn0KCi5tanItdGFncy1lbXB0eSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLm1qci10YWctY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMjQlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNDAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLm1qci10YWctY2hpcC1yZW1vdmUgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IDA7CiAgICBib3JkZXItcmFkaXVzOiAwOwogICAgYm94LXNoYWRvdzogbm9uZTsKICAgIGNvbG9yOiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC43Owp9CgoubWpyLXRhZy1jaGlwLXJlbW92ZTpkaXNhYmxlZCB7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItdGFncy1pbnB1dC13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci10YWctaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXRhZy1pbnB1dDpmb2N1cyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODglLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCkgIWltcG9ydGFudDsKfQoKLm1qci10YWctY2hpcDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMzQlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpICFpbXBvcnRhbnQ7Cn0KCi5tanItdGFncy1kcm9wZG93biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwMCU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG1heC1oZWlnaHQ6IDE1MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHotaW5kZXg6IDEwMDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXRhZy1zdWdnZXN0aW9uIHsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci10YWctc3VnZ2VzdGlvbi5pcy1hY3RpdmUsCi5tanItdGFnLXN1Z2dlc3Rpb246aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDI4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7Cn0KCi8qIEJhZGdlcyBJbnRlcmFjdGl2ZSAqLwoubWpyLXJhdGluZy1iYWRnZSwKLm1qci10YWdzLWJhZGdlIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItcmF0aW5nLWJhZGdlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItcmF0aW5nLWNvbG9yKSAhaW1wb3J0YW50Owp9CgoubWpyLXRhZ3MtYmFkZ2UgewogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpICFpbXBvcnRhbnQ7Cn0KCi5tanItcmF0aW5nLWJhZGdlOmhvdmVyLAoubWpyLXRhZ3MtYmFkZ2U6aG92ZXIgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KCi8qIFNjcm9sbGJhciBmb3IgdGFncyBkcm9wZG93biAqLwoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA2cHg7Cn0KCi5tanItdGFncy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSA0OCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi8qIFNpZGViYXIgKGNhbiBiZSBsZWZ0IG9yIHJpZ2h0KSAqLwoubWpyLXNpZGViYXIgewogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXdyYXAgewogICAgbWFyZ2luOiAwIDAgMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kLCA4cHgpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUgewogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNlYWVhZWEpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLXdvcmtmbG93LXRyZWUtc2Nyb2xsIHsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgcGFkZGluZzogMnB4IDRweCA2cHg7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1saXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtLCA2cHgpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1OCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXRvZ2dsZSB7CiAgICB3aWR0aDogMTRweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NCkpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtdG9nZ2xlW2RhdGEtcC1sZWFmPSJ0cnVlIl0gewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtaWNvbiB7CiAgICB3aWR0aDogOHB4OwogICAgZmxleDogMCAwIDhweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzAlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICBmb250LXNpemU6IDdweDsKfQoKLm1qci13b3JrZmxvdy10cmVlLWxhYmVsIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDEgMSBhdXRvOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1uYW1lIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1ub2RlLXR5cGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbXV0ZWQpIDc1JSwgdmFyKC0tY29udGVudC1mZykpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1zaWRlYmFyLmlzLW9wZW4gewogICAgLyogQm9yZGVyIGlzIHNldCBkeW5hbWljYWxseSBiYXNlZCBvbiBwb3NpdGlvbiAqLwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA4cHg7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7Cn0KCi8qIEN1c3RvbSBSb290cyBQb3BvdmVyIFN0eWxpbmcgKi8KLm1qci1jdXN0b20tcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMwMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBwYWRkaW5nOiAxMnB4Owp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3c6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICB3aWR0aDogNjBweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXNlbGVjdCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItYnRuIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1yaWdodDogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA4MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1zZWN0aW9uIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItc2VjdGlvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMykgIWltcG9ydGFudDsKfQoKLyogSW5saW5lIFNpZGViYXIgKHdpZHRoLWJhc2VkIHRyYW5zaXRpb25zIGxpa2UgYXJjaGl2ZWQgdmVyc2lvbikgKi8KLm1qci1pbmxpbmUtc2lkZWJhciB7CiAgICB3aWR0aDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC13aWR0aDogNDgwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgd2lkdGggMC4zcyBlYXNlLAogICAgICAgIG1pbi13aWR0aCAwLjNzIGVhc2U7Cn0KCi5tanItaW5saW5lLXNpZGViYXIuaXMtb3BlbiB7CiAgICB3aWR0aDogNDAwcHg7CiAgICBtaW4td2lkdGg6IDI2MHB4Owp9CgovKiBTcGFjZSBiZXR3ZWVuIHNpZGViYXIgYW5kIGdyaWQgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBnYXA6IDA7Cn0KCi8qIEJvcmRlciBiYXNlZCBvbiBwb3NpdGlvbiAqLwoubWpyLWlubGluZS1zaWRlYmFyW2RhdGEtcG9zaXRpb249ImxlZnQiXSB7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1pbmxpbmUtc2lkZWJhcltkYXRhLXBvc2l0aW9uPSJyaWdodCJdIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi8qIFNpZGViYXIgcGxhY2Vob2xkZXIgKi8KLm1qci1zaWRlYmFyLXBsYWNlaG9sZGVyIHsKICAgIHBhZGRpbmc6IDIwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi8qID09PT09PT09PT0gVmlld2VyIENvbXBvbmVudCA9PT09PT09PT09ICovCi5tanItdmlld2VyLW92ZXJsYXkgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgYm90dG9tOiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjk1KTsKICAgIC8qIFNpdCBhYm92ZSBNRlYgKDEwMDAwKSBzbyB0aGUgZnVsbCB2aWV3ZXIgYWx3YXlzIGNvdmVycyB0aGUgZmxvYXRpbmcgcGFuZWwgKi8KICAgIHotaW5kZXg6IDEwMDAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQovKiBGYWRlLWluOiBhbmltYXRpb24gcmUtdHJpZ2dlcnMgZWFjaCB0aW1lIEpTIHN3aXRjaGVzIGRpc3BsYXkgYmFjayB0byBmbGV4ICovCi5tanItdmlld2VyLW92ZXJsYXlbc3R5bGUqPSJmbGV4Il0gewogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjE4cyBlYXNlLW91dDsKfQoKQGtleWZyYW1lcyBtanItZmFkZS1pbiB7CiAgICBmcm9tIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OTUpOwogICAgfQogICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgIH0KfQoKLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTJweCAyMHB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE3MGRlZywgcmdiYSgyNCwgMjcsIDMzLCAwLjk2KSwgcmdiYSgxNywgMTksIDI1LCAwLjk3KSk7CiAgICBib3JkZXItYm90dG9tOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMik7CiAgICBjb2xvcjogd2hpdGU7Cn0KCi5tanItdmlld2VyLWZpbGVuYW1lIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBtYXgtd2lkdGg6IDQwMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDZweDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIGJ1dHRvbiB7CiAgICBwYWRkaW5nOiA0cHggMTJweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4xKSwgcmdiYSgyMDYsIDIxMSwgMjE4LCAwLjAzKSk7CiAgICBib3JkZXI6IDAuOHB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4zKTsKICAgIGNvbG9yOiByZ2JhKDIzMCwgMjMzLCAyMzgsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTZzOwp9CgoubWpyLXZpZXdlci1tb2RlLWJ1dHRvbnMgYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4xNCksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNikpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuNDIpOwp9CgovKiBWaWV3ZXIgY2xvc2UgYnV0dG9uIHBpbm5lZCB0byBvdmVybGF5IGNvcm5lciAqLwoubWpyLXZpZXdlci1jbG9zZSwKLm1qci12aWV3ZXItZnMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjYpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wOCksIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wMikpLAogICAgICAgIHJnYmEoMjAsIDIzLCAyOSwgMC45NCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1jbG9zZSB7CiAgICBjb2xvcjogI2ZmZjRmNCAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIwNSwgODIsIDgyLCAwLjUpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA1LCA4MiwgODIsIDAuMyksIHJnYmEoMjA1LCA4MiwgODIsIDAuMTIpKSwKICAgICAgICByZ2JhKDU4LCAxOCwgMTgsIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDIxOSwgMjE5LCAwLjE2KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyMDUsIDgyLCA4MiwgMC4wOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2U6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMzgpLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMTYpKSwKICAgICAgICByZ2JhKDcwLCAxOCwgMTgsIDAuOTcpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjM1LCAxMzgsIDEzOCwgMC42NCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItZnM6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMTQpLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDYpKSwKICAgICAgICByZ2JhKDIzLCAyNiwgMzIsIDAuOTUpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC4zOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2UgLnBpIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZXdlci1jb250ZW50IHsKICAgIGZsZXg6IDE7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItc2luZ2xlLAoubWpyLXZpZXdlci1hYiwKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKfQoKLm1qci12aWV3ZXItc2luZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLXNpbmdsZSBpbWcsCi5tanItdmlld2VyLXNpbmdsZSB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzOwp9CgoubWpyLXZpZXdlci1hYiB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLXZpZXdlci1zaWRlYnlzaWRlIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgZ2FwOiAycHg7Cn0KCi5tanItdmlld2VyLXNpZGVieXNpZGUgPiBkaXYgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwp9CgoubWpyLXZpZXdlci1zaWRlYnlzaWRlIGltZywKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKfQoKLm1qci12aWV3ZXItZm9vdGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAxMnB4IDIwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgY29sb3I6IHdoaXRlOwogICAgZ2FwOiAyMHB4Owp9CgoubWpyLXZpZXdlci1mb290ZXIgYnV0dG9uIHsKICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBjb2xvcjogd2hpdGU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKfQoKLm1qci12aWV3ZXItZm9vdGVyIGJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7Cn0KCi5tanItdmlld2VyLW5hdiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTRweDsKfQoKLm1qci12aWV3ZXItbmF2LWJ0biB7CiAgICB3aWR0aDogNDBweCAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiA0MHB4ICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuNDIpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTk0LCAyMDAsIDIwOCwgMC4xOCksIHJnYmEoMTk0LCAyMDAsIDIwOCwgMC4wNykpLAogICAgICAgIHJnYmEoMzQsIDM4LCA0NCwgMC45MikgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDIzNCwgMjM2LCAyNDAsIDAuOTYpICFpbXBvcnRhbnQ7CiAgICBmb250LXNpemU6IDIwcHggIWltcG9ydGFudDsKICAgIGZvbnQtd2VpZ2h0OiA3MDAgIWltcG9ydGFudDsKICAgIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7CiAgICB0ZXh0LXNoYWRvdzogbm9uZTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDAuMTRzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjE0cyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjE0cyBlYXNlICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLW5hdi1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuNTYpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA3LCAyMTIsIDIxOSwgMC4yKSwgcmdiYSgyMDcsIDIxMiwgMjE5LCAwLjEpKSwKICAgICAgICByZ2JhKDM5LCA0MywgNDksIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKfQoKLm1qci12aWV3ZXItbmF2LWJ0bjphY3RpdmU6bm90KDpkaXNhYmxlZCkgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHNjYWxlKDAuOTgpOwogICAgZmlsdGVyOiBub25lOwp9CgoubWpyLXZpZXdlci1uYXYtYnRuOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuMzQgIWltcG9ydGFudDsKICAgIGZpbHRlcjogZ3JheXNjYWxlKDAuMjUpOwogICAgYm94LXNoYWRvdzogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1pbmRleCB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBtaW4td2lkdGg6IDc0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICAgIGNvbG9yOiByZ2JhKDIyNiwgMjI4LCAyMzMsIDAuOTQpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxOTcsIDIwMywgMjExLCAwLjE1KSwgcmdiYSgxOTcsIDIwMywgMjExLCAwLjA2KSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NywgMjAzLCAyMTEsIDAuMzQpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBwYWRkaW5nOiA1cHggMTFweDsKICAgIHRleHQtc2hhZG93OiBub25lOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwp9CgoubWpyLXZpZXdlci1wbGF5ZXJiYXIgewogICAgYm9yZGVyLXJhZGl1czogMThweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk0LCAyMDAsIDIwOCwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgdG9wIGxlZnQsIHJnYmEoOTAsIDE1MCwgMjU1LCAwLjA4KSwgdHJhbnNwYXJlbnQgMzYlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTYwZGVnLCByZ2JhKDIwLCAyNCwgMzAsIDAuOTQpLCByZ2JhKDEyLCAxNSwgMjEsIDAuOTgpKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpLAogICAgICAgIDAgMTZweCAzNnB4IHJnYmEoMCwgMCwgMCwgMC4yMik7CiAgICAvKiBvdmVyZmxvdyBtdXN0IHN0YXkgdmlzaWJsZSBzbyB0aGUgc2VlayBydWxlciB0aWNrcy9sYWJlbHMgKHRvcDotMTZweCAvIHRvcDotMzRweCkKICAgICAgIHRoYXQgYXJlIGFic29sdXRlbHkgcG9zaXRpb25lZCBhYm92ZSB0aGUgc2VlayBiYXIgYXJlIG5vdCBjbGlwcGVkLiAqLwogICAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi5tanItdmlld2VyLXRvb2xzIHsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKICAgIGp1c3RpZnktY29udGVudDogc3RyZXRjaDsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZXdlci1oZWFkZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoubWpyLXZpZXdlci1oZWFkZXI6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMThweDsKICAgIHJpZ2h0OiAxOHB4OwogICAgdG9wOiA0NHB4OwogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHRyYW5zcGFyZW50LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLCB0cmFuc3BhcmVudCk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIG9wYWNpdHk6IDAuNzsKfQoKLm1qci12aWV3ZXItaGVhZGVyLW1ldGEgewogICAgbWluLWhlaWdodDogMzBweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzNSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXZpZXdlci1oZWFkZXItdG9wIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBwYWRkaW5nLXJpZ2h0OiA4NHB4OwogICAgcGFkZGluZy1sZWZ0OiAxMnB4Owp9CgoubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tbGVmdCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleDogMSAxIDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDEgMSBhdXRvOwp9CgoubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGZsZXg6IDEgMSAwOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci12aWV3ZXItdGl0bGUtd3JhcCB7CiAgICB3aWR0aDogYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC13aWR0aDogbWluKDEwMCUsIGNhbGMoMTAwdncgLSAyMjBweCkpOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMTJweDsKfQoKLm1qci12aWV3ZXItdGl0bGUtbGluZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItdmlld2VyLWZpbGVuYW1lIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW46IDAgYXV0bzsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItYmFkZ2VzIHsKICAgIGdhcDogNHB4Owp9CgoubWpyLXZpZXdlci10aXRsZS1saW5lIC5tanItdmlld2VyLWJhZGdlcyB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tbGVmdCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBtYXgtd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhLS1sZWZ0OmVtcHR5IHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhLS1yaWdodCB7CiAgICBqdXN0aWZ5LXNlbGY6IGVuZDsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKICAgIG1heC13aWR0aDogMTAwJTsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgcGFkZGluZzogM3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZGVjayB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBtaW4td2lkdGg6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpLAogICAgICAgIHJnYmEoMTAsIDEyLCAxNiwgMC4yNCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwKICAgICAgICAwIDZweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4xMik7CiAgICBwYWRkaW5nOiA1cHggNnB4OwogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMCAwIGF1dG8gMDsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSwgdHJhbnNwYXJlbnQpOwogICAgb3BhY2l0eTogMC43OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWhlYWQgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtaGVhZGluZyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMXB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1leWVicm93IHsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjE0ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40Nik7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwogICAgY29sb3I6IHJnYmEoMjQ4LCAyNTAsIDI1MiwgMC45Nik7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJncmFkZSJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0ib3ZlcmxheSJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iaW5zcGVjdCJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHksCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9ImFjdGlvbnMiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5LAoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJpbmZvIl0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cCB7CiAgICB3aWR0aDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBwYWRkaW5nOiA1cHggN3B4OwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzNSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpLAogICAgICAgIHJnYmEoMTAsIDEyLCAxNiwgMC4xOCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7CiAgICBtaW4td2lkdGg6IGZpdC1jb250ZW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc1KTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjE1cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW3N0eWxlKj0iLS1tanItZ3JvdXAtYWNjZW50Il0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwgewogICAgY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuOSk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW3N0eWxlKj0iLS1tanItZ3JvdXAtYWNjZW50Il0gewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjM1KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY2hhbm5lbCJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCB7CiAgICBtaW4td2lkdGg6IDQycHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9Im92ZXJsYXkiXSAubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIHsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSB7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgYWxpZ24tY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjaGFubmVsIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImV4cG9zdXJlIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImdhbW1hIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImFuYWx5c2lzIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNvbXBhcmUiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYXVkaW8tdml6Il0gewogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb25zLAoubWpyLXZpZXdlci10b29scy1tZXRhIHsKICAgIHdpZHRoOiBhdXRvOwogICAgbWluLWhlaWdodDogMzBweDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBwYWRkaW5nOiA1cHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA2cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9uLS1wcmltYXJ5IHsKICAgIG1hcmdpbi1sZWZ0OiAwOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb24gKyAubWpyLXZpZXdlci10b29scy1hY3Rpb24gewogICAgbWFyZ2luLWxlZnQ6IDRweDsKfQoKLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0IHsKICAgIG1pbi1oZWlnaHQ6IDI0cHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXJhbmdlLWlucHV0IHsKICAgIHdpZHRoOiA5MnB4ICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLXJhbmdlIHNwYW4gewogICAgZm9udC1zaXplOiAxMXB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogMTQ4MHB4KSB7CiAgICAubWpyLXZpZXdlci10b29scy1kZWNrIHsKICAgICAgICBnYXA6IDZweDsKICAgIH0KfQoKQG1lZGlhIChtYXgtd2lkdGg6IDEyMjBweCkgewogICAgLm1qci12aWV3ZXItaGVhZGVyLXRvcCB7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDg0cHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAwOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIsCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXg6IDEgMSAxMDAlOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1yaWdodCB7CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXg6IDEgMSAxMDAlOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1tZXRhLS1yaWdodCB7CiAgICAgICAganVzdGlmeS1zZWxmOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtZGVjayB7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtcGFuZWwsCiAgICAubWpyLXZpZXdlci10b29scy1hY3Rpb25zLAogICAgLm1qci12aWV3ZXItdG9vbHMtbWV0YSwKICAgIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1tZXRhIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB9Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNvbXBhcmUiXVtkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGJhY2tncm91bmQ6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuMSk7CiAgICBib3JkZXItbGVmdC1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC42KTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjIyKTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY29tcGFyZSJdW2RhdGEtYWN0aXZlPSIxIl0gLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC42KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjE4KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0OmZvY3VzIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSg2NCwgMTYwLCAyNTUsIDAuMjIpOwp9CgovKiBOYXRpdmUgZHJvcGRvd25zOiBoaW50IGRhcmsgVUkgYW5kIHN0eWxlIG9wdGlvbnMgd2hlbiB0aGUgYnJvd3NlciBhbGxvd3MgaXQuICovCi5tanItdmlld2VyLWhlYWRlciB7CiAgICBjb2xvci1zY2hlbWU6IGRhcms7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdCB7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQ2KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45MikgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogOHB4ICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdCBvcHRpb24gewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwp9CgoubWpyLXZpZXdlci10b29scy1yYW5nZS1pbnB1dDpmb2N1cyB7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXZpZXdlci10b29sLWJ0bi0tcmVzZXQgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2wtYnRuIHsKICAgIG1pbi1oZWlnaHQ6IDI0cHggIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXdpZHRoOiAxcHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA3NSksCiAgICAgICAgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyNSkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjE2KSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgZm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAwIDhweCAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29sLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4yNCkgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyMjAsIDIyNCwgMjMwLCAwLjEpLAogICAgICAgIHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4wMzUpCiAgICApICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImFuYWx5c2lzIl0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjU1LCAxNjYsIDkyLCAwLjIyKSwKICAgICAgICByZ2JhKDI1NSwgMTE2LCA2NCwgMC4wOCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDE2MCwgOTIsIDAuMzQpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIzNiwgMjI0LCAwLjk2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl06aG92ZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDI1NSwgMTgwLCAxMDgsIDAuMjgpLAogICAgICAgIHJnYmEoMjU1LCAxMjgsIDcyLCAwLjE0KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMTg0LCAxMTYsIDAuNDYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktZ3VpZGVzIl0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoOTIsIDIxOSwgMTg2LCAwLjIyKSwKICAgICAgICByZ2JhKDQ0LCAxNzAsIDE0NCwgMC4wOCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg5MiwgMjE5LCAxODYsIDAuMzQpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyMjQsIDI1NSwgMjQ4LCAwLjk2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl06aG92ZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDEwMiwgMjMwLCAxOTYsIDAuMjgpLAogICAgICAgIHJnYmEoNTIsIDE4MiwgMTU2LCAwLjE0KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDExMCwgMjM2LCAyMDIsIDAuNDYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktaW5zcGVjdCJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDEyNCwgMTY2LCAyNTUsIDAuMjIpLAogICAgICAgIHJnYmEoMTA5LCA4OCwgMjIyLCAwLjA4KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDEzMiwgMTcwLCAyNTUsIDAuMzYpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyMzYsIDI0MiwgMjU1LCAwLjk3KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgxMzgsIDE4MCwgMjU1LCAwLjMpLAogICAgICAgIHJnYmEoMTI0LCAxMDAsIDIzMiwgMC4xNCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxNDgsIDE4OCwgMjU1LCAwLjQ4KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGZpbHRlcjogc2F0dXJhdGUoMS4xMikgYnJpZ2h0bmVzcygxLjA0KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNiksCiAgICAgICAgMCA4cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMTYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLWhlbHAgewogICAgYm9yZGVyLXJhZGl1czogMTRweCAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxMywgMTcsIDIyLCAwLjk2KSwgcmdiYSg4LCAxMSwgMTYsIDAuOTgpKSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCAxOHB4IDM0cHggcmdiYSgwLCAwLCAwLCAwLjM0KSAhaW1wb3J0YW50Owp9CgpAbWVkaWEgKG1heC13aWR0aDogMTIyMHB4KSB7CiAgICAubWpyLXZpZXdlci10b29scyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucyB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci10b3AgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgIGp1c3RpZnktaXRlbXM6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tbGVmdCwKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIsCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1tZXRhLS1sZWZ0LAogICAgLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LXNlbGY6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1ib2R5IHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIyMHB4LCAxZnIpKTsKICAgIH0KfQoKLyogPT09PT09PT09PSBDdXN0b20gVmlkZW8gQ29udHJvbHMgKG5vIG5hdGl2ZSBiYXIpID09PT09PT09PT0gKi8KLm1qci12aWRlby1ob3N0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci12aWRlby1jb250cm9scyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMnB4OwogICAgcmlnaHQ6IDEycHg7CiAgICBib3R0b206IDEycHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgIG9wYWNpdHk6IDA7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgZWFzZTsKICAgIHotaW5kZXg6IDU7Cn0KCi5tanItdmlkZW8tcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGdhcDogMTJweDsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIGF1dG8gMWZyIGF1dG8gYXV0bzsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tcm93LS10b3AgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIGF1dG8gMWZyIGF1dG8gYXV0bzsKfQoKLm1qci12aWRlby1jb250cm9scy0tcHJldmlldyAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlkZW8tcm93LS1ib3R0b20gewogICAgZ2FwOiA4cHg7Cn0KCi5tanItdmlkZW8tZ3JvdXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLW51bSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogNXB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci12aWRlby1udW06Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzgpOwp9CgoubWpyLXZpZGVvLW51bS0tc3BlZWQgewogICAgY29sb3Itc2NoZW1lOiBkYXJrOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwp9CgoubWpyLXZpZGVvLW51bS0tc3BlZWQgb3B0aW9uIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwp9CgoubWpyLXZpZGVvLWZyYW1lIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBtaW4td2lkdGg6IDUycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLWZyYW1lLmlzLXN0ZXAgewogICAgY29sb3I6ICNmZmQyNGQ7Cn0KCi5tanItdmlkZW8tYm90dG9tIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4OiAxOwp9CgoubWpyLXZpZGVvLWJvdHRvbS0tbGVmdCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7Cn0KCi5tanItdmlkZW8tYm90dG9tLS1yaWdodCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMCAwIGF1dG87Cn0KCi8qIFNob3cgY29udHJvbHMgb24gaG92ZXIvZm9jdXMgKHZpZXdlcikuICovCi5tanItdmlkZW8taG9zdDpob3ZlciAubWpyLXZpZGVvLWNvbnRyb2xzLAoubWpyLXZpZGVvLWNvbnRyb2xzOmZvY3VzLXdpdGhpbiB7CiAgICBvcGFjaXR5OiAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi8qIFByZXZpZXc6IGtlZXAgY29udHJvbHMgdmlzaWJsZSBiZWNhdXNlIHRoZSBhcmVhIGlzIHNtYWxsLiAqLwoubWpyLXZpZGVvLWNvbnRyb2xzLS1wcmV2aWV3IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogMTBweDsKICAgIHRvcDogYXV0bzsKICAgIGJvdHRvbTogMTBweDsKICAgIG9wYWNpdHk6IDE7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiBub25lOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IGF1dG87CiAgICBoZWlnaHQ6IGF1dG87CiAgICBiYWNrZHJvcC1maWx0ZXI6IG5vbmU7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogbm9uZTsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0biB7CiAgICB3aWR0aDogMzhweDsKICAgIGhlaWdodDogMzhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZGVvLXByZXZpZXctYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI4KTsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0biAucGkgewogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItdmlkZW8tYnRuIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgY29sb3I6ICNmZmY7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZGVvLWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwp9CgoubWpyLXZpZGVvLWJ0bi5pcy1vbiB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDY0LCAxNjAsIDI1NSwgMC4yNSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNjQsIDE2MCwgMjU1LCAwLjU1KTsKfQoKLm1qci12aWRlby1idG4tLWluIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3MCwgMjU1LCAxMjAsIDAuNTUpOwogICAgYmFja2dyb3VuZDogcmdiYSg3MCwgMjU1LCAxMjAsIDAuMTIpOwp9CgoubWpyLXZpZGVvLWJ0bi0taW46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSg3MCwgMjU1LCAxMjAsIDAuMTgpOwp9CgoubWpyLXZpZGVvLWJ0bi0tb3V0IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDcwLCA3MCwgMC41NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjEpOwp9CgoubWpyLXZpZGVvLWJ0bi0tb3V0OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuMTYpOwp9CgoubWpyLXZpZGVvLXRpbWUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIG1pbi13aWR0aDogOTJweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgZ2FwOiAxMHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDY0LCAxOTAsIDI1NSwgMC45Mik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDY0LCAxOTAsIDI1NSwgMC4xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNjQsIDE5MCwgMjU1LCAwLjI1KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgcGFkZGluZzogMXB4IDhweDsKICAgIGxpbmUtaGVpZ2h0OiAxNnB4OwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLXJhbmdlIHsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDgwcHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAxOwogICAgLyogV2UgZHJhdyBvdXIgb3duIHBsYXloZWFkL21hcmtlcnM7IGhpZGUgdGhlIG5hdGl2ZSB0aHVtYiAiZG90Ii4gKi8KICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGFwcGVhcmFuY2U6IG5vbmU7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXNlZWs6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoKLm1qci12aWRlby1yYW5nZS0tc2Vlazo6LW1vei1yYW5nZS10aHVtYiB7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoKLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbWluLXdpZHRoOiA4MHB4OwogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDEwcHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDI7Cn0KCi5tanItdmlkZW8tc2Vlay16b25lIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKfQoKLyogMC4uSW46IHRyaW1tZWQtb3V0IHJhbmdlLiAqLwoubWpyLXZpZGVvLXNlZWstem9uZS0tbGVmdFRyaW0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4xOCk7Cn0KCi8qIEluLi5PdXQ6IHNlbGVjdGVkIHBsYXliYWNrIHJhbmdlIGhpZ2hsaWdodC4gKi8KLm1qci12aWRlby1zZWVrLXpvbmUtLXNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNjQsIDE5MCwgMjU1LCAwLjU1KTsKfQoKLm1qci12aWRlby1zZWVrLXpvbmVzLmlzLWZ1bGxyYW5nZSAubWpyLXZpZGVvLXNlZWstem9uZS0tc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKfQoKLyogT3V0Li5FbmQ6IHNob3cgb3V0LW9mLXJhbmdlIGZyYW1lcyBhcyBhIGRpZmZlcmVudCBjb2xvci4gKi8KLm1qci12aWRlby1zZWVrLXpvbmUtLXJpZ2h0VHJpbSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjIpOwp9CgoubWpyLXZpZGVvLXNlZWstb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IDUwJTsKICAgIGhlaWdodDogMDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMzsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDUwJTsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAzMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdG91Y2gtYWN0aW9uOiBub25lOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB6LWluZGV4OiA0OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGU6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjQpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YWZ0ZXIsCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLW91dDo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB0b3A6IDUwJTsKICAgIHdpZHRoOiAycHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YWZ0ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSg3MCwgMjU1LCAxMjAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YmVmb3JlLAoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1vdXQ6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YmVmb3JlIHsKICAgIHRvcDogNHB4OwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkIHJnYmEoNzAsIDI1NSwgMTIwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0tb3V0OjpiZWZvcmUgewogICAgYm90dG9tOiA0cHg7CiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItdG9wOiA2cHggc29saWQgcmdiYSgyNTUsIDcwLCA3MCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay10aWNrcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IC0xNnB4OwogICAgaGVpZ2h0OiAxMnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci12aWRlby1zZWVrLWxhYmVscyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IC0zNHB4OwogICAgaGVpZ2h0OiAxNHB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMTRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC41NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1sYWJlbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLXZpZGVvLXNlZWstcGxheWhlYWQtbGFiZWwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAxMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgcGFkZGluZzogMXB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC0xMHB4OwogICAgd2lkdGg6IDE0cHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGN1cnNvcjogZXctcmVzaXplOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB0b3VjaC1hY3Rpb246IG5vbmU7CiAgICB6LWluZGV4OiA0OwogICAgLS1tanItbWFyay1jb2xvcjogcmdiYSgyNTUsIDcwLCA3MCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrLS1pbiB7CiAgICAtLW1qci1tYXJrLWNvbG9yOiByZ2JhKDcwLCAyNTUsIDEyMCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICB3aWR0aDogMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLW1hcmstY29sb3IpOwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkIHZhcigtLW1qci1tYXJrLWNvbG9yKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKfQoKLm1qci12aWRlby1zZWVrLW1hcmstLWluOjphZnRlciB7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tanItbWFyay1jb2xvcik7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrLS1vdXQ6OmFmdGVyIHsKICAgIHRvcDogYXV0bzsKICAgIGJvdHRvbTogLTVweDsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7CiAgICBib3JkZXItdG9wOiA2cHggc29saWQgdmFyKC0tbWpyLW1hcmstY29sb3IpOwp9CgoubWpyLXZpZGVvLXNlZWstcGxheWhlYWQgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMTJweDsKICAgIHdpZHRoOiAycHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjAwLCA3MCwgMC45NSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMXB4KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIHsKICAgIHBvc2l0aW9uOiBzdGF0aWM7CiAgICBsZWZ0OiBhdXRvOwogICAgcmlnaHQ6IGF1dG87CiAgICBib3R0b206IGF1dG87CiAgICBvcGFjaXR5OiAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDE0cHg7CiAgICBib3JkZXItcmFkaXVzOiAxOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjEyKTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCB0b3AgbGVmdCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKSwgdHJhbnNwYXJlbnQgMzQlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE5OCwgMjAzLCAyMTAsIDAuMDI1KSwgcmdiYSgxOTgsIDIwMywgMjEwLCAwLjAwOCkpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxNjVkZWcsIHJnYmEoMTgsIDIyLCAyOCwgMC44MiksIHJnYmEoMTIsIDE1LCAyMSwgMC45KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwKICAgICAgICAwIDEwcHggMzBweCByZ2JhKDAsIDAsIDAsIDAuMTQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBub25lOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IG5vbmU7CiAgICBnYXA6IDEycHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0biB7CiAgICBtaW4taGVpZ2h0OiAzOHB4OwogICAgcGFkZGluZzogOHB4IDEycHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA3KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyKSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk0LCAyMDEsIDIwOCwgMC4xOCk7CiAgICBib3JkZXItd2lkdGg6IDFweDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDAuMTJzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjEycyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMC4xMnMgZWFzZTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMjAsIDIyNCwgMjMwLCAwLjI2KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLAogICAgICAgIDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE0KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuLmlzLW9uIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTAwLCAxNzAsIDI1NSwgMC4yKSwgcmdiYSgxMDAsIDE3MCwgMjU1LCAwLjA4KSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTIwLCAxODYsIDI1NSwgMC40Mik7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgxMjAsIDE4NiwgMjU1LCAwLjEyKSBpbnNldDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuIC5waSB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWhlYWQsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpIGF1dG8gbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDEycHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItc3RhdHVzLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItc2lkZSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWNlbnRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItc2lkZS0tcmlnaHQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gbWlubWF4KDAsIDFmcikgYXV0bzsKICAgIGdhcDogMTJweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLW1lZGlhLWJhZGdlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDAgMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSg3OCwgMjI0LCAxOTYsIDAuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg3OCwgMjI0LCAxOTYsIDAuMjIpOwogICAgY29sb3I6IHJnYmEoMjIwLCAyNDcsIDI0MSwgMC45Nik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQ1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWUsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWZyYW1lIHsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBjb2xvcjogcmdiYSgyMjgsIDIzMCwgMjM0LCAwLjkyKTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1mcmFtZSB7CiAgICBtaW4td2lkdGg6IDk0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10aW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGhlaWdodDogMjJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjkyKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgY29sb3I6IHJnYmEoMjIyLCAyMjUsIDIzMCwgMC45NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk0LCAyMDEsIDIwOSwgMC4yNik7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxOTQsIDIwMSwgMjA5LCAwLjA4KTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1ncm91cCB7CiAgICBtaW4taGVpZ2h0OiAzNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWdyb3VwLS1hZGp1c3QtbGVmdCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLWFkanVzdC1yaWdodCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLXNwZWVkIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1udW0gewogICAgbWluLWhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDksIDEyLCAxNiwgMC41NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4tLXBsYXkgewogICAgbWluLXdpZHRoOiA4OHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG1pbi1oZWlnaHQ6IDQ0cHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgaGVpZ2h0OiAxMnB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdm9sdW1lLXdyYXAgewogICAgcGFkZGluZzogMCA0cHg7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXZvbHVtZSB7CiAgICB3aWR0aDogOTBweDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDk4MHB4KSB7CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCwKICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1hY3Rpb25zLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItY2VudGVyLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgICAgIGdhcDogMTBweDsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10cmFuc3BvcnQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgfQp9CgovKiA9PT09PT09PT09IENvbnRleHQgTWVudSBDb21wb25lbnQgPT09PT09PT09PSAqLwoubWpyLWNvbnRleHQtbWVudSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAvKiBBYm92ZSB2aWV3ZXIgb3ZlcmxheSAoMTAwMDEpIGFuZCBNRlYgZGlhbG9nICgxMDAwMCkgKi8KICAgIHotaW5kZXg6IDEwMDAyOwogICAgZGlzcGxheTogbm9uZTsKICAgIHBhZGRpbmc6IDRweCAwOwogICAgYW5pbWF0aW9uOiBtanItY29udGV4dC1tZW51LWluIDAuMTVzIGVhc2Utb3V0Owp9CgoubWpyLWNvbnRleHQtbWVudSwKLm1qci1jb250ZXh0LW1lbnUgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpAa2V5ZnJhbWVzIG1qci1jb250ZXh0LW1lbnUtaW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHBhZGRpbmc6IDhweCAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtOjotbW96LWZvY3VzLWlubmVyIHsKICAgIGJvcmRlcjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW06aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZyk7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLWRpc2FibGVkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQ6aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQ6Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1jb250ZXh0LW1lbnUtc2VwYXJhdG9yIHsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyLWNvbG9yKTsKICAgIG1hcmdpbjogNHB4IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1yaWdodCB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1hcmdpbi1sZWZ0OiAxNnB4Owp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLWxlZnQgaSB7CiAgICB3aWR0aDogMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG9wYWNpdHk6IDAuODI7Cn0KCi5tanItY29udGV4dC1tZW51LWhpbnQgewogICAgb3BhY2l0eTogMC41ODsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItY29udGV4dC1tZW51LXN1Ym1lbnUtYXJyb3cgewogICAgb3BhY2l0eTogMC43MjsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFkZC10by1jb2xsZWN0aW9uLW1lbnUgewogICAgbWluLXdpZHRoOiAyNjBweDsKICAgIG1heC13aWR0aDogbWluKDM2MHB4LCBjYWxjKDEwMHZ3IC0gMTZweCkpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEycHgpOwp9CgoubWpyLWNvbnRleHQtbWVudS10aXRsZSB7CiAgICBwYWRkaW5nOiA4cHggMTRweCAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvcik7CiAgICBvcGFjaXR5OiAwLjkyOwp9CgoubWpyLWNvbnRleHQtbWVudS1ub3RlIHsKICAgIHBhZGRpbmc6IDEwcHggMTRweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNzIlLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1Owp9CgoubWpyLWdyaWQtcG9wb3ZlciwKLm1qci12aWV3ZXItcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDI1MHB4OwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAxNnB4KSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItdmlld2VyLW92ZXJsYXkgKiwKICAgIC5tanItdmlkZW8tY29udHJvbHMsCiAgICAubWpyLWNvbnRleHQtbWVudSB7CiAgICAgICAgYW5pbWF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgIHNjcm9sbC1iZWhhdmlvcjogYXV0byAhaW1wb3J0YW50OwogICAgfQp9CgovKiBIaWRlIGhlYWRlciAodG9vbGJhcikgd2hlbiB2aWV3ZXIgb3ZlcmxheSBpcyBpbiBmdWxsc2NyZWVuICovCi5tanItdmlld2VyLW92ZXJsYXk6ZnVsbHNjcmVlbiAubWpyLXZpZXdlci1oZWFkZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIE1ham9vciBGbG9hdGluZyBWaWV3ZXIgKE1GVikg4oCUIHBvcnRhbGVkIHRvIGRvY3VtZW50LmJvZHkKICAgUmVkZWNsYXJlcyBDU1MgdmFyaWFibGVzIHNvIHRoZSBwYW5lbCB3b3JrcyBvdXRzaWRlIC5tanItYXNzZXRzLW1hbmFnZXIKICAgKHNhbWUgcGF0dGVybiBhcyAubWpyLXBvcG92ZXIpCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLm1qci1tZnYgewogICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1jb250ZW50LWJnLCAjMWUxZTFlKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWNvbWZ5LW1lbnUtc2Vjb25kYXJ5LWJnLCAjMzMzKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpOwogICAgLS1tanItYWNjZW50OiB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpOwogICAgLS1tanItc3RhdHVzLXN1Y2Nlc3M6IHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKTsKCiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgIHN5c3RlbS11aSwKICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgUm9ib3RvLAogICAgICAgIEFyaWFsLAogICAgICAgIHNhbnMtc2VyaWYKICAgICk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSk7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgIC8qIFZpc3VhbCBjaHJvbWUgKi8KICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgOHB4IDMycHggcmdiYSgwLCAwLCAwLCAwLjU1KSwKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLW1mdiAqIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCmh0bWwubWpyLW1mdi1wb3BvdXQtZG9jdW1lbnQgewogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICAgIDEyMDBweCA0MjBweCBhdCA1MCUgMCUsCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDEwJSwKICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50CiAgICAgICAgICAgICksCiAgICAgICAgICAgIHRyYW5zcGFyZW50IDYyJQogICAgICAgICksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KAogICAgICAgICAgICAxODBkZWcsCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgdmFyKC0tY29udGVudC1iZywgIzE2MTkxZikpIDgyJSwKICAgICAgICAgICAgICAgICMwMDAgMTglCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1pbnRlcmZhY2UtbWVudS1zdXJmYWNlLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMWYyMjI3KSkgODQlLAogICAgICAgICAgICAgICAgIzAwMCAxNiUKICAgICAgICAgICAgKQogICAgICAgICk7Cn0KCmJvZHkubWpyLW1mdi1wb3BvdXQtYm9keSB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKI21qci1tZnYtcG9wb3V0LXJvb3QsCi5tanItbWZ2LXBvcG91dC1yb290IHsKICAgIGlzb2xhdGlvbjogaXNvbGF0ZTsKfQoKLyog4pSA4pSAIEhlYWRlciAoZHJhZyBoYW5kbGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgY3Vyc29yOiBtb3ZlOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICBmbGV4LXNocmluazogMDsKICAgIGdhcDogNnB4OwogICAgbWluLWhlaWdodDogMzRweDsKfQoKLm1qci1tZnYtaGVhZGVyLXRpdGxlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBvcGFjaXR5OiAwLjc4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZmxleDogMTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjI4cHg7Cn0KCi8qIOKUgOKUgCBUb29sYmFyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi10b29sYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDUwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTAlKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgbWluLWhlaWdodDogMzZweDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIHNjcm9sbGJhci13aWR0aDogbm9uZTsKfQoubWpyLW1mdi10b29sYmFyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICB3aWR0aDogMXB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWJvcmRlcik7CiAgICBtYXJnaW46IDAgM3B4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LXByb2dyZXNzIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBoZWlnaHQ6IDIycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNzIlLCAjMDAwIDI4JSk7CiAgICBmbGV4LXNocmluazogMDsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlOmhvdmVyIHsKICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjAzKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MtYmFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICB3aWR0aDogMCU7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCA3MG1zIGVhc2UtaW4tb3V0Owp9CgoubWpyLW1mdi1wcm9ncmVzcy1iYXItLW5vZGVzIHsKICAgIHRvcDogMDsKICAgIGhlaWdodDogNTAlOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjglLCAjMGIzNTEzIDMyJSk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLWJhci0tc3RlcHMgewogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDUwJTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2NCUsICMwYjIzNDAgMzYlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1ub2RlcywKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1zdGVwcyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2Q5NTM0ZiA3OCUsICM0YTE0MTQgMjIlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3Mtb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCksIHJnYmEoMCwgMCwgMCwgMC4xOCkpOwogICAgbWl4LWJsZW5kLW1vZGU6IHNjcmVlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGhlaWdodDogMTAwJTsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtc2hhZG93OiAwIDAgMnB4IHJnYmEoMCwgMCwgMCwgMC45KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5tanItbWZ2LXBpbi1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAycHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KLm1qci1tZnYtcGluLWJ0biB7CiAgICB3aWR0aDogMjZweDsKICAgIGhlaWdodDogMjZweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2U7Cn0KLm1qci1tZnYtcGluLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1hY2NlbnQpIDglKTsKfQoubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTIlKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA0MiUsIHZhcigtLW1qci1hY2NlbnQpIDU4JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjQlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIOKUgOKUgCBQaW4gZ3JvdXA6IG5vdyBhIGRyb3Bkb3duIG1lbnUgKGRpc3BsYXk6bm9uZSBieSBkZWZhdWx0LCBmbGV4IHdoZW4gLmlzLW9wZW4pIOKUgOKUgCAqLwoubWpyLW1mdi1waW4tZ3JvdXAgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogY2FsYygxMDAlICsgNHB4KTsKICAgIGxlZnQ6IDA7CiAgICB6LWluZGV4OiAxMDAxMDsKICAgIG1pbi13aWR0aDogNzBweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7Cn0KLm1qci1tZnYtcGluLWdyb3VwLmlzLW9wZW4gewogICAgZGlzcGxheTogZmxleDsKfQoubWpyLW1mdi1waW4tYnRuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMzBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwIDEwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlOwp9Ci5tanItbWZ2LXBpbi1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM1JSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItbWZ2LXBpbi1idG4uaXMtcGlubmVkIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMiUpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDQyJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgNTglKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwp9CgovKiDilIDilIAgSWNvbiBEcm9wZG93biBjb21wb25lbnQgKC5tanItbWZ2LWlkcm9wKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtaWRyb3AgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LWlkcm9wLW1lbnUgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgbWluLXdpZHRoOiAxMTBweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5tanItbWZ2LWlkcm9wLW1lbnUuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLW1mdi1pZHJvcC1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXMgZWFzZTsKfQoubWpyLW1mdi1pZHJvcC1pdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KLm1qci1tZnYtaWRyb3AtaXRlbS5pcy1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNik7CiAgICBjb2xvcjogI2E4ZDhmZjsKfQoubWpyLW1mdi1pZHJvcC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cn0KLyogQ2hhbm5lbCB0cmlnZ2VyOiBzbGlnaHRseSB3aWRlciB0byBmaXQgIlJHQiIgKi8KLm1qci1tZnYtY2gtbGFiZWwgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiBUb29sYmFyIGljb24tYnV0dG9uIHBvcG92ZXJzIChjaGFubmVsLCBndWlkZXMsIHBpbiwgZm9ybWF0IOKAlCBzb3J0LXN0eWxlIGNvbnRleHQgbWVudXMpICovCi5tanItbWZ2LWNoLXBvcG92ZXIsCi5tanItbWZ2LWd1aWRlcy1wb3BvdmVyLAoubWpyLW1mdi1waW4tcG9wb3ZlciwKLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbWluLXdpZHRoOiAxMjBweDsKICAgIHBhZGRpbmc6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZywgMC41cmVtKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpOwogICAgei1pbmRleDogMTAwMTA7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItbWZ2LWNoLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtZ3VpZGVzLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtcGluLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBibG9jazsKfQovKiBUb29sYmFyIGljb24gaW1hZ2VzIOKAlCBjaCBpY29uIGlzIGJsYWNrIChpbnZlcnRlZCksIGd1aWRlcyBpY29uIGlzIG5hdGl2ZSB3aGl0ZSAqLwoubWpyLW1mdi1jaC1pY29uIHsKICAgIHdpZHRoOiAxOHB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgZmlsdGVyOiBpbnZlcnQoMSk7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgZGlzcGxheTogYmxvY2s7Cn0KLm1qci1tZnYtZ3VpZGVzLWljb24gewogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgZGlzcGxheTogYmxvY2s7Cn0KLm1qci1tZnYtY2gtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0sCi5tanItbWZ2LWd1aWRlcy10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSwKLm1qci1tZnYtcGluLXRyaWdnZXJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdLAoubWpyLW1mdi1mb3JtYXQtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSAhaW1wb3J0YW50Owp9Ci8qIFBpbiBzbG90IGFjdGl2ZSBzdGF0ZSAqLwoubWpyLW1mdi1waW4tcG9wb3ZlciAubWpyLW1lbnUtaXRlbS5pcy1waW5uZWQgewogICAgYmFja2dyb3VuZDogcmdiYSg5NSwgMTc5LCAyNTUsIDAuMTYpOwogICAgY29sb3I6ICNhOGQ4ZmY7Cn0KLm1qci1tZnYtcGluLXBvcG92ZXIgLm1qci1tZW51LWl0ZW0uaXMtcGlubmVkIC5tanItbWVudS1pdGVtLWNoZWNrIHsKICAgIG9wYWNpdHk6IDEgIWltcG9ydGFudDsKfQovKiBGb3JtYXQgcG9wb3Zlcjogc2VwYXJhdG9yICsgb3BhY2l0eSBzbGlkZXIgcm93ICovCi5tanItbWZ2LWZvcm1hdC1zZXAgewogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkpOwogICAgbWFyZ2luOiA0cHggMnB4Owp9Ci5tanItbWZ2LWZvcm1hdC1zbGlkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4IDJweDsKfQoubWpyLW1mdi1mb3JtYXQtc2xpZGVyLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIG9wYWNpdHk6IDAuNjU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZmxleC1zaHJpbms6IDA7Cn0KLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiA3MHB4OwogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoubWpyLW1mdi1mb3JtYXQtcG9wb3ZlciAubWpyLW1mdi10b29sYmFyLXJhbmdlLW91dCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBvcGFjaXR5OiAwLjY1OwogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0biB7CiAgICB3aWR0aDogMzBweDsKICAgIGhlaWdodDogMzBweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBmbGV4LXNocmluazogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAxMjBtcyBlYXNlOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgOCUpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuOmZvY3VzLXZpc2libGUgewogICAgb3V0bGluZTogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyNCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi8qIFVuaXZlcnNhbCBhY3RpdmUgaGlnaGxpZ2h0IOKAlCBhbnkgYXJpYS1wcmVzc2VkPSJ0cnVlIiBidXR0b24gZ2V0cyBhY2NlbnQgZ2xvdy4KICAgUGxhY2VkIGJlZm9yZSB0aGUgY29sb3JlZCBhY3RpdmUgY2xhc3NlcyBzbyB0aGV5IGNhbiBvdmVycmlkZSB3aXRoIHRoZWlyIG93biBjb2xvci4gKi8KLm1qci1tZnYgLm1qci1pY29uLWJ0blthcmlhLXByZXNzZWQ9InRydWUiXSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjU1KTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA4MCUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE1JSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI1JSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItbWZ2IC5tanItaWNvbi1idG5bYXJpYS1wcmVzc2VkPSJ0cnVlIl0gLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLWxpdmUtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItbGl2ZS1hY3RpdmUgLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1ub2Rlc3RyZWFtLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsCiAgICAgICAgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAxMiUKICAgICk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgovKiBQb3AtaW4gbW9kZSAodmlld2VyIHBvcHBlZCBvdXQpOiByYWlzZSBidXR0b24gY29udHJhc3QvYnJpZ2h0bmVzcyAqLwoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgOTIlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDI0cHggNTZweCByZ2JhKDAsIDAsIDAsIDAuNDIpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkwJSwgcmdiYSgwLCAwLCAwLCAwLjI0KSkKICAgICk7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWhlYWRlci10aXRsZSB7CiAgICBvcGFjaXR5OiAwLjk4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA5NCUsICNmZmZmZmYgNiUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtdG9vbGJhciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MCUsIHJnYmEoMCwgMCwgMCwgMC4yNCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXByb2dyZXNzIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDgyJSwgIzBhMTExOCAxOCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MiUsICMwMDAgOCUpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2VlZjRmZikgOTQlLCAjZmZmZmZmIDYlKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWNvbnRlbnQgewogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICAgIGNpcmNsZSBhdCB0b3AsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMCUsIHRyYW5zcGFyZW50KSAwJSwKICAgICAgICAgICAgdHJhbnNwYXJlbnQgNDIlCiAgICAgICAgKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODIlLCAjMDAwIDE4JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA5MiUsICNmZmZmZmYgOCUpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB2YXIoLS1tanItYWNjZW50KSA0MiUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2MiUsIHZhcigtLW1qci1hY2NlbnQpIDM4JSkKICAgICk7CiAgICBjb2xvcjogI2Y0ZjhmZiAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0biAucGkgewogICAgb3BhY2l0eTogMTsKICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1saXZlLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDYwJSwgI2ZmZmZmZiA0MCUpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMjQlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAwIDE4cHggcmdiYSg3NiwgMTc1LCA4MCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1wcmV2aWV3LWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAxOHB4IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgNTglLCAjZmZmZmZmIDQyJSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMzYlLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUpCiAgICApOwogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAyNCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMThweCByZ2JhKDI1NSwgMTUyLCAwLCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXBpbi1idG4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzYlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpIDkyJSwgI2ZmZmZmZiA4JSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTYlLCB2YXIoLS1tanItYWNjZW50KSA0NCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUsIHZhcigtLW1qci1hY2NlbnQpIDM2JSkKICAgICk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDk0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDk0JSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBib3JkZXItbGVmdC1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAxcHggMCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItcmlnaHQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNikpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXNpZGViYXItdGl0bGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA4MiUsIHZhcigtLW1qci1tdXRlZCkgMTglKTsKICAgIG9wYWNpdHk6IDAuODg7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwKSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KAogICAgICAgICAgICAxODBkZWcsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4NiUsIHZhcigtLW1qci1hY2NlbnQpIDE0JSksCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA4NiUsIHJnYmEoMCwgMCwgMCwgMC4xNCkpCiAgICAgICAgKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNlZWY0ZmYpIDk0JSwgI2ZmZmZmZiA2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXdpZGdldC1sYWJlbCwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtc2lkZWJhci1lbXB0eSwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS1lbXB0eSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tdXRlZCkgODQlLCAjZmZmZmZmIDE2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA3NCUsICMwNTA3MGEgMjYlKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMCUpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItcG9waW4tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiA0MiUpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDQ1JSwgdmFyKC0tbWpyLWFjY2VudCkgNTUlKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwp9CgovKiDilIDilIAgQ29udGVudCB3cmFwcGVyIChob3Jpem9udGFsIGZsZXg6IGNvbnRlbnQgKyBzaWRlYmFyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtY29udGVudC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIOKUgOKUgCBTaWRlYmFyIHBvc2l0aW9uIHZhcmlhbnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSAubWpyLXdzLXNpZGViYXIgewogICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci13cy1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGhlaWdodCAwLjJzIGVhc2UsCiAgICAgICAgd2lkdGggMHM7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItd3Mtc2lkZWJhci5vcGVuIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAyMjBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAxMjBweDsKICAgIG1heC1oZWlnaHQ6IDY1JTsKfQoKLyog4pSA4pSAIENvbnRlbnQgYXJlYSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGQ7CiAgICBtaW4taGVpZ2h0OiAwOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleDogMCAwIDMyMHB4OwogICAgd2lkdGg6IDMyMHB4OwogICAgbWluLXdpZHRoOiAyMTBweDsKICAgIG1heC13aWR0aDogbWluKDQyJSwgNDIwcHgpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMTgsIDIwLCAwLjk2KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODgpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci5vcGVuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItbWZ2LWdlbi1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmlnaHQ6IG5vbmU7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBmbGV4OiAwIDAgMTgwcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci10aXRsZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItc2VjdGlvbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZy10b3A6IDhweDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLXNlY3Rpb246Zmlyc3Qtb2YtdHlwZSB7CiAgICBwYWRkaW5nLXRvcDogMDsKICAgIGJvcmRlci10b3A6IG5vbmU7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWhlYWRpbmcgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1nZW4tdGltZS1iYWRnZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjQyKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjE2KSwgcmdiYSg3NiwgMTc1LCA4MCwgMC4xKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjEyKSBpbnNldDsKICAgIGN1cnNvcjogY29weTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE2cyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjE2cyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMC4xNnMgZWFzZTsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtbGFiZWwgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Mik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtdmFsdWUgewogICAgY29sb3I6ICNlMGZmN2E7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIG1vbm9zcGFjZTsKfQoKLm1qci1tZnYtZ2VuLWNhcmQgewogICAgLS1tanItbWZ2LWdlbi1hY2NlbnQ6ICMyMTk2ZjM7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpIDQ1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDEzNWRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSAxNiUsIHRyYW5zcGFyZW50KSAwJSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSA4JSwgdHJhbnNwYXJlbnQpIDEwMCUKICAgICk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgMTQlLCB0cmFuc3BhcmVudCkgaW5zZXQ7CiAgICBjdXJzb3I6IGNvcHk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xNnMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1zZWVkIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYm9yZGVyLXdpZHRoOiAycHg7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1jb21wYWN0IHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCAubWpyLW1mdi1nZW4tY2FyZC10aXRsZSwKLm1qci1tZnYtZ2VuLWNhcmQtLWNvbXBhY3QgLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQ6aG92ZXIsCi5tanItbWZ2LWdlbi10aW1lLWJhZGdlOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCwgI2UwZmY3YSkgNzAlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCwgI2UwZmY3YSkgMjQlLCB0cmFuc3BhcmVudCkKICAgICAgICBpbnNldDsKfQoKLm1qci1tZnYtZ2VuLWNvcHktZmxhc2ggewogICAgYmFja2dyb3VuZDogcmdiYSg3NiwgMTc1LCA4MCwgMC4yOCkgIWltcG9ydGFudDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdGl0bGUgewogICAgY29sb3I6IHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG1pbi13aWR0aDogMDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWNvbXBhY3QgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1tdWx0aWxpbmUgewogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwp9CgoubWpyLW1mdi1nZW4tY2FyZC0tc2VlZCAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIG1vbm9zcGFjZTsKICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICBjb2xvcjogI2ZmZjsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtZmllbGRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1nZW4tZmllbGQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDc4cHgsIGF1dG8pIDFmcjsKICAgIGdhcDogMTBweDsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLWxhYmVsIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMTgwLCAxODAsIDE4MCwgMC43MikpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLXZhbHVlIHsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSk7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2VjOGZmOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmN2E5ZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZTBmZjdhOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdiB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgZGl2Omxhc3QtY2hpbGQgewogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLm1qci1tZnYtb3ZlcmxheS1jYW52YXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTI7Cn0KCi5tanItbWZ2LXRvb2xiYXItc2VsZWN0IHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjQpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA2KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyKSk7CiAgICBjb2xvcjogcmdiYSgyMzAsIDIzMywgMjM4LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICB3aWR0aDogNzJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKfQoKLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgovKiBFViBzbGlkZXIgYWN0aXZlIHN0YXRlICh2YWx1ZSDiiaAgMCkgKi8KLm1qci1tZnYtdG9vbGJhci1yYW5nZS5pcy1hY3RpdmUgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICBhY2NlbnQtY29sb3I6ICNmNWM4NDI7Cn0KLm1qci1tZnYtdG9vbGJhci1yYW5nZS5pcy1hY3RpdmUgLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgY29sb3I6ICNmNWM4NDI7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwcHg7CiAgICBsZWZ0OiAxMHB4OwogICAgei1pbmRleDogNjsKICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gMjBweCk7CiAgICBwYWRkaW5nOiA1cHggOXB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSkgODglLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgcmdiYSg1LCA4LCAxNCwgMC44NikgODYlLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExKSAxNCUpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY3ZmEpOwogICAgYm94LXNoYWRvdzogMCAycHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMTZzIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LW1lZGlhLXByb2dyZXNzLmlzLXZpc2libGUgewogICAgb3BhY2l0eTogMTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MuaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgI2ZmNWM3YSkgNzIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgcmdiYSg2MCwgMTAsIDE4LCAwLjkpIDgyJSwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzExMSkgMTglKTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MtdGV4dCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjsKfQoKLyog4pSA4pSAIFdvcmtmbG93IFNpZGViYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItd3Mtc2lkZWJhciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMnMgZWFzZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLXdzLXNpZGViYXIub3BlbiB7CiAgICB3aWR0aDogMjYwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgbWluLXdpZHRoOiAxODBweDsKICAgIG1heC13aWR0aDogNjUlOwogICAgdHJhbnNpdGlvbjogbm9uZTsKfQoKLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBtaW4taGVpZ2h0OiAzNHB4Owp9Ci5tanItd3Mtc2lkZWJhci10aXRsZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgIG9wYWNpdHk6IDAuNjU7Cn0KLm1qci13cy1zaWRlYmFyLWJvZHkgewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogMDsKfQoubWpyLXdzLXNpZGViYXItZW1wdHkgewogICAgcGFkZGluZzogMjRweCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMS41Owp9CgovKiDilIDilIAgVGFiIGJhciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci13cy10YWItYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGdhcDogMnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItd3MtdGFiIHsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNXMsCiAgICAgICAgY29sb3IgMC4xNXM7Cn0KCi5tanItd3MtdGFiOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNyk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc1KTsKfQoKLm1qci13cy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjE1KTsKICAgIGNvbG9yOiAjNjM5YmZmOwp9CgovKiDilIDilIAgTm9kZXMgdGFiIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLXdzLW5vZGVzLXRhYiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGZsZXg6IDE7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLyogR3JhcGggTWFwIHRhYiAqLwoubWpyLXdnbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDEwMCU7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKfQoKLm1qci13Z20tbWFwLXdyYXAgewogICAgaGVpZ2h0OiAxOTBweDsKICAgIG1pbi1oZWlnaHQ6IDE1MHB4OwogICAgbWFyZ2luOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yMik7Cn0KCi5tanItd2dtLXByZXZpZXcgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMyKTsKfQoKLm1qci13Z20tcHJldmlldyAubWpyLW1mdi1tZWRpYSwKLm1qci13Z20tcHJldmlldyAubWpyLW1mdi1wbGF5ZXItaG9zdCwKLm1qci13Z20tcHJldmlldyAubWpyLW1vZGVsM2QtaG9zdCwKLm1qci13Z20tcHJldmlldy1tZWRpYSB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwp9CgoubWpyLXdnbS1wcmV2aWV3LWVtcHR5IHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1jYW52YXMgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGN1cnNvcjogZ3JhYjsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKfQoKLm1qci13Z20tY2FudmFzOmFjdGl2ZSB7CiAgICBjdXJzb3I6IGdyYWJiaW5nOwp9CgoubWpyLXdnbS0tbGFyZ2UgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLW1hcC13cmFwIHsKICAgIGZsZXg6IDE7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgbWFyZ2luOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogMDsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLXN0YXR1cyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMHB4OwogICAgdG9wOiAxMHB4OwogICAgei1pbmRleDogMjsKICAgIG1heC13aWR0aDogbWluKDQyMHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7CiAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tZGV0YWlscyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMTBweDsKICAgIHRvcDogMTBweDsKICAgIGJvdHRvbTogMTBweDsKICAgIHotaW5kZXg6IDI7CiAgICB3aWR0aDogbWluKDMyMHB4LCAzOCUpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMjAsIDI2LCAwLjg0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLWFjdGlvbiB7CiAgICBtaW4taGVpZ2h0OiAzMHB4Owp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tcGFyYW0gewogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1zdGF0dXMgewogICAgcGFkZGluZzogMCAxMHB4IDhweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7Cn0KCi5tanItd2dtLWRldGFpbHMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDAgOHB4IDEwcHg7Cn0KCi5tanItd2dtLW5vZGUtdGl0bGUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLW1ldGEgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1hcmdpbi10b3A6IC00cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKfQoKLm1qci13Z20tYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICBnYXA6IDRweDsKfQoKLm1qci13Z20tYWN0aW9uIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA3cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNXB4IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Nik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5tanItd2dtLWFjdGlvbjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjQ1KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjEyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpOwp9CgoubWpyLXdnbS1hY3Rpb24uaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc2LCAxNzUsIDgwLCAwLjU1KTsKICAgIGNvbG9yOiByZ2JhKDE5MCwgMjU1LCAxOTYsIDAuOTYpOwp9CgoubWpyLXdnbS1wYXJhbXMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4OwogICAgbWFyZ2luLXRvcDogMnB4Owp9CgoubWpyLXdnbS1wYXJhbSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoNjRweCwgMC40MmZyKSBtaW5tYXgoMCwgMWZyKTsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogNXB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xOCk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2U7Cn0KCi5tanItd2dtLXBhcmFtOmhvdmVyLAoubWpyLXdnbS1wYXJhbTpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXdnbS1wYXJhbS5pcy1vayB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSg3OSwgMjEwLCAxMjUsIDAuMTYpOwp9CgoubWpyLXdnbS1wYXJhbS5pcy1lcnJvciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCA5MCwgOTAsIDAuNyk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjE2KTsKfQoKLm1qci13Z20tcGFyYW0ta2V5IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ4KTsKfQoKLm1qci13Z20tcGFyYW0tdmFsdWUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwp9CgoubWpyLXdzLXNlYXJjaC13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgoubWpyLXdzLXNlYXJjaC1pY29uIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDE2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItd3Mtc2VhcmNoIHsKICAgIGZsZXg6IDE7CiAgICBwYWRkaW5nOiA0cHggMjhweCA0cHggMjZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44NSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXdzLXNlYXJjaDo6cGxhY2Vob2xkZXIgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yOCk7Cn0KCi5tanItd3Mtc2VhcmNoOmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg5OSwgMTU1LCAyNTUsIDAuNSk7Cn0KCi5tanItd3Mtc2VhcmNoLWNsZWFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHJpZ2h0OiAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHdpZHRoOiAxOHB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci13cy1zZWFyY2gtY2xlYXI6aG92ZXIgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItd3Mtbm9kZXMtbGlzdCB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDRweCAwOwp9CgoubWpyLXdzLW5vZGUtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMTJweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgbWluLWhlaWdodDogMzJweDsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xczsKfQoKLm1qci13cy1ub2RlLXJvdzpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXdzLW5vZGUtcm93LXR5cGUgewogICAgZmxleDogMTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLm1qci13cy1ub2RlLXJvdy10aXRsZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1heC13aWR0aDogODBweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLXdzLW5vZGUtbG9jYXRlIHsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgd2lkdGg6IDIycHg7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xcywKICAgICAgICBjb2xvciAwLjFzLAogICAgICAgIGJhY2tncm91bmQgMC4xczsKfQoKLm1qci13cy1ub2RlLXJvdzpob3ZlciAubWpyLXdzLW5vZGUtbG9jYXRlIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItd3Mtbm9kZS1sb2NhdGU6aG92ZXIgewogICAgY29sb3I6ICM2MzliZmY7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC4xNSk7Cn0KCi8qIOKUgOKUgCBOb2RlIHNlY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLXdzLXRyZWUtaXRlbSB7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KLm1qci13cy10cmVlLWl0ZW0gPiAubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoubWpyLXdzLXRyZWUtaXRlbS0tc3ViZ3JhcGggewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDQlLCB0cmFuc3BhcmVudCA5NiUpOwp9Ci5tanItd3Mtbm9kZSB7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KLyogU3VidGxlIGhpZ2hsaWdodCB3aGVuIHRoaXMgbm9kZSBtYXRjaGVzIHRoZSBjdXJyZW50IGdyYXBoIHNlbGVjdGlvbi4gKi8KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDIxMCwgOTAsIDAuMDgpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMnB4IDAgMCAwIHJnYmEoMjU1LCAyMTAsIDkwLCAwLjc1KTsKfQoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZmZkNDVhIDE4JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgODIlKTsKfQoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUtdHlwZSB7CiAgICBjb2xvcjogI2ZmZDQ1YTsKfQoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUtdGl0bGUgewogICAgY29sb3I6IHJnYmEoMjU1LCAyMjQsIDEzMCwgMC44OCk7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLXRvZ2dsZSwKLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1sb2NhdGUsCi5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS1raW5kIHsKICAgIGNvbG9yOiAjZmZkNDVhOwp9Ci5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIHdpZHRoOiAxNHB4OwogICAgei1pbmRleDogMjsKICAgIGN1cnNvcjogZXctcmVzaXplOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItd3Mtc2lkZWJhci1yZXNpemVyOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDUwJTsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiA0cHg7CiAgICBoZWlnaHQ6IDU2cHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjE1cyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMC4xNXMgZWFzZTsKfQoKLm1qci13cy1zaWRlYmFyLm9wZW46aG92ZXIgLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLmlzLXJlc2l6aW5nIC5tanItd3Mtc2lkZWJhci1yZXNpemVyOjpiZWZvcmUsCi5tanItd3Mtc2lkZWJhci1yZXNpemVyLmlzLWRyYWdnaW5nOjpiZWZvcmUgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci13cy1zaWRlYmFyLmlzLXJlc2l6aW5nIC5tanItd3Mtc2lkZWJhci1yZXNpemVyOjpiZWZvcmUsCi5tanItd3Mtc2lkZWJhci1yZXNpemVyOmhvdmVyOjpiZWZvcmUsCi5tanItd3Mtc2lkZWJhci1yZXNpemVyLmlzLWRyYWdnaW5nOjpiZWZvcmUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM0KTsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9InJpZ2h0Il0gLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgcmlnaHQ6IDA7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJsZWZ0Il0gLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgbGVmdDogMDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0wLCAjMWUxZTFlKSA0MCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgNjAlCiAgICApOwogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzIGVhc2U7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNpYmxlIC5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzaWJsZSAubWpyLXdzLW5vZGUtaGVhZGVyOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDI4JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA3MiUKICAgICk7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNpYmxlLmlzLWNvbGxhcHNlZCAubWpyLXdzLW5vZGUtaGVhZGVyOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDglLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDkyJQogICAgKTsKfQoubWpyLXdzLW5vZGUtdG9nZ2xlIHsKICAgIGZsZXg6IDAgMCBhdXRvOwp9Ci5tanItd3Mtbm9kZS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMXB4Owp9Ci5tanItd3Mtbm9kZS10eXBlIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9Ci5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ4KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLm1qci13cy1ub2RlLWtpbmQgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1heC13aWR0aDogMTEwcHg7CiAgICBwYWRkaW5nOiAycHggNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDM4JSwgdHJhbnNwYXJlbnQgNjIlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDEyJSwgdHJhbnNwYXJlbnQgODglKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNzglLCAjZmZmZmZmIDIyJSk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLm1qci13cy1ub2RlLWtpbmQgLnBpIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKfQoubWpyLXdzLW5vZGUta2luZC1jb3VudCB7CiAgICBtaW4td2lkdGg6IDE0cHg7CiAgICBwYWRkaW5nOiAwIDNweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzZWQgLm1qci13cy1ub2RlLWJvZHkgewogICAgZGlzcGxheTogbm9uZTsKfQoubWpyLXdzLW5vZGUtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7Cn0KLm1qci13cy1ub2RlLWVtcHR5IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBwYWRkaW5nOiA0cHggMDsKfQoKLyog4pSA4pSAIE5lc3RlZCBub2RlcyAoaW5zaWRlIHN1YmdyYXBocykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItd3Mtbm9kZS0tbmVzdGVkIHsKICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgcmdiYSg5MSwgMTM4LCAyNDAsIDAuMzUpOwp9Ci5tanItd3Mtbm9kZS0tbmVzdGVkIC5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgcGFkZGluZy1sZWZ0OiAxNnB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNSUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTUlCiAgICApOwp9Ci5tanItd3Mtbm9kZS0tbmVzdGVkLmlzLWNvbGxhcHNpYmxlIC5tanItd3Mtbm9kZS1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMTAlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDkwJQogICAgKTsKfQoKLyog4pSA4pSAIFN1YmdyYXBoIGNoaWxkcmVuIGdyb3VwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLXdzLWNoaWxkcmVuLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMjBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDYlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDk0JQogICAgKTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBvcGFjaXR5OiAwLjg7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMC4xcyBlYXNlOwp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlLS1uZXN0ZWQgewogICAgcGFkZGluZy1sZWZ0OiAyOHB4Owp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMiUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgODglCiAgICApOwp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBvcGFjaXR5OiAxOwp9Ci5tanItd3MtY2hpbGRyZW4gewogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCByZ2JhKDkxLCAxMzgsIDI0MCwgMC4yNSk7CiAgICBtYXJnaW4tbGVmdDogNnB4OwogICAgcGFkZGluZy1sZWZ0OiA2cHg7Cn0KCi5tanItd3Mtd2lkZ2V0LXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIC5tanItd3Mtd2lkZ2V0LWxhYmVsIHsKICAgIGZsZXg6IG5vbmU7CiAgICBwYWRkaW5nLXRvcDogMDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIC5tanItd3Mtd2lkZ2V0LWlucHV0IHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5tanItd3Mtd2lkZ2V0LWxhYmVsIHsKICAgIGZsZXg6IDAgMCA4MHB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjU1KSk7CiAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLXdpZGdldC1pbnB1dCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItd3MtaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgIzIyMik7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7Cn0KLm1qci13cy10ZXh0YXJlYSB7CiAgICByZXNpemU6IG5vbmU7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKfQoubWpyLXdzLXRleHQtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoubWpyLXdzLXRleHQtd3JhcHBlciAubWpyLXdzLXRleHRhcmVhIHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5tanItd3MtZXhwYW5kLWJ0biB7CiAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIG9wYWNpdHk6IDAuODsKfQoubWpyLXdzLWV4cGFuZC1idG46aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9Ci5tanItd3MtcmVhZG9ubHkgewogICAgb3BhY2l0eTogMC41OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5tanItd3MtY2hlY2tib3ggewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgbWFyZ2luLXRvcDogNHB4Owp9Ci5tanItd3MtdG9nZ2xlLWxhYmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgovKiDilIDilIAgTG9jYXRlIGJ1dHRvbiBpbnNpZGUgbm9kZSBoZWFkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItd3MtbG9jYXRlIHsKICAgIHdpZHRoOiAyNHB4ICFpbXBvcnRhbnQ7CiAgICBoZWlnaHQ6IDI0cHggIWltcG9ydGFudDsKICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgIG9wYWNpdHk6IDAuNTsKfQoubWpyLXdzLWxvY2F0ZTpob3ZlciB7CiAgICBvcGFjaXR5OiAxOwp9CgovKiDilIDilIAgUnVuIGJ1dHRvbiBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtcnVuLWNvbnRyb2xzIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4Owp9Ci5tanItbWZ2LXJ1bi1idG4gLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApOwp9Ci5tanItbWZ2LXJ1bi1idG4ucnVubmluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7Cn0KLm1qci1tZnYtcnVuLWJ0bi5zdG9wcGluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmYTcyNik7Cn0KLm1qci1tZnYtcnVuLWJ0bi5lcnJvciAucGkgewogICAgY29sb3I6ICNmNDQzMzY7Cn0KCi5tanItbWZ2LXN0b3AtYnRuIC5waSB7CiAgICBjb2xvcjogI2VmNTM1MDsKfQoubWpyLW1mdi1zdG9wLWJ0bi5hY3RpdmUgLnBpIHsKICAgIGNvbG9yOiAjZmY4YTY1Owp9Ci5tanItbWZ2LXN0b3AtYnRuLnN0b3BwaW5nIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KTsKfQoKLyog4pSA4pSAIEZsb2F0aW5nIFZpZXdlciBzaW1wbGUgdmlkZW8gcGxheWVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1zaW1wbGUtcGxheWVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIuaXMtYXVkaW8gewogICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAyMCUgMjAlLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4yKSwgcmdiYSgxOCwgMjAsIDI4LCAwLjk1KSk7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYXVkaW8tYmFja2Ryb3AgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4ycHg7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggMTJweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBwYWRkaW5nOiAxOHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWNvbnRyb2xzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEycHg7CiAgICByaWdodDogMTJweDsKICAgIGJvdHRvbTogMTJweDsKICAgIHotaW5kZXg6IDMwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCByZ2JhKDEwLCAxMCwgMTQsIDAuNzYpLCByZ2JhKDE2LCAxNiwgMjQsIDAuNTUpKTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItcm93IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWsgewogICAgLS1tanItc2Vlay1wY3Q6IDAlOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgdG8gcmlnaHQsCiAgICAgICAgI2ZmMmY1MiAwJSwKICAgICAgICAjZmYyZjUyIHZhcigtLW1qci1zZWVrLXBjdCksCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSB2YXIoLS1tanItc2Vlay1wY3QpLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgMTAwJQogICAgKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrOjotd2Via2l0LXNsaWRlci10aHVtYiB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIGJhY2tncm91bmQ6ICNmZjJmNTI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItc2Vlazo6LW1vei1yYW5nZS10aHVtYiB7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIGJhY2tncm91bmQ6ICNmZjJmNTI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYnRuIHsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgbWluLXdpZHRoOiAzMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWJ0bi5pcy1kaXNhYmxlZCwKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrLmlzLWRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNDU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItdGltZSB7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1mcmFtZSB7CiAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMgewogICAgei1pbmRleDogMzA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0sCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gewogICAgbGVmdDogOHB4OwogICAgcmlnaHQ6IDhweDsKICAgIGJvdHRvbTogOHB4OwogICAgcGFkZGluZzogOHB4OwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1yb3ctLXRvcCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tdGltZWdyb3VwLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tdGltZWdyb3VwIHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tcm93LS1ib3R0b20sCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1yb3ctLWJvdHRvbSB7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWJvdHRvbSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJvdHRvbSB7CiAgICBmbGV4LXNocmluazogMTsKICAgIGZsZXgtd3JhcDogbm93cmFwOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tdHJhbnNwb3J0LAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgIGZsZXgtd3JhcDogbm93cmFwOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tZ3JvdXAsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1ncm91cCB7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXNlZWstd3JhcCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1iYXItdGltZWxpbmUsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1zZWVrLXdyYXAsCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgb3JkZXI6IC0xOwogICAgZmxleDogMSAxIDEwMCU7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLWdyb3VwLS1pbiwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLWdyb3VwLS1vdXQsCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1ncm91cC0taW4sCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1ncm91cC0tb3V0IHsKICAgIGZsZXg6IDAgMSBhdXRvOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tcmFuZ2UtY291bnQsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1mcmFtZSB7CiAgICBtaW4td2lkdGg6IGF1dG87Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1yYW5nZS1jb3VudCB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1mcmFtZSB7CiAgICBtaW4td2lkdGg6IGF1dG87CiAgICBwYWRkaW5nOiAzcHggNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYnRuLS1pbiwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJ0bi0tb3V0LAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYnRuLS1tYXJrIHsKICAgIG1pbi13aWR0aDogMzJweDsKfQoKQGNvbnRhaW5lciAobWF4LXdpZHRoOiA5MDBweCkgewogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scyB7CiAgICAgICAgbGVmdDogOHB4OwogICAgICAgIHJpZ2h0OiA4cHg7CiAgICAgICAgYm90dG9tOiA4cHg7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGdhcDogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tcm93LS10b3AgewogICAgICAgIGdhcDogOHB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tdGltZWdyb3VwIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1yb3ctLWJvdHRvbSB7CiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBnYXA6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWJvdHRvbSB7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby10cmFuc3BvcnQgewogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tZ3JvdXAgewogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0CiAgICAgICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyCiAgICAgICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgICAgICAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICAgICAgb3JkZXI6IC0xOwogICAgICAgIGZsZXg6IDEgMSAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgfQp9CgpAY29udGFpbmVyIChtYXgtd2lkdGg6IDY4MHB4KSB7CiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzIHsKICAgICAgICBwYWRkaW5nOiA2cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1idG4gewogICAgICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tbnVtIHsKICAgICAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXRpbWUsCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWZyYW1lLAogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1yYW5nZS1jb3VudCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgfQp9CgovKiDilIDilIAgU2V0dGluZ3MgYnV0dG9uIGFjdGl2ZSBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtc2V0dGluZ3MtYnRuLmFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU1JSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKQogICAgKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDcwJSwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAxOCUKICAgICk7Cn0KLm1qci1tZnYtc2V0dGluZ3MtYnRuLmFjdGl2ZSAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9CgovKiDilIDilIAgQ2xvc2UgYnV0dG9uIChyZWQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdiAubWpyLW1mdi1jbG9zZS1idG4gewogICAgY29sb3I6ICNlODUwNTA7Cn0KLm1qci1tZnYgLm1qci1tZnYtY2xvc2UtYnRuOmhvdmVyIHsKICAgIGNvbG9yOiAjZmY2YjZiOwogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMzIsIDgwLCA4MCwgMC4xNSk7Cn0KCi8qIOKUgOKUgCBFbXB0eSBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtZW1wdHkgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IDEycHg7Cn0KCi8qIOKUgOKUgCBDb21wYXJlIGxhYmVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtbGFiZWwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNTgpOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgcGFkZGluZzogMnB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMjA7CiAgICBsZXR0ZXItc3BhY2luZzogMC40cHg7Cn0KCi5tanItbWZ2LWxhYmVsLmxhYmVsLWxlZnQgewogICAgbGVmdDogOHB4Owp9Ci5tanItbWZ2LWxhYmVsLmxhYmVsLXJpZ2h0IHsKICAgIHJpZ2h0OiA4cHg7Cn0KCi8qIOKUgOKUgCBBQiBkaXZpZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1hYi1kaXZpZGVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIHdpZHRoOiAwLjVweDsKICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgIHotaW5kZXg6IDEwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgMC41cHggcmdiYSgwLCAwLCAwLCAwLjQpLAogICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEwMG1zIGVhc2U7Cn0KCi5tanItbWZ2LWFiLWRpdmlkZXI6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAxMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwp9CgoubWpyLW1mdi1hYi1kaXZpZGVyOmhvdmVyLAoubWpyLW1mdi1hYi1kaXZpZGVyOmFjdGl2ZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIE1GViBHZW9tZXRyeSAmIExheW91dCBDbGFzc2VzIChyZXBsYWNlcyBpbmxpbmUgc3R5bGVzIGluIEZsb2F0aW5nVmlld2VyLmpzKQogICDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KCi8qIE1haW4gTUZWIGNvbnRhaW5lciBnZW9tZXRyeSAqLwoubWpyLW1mdiB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IHZhcigtLW1qci1tZnYtdG9wLW9mZnNldCwgNjBweCk7CiAgICByaWdodDogMjBweDsKICAgIHdpZHRoOiA2NDBweDsKICAgIGhlaWdodDogMzYwcHg7CiAgICBtaW4td2lkdGg6IDIyMHB4OwogICAgbWluLWhlaWdodDogMTYwcHg7CiAgICAvKiBBbHdheXMgZmxleDsgdmlzaWJpbGl0eSArIG9wYWNpdHkgY29udHJvbCBzaG93L2hpZGUgc28gQ1NTIHRyYW5zaXRpb25zIHdvcmsuCiAgICAgICBwb2ludGVyLWV2ZW50czpub25lIHdoaWxlIGhpZGRlbiBwcmV2ZW50cyBhY2NpZGVudGFsIGludGVyYWN0aW9uLiAqLwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICByZXNpemU6IGJvdGg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgei1pbmRleDogMTAwMDA7CiAgICAvKiBIaWRkZW4gc3RhdGUgKi8KICAgIG9wYWNpdHk6IDA7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNnB4KSBzY2FsZSgwLjk4KTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCByaWdodDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB0cmFuc2Zvcm0gMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdmlzaWJpbGl0eSAwcyBsaW5lYXIgMC4xOHM7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXJlc2l6aW5nIHsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLW1mdi5pcy12aXNpYmxlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCkgc2NhbGUoMSk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdHJhbnNmb3JtIDAuMThzIGVhc2Utb3V0LAogICAgICAgIHZpc2liaWxpdHkgMHMgbGluZWFyIDBzOwp9CgovKiBNZWRpYSBlbGVtZW50cyAoaW1nL3ZpZGVvKSBzaXppbmcgdmFyaWFudHMgKi8KLm1qci1tZnYtbWVkaWEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgb2JqZWN0LXBvc2l0aW9uOiBjZW50ZXI7Cn0KCi5tanItbWZ2LW1lZGlhLS1maXQtaGVpZ2h0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICBvYmplY3QtcG9zaXRpb246IGNlbnRlcjsKfQoKLm1qci1tZnYtbWVkaWEtLWZpbGwgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIG9iamVjdC1wb3NpdGlvbjogY2VudGVyOwogICAgZGlzcGxheTogYmxvY2s7Cn0KCi8qIEF1ZGlvIGNhcmQgaW5zaWRlIE1GViAqLwoubWpyLW1mdi1hdWRpby1jYXJkIHsKICAgIHdpZHRoOiBtaW4oOTIlLCA1NjBweCk7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxNjBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNiksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpOwogICAgYm94LXNoYWRvdzogMCA2cHggMTZweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLW1mdi1hdWRpby1oZWFkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWZ2LWF1ZGlvLWljb24gewogICAgY29sb3I6IHZhcigtLW1qci1iYWRnZS1hdWRpbywgI2ZmOTgwMCk7CiAgICBvcGFjaXR5OiAwLjk1Owp9CgoubWpyLW1mdi1hdWRpby10aXRsZSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLm1qci1tZnYtYXVkaW8tcGxheWVyIHsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLW1mdi1zaWRlLXBhbmVsIC5tanItbWZ2LWF1ZGlvLWNhcmQsCi5tanItbWZ2LWFiLWxheWVyIC5tanItbWZ2LWF1ZGlvLWNhcmQsCi5tanItbWZ2LWdyaWQtY2VsbCAubWpyLW1mdi1hdWRpby1jYXJkIHsKICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsKfQoKLyogVmlkZW8gZWxlbWVudCBzcGVjaWZpYyBzdHlsZXMgKi8KLm1qci1tZnYtbWVkaWEtdmlkZW8gewogICAgLyogSW5oZXJpdHMgZnJvbSAubWpyLW1mdi1tZWRpYSBvciAubWpyLW1mdi1tZWRpYS0tZmlsbCAqLwp9CgovKiBOb2RlIFN0cmVhbSDigJQgY3VycmVudGx5LXN0cmVhbWVkIG5vZGUgYmFkZ2UgKHRvcC1sZWZ0IG9mIGNvbnRlbnQgYXJlYSwKICAgZm9sbG93aW5nIHRoZSBzYW1lIG92ZXJsYXkgcGF0dGVybiBhcyAubWpyLW1mdi1nZW5pbmZvKS4gKi8KLm1qci1tZnYtbm9kZS1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogOHB4OwogICAgbGVmdDogOHB4OwogICAgei1pbmRleDogMTI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuMzsKICAgIGNvbG9yOiAjZTZmM2ZmOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjY1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTIwLCAxNzAsIDI0MCwgMC40NSk7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSAxNnB4KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLyogR2VuIGluZm8gb3ZlcmxheSDigJQgYWxsIG1vZGVzIHNoYXJlIGJhc2UgbGF5b3V0ICovCi5tanItbWZ2LWdlbmluZm8sCi5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA4cHg7CiAgICByaWdodDogOHB4OwogICAgYm90dG9tOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgY29sb3I6ICNmZmY7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yLXk6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwp9CgovKiBLZWVwIEdlbiBJbmZvIGFib3ZlIGN1c3RvbSBzaW1wbGUtcGxheWVyIGNvbnRyb2xzIHdoZW4gcHJlc2VudC4gKi8KLm1qci1tZnYtZ2VuaW5mby5tanItbWZ2LWdlbmluZm8tLWFib3ZlLXBsYXllciwKLm1qci1tZnYtZ2VuaW5mby1hLm1qci1tZnYtZ2VuaW5mby0tYWJvdmUtcGxheWVyLAoubWpyLW1mdi1nZW5pbmZvLWIubWpyLW1mdi1nZW5pbmZvLS1hYm92ZS1wbGF5ZXIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBGYWxsYmFjazogd2hlbiBzaW1wbGUtcGxheWVyIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgZ2VuaW5mbyBvdmVybGF5LAogICBtb3ZlIGl0IHVwIGV2ZW4gaWYgdGhlIG1vZGlmaWVyIGNsYXNzIHdhcyBub3QgYXR0YWNoZWQuICovCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgKyAubWpyLW1mdi1nZW5pbmZvLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mby1hLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIHRvcDogOHB4OwogICAgYm90dG9tOiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDQ1JSwgY2FsYygxMDAlIC0gMTI0cHgpKTsKfQoKLyogQUIgbW9kZSBvdmVybGF5cyBhcmUgYXR0YWNoZWQgYXQgY29udGFpbmVyIGxldmVsOyBzaGlmdCB0aGVtIHdoZW4gQUIgbGF5ZXJzIHVzZSBzaW1wbGUtcGxheWVyLiAqLwoubWpyLW1mdi1hYi1jb250YWluZXI6aGFzKC5tanItbWZ2LWFiLWxheWVyIC5tanItbWZ2LXNpbXBsZS1wbGF5ZXIpIC5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtYWItY29udGFpbmVyOmhhcygubWpyLW1mdi1hYi1sYXllciAubWpyLW1mdi1zaW1wbGUtcGxheWVyKSAubWpyLW1mdi1nZW5pbmZvLWIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBTaGFyZWQgc3R5bGUgZm9yIGFsbCBnZW4gaW5mbyBvdmVybGF5IHZhcmlhbnRzICovCi5tanItbWZ2LWdlbmluZm8gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOyAvKiBkZWZhdWx0IOKAlCBvdmVycmlkZGVuIHBlciBmaWVsZCBiZWxvdyAqLwp9CgovKiBQZXItZmllbGQgbGFiZWwgY29sb3JzICovCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2VjOGZmOwp9IC8qIGJsdWUgICDigJQgUHJvbXB0ICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmZDQ3YTsKfSAvKiBhbWJlciAg4oCUIFNlZWQgICAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0gLyogZ3JlZW4gIOKAlCBNb2RlbCAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZDQ4Y2ZmOwp9IC8qIHZpb2xldCDigJQgTG9SQSAgICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmOWY3YTsKfSAvKiBvcmFuZ2Ug4oCUIFNhbXBsZXIgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY3YTlmOwp9IC8qIHBpbmsgICDigJQgU2NoZWR1bGVyICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhOWZmZjsKfSAvKiBpbmRpZ28g4oCUIENGRyAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcgewogICAgY29sb3I6ICM3YWZmZDQ7Cn0gLyogdGVhbCAgIOKAlCBTdGVwICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImdlblRpbWUiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0iZ2VuVGltZSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2UwZmY3YTsKfSAvKiBsaW1lICAg4oCUIEdlbiBUaW1lICovCgoubWpyLW1mdi1nZW5pbmZvIGRpdiwKLm1qci1tZnYtZ2VuaW5mby1hIGRpdiwKLm1qci1tZnYtZ2VuaW5mby1iIGRpdiB7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIG1hcmdpbi1ib3R0b206IDNweDsKfQoKLm1qci1tZnYtZ2VuaW5mbyBkaXY6bGFzdC1jaGlsZCwKLm1qci1tZnYtZ2VuaW5mby1hIGRpdjpsYXN0LWNoaWxkLAoubWpyLW1mdi1nZW5pbmZvLWIgZGl2Omxhc3QtY2hpbGQgewogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLyogU2ltcGxlIG1vZGUgY29udGFpbmVyICovCi5tanItbWZ2LXNpbXBsZS1jb250YWluZXIgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLyogQUIgbW9kZSBjb250YWluZXIgKi8KLm1qci1tZnYtYWItY29udGFpbmVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6ICMwMDA7Cn0KCi8qIEFCIG1vZGUgbGF5ZXJzICovCi5tanItbWZ2LWFiLWxheWVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci1tZnYtYWItbGF5ZXItLWIgewogICAgLyogY2xpcC1wYXRoIGFwcGxpZWQgaW5saW5lIGZvciBkeW5hbWljIGRpdmlkZXIgcG9zaXRpb24gKi8KfQoKLyogU2lkZS1ieS1zaWRlIG1vZGUgY29udGFpbmVyICovCi5tanItbWZ2LXNpZGUtY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGdhcDogMnB4OwogICAgYmFja2dyb3VuZDogIzExMTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIFNpZGUtYnktc2lkZSBoYWxmIHBhbmVscyAqLwoubWpyLW1mdi1zaWRlLXBhbmVsIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGQ7Cn0KCi8qIEdyaWQgY29tcGFyZSAoMsOXMikgY29udGFpbmVyICovCi5tanItbWZ2LWdyaWQtY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDFmciAxZnI7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGdhcDogMnB4OwogICAgYmFja2dyb3VuZDogIzExMTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIEdyaWQgY2VsbHMgKi8KLm1qci1tZnYtZ3JpZC1jZWxsIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogIzBkMGQwZDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi8qIEdlbiBpbmZvIG92ZXJsYXlzIGZvciBncmlkIGNlbGxzIEMgYW5kIEQgKi8KLm1qci1tZnYtZ2VuaW5mby1jLAoubWpyLW1mdi1nZW5pbmZvLWQgewogICAgZGlzcGxheTogbm9uZTsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDhweDsKICAgIHJpZ2h0OiA4cHg7CiAgICBib3R0b206IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42NSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbWF4LWhlaWdodDogNDAlOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7Cn0KCi5tanItbWZ2LWdlbmluZm8tYyBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7Cn0KCi8qIFBlci1maWVsZCBsYWJlbCBjb2xvcnMgZm9yIEMvRCBnZW4gaW5mbyBvdmVybGF5cyAqLwoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZWM4ZmY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdkZGE4YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmOWY3YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjdhOWY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2E5ZmZmOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2FmZmQ0Owp9CgovKiBHZW4gaW5mbyBhY3RpdmUgc3RhdGUg4oCUIGJ1dHRvbiBnbG93cyB3aGVuIGF0IGxlYXN0IG9uZSBmaWVsZCBpcyBzZWxlY3RlZCAqLwoubWpyLW1mdiAubWpyLWljb24tYnRuLmlzLW9uIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50LCA5NSwgMTc5LCAyNTUpLCAwLjU1KTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA4MCUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE1JSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLmlzLW9wZW4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgNjIlLCAjZmZmZmZmIDEyJSk7CiAgICBjb2xvcjogI2VlZjdmZjsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjI4KSwgcmdiYSg5NSwgMTc5LCAyNTUsIDAuMTQpKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCksCiAgICAgICAgMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAyNiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4uaXMtb3BlbiB7CiAgICBjb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50Owp9CgovKiBHZW4gaW5mbyBkcm9wZG93biBwYW5lbCAqLwoubWpyLW1mdi1nZW4tZHJvcGRvd24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgei1pbmRleDogMTAwMDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTYlLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBwYWRkaW5nOiA2cHggNHB4OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjE4KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpLAogICAgICAgIDAgMnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMyk7CiAgICBkaXNwbGF5OiBub25lOwogICAgbWluLXdpZHRoOiAxNTBweDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duOjpiZWZvcmUgewogICAgY29udGVudDogIkdFTiBJTkZPIjsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZm9udC1zaXplOiA5cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuOHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7CiAgICBwYWRkaW5nOiAycHggMTBweCA2cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjEpOwogICAgbWFyZ2luLWJvdHRvbTogNHB4Owp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24uaXMtdmlzaWJsZSB7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgcGFkZGluZzogNXB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEwMG1zIGVhc2U7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLXJvdzpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDcpOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24tcm93IGlucHV0W3R5cGU9ImNoZWNrYm94Il0gewogICAgd2lkdGg6IDEzcHg7CiAgICBoZWlnaHQ6IDEzcHg7CiAgICBhY2NlbnQtY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi8qIFRyYW5zZm9ybSBmb3IgcGFuL3pvb20gLSBhcHBsaWVkIGlubGluZSBmb3IgZHluYW1pYyB2YWx1ZXMgKi8KLm1qci1tZnYtbWVkaWEtLXRyYW5zZm9ybSB7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7Cn0KCi8qIEN1cnNvciBmZWVkYmFjayBmb3IgcGFuL3pvb20gaW50ZXJhY3Rpb25zICovCi5tanItbWZ2LWNvbnRlbnQtLWdyYWIgewogICAgY3Vyc29yOiBncmFiOwp9CgoubWpyLW1mdi1jb250ZW50LS1ncmFiYmluZyB7CiAgICBjdXJzb3I6IGdyYWJiaW5nOwp9CgovKiBTaWRlYmFyIHRhYiBidXR0b246IGFsbG93IDItbGluZSBsYWJlbCB2aWEgXG4gaW4gbGFiZWwgc3RyaW5nICovCi5tYWpvb3ItYXNzZXRzLXRhYi1idXR0b24gLnNpZGUtYmFyLWJ1dHRvbi1sYWJlbCB7CiAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7Cn0KCi8qIEJvdHRvbS1wYW5lbCBnZW5lcmF0ZWQgZmVlZDogY29tcGFjdCBjYXJkcyB3aXRoIG9ubHkgdGhlIGdlbmVyYXRpb24tdGltZSBwaWxsICovCi5tanItYm90dG9tLWZlZWQgewogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbCB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHNjcm9sbGJhci1ndXR0ZXI6IHN0YWJsZTsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICBzY3JvbGwtYmVoYXZpb3I6IHNtb290aDsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMyZjM1NDApIDcwJSwgIzdmOGVhMyAzMCUpCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDg4JSwgIzAwMCAxMiUpOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLAoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogMTBweDsKICAgIGhlaWdodDogMTBweDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiwKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMyZjM1NDApIDcwJSwgIzdmOGVhMyAzMCUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2ssCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4OCUsICMwMDAgMTIlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZCB7CiAgICBnYXA6IDZweCAhaW1wb3J0YW50OwogICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50OwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgobWluKDEwMCUsIDEzMnB4KSwgMWZyKSkgIWltcG9ydGFudDsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBhbGlnbi1jb250ZW50OiBzdGFydDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkIHsKICAgIGJvcmRlci1yYWRpdXM6IDEycHggIWltcG9ydGFudDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCAjMDAwIDglKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMjIpICFpbXBvcnRhbnQ7CiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQ6aG92ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI4KSAhaW1wb3J0YW50OwoKICAgIC5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkLmlzLXNlbGVjdGVkIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAzcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgICAgIDAgMCAwIDZweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAgICAgMCAwIDIwcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgNDAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgICAgIDAgMTBweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4yOCkgIWltcG9ydGFudDsKICAgICAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSAhaW1wb3J0YW50OwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIHsKICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYiB7CiAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgaXNvbGF0aW9uOiBpc29sYXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogLTE7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxNDBtcyBlYXNlLAogICAgICAgIG9wYWNpdHkgMTQwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg1cHgsIDVweCkgc2NhbGUoMC45ODUpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMykpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMjAyNDJiKSA4NCUsICMwMDAgMTYlKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3gtc2hhZG93OiAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xNik7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDEwcHgsIDEwcHgpIHNjYWxlKDAuOTcpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODIlLCAjMDAwIDE4JSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDIycHggcmdiYSgwLCAwLCAwLCAwLjE0KTsKICAgIG9wYWNpdHk6IDAuNzU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNnB4LCA2cHgpIHNjYWxlKDAuOTg1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmFmdGVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTJweCwgMTJweCkgc2NhbGUoMC45Nyk7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiB7CiAgICBhc3BlY3QtcmF0aW86IDAuOTUgLyAxICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNzIlLCAjMDAwIDI4JSkgIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iLXBsYXkgewogICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KAogICAgICAgIGNpcmNsZSBhdCBjZW50ZXIsCiAgICAgICAgcmdiYSgwLCAwLCAwLCAwLjE4KSwKICAgICAgICByZ2JhKDAsIDAsIDAsIDAuMDQpIDM4JSwKICAgICAgICB0cmFuc3BhcmVudCA3MCUKICAgICk7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1leHQsCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1yYXRpbmcsCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS10YWdzIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45Mik7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKfQoKLyog4pSA4pSAIEZlZWQgY2FyZCBpbmZvOiBkZWZhdWx0IGhpZGRlbiwgdG9nZ2xlZCB2aWEgbWpyLWZlZWQtc2hvdy0qIGNsYXNzZXMgb24gLm1qci1ncmlkIOKUgOKUgCAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDRweCA2cHggIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWluZm8gLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKfQoKLyogRmVlZCBmaWxlbmFtZSAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1maWxlbmFtZSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1maWxlbmFtZSAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKfQoKLyogRmVlZCBkaW1lbnNpb25zIC8gZHVyYXRpb24gKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtcmVzLAoubWpyLWJvdHRvbS1mZWVkIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kaW1lbnNpb25zIC5tanItbWV0YS1yZXMsCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGltZW5zaW9ucyAubWpyLW1ldGEtZHVyYXRpb24gewogICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgZGF0ZS90aW1lICovCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWRhdGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLXRpbWUtdmFsIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRhdGUgLm1qci1tZXRhLWRhdGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGF0ZSAubWpyLW1ldGEtdGltZS12YWwgewogICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgZ2VuZXJhdGlvbiB0aW1lIGJhZGdlICovCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWdlbnRpbWUgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZ2VudGltZSAubWpyLW1ldGEtZ2VudGltZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleCAhaW1wb3J0YW50Owp9CgovKiBGZWVkIHdvcmtmbG93IGRvdCAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1kb3Qtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kb3QgLm1qci1jYXJkLWRvdC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgYmFkZ2VzICovCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1leHQgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLWV4dCAubWpyLWJhZGdlLWV4dCB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1yYXRpbmcgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLXJhdGluZyAubWpyLWJhZGdlLXJhdGluZyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS10YWdzIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWJhZGdlcy10YWdzIC5tanItYmFkZ2UtdGFncyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgbWV0YSByb3cgc3R5bGluZyDigJQgZmxleCBsYXlvdXQgc28gdmlzaWJsZSBpdGVtcyBzdGF5IHNlcGFyYXRlZCAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7CiAgICBmbGV4LXdyYXA6IG5vd3JhcCAhaW1wb3J0YW50OwogICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50OwogICAgZ2FwOiA1cHggIWltcG9ydGFudDsKICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMCAhaW1wb3J0YW50OwogICAgcGFkZGluZy1yaWdodDogMCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEuMyAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC43OCAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAwLjhlbSAhaW1wb3J0YW50OwogICAgLyogdGV4dC1vdmVyZmxvdyBlbGxpcHNpcyBkb2Vzbid0IGFwcGx5IG9uIGEgZmxleCBjb250YWluZXIgaXRzZWxmICovCn0KLyogRWFjaCBtZXRhIHNwYW4gdHJ1bmNhdGVzIGluZGl2aWR1YWxseSBpZiB0b28gbG9uZyAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyA+IHNwYW4gewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtc2hyaW5rOiAxOwp9Ci8qIEdlbnRpbWUgYmFkZ2UgYW5kIHRpbWUgdmFsdWUgc2hvdWxkIHN0YXkgdmlzaWJsZSAoZG9uJ3Qgc2hyaW5rIGF3YXkpICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gLm1qci1tZXRhLWdlbnRpbWUsCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gLm1qci1tZXRhLXRpbWUtdmFsIHsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWdlbnRpbWUgLm1qci1tZXRhLWdlbnRpbWUgewogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogM3B4OwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjIyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDAgIWltcG9ydGFudDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxNWVtOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45OCk7CiAgICB0ZXh0LXNoYWRvdzoKICAgICAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjkpLAogICAgICAgIDAgMCAxMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7Cn0KCi8qIOKUgOKUgCBBdWRpbyAvIDNEIHBsYWNlaG9sZGVyIHRodW1ibmFpbHMgaW4gdGhlIGZlZWQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgovKiBBdWRpbyBjYXJkcyBzaG93IHRoZSB3YXZlZm9ybSBzcHJpdGU7IGdpdmUgaXQgYSBkaXN0aW5jdCBiYWNrZ3JvdW5kIHNvIGl0CiAgIGRvZXNuJ3QgbG9vayBsaWtlIGEgYnJva2VuIGltYWdlIHBsYWNlaG9sZGVyIGluIHRoZSBmZWVkLiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1raW5kPSJhdWRpbyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0ibXAzIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJ3YXYiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9Im9nZyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZmxhYyJdIC5tanItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDYwJSwgIzFhMWYyYiA0MCUpICFpbXBvcnRhbnQ7Cn0KCi8qIDNEIG1vZGVsIGNhcmRzIHVzZSBhbiBpY29uIHBsYWNlaG9sZGVyIOKAlCBhZGQgYSBzdWJ0bGUgZ3JhZGllbnQgc28gdGhleSByZWFkCiAgIGFzIGludGVudGlvbmFsIHJhdGhlciB0aGFuIG1pc3NpbmcuICovCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWtpbmQ9Im1vZGVsM2QiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9ImdsYiJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZ2x0ZiJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0ib2JqIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJmYngiXSAubWpyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA1MCUsICMwZDExMTcgNTAlKSAhaW1wb3J0YW50Owp9CgovKiDilIDilIAgRmVlZCBncm91cCBidXR0b24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgoubWpyLWJvdHRvbS1mZWVkIC5tanItZmVlZC1ncm91cC1idXR0b24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAzNHB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDExOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIG1pbi13aWR0aDogMjhweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTYpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1mZWVkLWdyb3VwLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE4LCAyNCwgMzQsIDAuOSk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24taWNvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24tY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiDilIDilIAgRmVlZCBncm91cCBwb3BvdmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzIyMik7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICMzYTNhM2EpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcsIDhweCk7CiAgICBib3gtc2hhZG93OiAwIDhweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC40NSk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci10aXRsZSB7CiAgICBwYWRkaW5nOiA4cHggMTBweCA0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKfQoKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZCB7CiAgICBwYWRkaW5nOiA0cHggOHB4IDEwcHg7CiAgICBtYXgtaGVpZ2h0OiAzNjBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzJmMzU0MCkgNzAlLCAjN2Y4ZWEzIDMwJSkKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODglLCAjMDAwIDEyJSk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24taWNvbiwKLm1qci1mZWVkLWdyb3VwLWJ1dHRvbi1jb3VudCB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1mZWVkLWdyb3VwLW1lbWJlci1jYXJkIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1mZWVkLWdyb3VwLW1lbWJlci1jYXJkIC5tanItdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAxIC8gMSAhaW1wb3J0YW50Owp9CgoubWpyLWZlZWQtZ3JvdXAtbWVtYmVyLWNhcmQgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMzRweDsKICAgIHJpZ2h0OiA2cHg7CiAgICB6LWluZGV4OiAxMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBtaW4td2lkdGg6IDI4cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDE0LCAyMCwgMC43NCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk2KTsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMjQsIDM0LCAwLjkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uID4gKiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1maWxtc3RyaXA6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA0cHg7CiAgICBoZWlnaHQ6IDRweDsKfQoKLm1qci1maWxtc3RyaXA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWZpbG1zdHJpcDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwp9CgoubWpyLWZpbG1zdHJpcDpob3Zlcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbi1jb3VudCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi8qIOKUgOKUgCBEdXBsaWNhdGUgc3RhY2sgYnV0dG9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwovKiBTaG93cyBvbiB0aGUgcHJpbWFyeSBjYXJkIHdoZW4gc2FtZS1maWxlbmFtZSBkdXBsaWNhdGVzIGV4aXN0LiAgICAgICAgICAgICAqLwovKiBQb3NpdGlvbmVkIGF0IGJvdHRvbS1yaWdodCB0byBub3Qgb3ZlcmxhcCB0aGUgc3RhY2stZ3JvdXAgYnV0dG9uICh0b3AtcmlnaHQpLiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3R0b206IDMwcHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMTgwLCAwLCAwLjM4KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgzMCwgMTgsIDAsIDAuODIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyMDAsIDYwLCAwLjk2KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzIpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE1cywKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDUwLCAzMCwgMCwgMC45NCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAxODAsIDAsIDAuNik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stYnV0dG9uID4gKiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWR1cC1zdGFjay1jb3VudCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWR1cC1zdGFja2VkPSJ0cnVlIl0gLm1qci1kdXAtc3RhY2stYnV0dG9uIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zMiksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjU1LCAxODAsIDAsIDAuMik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItZmVlZC1ncm91cC1idXR0b24gewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI0KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1kdXAtc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgovKiDilIDilIAgVmlzdWFsIHN0YWNraW5nIGVmZmVjdCDigJQgbGF5ZXJlZCBjYXJkcyBiZWhpbmQgdGhlIG1haW4gY2FyZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLyogQ3JlYXRlcyBwc2V1ZG8tZWxlbWVudCAiY2FyZHMiIG9mZnNldCBiZWhpbmQgdGhlIHByaW1hcnkgY2FyZCB0byB2aXN1YWxseSAgICAqLwovKiBjb21tdW5pY2F0ZSB0aGF0IHRoaXMgY2FyZCByZXByZXNlbnRzIGEgZ3JvdXAgb2YgbXVsdGlwbGUgaW1hZ2VzLiAgICAgICAgICAgICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmJlZm9yZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMxYTFhMmUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogLTE7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxODBtcyBlYXNlLAogICAgICAgIG9wYWNpdHkgMTgwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoM3B4LCAzcHgpIHJvdGF0ZSgxZGVnKTsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNnB4LCA2cHgpIHJvdGF0ZSgyLjJkZWcpOwogICAgb3BhY2l0eTogMC4yNTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNHB4LCA0cHgpIHJvdGF0ZSgxLjVkZWcpOwogICAgb3BhY2l0eTogMC41NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg4cHgsIDhweCkgcm90YXRlKDNkZWcpOwogICAgb3BhY2l0eTogMC4zNTsKfQoKLm1qci1zdGFjay1ncm91cC1wb3BvdmVyIHsKICAgIHdpZHRoOiBtaW4oNDQwcHgsIDkydncpOwp9CgoubWpyLXN0YWNrLWdyb3VwLW1lbWJlci1jYXJkIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDEgIWltcG9ydGFudDsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBMaWdodCBtb2RlIG92ZXJyaWRlcyAoQ29tZnlVSSB2MS40MisgaW1wcm92ZWQgbGlnaHQgdGhlbWUpCiAqIFVzZXMgQ29tZnlVSSBkYXRhLXRoZW1lIGF0dHJpYnV0ZSB3aGVuIHNldCwgd2l0aAogKiBwcmVmZXJzLWNvbG9yLXNjaGVtZSBhcyBhIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucy4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgovKiBDb21meVVJIHNldHMgZGF0YS10aGVtZT0ibGlnaHQiIG9uIDxodG1sPiBvciA8Ym9keT4gKi8KOmlzKFtkYXRhLXRoZW1lPSJsaWdodCJdLCBbZGF0YS1jb2xvci1zY2hlbWU9ImxpZ2h0Il0pIC5tanItYXNzZXRzLW1hbmFnZXIsCjppcyhbZGF0YS10aGVtZT0ibGlnaHQiXSwgW2RhdGEtY29sb3Itc2NoZW1lPSJsaWdodCJdKSAubWpyLXBvcG92ZXIgewogICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgI2YwZjBmMCk7CiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsICNmYWZhZmEpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgI2U4ZThlOCk7CiAgICAtLW1qci1zdXJmYWNlLTM6IHZhcigtLW1vZGFsLWNhcmQtYmFja2dyb3VuZCwgI2ZmZmZmZik7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCByZ2JhKDAsIDAsIDAsIDAuMTQpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCByZ2JhKDAsIDAsIDAsIDAuNTUpKTsKICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZTBlMGUwKTsKfQoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIHsKICAgIC8qIEZhbGxiYWNrOiBvbmx5IGFwcGx5IGlmIENvbWZ5VUkgaGFzbid0IHNldCBhbiBleHBsaWNpdCBkYXRhLXRoZW1lICovCiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyOm5vdChbZGF0YS10aGVtZS1hcHBsaWVkXSksCiAgICAubWpyLXBvcG92ZXI6bm90KFtkYXRhLXRoZW1lLWFwcGxpZWRdKSB7CiAgICAgICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgI2YwZjBmMCk7CiAgICAgICAgLS1tanItc3VyZmFjZS0xOiB2YXIoLS1pbnRlcmZhY2UtbWVudS1zdXJmYWNlLCAjZmFmYWZhKTsKICAgICAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZThlOGU4KTsKICAgICAgICAtLW1qci1zdXJmYWNlLTM6IHZhcigtLW1vZGFsLWNhcmQtYmFja2dyb3VuZCwgI2ZmZmZmZik7CiAgICAgICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItZGVmYXVsdCwgcmdiYSgwLCAwLCAwLCAwLjE0KSk7CiAgICAgICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHJnYmEoMCwgMCwgMCwgMC41NSkpOwogICAgICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZTBlMGUwKTsKICAgIH0KfQoKLyog4pSA4pSA4pSAIFNrZWxldG9uIGxvYWRlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgoubWpyLWNhcmQtc2tlbGV0b24gewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCAjM2EzYTNhKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnLCA4cHgpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIC8qIE1hdGNoIC5tanItdGh1bWIgYXNwZWN0IHJhdGlvIHNvIHNrZWxldG9ucyBoYXZlIHRoZSBzYW1lIGZvb3RwcmludCBhcyByZWFsIGNhcmRzLiAqLwogICAgYXNwZWN0LXJhdGlvOiAxIC8gMTsKfQoKLyogU2hpbW1lciBzd2VlcCAqLwoubWpyLWNhcmQtc2tlbGV0b246OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgOTBkZWcsCiAgICAgICAgdHJhbnNwYXJlbnQgMCUsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzYTNhM2EpIDgwJSwgdHJhbnNwYXJlbnQpIDUwJSwKICAgICAgICB0cmFuc3BhcmVudCAxMDAlCiAgICApOwogICAgYW5pbWF0aW9uOiBtanItc2hpbW1lciAxLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKfQoKQGtleWZyYW1lcyBtanItc2hpbW1lciB7CiAgICBmcm9tIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgfQogICAgdG8gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsKICAgIH0KfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItY2FyZC1za2VsZXRvbjo6YWZ0ZXIgewogICAgICAgIGFuaW1hdGlvbjogbm9uZTsKICAgIH0KfQoKLyog4pSA4pSA4pSAIFJlc3BvbnNpdmUgc3VtbWFyeSBiYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgovKgogKiBFbmFibGUgY29udGFpbmVyIHF1ZXJpZXMgb24gdGhlIHN1bW1hcnkgYmFyIHNvIGNoaWxkcmVuIGNhbiByZXNwb25kIHRvIGl0cwogKiBhY3R1YWwgcmVuZGVyZWQgd2lkdGggKGUuZy4gd2hlbiB0aGUgcGFuZWwgaXMgZG9ja2VkIGluIGEgbmFycm93IHNpZGViYXIpLgogKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnkgewogICAgY29udGFpbmVyLXR5cGU6IGlubGluZS1zaXplOwogICAgY29udGFpbmVyLW5hbWU6IG1qci1zdW1tYXJ5LWJhcjsKfQoKLyogQmVsb3cgfjM4MCBweDogaGlkZSB0aGUgcGlsbHMvcmlnaHQgc2VjdGlvbiB0byBwcmV2ZW50IG92ZXJmbG93LiAqLwpAY29udGFpbmVyIG1qci1zdW1tYXJ5LWJhciAobWF4LXdpZHRoOiAzODBweCkgewogICAgLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktcmlnaHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS10ZXh0IHsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICB9Cn0K", "" + import.meta.url).toString(), n = document.createElement("link");
+ let e = new URL("data:text/css;base64,LyoqCiAqIE1ham9vciBBc3NldHMgTWFuYWdlciDigJQgQ29tZnktbGlrZSB0aGVtZSBsYXllcgogKgogKiBSVUxFUzoKICogLSBEbyBOT1QgaGFyZGNvZGUgYSBjdXN0b20gcGFsZXR0ZTsgdXNlIGV4aXN0aW5nIENvbWZ5VUkgQ1NTIHZhcmlhYmxlcyB2aWEgdmFyKC4uLikuCiAqIC0gS2VlcCBldmVyeXRoaW5nIHNjb3BlZCB1bmRlciBgLm1qci1hc3NldHMtbWFuYWdlcmAgdG8gYXZvaWQgbGVha2luZyBzdHlsZXMgdG8gQ29tZnlVSSAoZXhjZXB0IGAubWpyLXBvcG92ZXIqYCB3aGljaCBjYW4gYmUgcG9ydGFsZWQgdG8gYGRvY3VtZW50LmJvZHlgKS4KICovCgoubWpyLWFzc2V0cy1tYW5hZ2VyIHsKICAgIC8qIFR5cG9ncmFwaHkgKi8KICAgIGZvbnQtZmFtaWx5OiB2YXIoCiAgICAgICAgLS1jb21meS1mb250LAogICAgICAgIHZhcigKICAgICAgICAgICAgLS1mb250LWludGVyLAogICAgICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgICAgICBzeXN0ZW0tdWksCiAgICAgICAgICAgIC1hcHBsZS1zeXN0ZW0sCiAgICAgICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgICAgIFJvYm90bywKICAgICAgICAgICAgQXJpYWwsCiAgICAgICAgICAgIHNhbnMtc2VyaWYKICAgICAgICApCiAgICApOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsIHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKSk7CgogICAgLyoKICAgICAqIFN1cmZhY2VzIOKAlCBwcmlvcml0eTogQ29tZnlVSSB2MS40MiBkZXNpZ24tc3lzdGVtIHRva2VuIOKGkiBsZWdhY3kgdG9rZW4g4oaSIGhhcmQgZmFsbGJhY2sKICAgICAqIE5ldyB0b2tlbnM6IC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwKICAgICAqICAgICAgICAgICAgIC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAtLWJ1dHRvbi1zdXJmYWNlLCAtLWJ1dHRvbi1ob3Zlci1zdXJmYWNlLAogICAgICogICAgICAgICAgICAgLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgLS1wcmltYXJ5LWJhY2tncm91bmQsIC0tbXV0ZWQtZm9yZWdyb3VuZCwKICAgICAqICAgICAgICAgICAgIC0tYm9yZGVyLWRlZmF1bHQsIC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCAtLXdhcm5pbmctYmFja2dyb3VuZCwgLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kCiAgICAgKi8KICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxZTFlMWUpKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpKTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKSk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIC0tbWpyLWFjY2VudC1ob3ZlcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWhvdmVyLCB2YXIoLS1jb21meS1hY2NlbnQsICM3ZWM4ZmYpKTsKICAgIC0tbWpyLWJ0bi1zdXJmYWNlOiB2YXIoLS1idXR0b24tc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItYnRuLWhvdmVyOiB2YXIoLS1idXR0b24taG92ZXItc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItc2VsZWN0ZWQtc3VyZmFjZTogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE1KSk7CgogICAgLyogUmFkaWkg4oCUIHVzZSBDb21meVVJIGRlc2lnbi1zeXN0ZW0gcmFkaXVzIHRva2VucyB3aGVuIGF2YWlsYWJsZSAqLwogICAgLS1tanItci1zbTogdmFyKC0tcmFkaXVzLXNtLCA4cHgpOwogICAgLS1tanItci1tZDogdmFyKC0tcmFkaXVzLW1kLCAxMHB4KTsKICAgIC0tbWpyLXItbGc6IHZhcigtLXJhZGl1cy1sZywgMTJweCk7CgogICAgLyogU3BhY2luZyAqLwogICAgLS1tanItcGFkLXNtOiA4cHg7CiAgICAtLW1qci1wYWQtbWQ6IDEycHg7CiAgICAtLW1qci1wYWQtbGc6IDE2cHg7CgogICAgLyogU2VtYW50aWMgU3RhdHVzIENvbG9ycyDigJQgcHJlZmVyIENvbWZ5VUkgdjEuNDIgc2VtYW50aWMgdG9rZW5zICovCiAgICAtLW1qci1zdGF0dXMtc3VjY2VzczogdmFyKC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtc3VjY2VzcywgIzRjYWY1MCkpOwogICAgLS1tanItc3RhdHVzLXdhcm5pbmc6IHZhcigtLXdhcm5pbmctYmFja2dyb3VuZCwgdmFyKC0tY29tZnktc3RhdHVzLXdhcm5pbmcsICNmZmE3MjYpKTsKICAgIC0tbWpyLXN0YXR1cy1lcnJvcjogdmFyKC0tZGVzdHJ1Y3RpdmUtYmFja2dyb3VuZCwgdmFyKC0tY29tZnktc3RhdHVzLWVycm9yLCAjZjQ0MzM2KSk7CiAgICAtLW1qci1zdGF0dXMtaW5mbzogdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpOwogICAgLS1tanItc3RhdHVzLW5ldXRyYWw6IHZhcigtLWNvbWZ5LXN0YXR1cy1uZXV0cmFsLCAjOWU5ZTllKTsKICAgIC0tbWpyLXN0YXItYWN0aXZlOiAjZmZkNDVhOwoKICAgIC8qIEJhZGdlIGNvbG9ycyAob3ZlcnJpZGRlbiBieSBzZXR0aW5ncykgKi8KICAgIC0tbWpyLWJhZGdlLWltYWdlOiAjMjE5NmYzOwogICAgLS1tanItYmFkZ2UtdmlkZW86ICM5YzI3YjA7CiAgICAtLW1qci1iYWRnZS1hdWRpbzogI2ZmOTgwMDsKICAgIC0tbWpyLWJhZGdlLW1vZGVsM2Q6ICM0Y2FmNTA7CiAgICAtLW1qci1jYXJkLWhvdmVyLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgIzNkM2QzZCk7CiAgICAtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsICM0YTkwZTIpOwogICAgLS1tanItcmF0aW5nLWNvbG9yOiAjZmY5NTAwOwogICAgLS1tanItdGFnLWNvbG9yOiAjNGE5MGUyOwp9CgovKiBNYWtlIHRoZSB0aGVtZSB2aXNpYmx5IGFwcGx5IGV2ZW4gd2l0aCBpbmxpbmUgc3R5bGVzICovCi5tanItYXNzZXRzLW1hbmFnZXIgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyLm1qci1hbS1jb250YWluZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyIHsKICAgIHBhZGRpbmc6IDE0cHggMTZweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgZmxleDogMCAwIGF1dG87CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICByb3ctZ2FwOiAxMHB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLWxlZnQgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgZmxleDogMCAwIGF1dG87CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItdG9vbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWJzIHsKICAgIC8qIFF1ZXVlLWxpa2UgdGFicyAoYWN0aXZlIHBpbGwsIG90aGVycyBhcyB0ZXh0KSAqLwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgZ2FwOiAxMHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiczo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWIgewogICAgcGFkZGluZzogNnB4IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYi5pcy1hY3RpdmUgewogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODUlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0biB7CiAgICB3aWR0aDogMjhweDsKICAgIGhlaWdodDogMjhweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgOCUpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLWNvbnRleHQtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDg1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEZsb2F0aW5nIFZpZXdlciBidXR0b24g4oCUIHRlYWwgZ2xvdyB3aGVuIHZpZXdlciBpcyBvcGVuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItbWZ2LWJ0bi1hY3RpdmUgewogICAgY29sb3I6ICM0ZGQ5YzA7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzcsIDIxNywgMTkyLCAwLjU1KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzcsIDIxNywgMTkyLCAwLjEpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoNzcsIDIxNywgMTkyLCAwLjI1KTsKfQoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1mdi1idG4tYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1lc3NhZ2UtYnRuIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiB2aXNpYmxlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1lc3NhZ2UtaGFzLXVucmVhZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA3NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3MiUsIHZhcigtLW1qci1hY2NlbnQpIDExJSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZXNzYWdlLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIHJpZ2h0OiAtNnB4OwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgcGFkZGluZzogMCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA1NSUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKSk7CiAgICBiYWNrZ3JvdW5kOiAjZWY1MzUwOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bjpkaXNhYmxlZCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWNvbnRyb2w6ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC41OwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgIHRyYW5zZm9ybTogbm9uZTsKICAgIGZpbHRlcjogZ3JheXNjYWxlKDAuNDUpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODglLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA5MiUsIHRyYW5zcGFyZW50KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQgLm1qci1haS1jb250cm9sOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQtYmxvY2sgewogICAgb3BhY2l0eTogMC41ODsKICAgIGZpbHRlcjogZ3JheXNjYWxlKDAuNDUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQtYmxvY2sgLm1qci1haS1jb250cm9sLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQtYmxvY2sgYnV0dG9uIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgovKiBQb3BvdmVycyBjYW4gYmUgbW92ZWQgdG8gYGRvY3VtZW50LmJvZHlgIChwb3J0YWwpIHRvIGF2b2lkIGJlaW5nIGNsaXBwZWQuICovCi5tanItcG9wb3ZlciB7CiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB2YXIoCiAgICAgICAgICAgIC0tZm9udC1pbnRlciwKICAgICAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICAgICAgc3lzdGVtLXVpLAogICAgICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgICAgICBSb2JvdG8sCiAgICAgICAgICAgIEFyaWFsLAogICAgICAgICAgICBzYW5zLXNlcmlmCiAgICAgICAgKQogICAgKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSkpOwoKICAgIC8qIFByb3ZpZGUgZmFsbGJhY2tzIHdoZW4gb3V0c2lkZSBgLm1qci1hc3NldHMtbWFuYWdlcmAgc2NvcGUgKi8KICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItZGVmYXVsdCwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICAtLW1qci1tdXRlZDogdmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCwgdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7CiAgICAtLW1qci1hY2NlbnQ6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSk7CiAgICAtLW1qci1wb3BvdmVyLXotaW5kZXg6IDIxNDc0ODM2NDc7CgogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIHdpZHRoOiBtaW4oMjgwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBtYXgtd2lkdGg6IG1pbigzNjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICB6LWluZGV4OiB2YXIoLS1tanItcG9wb3Zlci16LWluZGV4KTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAzNDBweDsKICAgIHdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMnB4Owp9CgoubWpyLXNvcnQtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDIyMHB4OwogICAgd2lkdGg6IG1pbigyNjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItY29sbGVjdGlvbnMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDI4MHB4OwogICAgd2lkdGg6IG1pbigzMjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItbWVzc2FnZXMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgd2lkdGg6IG1pbig0NjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItaW5saW5lLWRpYWxvZy1tYXNrIHsKICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgIGluc2V0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKfQoKLm1qci1pbmxpbmUtZGlhbG9nLXJvb3QgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgIHdpZHRoOiAxMDAlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItaW5saW5lLWRpYWxvZy1jb250ZW50IHsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItbWVzc2FnZXMtaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLW1lc3NhZ2VzLXRhYnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZXNzYWdlcy10YWIgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA3NiUsIHRyYW5zcGFyZW50KTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTRzIGVhc2UsCiAgICAgICAgY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNHMgZWFzZTsKfQoKLm1qci1tZXNzYWdlcy10YWI6aG92ZXIsCi5tanItbWVzc2FnZXMtdGFiOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmMWYxZjEpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzQlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVzc2FnZXMtcGFuZWxzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKICAgIG1heC1oZWlnaHQ6IG1pbig1MnZoLCA0MjBweCk7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCwKLm1qci1tZXNzYWdlcy1zaG9ydGN1dHMtcGFuZWwgewogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItdGFiLWNvdW50LWJhZGdlIHsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyOCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2VzLXRpdGxlIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA4MiUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLW1lc3NhZ2VzLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLW1lc3NhZ2VzLW1hcmstcmVhZC1idG4gewogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjNjODRiIDQyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmM2M4NGIgMTIlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rOmhvdmVyLAoubWpyLW1lc3NhZ2VzLXN0YXItbGluazpmb2N1cy12aXNpYmxlIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWljb24gewogICAgY29sb3I6ICNmM2M4NGI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWVzc2FnZXMtZW1wdHkgewogICAgcGFkZGluZzogOHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItbWVzc2FnZS1pdGVtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODYlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi5tanItbWVzc2FnZS1pdGVtLS11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDYyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1lc3NhZ2UtaXRlbS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KCi5tanItbWVzc2FnZS1pdGVtLWVtb2ppIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItbWVzc2FnZS1pdGVtLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7Cn0KCi5tanItbWVzc2FnZS1pdGVtLWNhdGVnb3J5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA4NiUsIHRyYW5zcGFyZW50KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZS1pdGVtLW1ldGEgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYm9keSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS1hY3Rpb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBUb2FzdCBIaXN0b3J5IHRhYiDigJQgdW5yZWFkIGluZGljYXRvciBkb3QgKi8KLm1qci10YWItdW5yZWFkLWRvdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogNnB4OwogICAgaGVpZ2h0OiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi8qIEhpc3RvcnkgcGFuZWwgKi8KLm1qci1tZXNzYWdlcy1oaXN0b3J5LXBhbmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItaGlzdG9yeS1oZWFkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgcGFkZGluZzogNHB4IDAgNnB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItaGlzdG9yeS1oZWFkLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBvcGFjaXR5OiAwLjYyOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07Cn0KCi5tanItaGlzdG9yeS1jbGVhci1idG4gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgcGFkZGluZzogMnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBjb2xvcjogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItaGlzdG9yeS1jbGVhci1idG46aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1oaXN0b3J5LWxpc3QgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47Cn0KCi5tanItaGlzdG9yeS1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMiwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSk7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5tanItaGlzdG9yeS1pdGVtLS1lcnJvciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjM2YjZiIDUwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLWhpc3RvcnktaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDUwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLWhpc3RvcnktaXRlbS0tc3VjY2VzcyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjNThjMDdkIDUwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLWhpc3RvcnktaXRlbS1pY29uIHsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tY29udGVudCB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItaGlzdG9yeS1pdGVtLW1zZyB7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLWhpc3RvcnktaXRlbS10aXRsZSB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG9wYWNpdHk6IDAuOTY7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tZGV0YWlsIHsKICAgIG9wYWNpdHk6IDAuODQ7CiAgICBsaW5lLWhlaWdodDogMS40NTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tbWV0YSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWhpc3RvcnktaXRlbS10aW1lIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIG9wYWNpdHk6IDAuNTI7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWNoaXAgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBwYWRkaW5nOiAycHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMywgdmFyKC0tbWpyLXN1cmZhY2UtMikpIDc4JSwgdHJhbnNwYXJlbnQpOwogICAgb3BhY2l0eTogMC43NjsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tYWN0aW9uIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItaGlzdG9yeS1pdGVtLXByb2dyZXNzLXN1bW1hcnkgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43NDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLXByb2dyZXNzLWJhciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogNnB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1maWxsIHsKICAgIGhlaWdodDogMTAwJTsKICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgOTBkZWcsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZiksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsICM1OGMwN2QgNzIlLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSkKICAgICk7Cn0KCi5tanItc2hvcnRjdXQtZ3VpZGUgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogOHB4Owp9CgoubWpyLXNob3J0Y3V0LWd1aWRlLWludHJvIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1OwogICAgb3BhY2l0eTogMC44NDsKfQoKLm1qci1zaG9ydGN1dC1zZWN0aW9uIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODQlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMywgdmFyKC0tbWpyLXN1cmZhY2UtMikpIDcyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXNob3J0Y3V0LXNlY3Rpb24tdGl0bGUgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA4OCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zaG9ydGN1dC1saXN0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1zaG9ydGN1dC1yb3cgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDEzMnB4LCAxNjBweCkgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKfQoKLm1qci1zaG9ydGN1dC1rZXkgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogM3B4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM4JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDEyJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA5MCUsIHRyYW5zcGFyZW50KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMS4yNTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7Cn0KCi5tanItc2hvcnRjdXQtZGVzYyB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgb3BhY2l0eTogMC45MjsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDU2MHB4KSB7CiAgICAubWpyLXNob3J0Y3V0LXJvdyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9CgogICAgLm1qci1zaG9ydGN1dC1rZXkgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIH0KfQoKLm1qci1maWx0ZXItZ3JvdXAgewogICAgcGFkZGluZzogMTBweCAwIDhweDsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1maWx0ZXItZ3JvdXA6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIHBhZGRpbmctYm90dG9tOiAycHg7Cn0KCi5tanItZmlsdGVyLWdyb3VwLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4zNXB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNzglLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKfQoKLm1qci1wb3BvdmVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItcG9wb3Zlci1yb3c6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLXBvcG92ZXItbGFiZWwgewogICAgd2lkdGg6IDU2cHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci1wb3BvdmVyLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKfQoKLm1qci1wb3BvdmVyLXRvZ2dsZSBpbnB1dFt0eXBlPSJjaGVja2JveCJdIHsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItaWNvbiB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXRpdGxlIHsKICAgIG1hcmdpbjogMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcGFkZGluZzogMTZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1icm93c2UgewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKICAgIHBhZGRpbmctdG9wOiA0cHg7Cn0KCi8qIFNjcm9sbGJhcnMgKG1hdGNoIENvbWZ5VUkgZmVlbCkgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWdyaWQtc2Nyb2xsIHsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODUlLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSkgdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDEwcHg7CiAgICBoZWlnaHQ6IDEwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwogICAgYm9yZGVyOiAycHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDpob3Zlcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLWNvcm5lciB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWN1c3RvbS1jb250cm9scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoIHsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoIHsKICAgIHBhZGRpbmctYm90dG9tOiA2cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBtYXJnaW4tYm90dG9tOiA2cHg7Cn0KCi8qIENhcmQgTWV0YWRhdGEgQ29sb3JzICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZXRhLWR1cmF0aW9uIHsKICAgIGNvbG9yOiAjZmZhNzI2OyAvKiBPcmFuZ2UgZm9yIGR1cmF0aW9uICovCiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1yZXMgewogICAgY29sb3I6ICM0ZmMzZjc7IC8qIExpZ2h0IEJsdWUgZm9yIHJlc29sdXRpb24gKi8KICAgIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZXRhLWRhdGUgewogICAgY29sb3I6ICNiOWY2Y2E7IC8qIFBhbGUgR3JlZW4gZm9yIGRhdGUgKi8KICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS10aW1lIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpOwogICAgZm9udC1zaXplOiAwLjllbTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnkgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW46IDAgMCA2cHggMDsKICAgIHBhZGRpbmc6IDAgMCA0cHggMDsKICAgIG1pbi1oZWlnaHQ6IDE2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNjUlLCB0cmFuc3BhcmVudCk7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLyogVG9hc3RzIChnbG9iYWw6IGNhbiBiZSBtb3VudGVkIHVuZGVyIGRvY3VtZW50LmJvZHkpICovCi5tanItdG9hc3QtY29udGFpbmVyIHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMTZweDsKICAgIGxlZnQ6IDUwJTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHotaW5kZXg6IDEwMDAwMDE7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci10b2FzdCB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICMzYTNhM2EpOwogICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1tanItdG9hc3Qtc3RyaXApOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCAjZWZlZmVmKTsKICAgIGZvbnQtZmFtaWx5OiB2YXIoCiAgICAgICAgLS1jb21meS1mb250LAogICAgICAgIHVpLXNhbnMtc2VyaWYsCiAgICAgICAgc3lzdGVtLXVpLAogICAgICAgIC1hcHBsZS1zeXN0ZW0sCiAgICAgICAgIlNlZ29lIFVJIiwKICAgICAgICBSb2JvdG8sCiAgICAgICAgQXJpYWwsCiAgICAgICAgc2Fucy1zZXJpZgogICAgKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjUpOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTVweCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4ycyBlYXNlLW91dCwKICAgICAgICB0cmFuc2Zvcm0gMC4ycyBlYXNlLW91dDsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7CiAgICBtaW4td2lkdGg6IG1pbigyNTBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIG1heC13aWR0aDogbWluKDQwMHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDRweCk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci10b2FzdC5pcy12aXNpYmxlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7Cn0KCi5tanItdG9hc3QtdGV4dCB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLyogVG9hc3QgaWNvbiBzdHlsaW5nICovCi5tanItdG9hc3QtdGV4dDo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1pY29uKTsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgY29sb3I6IHZhcigtLW1qci10b2FzdC1pY29uLWNvbG9yKTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLXdpZHRoOiAxNnB4Owp9CgoubWpyLXRvYXN0LXN1Y2Nlc3MgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcywgdmFyKC0tY29tZnktc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcywgdmFyKC0tY29tZnktc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApKTsKfQoKLm1qci10b2FzdC1lcnJvciB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgdmFyKC0tY29tZnktc3RhdHVzLWVycm9yLCAjZjQ0MzM2KSk7CiAgICAtLW1qci10b2FzdC1pY29uLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLWVycm9yLCB2YXIoLS1jb21meS1zdGF0dXMtZXJyb3IsICNmNDQzMzYpKTsKfQoKLm1qci10b2FzdC13YXJuaW5nIHsKICAgIC0tbWpyLXRvYXN0LXN0cmlwOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsIHZhcigtLWNvbWZ5LXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KSk7CiAgICAtLW1qci10b2FzdC1pY29uLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsIHZhcigtLWNvbWZ5LXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KSk7Cn0KCi5tanItdG9hc3QtaW5mbyB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS10ZXh0IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGV4dC1waWxscyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHJvdy1nYXA6IDRweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTAuNXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtaW4taGVpZ2h0OiAyMnB4OwogICAgbWF4LXdpZHRoOiAyMjBweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbDpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA3NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1MCUsIHZhcigtLW1qci1hY2NlbnQpIDE0JSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwtdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3BhY2l0eTogMC45MjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbC14IHsKICAgIHdpZHRoOiAyMHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsLXg6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXBpbGwgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBoZWlnaHQ6IDEuNzVyZW07CiAgICBwYWRkaW5nOiAwIDEwcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZywgMC41cmVtKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtdG9vbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXBvcG92ZXItYW5jaG9yIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1hZ2VuZGEtaW5wdXQgewogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlLAogICAgICAgIGNvbG9yIDAuMnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4ycyBlYXNlOwp9Ci5tanItYWdlbmRhLWlucHV0Lm1qci1hZ2VuZGEtZmlsbGVkIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDQwJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA2MCUKICAgICk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDgwJSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKQogICAgKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoubWpyLWFnZW5kYS1pbnB1dC5tanItYWdlbmRhLWVtcHR5IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NSUsIHRyYW5zcGFyZW50IDE1JSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1ib3JkZXIpOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7Cn0KCi5tanItYWdlbmRhLWNvbnRhaW5lciB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1hZ2VuZGEtY2FsZW5kYXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFnZW5kYS1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLm1qci1hZ2VuZGEtbW9udGggewogICAgZmxleDogMTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1hZ2VuZGEtbmF2IHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7Cn0KCi5tanItYWdlbmRhLWdyaWQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDcsIG1pbm1heCgwLCAxZnIpKTsKICAgIGdhcDogNnB4OwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItYWdlbmRhLXdlZWtkYXkgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1hZ2VuZGEtZGF5IHsKICAgIGhlaWdodDogMzBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1hZ2VuZGEtZGF5LWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIHJpZ2h0OiAtNXB4OwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgcGFkZGluZzogMCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6ICNlNTM5MzU7CiAgICBjb2xvcjogI2ZmZjsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCAjZTUzOTM1IDY1JSwgI2ZmZmZmZiAzNSUpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoubWpyLWFnZW5kYS1kYXk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKSA1NSUsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNDUlCiAgICApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMikgNDUlLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDEwJQogICAgKTsKfQoKLm1qci1hZ2VuZGEtZGF5OmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1ibGFuayB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1oYXMtYXNzZXRzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgODAlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgMTglLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIpIDgyJQogICAgKTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1zZWxlY3RlZCB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4CiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDU1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFnZW5kYS1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogOHB4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLWFnZW5kYS1jbGVhciwKLm1qci1hZ2VuZGEtcmVmcmVzaCB7CiAgICBmbGV4OiAxOwp9CgoubWpyLW1lbnUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItcHJpbWUtbWVudS1saXN0LAoubWpyLXNvcnQtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItcHJpbWUtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJpdGVtIl0sCi5tanItcHJpbWUtbWVudS1saXN0IFtkYXRhLXBjLXNlY3Rpb249Iml0ZW0iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXByaW1lLW1lbnUgW2RhdGEtcGMtc2VjdGlvbj0iaXRlbWNvbnRlbnQiXSB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1tZW51LWl0ZW0sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1tZW51LWl0ZW06aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW06aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVudS1pdGVtOmFjdGl2ZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbTphY3RpdmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtLWxhYmVsIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZW51LWl0ZW0tY2hlY2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0tY2hlY2sgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgd2lkdGg6IDE2cHg7CiAgICBmbGV4OiAwIDAgMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG9wYWNpdHk6IDA7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDcyJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1tZW51LWl0ZW0gLnBpLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtIC5waSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItY29sbGVjdGlvbnMtbWVudSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLS1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLS1pY29uIC5waSB7CiAgICB3aWR0aDogMTZweDsKICAgIGZsZXg6IDAgMCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLW1lbnUtaXRlbS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1tZW51LWl0ZW0taGludCB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDYyJSwgdmFyKC0tbWpyLW11dGVkKSk7CiAgICBvcGFjaXR5OiAwLjcyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZW51LWl0ZW0tY2hlY2stLXZpc2libGUsCi5tanItbWVudS1pdGVtLmlzLWFjdGl2ZSAubWpyLW1lbnUtaXRlbS1jaGVjayB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1lbnUtZGl2aWRlciB7CiAgICBoZWlnaHQ6IDFweDsKICAgIG1hcmdpbjogNHB4IDA7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbXV0ZWQgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1zdGF0ZS1ibG9jayB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgYm9yZGVyOiAxcHggZGFzaGVkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgbWFyZ2luOiA0cHggMDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zdGF0ZS1ibG9jay5pcy1lcnJvciwKLm1qci1jb250ZXh0LW1lbnUtbm90ZS5pcy1lcnJvciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDgyJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi5tanItY29sbGVjdGlvbi1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiA0OHB4Owp9CgoubWpyLWNvbGxlY3Rpb25zLXZpcnR1YWwtbGlzdCB7CiAgICB3aWR0aDogMTAwJTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLWRlbGV0ZS1idG4gewogICAgd2lkdGg6IDQycHg7CiAgICBmbGV4OiAwIDAgNDJweDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA2NSUsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDQ1JSk7Cn0KCi5tanItZGVsZXRlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA0MCUsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDY1JSk7Cn0KCi5tanItZGVsZXRlLWJ0biAucGkgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yKSA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweCAycHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNnB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIG9wYWNpdHk6IDAuODg7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDcyJSwgdmFyKC0tbWpyLW11dGVkKSk7Cn0KCi5tanItc2VjdGlvbi10aXRsZS0tY3lhbiB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICM2ZmQ0ZmYgNzglLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItc2VjdGlvbi10aXRsZS0tdmlvbGV0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2M0OGRmZiA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLWhpbnQgewogICAgcGFkZGluZzogMCAxMHB4IDRweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDU1JSwgdmFyKC0tbWpyLW11dGVkKSk7Cn0KCi5tanItbWVudS1pdGVtLS1zbWFydCwKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXIgewogICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLW1lbnUtaXRlbS0tY2x1c3RlciB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0IC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICM2ZmQ0ZmYgNzQlLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItbWVudS1pdGVtLS1jbHVzdGVyIC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICNjNDhkZmYgNzQlLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItbWVudS1pdGVtLS1zbWFydDpob3Zlcjpub3QoOmRpc2FibGVkKSwKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXI6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItY2x1c3Rlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1jbHVzdGVyLXRodW1icyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAzcHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1jbHVzdGVyLXRodW1iIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDYwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWNsdXN0ZXItaW5mbyB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWNsdXN0ZXItbmFtZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKfQoKLm1qci1jbHVzdGVyLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNTglLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1jbHVzdGVyLWNyZWF0ZS1idG4gewogICAgZmxleC1zaHJpbms6IDA7CiAgICBwYWRkaW5nOiAzcHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgb3BhY2l0eSAxMjBtcyBlYXNlOwp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjYyOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtaWNvbiAucGkgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtcGlsbCAubWpyLWlucHV0IHsKICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXBpbGw6Zm9jdXMtd2l0aGluIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDY1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBtYXJnaW4tdG9wOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgcGFkZGluZy1yaWdodDogNHB4OwogICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlOwp9CgovKiBHcmlkIGxheW91dCAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgLyogQXZvaWQgb3ZlcmZsb3cgd2hlbiB0aGUgcGFuZWwgYmVjb21lcyBuYXJyb3dlciB0aGFuIHRoZSBtaW4gY2FyZCBzaXplICovCiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgKICAgICAgICBhdXRvLWZpbGwsCiAgICAgICAgbWlubWF4KG1pbigxMDAlLCB2YXIoLS1tanItZ3JpZC1taW4tc2l6ZSwgMTgwcHgpKSwgMWZyKQogICAgKTsKICAgIGdhcDogdmFyKC0tbWpyLWdyaWQtZ2FwLCAxMHB4KTsKICAgIG1hcmdpbi10b3A6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi8qIENhcmQgc2VsZWN0aW9uICsgZm9jdXMgKGtlZXBzIGEgdmlzaWJsZSBpbmRpY2F0b3Igd2hlbiBzaWRlYmFyIGlzIG9wZW4pICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIHsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkLmlzLXNlbGVjdGVkIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDgwJSwgdmFyKC0tY29udGVudC1mZykpLAogICAgICAgIDAgMCAwIDZweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkyKSAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTA7CiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQ6Zm9jdXMtdmlzaWJsZSB7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMCAwIDNweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAxMHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45MikgIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwOwp9CgpAa2V5ZnJhbWVzIG1qci1saXZlLXBsYWNlaG9sZGVyLXNoZWVuIHsKICAgIDAlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTU4JSk7CiAgICAgICAgb3BhY2l0eTogMC4xODsKICAgIH0KICAgIDUwJSB7CiAgICAgICAgb3BhY2l0eTogMC4zNDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1OCUpOwogICAgICAgIG9wYWNpdHk6IDAuMTg7CiAgICB9Cn0KCkBrZXlmcmFtZXMgbWpyLWxpdmUtcGxhY2Vob2xkZXItcHVsc2UgewogICAgMCUsCiAgICAxMDAlIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAxcHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjM0KSwKICAgICAgICAgICAgMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIH0KICAgIDUwJSB7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgICAgMCAwIDAgMXB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC41MiksCiAgICAgICAgICAgIDAgMCAwIDRweCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMTIpLAogICAgICAgICAgICAwIDEycHggMzBweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgfQp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gewogICAgYW5pbWF0aW9uOiBtanItbGl2ZS1wbGFjZWhvbGRlci1wdWxzZSAxLjlzIGVhc2UtaW4tb3V0IGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gLm1qci10aHVtYiB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1wbGFjZWhvbGRlci13YXNoIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAtOCU7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDE7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTE1ZGVnLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwKSAwJSwKICAgICAgICByZ2JhKDk4LCAxOTksIDI1NSwgMC4wOCkgMzAlLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgNTAlLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwLjEyKSA3MCUsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDApIDEwMCUKICAgICk7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXNoZWVuIDIuMnMgbGluZWFyIGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1waWxsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNnB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDEyOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogMCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDE0LCAyMCwgMC43OCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMzQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWxpdmUtcGlsbC1kb3QgewogICAgd2lkdGg6IDdweDsKICAgIGhlaWdodDogN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiAjNzZkNmZmOwogICAgYm94LXNoYWRvdzogMCAwIDAgNHB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4xNik7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItbGl2ZS1wbGFjZWhvbGRlcj0idHJ1ZSJdIC5tanItYXNzZXQtc3RhdHVzLWRvdCB7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXB1bHNlIDEuOXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7Cn0KCi8qIEdyaWQgbG9hZGluZyBvdmVybGF5ICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLWxvYWRpbmctb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgIzAwMCAzNSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjNweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDJweCk7Cn0KCkBrZXlmcmFtZXMgbWpyLXNrZWxldG9uLXNoaW1tZXIgewogICAgMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDEyMCUgMDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjAlIDA7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgewogICAgd2lsbC1jaGFuZ2U6IGJhY2tncm91bmQtcG9zaXRpb247Cn0KCi8qIEdlbmVyaWMgaGVhZGluZ3MgaW5zaWRlIHBhbmVsICovCi5tanItYXNzZXRzLW1hbmFnZXIgaDMsCi5tanItYXNzZXRzLW1hbmFnZXIgaDQgewogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgovKiBQYW5lbHMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXBhbmVsIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZyk7CiAgICBib3gtc2hhZG93OiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtYm94LXNoYWRvdywgMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKfQoKLyogVG9vbGJhciAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdG9vbGJhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IHZhcigtLW1qci1wYWQtbWQpOwp9CgovKiBCdXR0b25zICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA3cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bjphY3RpdmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC41NTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4ubWpyLXByaW1hcnkgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTQlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4gewogICAgLyogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBpZiBwcmVzZW50ICovCiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKfQoKLyogSW5wdXRzIC8gc2VsZWN0cyAodXNlZCBpbnNpZGUgcG9ydGFsZWQgcG9wb3ZlcnMgdG9vKSAqLwoubWpyLWlucHV0LAoubWpyLXNlbGVjdCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc2VsZWN0IHsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgb3V0bGluZTogbm9uZTsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQ6OnBsYWNlaG9sZGVyIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW11dGVkKSA4MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1pbnB1dDpmb2N1cywKLm1qci1zZWxlY3Q6Zm9jdXMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dDpmb2N1cywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXNlbGVjdDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaW5wdXQsCi5tanItc2VsZWN0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zZWxlY3QgewogICAgLyogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBpZiBwcmVzZW50ICovCiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDhweDsKICAgIG1pbi1oZWlnaHQ6IDM0cHg7CiAgICBwYWRkaW5nOiAwIDlweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0W2RhdGEtcC1kaXNhYmxlZD0idHJ1ZSJdIHsKICAgIG9wYWNpdHk6IDAuNTU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0IFtkYXRhLXBjLXNlY3Rpb249ImxhYmVsIl0gewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdCBbZGF0YS1wYy1zZWN0aW9uPSJkcm9wZG93biJdIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMThweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgewogICAgbWluLXdpZHRoOiB2YXIoLS1wLXNlbGVjdC1vdmVybGF5LXdpZHRoLCAxMnJlbSk7CiAgICBtYXgtd2lkdGg6IG1pbigzMjBweCwgY2FsYygxMDB2dyAtIDMycHgpKTsKICAgIG1heC1oZWlnaHQ6IG1pbigzMjBweCwgY2FsYygxMDB2aCAtIDMycHgpKTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgcGFkZGluZzogNHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM4KTsKICAgIHotaW5kZXg6IGNhbGModmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCwgMjE0NzQ4MzY0NykgKyAxKTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXBjLXNlY3Rpb249Imxpc3QiXSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbjogMDsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXSB7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogY2FsYyh2YXIoLS1tanItci1tZCkgLSAycHgpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuMjU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcGMtc2VjdGlvbj0ib3B0aW9uIl06aG92ZXIsCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wLWhpZ2hsaWdodD0idHJ1ZSJdIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoKLyogVGFiczogb3ZlcnJpZGRlbiBhYm92ZSB3aXRoIHF1ZXVlLWxpa2Ugc3R5bGUgKi8KCi8qIFJlbW92ZWQgcmVkdW5kYW50IHRhYiBkZWNsYXJhdGlvbnMgdGhhdCB3ZXJlIHVzaW5nICFpbXBvcnRhbnQgKi8KCi8qIE11dGVkIHRleHQgaGVscGVyICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tdXRlZCB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKfQoKLyogR3JpZCArIGNhcmRzIChvdmVycmlkZSBpbmxpbmUgc3R5bGVzIGZyb20gQ2FyZC5qcykgKi8KLm1qci1hc3NldHMtbWFuYWdlciAjbWpyLWFzc2V0cy1ncmlkIHsKICAgIGdhcDogMTBweCAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSkgIWltcG9ydGFudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZykgIWltcG9ydGFudDsKICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAxMjBtcyBlYXNlICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkOmhvdmVyLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA1NSUsCiAgICAgICAgdmFyKC0tbWpyLWJvcmRlcikKICAgICkgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1qci1jYXJkLWhvdmVyLWNvbG9yKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCA4cHggMjJweCByZ2JhKDAsIDAsIDAsIDAuMjUpICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIGltZywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgdmlkZW8sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYi1tZWRpYSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgIG9iamVjdC1maXQ6IGNvdmVyICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiB7CiAgICB3aWR0aDogMTAwJTsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODAlLCB0cmFuc3BhcmVudCk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBLZWVwIGdlbmVyYXRpb24tdGltZSBiYWRnZSBwaW5uZWQgdG8gdGhlIHRodW1ibmFpbCBjb3JuZXIgYWNyb3NzIGdyaWQvZmVlZCB2YXJpYW50cy4KICAgVGhlICFpbXBvcnRhbnQgb3ZlcnJpZGVzIGFyZSBpbnRlbnRpb25hbDogR2VuVGltZUJhZGdlLnZ1ZSB1c2VzIDxzdHlsZSBzY29wZWQ+IHdob3NlCiAgIGhhc2hlZCBjbGFzcyBoYXMgdGhlIHNhbWUgc3BlY2lmaWNpdHkgYXMgZ2xvYmFsIHNlbGVjdG9ycy4gV2l0aG91dCAhaW1wb3J0YW50LCBhCiAgIGNvbmZsaWN0aW5nIHJ1bGUgKGUuZy4gZnJvbSBhIHRoZW1lIGV4dGVuc2lvbiBvciBhbiBvbGRlciBub24tc2NvcGVkIGNvbnRleHQpIHRoYXQgc2V0cwogICBsZWZ0OjAvdG9wOjAgd291bGQgd2luLiBsZWZ0OmF1dG8gKyB0b3A6YXV0byBleHBsaWNpdGx5IGNhbmNlbCBhbnkgc3VjaCBhY2NpZGVudGFsIHJlc2V0LiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLWdlbnRpbWUtYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItZ2VudGltZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgIHJpZ2h0OiA2cHggIWltcG9ydGFudDsKICAgIGJvdHRvbTogNnB4ICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB0b3A6IGF1dG8gIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAycHggNnB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSAhaW1wb3J0YW50OwogICAgZm9udC13ZWlnaHQ6IDgwMCAhaW1wb3J0YW50OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE1ZW07CiAgICB0ZXh0LXNoYWRvdzoKICAgICAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjkpLAogICAgICAgIDAgMCAxMHB4IGNvbG9yLW1peChpbiBzcmdiLCBjdXJyZW50Q29sb3IgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEtlZXAgcmF0aW5nL3RhZ3MgYmFkZ2VzIGFuY2hvcmVkIGV2ZW4gd2hlbiBzY29wZWQgVnVlIHN0eWxlcyBhcmUgbm90IGFwcGxpZWQgYWZ0ZXIgcmVsb2FkLgogICBEbyBub3QgZm9yY2UgZGlzcGxheSBoZXJlIHNvIGdyaWQgdmlzaWJpbGl0eSB0b2dnbGVzICgubWpyLXNob3ctYmFkZ2VzLSopIHN0aWxsIGNvbnRyb2wgc2hvdy9oaWRlLiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLXJhdGluZy1iYWRnZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iID4gLm1qci1yYXRpbmctYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICB0b3A6IDZweCAhaW1wb3J0YW50OwogICAgcmlnaHQ6IDZweCAhaW1wb3J0YW50OwogICAgbGVmdDogYXV0byAhaW1wb3J0YW50OwogICAgYm90dG9tOiBhdXRvICFpbXBvcnRhbnQ7CiAgICB6LWluZGV4OiAxMCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yNSk7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggNnB4IHJnYmEoMCwgMCwgMCwgMC42KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iID4gLm1qci10YWdzLWJhZGdlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWIgPiAubWpyLXRhZ3MtYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiA2cHggIWltcG9ydGFudDsKICAgIGJvdHRvbTogNnB4ICFpbXBvcnRhbnQ7CiAgICByaWdodDogYXV0byAhaW1wb3J0YW50OwogICAgdG9wOiBhdXRvICFpbXBvcnRhbnQ7CiAgICB6LWluZGV4OiAxMCAhaW1wb3J0YW50OwogICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA1NnB4KTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMyk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYi1wbGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZ3JpZDsKICAgIHBsYWNlLWl0ZW1zOiBjZW50ZXI7CiAgICBmb250LXNpemU6IDI4cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgdGV4dC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC43KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlOwp9CgovKiDilIDilIDilIAgSG92ZXIgaW5mbyBvdmVybGF5IChwb3NpdGl2ZSBwcm9tcHQgKyBnZW4gdGltZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgIFNsaWRlcyB1cCBmcm9tIHRoZSBib3R0b20gb2YgLm1qci10aHVtYiBvbiBjYXJkIGhvdmVyLgogICBwb2ludGVyLWV2ZW50czogbm9uZSAg4oaSIG5ldmVyIGJsb2NrcyB2aWRlbyBtb3VzZWVudGVyIC8gcGxheS1vbi1ob3Zlci4KICAgei1pbmRleDogMiAgICAgICAgICAg4oaSIHNpdHMgYWJvdmUgdGhlIHRodW1ibmFpbCBpbWFnZSwgYmVsb3cgdGhlIHBsYXkgaWNvbi4KICAgQ29udHJvbGxlZCBieSB0aGUgLm1qci1zaG93LWhvdmVyLWluZm8gY2xhc3Mgb24gdGhlIGdyaWQgY29udGFpbmVyLCB3aGljaAogICBpcyB0b2dnbGVkIHZpYSB0aGUgIlNob3cgcHJvbXB0IG9uIGhvdmVyIiBzZXR0aW5nLgogICDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3R0b206IDA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBwYWRkaW5nOiAyMnB4IDhweCA3cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCB0cmFuc3BhcmVudCAwJSwgcmdiYSgwLCAwLCAwLCAwLjc4KSAxMDAlKTsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg1cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDE1MG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDE1MG1zIGVhc2U7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogM3B4OwogICAgei1pbmRleDogMjsKfQovKiBPbmx5IHJldmVhbCBvbiBob3ZlciB3aGVuIHRoZSBzZXR0aW5nIGlzIGVuYWJsZWQgKGNsYXNzIG9uIGdyaWQgY29udGFpbmVyKSAqLwoubWpyLWdyaWQubWpyLXNob3ctaG92ZXItaW5mbyAubWpyLWNhcmQ6aG92ZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gewogICAgb3BhY2l0eTogMTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKfQoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIC5tanItaG92ZXItcHJvbXB0IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDsKICAgIC13ZWJraXQtbGluZS1jbGFtcDogMjsKICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgb3BhY2l0eTogMC45OwogICAgZm9udC1zaXplOiA5LjVweDsKfQoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIC5tanItaG92ZXItZ2VudGltZSB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIxMCwgMTIwLCAwLjk1KTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDlweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07Cn0KQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gewogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMG1zOwogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgIH0KfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtbWV0YSB7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luLWJvdHRvbTogMnB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1kZXRhaWxzIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG9wYWNpdHk6IDAuODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUtdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgovKiBSYXRpbmcgJiBUYWdzIEVkaXRvcnMgKi8KQGtleWZyYW1lcyBmYWRlSW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KLyoqCiAqIEFyY2hpdmVkIENTUyBTdHlsZXMgLSBSYXRpbmcgYW5kIFRhZ3MKICogVGhlc2Ugc3R5bGVzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZW1lLWNvbWZ5LmNzcwogKi8KCi8qIEFuaW1hdGlvbnMgKi8KQGtleWZyYW1lcyBzbGlkZUluUmlnaHQgewogICAgZnJvbSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICB9Cn0KCi8qIFBvcG92ZXJzICovCi5tanItcmF0aW5nLXBvcG92ZXIsCi5tanItdGFncy1wb3BvdmVyIHsKICAgIGFuaW1hdGlvbjogZmFkZUluIDAuMnMgZWFzZTsKfQoKLm1qci1yYXRpbmctcG9wb3ZlciwKLm1qci10YWdzLXBvcG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHBhZGRpbmc6IDhweDsKfQoKLyogUmF0aW5nIEVkaXRvciAqLwoubWpyLXJhdGluZy1lZGl0b3IgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAycHg7Cn0KCi5tanItcmF0aW5nLXN0YXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2U7Cn0KCi5tanItcmF0aW5nLXN0YXI6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSAzNSUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb21meS1tZW51LXNlY29uZGFyeS1iZywgIzMzMykgNjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItcmF0aW5nLWVkaXRvciAubWpyLXJhdGluZy1zdGFyOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4yKSAhaW1wb3J0YW50Owp9CgoubWpyLXJhdGluZy1lZGl0b3IgLm1qci1yYXRpbmctc3RhcjphY3RpdmUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KSAhaW1wb3J0YW50Owp9CgovKiBUYWdzIEVkaXRvciAqLwoubWpyLXRhZ3MtZWRpdG9yIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgbWluLXdpZHRoOiAyNTBweDsKICAgIG1heC13aWR0aDogbWluKDM1MHB4LCBjYWxjKDEwMHZ3IC0gMjBweCkpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7Cn0KCi5tanItdGFncy1lZGl0b3IuaXMtZGlzYWJsZWQgewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCi5tanItdGFncy1kaXNwbGF5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDMycHg7Cn0KCi5tanItdGFncy1lbXB0eSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLm1qci10YWctY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMjQlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNDAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLm1qci10YWctY2hpcC1yZW1vdmUgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IDA7CiAgICBib3JkZXItcmFkaXVzOiAwOwogICAgYm94LXNoYWRvdzogbm9uZTsKICAgIGNvbG9yOiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC43Owp9CgoubWpyLXRhZy1jaGlwLXJlbW92ZTpkaXNhYmxlZCB7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItdGFncy1pbnB1dC13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci10YWctaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXRhZy1pbnB1dDpmb2N1cyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODglLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCkgIWltcG9ydGFudDsKfQoKLm1qci10YWctY2hpcDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMzQlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpICFpbXBvcnRhbnQ7Cn0KCi5tanItdGFncy1kcm9wZG93biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwMCU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG1heC1oZWlnaHQ6IDE1MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHotaW5kZXg6IDEwMDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXRhZy1zdWdnZXN0aW9uIHsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci10YWctc3VnZ2VzdGlvbi5pcy1hY3RpdmUsCi5tanItdGFnLXN1Z2dlc3Rpb246aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDI4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7Cn0KCi8qIEJhZGdlcyBJbnRlcmFjdGl2ZSAqLwoubWpyLXJhdGluZy1iYWRnZSwKLm1qci10YWdzLWJhZGdlIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItcmF0aW5nLWJhZGdlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItcmF0aW5nLWNvbG9yKSAhaW1wb3J0YW50Owp9CgoubWpyLXRhZ3MtYmFkZ2UgewogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpICFpbXBvcnRhbnQ7Cn0KCi5tanItcmF0aW5nLWJhZGdlOmhvdmVyLAoubWpyLXRhZ3MtYmFkZ2U6aG92ZXIgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KCi8qIFNjcm9sbGJhciBmb3IgdGFncyBkcm9wZG93biAqLwoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA2cHg7Cn0KCi5tanItdGFncy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSA0OCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi8qIFNpZGViYXIgKGNhbiBiZSBsZWZ0IG9yIHJpZ2h0KSAqLwoubWpyLXNpZGViYXIgewogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXdyYXAgewogICAgbWFyZ2luOiAwIDAgMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kLCA4cHgpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUgewogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNlYWVhZWEpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLXdvcmtmbG93LXRyZWUtc2Nyb2xsIHsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgcGFkZGluZzogMnB4IDRweCA2cHg7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1saXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtLCA2cHgpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1OCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXRvZ2dsZSB7CiAgICB3aWR0aDogMTRweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NCkpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtdG9nZ2xlW2RhdGEtcC1sZWFmPSJ0cnVlIl0gewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtaWNvbiB7CiAgICB3aWR0aDogOHB4OwogICAgZmxleDogMCAwIDhweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzAlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICBmb250LXNpemU6IDdweDsKfQoKLm1qci13b3JrZmxvdy10cmVlLWxhYmVsIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDEgMSBhdXRvOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1uYW1lIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1ub2RlLXR5cGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbXV0ZWQpIDc1JSwgdmFyKC0tY29udGVudC1mZykpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1zaWRlYmFyLmlzLW9wZW4gewogICAgLyogQm9yZGVyIGlzIHNldCBkeW5hbWljYWxseSBiYXNlZCBvbiBwb3NpdGlvbiAqLwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA4cHg7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7Cn0KCi8qIEN1c3RvbSBSb290cyBQb3BvdmVyIFN0eWxpbmcgKi8KLm1qci1jdXN0b20tcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMwMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBwYWRkaW5nOiAxMnB4Owp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3c6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICB3aWR0aDogNjBweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXNlbGVjdCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItYnRuIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1yaWdodDogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA4MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1zZWN0aW9uIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItc2VjdGlvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMykgIWltcG9ydGFudDsKfQoKLyogSW5saW5lIFNpZGViYXIgKHdpZHRoLWJhc2VkIHRyYW5zaXRpb25zIGxpa2UgYXJjaGl2ZWQgdmVyc2lvbikgKi8KLm1qci1pbmxpbmUtc2lkZWJhciB7CiAgICB3aWR0aDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC13aWR0aDogNDgwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgd2lkdGggMC4zcyBlYXNlLAogICAgICAgIG1pbi13aWR0aCAwLjNzIGVhc2U7Cn0KCi5tanItaW5saW5lLXNpZGViYXIuaXMtb3BlbiB7CiAgICB3aWR0aDogNDAwcHg7CiAgICBtaW4td2lkdGg6IDI2MHB4Owp9CgovKiBTcGFjZSBiZXR3ZWVuIHNpZGViYXIgYW5kIGdyaWQgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBnYXA6IDA7Cn0KCi8qIEJvcmRlciBiYXNlZCBvbiBwb3NpdGlvbiAqLwoubWpyLWlubGluZS1zaWRlYmFyW2RhdGEtcG9zaXRpb249ImxlZnQiXSB7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1pbmxpbmUtc2lkZWJhcltkYXRhLXBvc2l0aW9uPSJyaWdodCJdIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi8qIFNpZGViYXIgcGxhY2Vob2xkZXIgKi8KLm1qci1zaWRlYmFyLXBsYWNlaG9sZGVyIHsKICAgIHBhZGRpbmc6IDIwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi8qID09PT09PT09PT0gVmlld2VyIENvbXBvbmVudCA9PT09PT09PT09ICovCi5tanItdmlld2VyLW92ZXJsYXkgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgYm90dG9tOiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjk1KTsKICAgIC8qIFNpdCBhYm92ZSBNRlYgKDEwMDAwKSBzbyB0aGUgZnVsbCB2aWV3ZXIgYWx3YXlzIGNvdmVycyB0aGUgZmxvYXRpbmcgcGFuZWwgKi8KICAgIHotaW5kZXg6IDEwMDAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQovKiBGYWRlLWluOiBhbmltYXRpb24gcmUtdHJpZ2dlcnMgZWFjaCB0aW1lIEpTIHN3aXRjaGVzIGRpc3BsYXkgYmFjayB0byBmbGV4ICovCi5tanItdmlld2VyLW92ZXJsYXlbc3R5bGUqPSJmbGV4Il0gewogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjE4cyBlYXNlLW91dDsKfQoKQGtleWZyYW1lcyBtanItZmFkZS1pbiB7CiAgICBmcm9tIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OTUpOwogICAgfQogICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgIH0KfQoKLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTJweCAyMHB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE3MGRlZywgcmdiYSgyNCwgMjcsIDMzLCAwLjk2KSwgcmdiYSgxNywgMTksIDI1LCAwLjk3KSk7CiAgICBib3JkZXItYm90dG9tOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMik7CiAgICBjb2xvcjogd2hpdGU7Cn0KCi5tanItdmlld2VyLWZpbGVuYW1lIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBtYXgtd2lkdGg6IDQwMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDZweDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIGJ1dHRvbiB7CiAgICBwYWRkaW5nOiA0cHggMTJweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4xKSwgcmdiYSgyMDYsIDIxMSwgMjE4LCAwLjAzKSk7CiAgICBib3JkZXI6IDAuOHB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4zKTsKICAgIGNvbG9yOiByZ2JhKDIzMCwgMjMzLCAyMzgsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTZzOwp9CgoubWpyLXZpZXdlci1tb2RlLWJ1dHRvbnMgYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4xNCksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNikpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuNDIpOwp9CgovKiBWaWV3ZXIgY2xvc2UgYnV0dG9uIHBpbm5lZCB0byBvdmVybGF5IGNvcm5lciAqLwoubWpyLXZpZXdlci1jbG9zZSwKLm1qci12aWV3ZXItZnMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjYpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wOCksIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wMikpLAogICAgICAgIHJnYmEoMjAsIDIzLCAyOSwgMC45NCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1jbG9zZSB7CiAgICBjb2xvcjogI2ZmZjRmNCAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIwNSwgODIsIDgyLCAwLjUpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA1LCA4MiwgODIsIDAuMyksIHJnYmEoMjA1LCA4MiwgODIsIDAuMTIpKSwKICAgICAgICByZ2JhKDU4LCAxOCwgMTgsIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDIxOSwgMjE5LCAwLjE2KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyMDUsIDgyLCA4MiwgMC4wOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2U6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMzgpLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMTYpKSwKICAgICAgICByZ2JhKDcwLCAxOCwgMTgsIDAuOTcpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjM1LCAxMzgsIDEzOCwgMC42NCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItZnM6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMTQpLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDYpKSwKICAgICAgICByZ2JhKDIzLCAyNiwgMzIsIDAuOTUpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC4zOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2UgLnBpIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZXdlci1jb250ZW50IHsKICAgIGZsZXg6IDE7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItc2luZ2xlLAoubWpyLXZpZXdlci1hYiwKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKfQoKLm1qci12aWV3ZXItc2luZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLXNpbmdsZSBpbWcsCi5tanItdmlld2VyLXNpbmdsZSB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzOwp9CgoubWpyLXZpZXdlci1hYiB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLXZpZXdlci1zaWRlYnlzaWRlIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgZ2FwOiAycHg7Cn0KCi5tanItdmlld2VyLXNpZGVieXNpZGUgPiBkaXYgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwp9CgoubWpyLXZpZXdlci1zaWRlYnlzaWRlIGltZywKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKfQoKLm1qci12aWV3ZXItZm9vdGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAxMnB4IDIwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgY29sb3I6IHdoaXRlOwogICAgZ2FwOiAyMHB4Owp9CgoubWpyLXZpZXdlci1mb290ZXIgYnV0dG9uIHsKICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBjb2xvcjogd2hpdGU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKfQoKLm1qci12aWV3ZXItZm9vdGVyIGJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7Cn0KCi5tanItdmlld2VyLW5hdiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTRweDsKfQoKLm1qci12aWV3ZXItbmF2LWJ0biB7CiAgICB3aWR0aDogNDBweCAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiA0MHB4ICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuNDIpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTk0LCAyMDAsIDIwOCwgMC4xOCksIHJnYmEoMTk0LCAyMDAsIDIwOCwgMC4wNykpLAogICAgICAgIHJnYmEoMzQsIDM4LCA0NCwgMC45MikgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDIzNCwgMjM2LCAyNDAsIDAuOTYpICFpbXBvcnRhbnQ7CiAgICBmb250LXNpemU6IDIwcHggIWltcG9ydGFudDsKICAgIGZvbnQtd2VpZ2h0OiA3MDAgIWltcG9ydGFudDsKICAgIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7CiAgICB0ZXh0LXNoYWRvdzogbm9uZTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDAuMTRzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjE0cyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjE0cyBlYXNlICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLW5hdi1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuNTYpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA3LCAyMTIsIDIxOSwgMC4yKSwgcmdiYSgyMDcsIDIxMiwgMjE5LCAwLjEpKSwKICAgICAgICByZ2JhKDM5LCA0MywgNDksIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKfQoKLm1qci12aWV3ZXItbmF2LWJ0bjphY3RpdmU6bm90KDpkaXNhYmxlZCkgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHNjYWxlKDAuOTgpOwogICAgZmlsdGVyOiBub25lOwp9CgoubWpyLXZpZXdlci1uYXYtYnRuOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuMzQgIWltcG9ydGFudDsKICAgIGZpbHRlcjogZ3JheXNjYWxlKDAuMjUpOwogICAgYm94LXNoYWRvdzogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1pbmRleCB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBtaW4td2lkdGg6IDc0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICAgIGNvbG9yOiByZ2JhKDIyNiwgMjI4LCAyMzMsIDAuOTQpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxOTcsIDIwMywgMjExLCAwLjE1KSwgcmdiYSgxOTcsIDIwMywgMjExLCAwLjA2KSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NywgMjAzLCAyMTEsIDAuMzQpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBwYWRkaW5nOiA1cHggMTFweDsKICAgIHRleHQtc2hhZG93OiBub25lOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwp9CgoubWpyLXZpZXdlci1wbGF5ZXJiYXIgewogICAgYm9yZGVyLXJhZGl1czogMThweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk0LCAyMDAsIDIwOCwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgdG9wIGxlZnQsIHJnYmEoOTAsIDE1MCwgMjU1LCAwLjA4KSwgdHJhbnNwYXJlbnQgMzYlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTYwZGVnLCByZ2JhKDIwLCAyNCwgMzAsIDAuOTQpLCByZ2JhKDEyLCAxNSwgMjEsIDAuOTgpKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpLAogICAgICAgIDAgMTZweCAzNnB4IHJnYmEoMCwgMCwgMCwgMC4yMik7CiAgICAvKiBvdmVyZmxvdyBtdXN0IHN0YXkgdmlzaWJsZSBzbyB0aGUgc2VlayBydWxlciB0aWNrcy9sYWJlbHMgKHRvcDotMTZweCAvIHRvcDotMzRweCkKICAgICAgIHRoYXQgYXJlIGFic29sdXRlbHkgcG9zaXRpb25lZCBhYm92ZSB0aGUgc2VlayBiYXIgYXJlIG5vdCBjbGlwcGVkLiAqLwogICAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi5tanItdmlld2VyLXRvb2xzIHsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKICAgIGp1c3RpZnktY29udGVudDogc3RyZXRjaDsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZXdlci1oZWFkZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoubWpyLXZpZXdlci1oZWFkZXI6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMThweDsKICAgIHJpZ2h0OiAxOHB4OwogICAgdG9wOiA0NHB4OwogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHRyYW5zcGFyZW50LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLCB0cmFuc3BhcmVudCk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIG9wYWNpdHk6IDAuNzsKfQoKLm1qci12aWV3ZXItaGVhZGVyLW1ldGEgewogICAgbWluLWhlaWdodDogMzBweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzNSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXZpZXdlci1oZWFkZXItdG9wIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBwYWRkaW5nLXJpZ2h0OiA4NHB4OwogICAgcGFkZGluZy1sZWZ0OiAxMnB4Owp9CgoubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tbGVmdCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleDogMSAxIDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDEgMSBhdXRvOwp9CgoubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGZsZXg6IDEgMSAwOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci12aWV3ZXItdGl0bGUtd3JhcCB7CiAgICB3aWR0aDogYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC13aWR0aDogbWluKDEwMCUsIGNhbGMoMTAwdncgLSAyMjBweCkpOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMTJweDsKfQoKLm1qci12aWV3ZXItdGl0bGUtbGluZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItdmlld2VyLWZpbGVuYW1lIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW46IDAgYXV0bzsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItYmFkZ2VzIHsKICAgIGdhcDogNHB4Owp9CgoubWpyLXZpZXdlci10aXRsZS1saW5lIC5tanItdmlld2VyLWJhZGdlcyB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tbGVmdCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBtYXgtd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhLS1sZWZ0OmVtcHR5IHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhLS1yaWdodCB7CiAgICBqdXN0aWZ5LXNlbGY6IGVuZDsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKICAgIG1heC13aWR0aDogMTAwJTsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgcGFkZGluZzogM3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZGVjayB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBtaW4td2lkdGg6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpLAogICAgICAgIHJnYmEoMTAsIDEyLCAxNiwgMC4yNCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwKICAgICAgICAwIDZweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4xMik7CiAgICBwYWRkaW5nOiA1cHggNnB4OwogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMCAwIGF1dG8gMDsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSwgdHJhbnNwYXJlbnQpOwogICAgb3BhY2l0eTogMC43OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWhlYWQgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtaGVhZGluZyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMXB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1leWVicm93IHsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjE0ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40Nik7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwogICAgY29sb3I6IHJnYmEoMjQ4LCAyNTAsIDI1MiwgMC45Nik7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJncmFkZSJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0ib3ZlcmxheSJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iaW5zcGVjdCJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHksCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9ImFjdGlvbnMiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5LAoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJpbmZvIl0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cCB7CiAgICB3aWR0aDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBwYWRkaW5nOiA1cHggN3B4OwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzNSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpLAogICAgICAgIHJnYmEoMTAsIDEyLCAxNiwgMC4xOCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7CiAgICBtaW4td2lkdGg6IGZpdC1jb250ZW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc1KTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjE1cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW3N0eWxlKj0iLS1tanItZ3JvdXAtYWNjZW50Il0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwgewogICAgY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuOSk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW3N0eWxlKj0iLS1tanItZ3JvdXAtYWNjZW50Il0gewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjM1KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY2hhbm5lbCJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCB7CiAgICBtaW4td2lkdGg6IDQycHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9Im92ZXJsYXkiXSAubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIHsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSB7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgYWxpZ24tY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjaGFubmVsIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImV4cG9zdXJlIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImdhbW1hIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImFuYWx5c2lzIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNvbXBhcmUiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYXVkaW8tdml6Il0gewogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb25zLAoubWpyLXZpZXdlci10b29scy1tZXRhIHsKICAgIHdpZHRoOiBhdXRvOwogICAgbWluLWhlaWdodDogMzBweDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBwYWRkaW5nOiA1cHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA2cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9uLS1wcmltYXJ5IHsKICAgIG1hcmdpbi1sZWZ0OiAwOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb24gKyAubWpyLXZpZXdlci10b29scy1hY3Rpb24gewogICAgbWFyZ2luLWxlZnQ6IDRweDsKfQoKLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0IHsKICAgIG1pbi1oZWlnaHQ6IDI0cHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXJhbmdlLWlucHV0IHsKICAgIHdpZHRoOiA5MnB4ICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLXJhbmdlIHNwYW4gewogICAgZm9udC1zaXplOiAxMXB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogMTQ4MHB4KSB7CiAgICAubWpyLXZpZXdlci10b29scy1kZWNrIHsKICAgICAgICBnYXA6IDZweDsKICAgIH0KfQoKQG1lZGlhIChtYXgtd2lkdGg6IDEyMjBweCkgewogICAgLm1qci12aWV3ZXItaGVhZGVyLXRvcCB7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDg0cHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAwOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIsCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXg6IDEgMSAxMDAlOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1yaWdodCB7CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXg6IDEgMSAxMDAlOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1tZXRhLS1yaWdodCB7CiAgICAgICAganVzdGlmeS1zZWxmOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtZGVjayB7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtcGFuZWwsCiAgICAubWpyLXZpZXdlci10b29scy1hY3Rpb25zLAogICAgLm1qci12aWV3ZXItdG9vbHMtbWV0YSwKICAgIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1tZXRhIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB9Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNvbXBhcmUiXVtkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGJhY2tncm91bmQ6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuMSk7CiAgICBib3JkZXItbGVmdC1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC42KTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjIyKTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY29tcGFyZSJdW2RhdGEtYWN0aXZlPSIxIl0gLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC42KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjE4KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0OmZvY3VzIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSg2NCwgMTYwLCAyNTUsIDAuMjIpOwp9CgovKiBOYXRpdmUgZHJvcGRvd25zOiBoaW50IGRhcmsgVUkgYW5kIHN0eWxlIG9wdGlvbnMgd2hlbiB0aGUgYnJvd3NlciBhbGxvd3MgaXQuICovCi5tanItdmlld2VyLWhlYWRlciB7CiAgICBjb2xvci1zY2hlbWU6IGRhcms7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdCB7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQ2KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45MikgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogOHB4ICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdCBvcHRpb24gewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwp9CgoubWpyLXZpZXdlci10b29scy1yYW5nZS1pbnB1dDpmb2N1cyB7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXZpZXdlci10b29sLWJ0bi0tcmVzZXQgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2wtYnRuIHsKICAgIG1pbi1oZWlnaHQ6IDI0cHggIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXdpZHRoOiAxcHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA3NSksCiAgICAgICAgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyNSkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjE2KSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgZm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAwIDhweCAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29sLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4yNCkgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyMjAsIDIyNCwgMjMwLCAwLjEpLAogICAgICAgIHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4wMzUpCiAgICApICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImFuYWx5c2lzIl0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjU1LCAxNjYsIDkyLCAwLjIyKSwKICAgICAgICByZ2JhKDI1NSwgMTE2LCA2NCwgMC4wOCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDE2MCwgOTIsIDAuMzQpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIzNiwgMjI0LCAwLjk2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl06aG92ZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDI1NSwgMTgwLCAxMDgsIDAuMjgpLAogICAgICAgIHJnYmEoMjU1LCAxMjgsIDcyLCAwLjE0KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMTg0LCAxMTYsIDAuNDYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktZ3VpZGVzIl0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoOTIsIDIxOSwgMTg2LCAwLjIyKSwKICAgICAgICByZ2JhKDQ0LCAxNzAsIDE0NCwgMC4wOCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg5MiwgMjE5LCAxODYsIDAuMzQpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyMjQsIDI1NSwgMjQ4LCAwLjk2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl06aG92ZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDEwMiwgMjMwLCAxOTYsIDAuMjgpLAogICAgICAgIHJnYmEoNTIsIDE4MiwgMTU2LCAwLjE0KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDExMCwgMjM2LCAyMDIsIDAuNDYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktaW5zcGVjdCJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDEyNCwgMTY2LCAyNTUsIDAuMjIpLAogICAgICAgIHJnYmEoMTA5LCA4OCwgMjIyLCAwLjA4KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDEzMiwgMTcwLCAyNTUsIDAuMzYpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyMzYsIDI0MiwgMjU1LCAwLjk3KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgxMzgsIDE4MCwgMjU1LCAwLjMpLAogICAgICAgIHJnYmEoMTI0LCAxMDAsIDIzMiwgMC4xNCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxNDgsIDE4OCwgMjU1LCAwLjQ4KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGZpbHRlcjogc2F0dXJhdGUoMS4xMikgYnJpZ2h0bmVzcygxLjA0KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNiksCiAgICAgICAgMCA4cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMTYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLWhlbHAgewogICAgYm9yZGVyLXJhZGl1czogMTRweCAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxMywgMTcsIDIyLCAwLjk2KSwgcmdiYSg4LCAxMSwgMTYsIDAuOTgpKSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCAxOHB4IDM0cHggcmdiYSgwLCAwLCAwLCAwLjM0KSAhaW1wb3J0YW50Owp9CgpAbWVkaWEgKG1heC13aWR0aDogMTIyMHB4KSB7CiAgICAubWpyLXZpZXdlci10b29scyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucyB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci10b3AgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgIGp1c3RpZnktaXRlbXM6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tbGVmdCwKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIsCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1tZXRhLS1sZWZ0LAogICAgLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LXNlbGY6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1ib2R5IHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIyMHB4LCAxZnIpKTsKICAgIH0KfQoKLyogPT09PT09PT09PSBDdXN0b20gVmlkZW8gQ29udHJvbHMgKG5vIG5hdGl2ZSBiYXIpID09PT09PT09PT0gKi8KLm1qci12aWRlby1ob3N0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci12aWRlby1jb250cm9scyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMnB4OwogICAgcmlnaHQ6IDEycHg7CiAgICBib3R0b206IDEycHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgIG9wYWNpdHk6IDA7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgZWFzZTsKICAgIHotaW5kZXg6IDU7Cn0KCi5tanItdmlkZW8tcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGdhcDogMTJweDsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIGF1dG8gMWZyIGF1dG8gYXV0bzsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tcm93LS10b3AgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIGF1dG8gMWZyIGF1dG8gYXV0bzsKfQoKLm1qci12aWRlby1jb250cm9scy0tcHJldmlldyAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlkZW8tcm93LS1ib3R0b20gewogICAgZ2FwOiA4cHg7Cn0KCi5tanItdmlkZW8tZ3JvdXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLW51bSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogNXB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci12aWRlby1udW06Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzgpOwp9CgoubWpyLXZpZGVvLW51bS0tc3BlZWQgewogICAgY29sb3Itc2NoZW1lOiBkYXJrOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwp9CgoubWpyLXZpZGVvLW51bS0tc3BlZWQgb3B0aW9uIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwp9CgoubWpyLXZpZGVvLWZyYW1lIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBtaW4td2lkdGg6IDUycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLWZyYW1lLmlzLXN0ZXAgewogICAgY29sb3I6ICNmZmQyNGQ7Cn0KCi5tanItdmlkZW8tYm90dG9tIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4OiAxOwp9CgoubWpyLXZpZGVvLWJvdHRvbS0tbGVmdCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7Cn0KCi5tanItdmlkZW8tYm90dG9tLS1yaWdodCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMCAwIGF1dG87Cn0KCi8qIFNob3cgY29udHJvbHMgb24gaG92ZXIvZm9jdXMgKHZpZXdlcikuICovCi5tanItdmlkZW8taG9zdDpob3ZlciAubWpyLXZpZGVvLWNvbnRyb2xzLAoubWpyLXZpZGVvLWNvbnRyb2xzOmZvY3VzLXdpdGhpbiB7CiAgICBvcGFjaXR5OiAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi8qIFByZXZpZXc6IGtlZXAgY29udHJvbHMgdmlzaWJsZSBiZWNhdXNlIHRoZSBhcmVhIGlzIHNtYWxsLiAqLwoubWpyLXZpZGVvLWNvbnRyb2xzLS1wcmV2aWV3IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogMTBweDsKICAgIHRvcDogYXV0bzsKICAgIGJvdHRvbTogMTBweDsKICAgIG9wYWNpdHk6IDE7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiBub25lOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IGF1dG87CiAgICBoZWlnaHQ6IGF1dG87CiAgICBiYWNrZHJvcC1maWx0ZXI6IG5vbmU7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogbm9uZTsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0biB7CiAgICB3aWR0aDogMzhweDsKICAgIGhlaWdodDogMzhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZGVvLXByZXZpZXctYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI4KTsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0biAucGkgewogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItdmlkZW8tYnRuIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgY29sb3I6ICNmZmY7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZGVvLWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwp9CgoubWpyLXZpZGVvLWJ0bi5pcy1vbiB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDY0LCAxNjAsIDI1NSwgMC4yNSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNjQsIDE2MCwgMjU1LCAwLjU1KTsKfQoKLm1qci12aWRlby1idG4tLWluIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3MCwgMjU1LCAxMjAsIDAuNTUpOwogICAgYmFja2dyb3VuZDogcmdiYSg3MCwgMjU1LCAxMjAsIDAuMTIpOwp9CgoubWpyLXZpZGVvLWJ0bi0taW46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSg3MCwgMjU1LCAxMjAsIDAuMTgpOwp9CgoubWpyLXZpZGVvLWJ0bi0tb3V0IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDcwLCA3MCwgMC41NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjEpOwp9CgoubWpyLXZpZGVvLWJ0bi0tb3V0OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuMTYpOwp9CgoubWpyLXZpZGVvLXRpbWUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIG1pbi13aWR0aDogOTJweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgZ2FwOiAxMHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDY0LCAxOTAsIDI1NSwgMC45Mik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDY0LCAxOTAsIDI1NSwgMC4xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNjQsIDE5MCwgMjU1LCAwLjI1KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgcGFkZGluZzogMXB4IDhweDsKICAgIGxpbmUtaGVpZ2h0OiAxNnB4OwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLXJhbmdlIHsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDgwcHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAxOwogICAgLyogV2UgZHJhdyBvdXIgb3duIHBsYXloZWFkL21hcmtlcnM7IGhpZGUgdGhlIG5hdGl2ZSB0aHVtYiAiZG90Ii4gKi8KICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGFwcGVhcmFuY2U6IG5vbmU7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXNlZWs6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoKLm1qci12aWRlby1yYW5nZS0tc2Vlazo6LW1vei1yYW5nZS10aHVtYiB7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoKLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbWluLXdpZHRoOiA4MHB4OwogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDEwcHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDI7Cn0KCi5tanItdmlkZW8tc2Vlay16b25lIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKfQoKLyogMC4uSW46IHRyaW1tZWQtb3V0IHJhbmdlLiAqLwoubWpyLXZpZGVvLXNlZWstem9uZS0tbGVmdFRyaW0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4xOCk7Cn0KCi8qIEluLi5PdXQ6IHNlbGVjdGVkIHBsYXliYWNrIHJhbmdlIGhpZ2hsaWdodC4gKi8KLm1qci12aWRlby1zZWVrLXpvbmUtLXNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNjQsIDE5MCwgMjU1LCAwLjU1KTsKfQoKLm1qci12aWRlby1zZWVrLXpvbmVzLmlzLWZ1bGxyYW5nZSAubWpyLXZpZGVvLXNlZWstem9uZS0tc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKfQoKLyogT3V0Li5FbmQ6IHNob3cgb3V0LW9mLXJhbmdlIGZyYW1lcyBhcyBhIGRpZmZlcmVudCBjb2xvci4gKi8KLm1qci12aWRlby1zZWVrLXpvbmUtLXJpZ2h0VHJpbSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjIpOwp9CgoubWpyLXZpZGVvLXNlZWstb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IDUwJTsKICAgIGhlaWdodDogMDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMzsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDUwJTsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAzMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdG91Y2gtYWN0aW9uOiBub25lOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB6LWluZGV4OiA0OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGU6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjQpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YWZ0ZXIsCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLW91dDo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB0b3A6IDUwJTsKICAgIHdpZHRoOiAycHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YWZ0ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSg3MCwgMjU1LCAxMjAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YmVmb3JlLAoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1vdXQ6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YmVmb3JlIHsKICAgIHRvcDogNHB4OwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkIHJnYmEoNzAsIDI1NSwgMTIwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0tb3V0OjpiZWZvcmUgewogICAgYm90dG9tOiA0cHg7CiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItdG9wOiA2cHggc29saWQgcmdiYSgyNTUsIDcwLCA3MCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay10aWNrcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IC0xNnB4OwogICAgaGVpZ2h0OiAxMnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci12aWRlby1zZWVrLWxhYmVscyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IC0zNHB4OwogICAgaGVpZ2h0OiAxNHB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMTRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC41NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1sYWJlbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLXZpZGVvLXNlZWstcGxheWhlYWQtbGFiZWwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAxMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgcGFkZGluZzogMXB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC0xMHB4OwogICAgd2lkdGg6IDE0cHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGN1cnNvcjogZXctcmVzaXplOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB0b3VjaC1hY3Rpb246IG5vbmU7CiAgICB6LWluZGV4OiA0OwogICAgLS1tanItbWFyay1jb2xvcjogcmdiYSgyNTUsIDcwLCA3MCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrLS1pbiB7CiAgICAtLW1qci1tYXJrLWNvbG9yOiByZ2JhKDcwLCAyNTUsIDEyMCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICB3aWR0aDogMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLW1hcmstY29sb3IpOwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkIHZhcigtLW1qci1tYXJrLWNvbG9yKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKfQoKLm1qci12aWRlby1zZWVrLW1hcmstLWluOjphZnRlciB7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tanItbWFyay1jb2xvcik7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrLS1vdXQ6OmFmdGVyIHsKICAgIHRvcDogYXV0bzsKICAgIGJvdHRvbTogLTVweDsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7CiAgICBib3JkZXItdG9wOiA2cHggc29saWQgdmFyKC0tbWpyLW1hcmstY29sb3IpOwp9CgoubWpyLXZpZGVvLXNlZWstcGxheWhlYWQgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMTJweDsKICAgIHdpZHRoOiAycHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjAwLCA3MCwgMC45NSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMXB4KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIHsKICAgIHBvc2l0aW9uOiBzdGF0aWM7CiAgICBsZWZ0OiBhdXRvOwogICAgcmlnaHQ6IGF1dG87CiAgICBib3R0b206IGF1dG87CiAgICBvcGFjaXR5OiAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDE0cHg7CiAgICBib3JkZXItcmFkaXVzOiAxOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjEyKTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCB0b3AgbGVmdCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKSwgdHJhbnNwYXJlbnQgMzQlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE5OCwgMjAzLCAyMTAsIDAuMDI1KSwgcmdiYSgxOTgsIDIwMywgMjEwLCAwLjAwOCkpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxNjVkZWcsIHJnYmEoMTgsIDIyLCAyOCwgMC44MiksIHJnYmEoMTIsIDE1LCAyMSwgMC45KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwKICAgICAgICAwIDEwcHggMzBweCByZ2JhKDAsIDAsIDAsIDAuMTQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBub25lOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IG5vbmU7CiAgICBnYXA6IDEycHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0biB7CiAgICBtaW4taGVpZ2h0OiAzOHB4OwogICAgcGFkZGluZzogOHB4IDEycHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA3KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyKSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk0LCAyMDEsIDIwOCwgMC4xOCk7CiAgICBib3JkZXItd2lkdGg6IDFweDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDAuMTJzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjEycyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMC4xMnMgZWFzZTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMjAsIDIyNCwgMjMwLCAwLjI2KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLAogICAgICAgIDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE0KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuLmlzLW9uIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTAwLCAxNzAsIDI1NSwgMC4yKSwgcmdiYSgxMDAsIDE3MCwgMjU1LCAwLjA4KSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTIwLCAxODYsIDI1NSwgMC40Mik7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgxMjAsIDE4NiwgMjU1LCAwLjEyKSBpbnNldDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuIC5waSB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWhlYWQsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpIGF1dG8gbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDEycHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItc3RhdHVzLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItc2lkZSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWNlbnRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItc2lkZS0tcmlnaHQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gbWlubWF4KDAsIDFmcikgYXV0bzsKICAgIGdhcDogMTJweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLW1lZGlhLWJhZGdlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDAgMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSg3OCwgMjI0LCAxOTYsIDAuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg3OCwgMjI0LCAxOTYsIDAuMjIpOwogICAgY29sb3I6IHJnYmEoMjIwLCAyNDcsIDI0MSwgMC45Nik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQ1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWUsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWZyYW1lIHsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBjb2xvcjogcmdiYSgyMjgsIDIzMCwgMjM0LCAwLjkyKTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1mcmFtZSB7CiAgICBtaW4td2lkdGg6IDk0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10aW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGhlaWdodDogMjJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjkyKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgY29sb3I6IHJnYmEoMjIyLCAyMjUsIDIzMCwgMC45NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk0LCAyMDEsIDIwOSwgMC4yNik7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxOTQsIDIwMSwgMjA5LCAwLjA4KTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1ncm91cCB7CiAgICBtaW4taGVpZ2h0OiAzNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWdyb3VwLS1hZGp1c3QtbGVmdCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLWFkanVzdC1yaWdodCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLXNwZWVkIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1udW0gewogICAgbWluLWhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDksIDEyLCAxNiwgMC41NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4tLXBsYXkgewogICAgbWluLXdpZHRoOiA4OHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG1pbi1oZWlnaHQ6IDQ0cHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgaGVpZ2h0OiAxMnB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdm9sdW1lLXdyYXAgewogICAgcGFkZGluZzogMCA0cHg7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXZvbHVtZSB7CiAgICB3aWR0aDogOTBweDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDk4MHB4KSB7CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCwKICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1hY3Rpb25zLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItY2VudGVyLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgICAgIGdhcDogMTBweDsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10cmFuc3BvcnQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgfQp9CgovKiA9PT09PT09PT09IENvbnRleHQgTWVudSBDb21wb25lbnQgPT09PT09PT09PSAqLwoubWpyLWNvbnRleHQtbWVudSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAvKiBBYm92ZSB2aWV3ZXIgb3ZlcmxheSAoMTAwMDEpIGFuZCBNRlYgZGlhbG9nICgxMDAwMCkgKi8KICAgIHotaW5kZXg6IDEwMDAyOwogICAgZGlzcGxheTogbm9uZTsKICAgIHBhZGRpbmc6IDRweCAwOwogICAgYW5pbWF0aW9uOiBtanItY29udGV4dC1tZW51LWluIDAuMTVzIGVhc2Utb3V0Owp9CgoubWpyLWNvbnRleHQtbWVudSwKLm1qci1jb250ZXh0LW1lbnUgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpAa2V5ZnJhbWVzIG1qci1jb250ZXh0LW1lbnUtaW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHBhZGRpbmc6IDhweCAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtOjotbW96LWZvY3VzLWlubmVyIHsKICAgIGJvcmRlcjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW06aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZyk7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLWRpc2FibGVkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQ6aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQ6Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1jb250ZXh0LW1lbnUtc2VwYXJhdG9yIHsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyLWNvbG9yKTsKICAgIG1hcmdpbjogNHB4IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1yaWdodCB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1hcmdpbi1sZWZ0OiAxNnB4Owp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLWxlZnQgaSB7CiAgICB3aWR0aDogMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG9wYWNpdHk6IDAuODI7Cn0KCi5tanItY29udGV4dC1tZW51LWhpbnQgewogICAgb3BhY2l0eTogMC41ODsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItY29udGV4dC1tZW51LXN1Ym1lbnUtYXJyb3cgewogICAgb3BhY2l0eTogMC43MjsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFkZC10by1jb2xsZWN0aW9uLW1lbnUgewogICAgbWluLXdpZHRoOiAyNjBweDsKICAgIG1heC13aWR0aDogbWluKDM2MHB4LCBjYWxjKDEwMHZ3IC0gMTZweCkpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEycHgpOwp9CgoubWpyLWNvbnRleHQtbWVudS10aXRsZSB7CiAgICBwYWRkaW5nOiA4cHggMTRweCAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvcik7CiAgICBvcGFjaXR5OiAwLjkyOwp9CgoubWpyLWNvbnRleHQtbWVudS1ub3RlIHsKICAgIHBhZGRpbmc6IDEwcHggMTRweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNzIlLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1Owp9CgoubWpyLWdyaWQtcG9wb3ZlciwKLm1qci12aWV3ZXItcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDI1MHB4OwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAxNnB4KSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItdmlld2VyLW92ZXJsYXkgKiwKICAgIC5tanItdmlkZW8tY29udHJvbHMsCiAgICAubWpyLWNvbnRleHQtbWVudSB7CiAgICAgICAgYW5pbWF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgIHNjcm9sbC1iZWhhdmlvcjogYXV0byAhaW1wb3J0YW50OwogICAgfQp9CgovKiBIaWRlIGhlYWRlciAodG9vbGJhcikgd2hlbiB2aWV3ZXIgb3ZlcmxheSBpcyBpbiBmdWxsc2NyZWVuICovCi5tanItdmlld2VyLW92ZXJsYXk6ZnVsbHNjcmVlbiAubWpyLXZpZXdlci1oZWFkZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIE1ham9vciBGbG9hdGluZyBWaWV3ZXIgKE1GVikg4oCUIHBvcnRhbGVkIHRvIGRvY3VtZW50LmJvZHkKICAgUmVkZWNsYXJlcyBDU1MgdmFyaWFibGVzIHNvIHRoZSBwYW5lbCB3b3JrcyBvdXRzaWRlIC5tanItYXNzZXRzLW1hbmFnZXIKICAgKHNhbWUgcGF0dGVybiBhcyAubWpyLXBvcG92ZXIpCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLm1qci1tZnYgewogICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1jb250ZW50LWJnLCAjMWUxZTFlKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWNvbWZ5LW1lbnUtc2Vjb25kYXJ5LWJnLCAjMzMzKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpOwogICAgLS1tanItYWNjZW50OiB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpOwogICAgLS1tanItc3RhdHVzLXN1Y2Nlc3M6IHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKTsKCiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgIHN5c3RlbS11aSwKICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgUm9ib3RvLAogICAgICAgIEFyaWFsLAogICAgICAgIHNhbnMtc2VyaWYKICAgICk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSk7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgIC8qIFZpc3VhbCBjaHJvbWUgKi8KICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgOHB4IDMycHggcmdiYSgwLCAwLCAwLCAwLjU1KSwKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLW1mdiAqIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCmh0bWwubWpyLW1mdi1wb3BvdXQtZG9jdW1lbnQgewogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICAgIDEyMDBweCA0MjBweCBhdCA1MCUgMCUsCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDEwJSwKICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50CiAgICAgICAgICAgICksCiAgICAgICAgICAgIHRyYW5zcGFyZW50IDYyJQogICAgICAgICksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KAogICAgICAgICAgICAxODBkZWcsCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgdmFyKC0tY29udGVudC1iZywgIzE2MTkxZikpIDgyJSwKICAgICAgICAgICAgICAgICMwMDAgMTglCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1pbnRlcmZhY2UtbWVudS1zdXJmYWNlLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMWYyMjI3KSkgODQlLAogICAgICAgICAgICAgICAgIzAwMCAxNiUKICAgICAgICAgICAgKQogICAgICAgICk7Cn0KCmJvZHkubWpyLW1mdi1wb3BvdXQtYm9keSB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKI21qci1tZnYtcG9wb3V0LXJvb3QsCi5tanItbWZ2LXBvcG91dC1yb290IHsKICAgIGlzb2xhdGlvbjogaXNvbGF0ZTsKfQoKLyog4pSA4pSAIEhlYWRlciAoZHJhZyBoYW5kbGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgY3Vyc29yOiBtb3ZlOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICBmbGV4LXNocmluazogMDsKICAgIGdhcDogNnB4OwogICAgbWluLWhlaWdodDogMzRweDsKfQoKLm1qci1tZnYtaGVhZGVyLXRpdGxlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBvcGFjaXR5OiAwLjc4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZmxleDogMTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjI4cHg7Cn0KCi8qIOKUgOKUgCBUb29sYmFyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi10b29sYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDUwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTAlKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgbWluLWhlaWdodDogMzZweDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIHNjcm9sbGJhci13aWR0aDogbm9uZTsKfQoubWpyLW1mdi10b29sYmFyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICB3aWR0aDogMXB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWJvcmRlcik7CiAgICBtYXJnaW46IDAgM3B4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LXByb2dyZXNzIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBoZWlnaHQ6IDIycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNzIlLCAjMDAwIDI4JSk7CiAgICBmbGV4LXNocmluazogMDsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlOmhvdmVyIHsKICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjAzKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MtYmFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICB3aWR0aDogMCU7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCA3MG1zIGVhc2UtaW4tb3V0Owp9CgoubWpyLW1mdi1wcm9ncmVzcy1iYXItLW5vZGVzIHsKICAgIHRvcDogMDsKICAgIGhlaWdodDogNTAlOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjglLCAjMGIzNTEzIDMyJSk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLWJhci0tc3RlcHMgewogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDUwJTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2NCUsICMwYjIzNDAgMzYlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1ub2RlcywKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1zdGVwcyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2Q5NTM0ZiA3OCUsICM0YTE0MTQgMjIlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3Mtb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCksIHJnYmEoMCwgMCwgMCwgMC4xOCkpOwogICAgbWl4LWJsZW5kLW1vZGU6IHNjcmVlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGhlaWdodDogMTAwJTsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtc2hhZG93OiAwIDAgMnB4IHJnYmEoMCwgMCwgMCwgMC45KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5tanItbWZ2LXBpbi1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAycHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KLm1qci1tZnYtcGluLWJ0biB7CiAgICB3aWR0aDogMjZweDsKICAgIGhlaWdodDogMjZweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2U7Cn0KLm1qci1tZnYtcGluLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1hY2NlbnQpIDglKTsKfQoubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTIlKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA0MiUsIHZhcigtLW1qci1hY2NlbnQpIDU4JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjQlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIOKUgOKUgCBQaW4gZ3JvdXA6IG5vdyBhIGRyb3Bkb3duIG1lbnUgKGRpc3BsYXk6bm9uZSBieSBkZWZhdWx0LCBmbGV4IHdoZW4gLmlzLW9wZW4pIOKUgOKUgCAqLwoubWpyLW1mdi1waW4tZ3JvdXAgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogY2FsYygxMDAlICsgNHB4KTsKICAgIGxlZnQ6IDA7CiAgICB6LWluZGV4OiAxMDAxMDsKICAgIG1pbi13aWR0aDogNzBweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7Cn0KLm1qci1tZnYtcGluLWdyb3VwLmlzLW9wZW4gewogICAgZGlzcGxheTogZmxleDsKfQoubWpyLW1mdi1waW4tYnRuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMzBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwIDEwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlOwp9Ci5tanItbWZ2LXBpbi1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM1JSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItbWZ2LXBpbi1idG4uaXMtcGlubmVkIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMiUpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDQyJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgNTglKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwp9CgovKiDilIDilIAgSWNvbiBEcm9wZG93biBjb21wb25lbnQgKC5tanItbWZ2LWlkcm9wKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtaWRyb3AgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LWlkcm9wLW1lbnUgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgbWluLXdpZHRoOiAxMTBweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5tanItbWZ2LWlkcm9wLW1lbnUuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLW1mdi1pZHJvcC1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXMgZWFzZTsKfQoubWpyLW1mdi1pZHJvcC1pdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KLm1qci1tZnYtaWRyb3AtaXRlbS5pcy1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNik7CiAgICBjb2xvcjogI2E4ZDhmZjsKfQoubWpyLW1mdi1pZHJvcC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cn0KLyogQ2hhbm5lbCB0cmlnZ2VyOiBzbGlnaHRseSB3aWRlciB0byBmaXQgIlJHQiIgKi8KLm1qci1tZnYtY2gtbGFiZWwgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiBUb29sYmFyIGljb24tYnV0dG9uIHBvcG92ZXJzIChjaGFubmVsLCBndWlkZXMsIHBpbiwgZm9ybWF0IOKAlCBzb3J0LXN0eWxlIGNvbnRleHQgbWVudXMpICovCi5tanItbWZ2LWNoLXBvcG92ZXIsCi5tanItbWZ2LWd1aWRlcy1wb3BvdmVyLAoubWpyLW1mdi1waW4tcG9wb3ZlciwKLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbWluLXdpZHRoOiAxMjBweDsKICAgIHBhZGRpbmc6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZywgMC41cmVtKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpOwogICAgei1pbmRleDogMTAwMTA7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItbWZ2LWNoLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtZ3VpZGVzLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtcGluLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBibG9jazsKfQovKiBUb29sYmFyIGljb24gaW1hZ2VzIOKAlCBjaCBpY29uIGlzIGJsYWNrIChpbnZlcnRlZCksIGd1aWRlcyBpY29uIGlzIG5hdGl2ZSB3aGl0ZSAqLwoubWpyLW1mdi1jaC1pY29uIHsKICAgIHdpZHRoOiAxOHB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgZmlsdGVyOiBpbnZlcnQoMSk7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgZGlzcGxheTogYmxvY2s7Cn0KLm1qci1tZnYtZ3VpZGVzLWljb24gewogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgZGlzcGxheTogYmxvY2s7Cn0KLm1qci1tZnYtY2gtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0sCi5tanItbWZ2LWd1aWRlcy10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSwKLm1qci1tZnYtcGluLXRyaWdnZXJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdLAoubWpyLW1mdi1mb3JtYXQtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSAhaW1wb3J0YW50Owp9Ci8qIFBpbiBzbG90IGFjdGl2ZSBzdGF0ZSAqLwoubWpyLW1mdi1waW4tcG9wb3ZlciAubWpyLW1lbnUtaXRlbS5pcy1waW5uZWQgewogICAgYmFja2dyb3VuZDogcmdiYSg5NSwgMTc5LCAyNTUsIDAuMTYpOwogICAgY29sb3I6ICNhOGQ4ZmY7Cn0KLm1qci1tZnYtcGluLXBvcG92ZXIgLm1qci1tZW51LWl0ZW0uaXMtcGlubmVkIC5tanItbWVudS1pdGVtLWNoZWNrIHsKICAgIG9wYWNpdHk6IDEgIWltcG9ydGFudDsKfQovKiBGb3JtYXQgcG9wb3Zlcjogc2VwYXJhdG9yICsgb3BhY2l0eSBzbGlkZXIgcm93ICovCi5tanItbWZ2LWZvcm1hdC1zZXAgewogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkpOwogICAgbWFyZ2luOiA0cHggMnB4Owp9Ci5tanItbWZ2LWZvcm1hdC1zbGlkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4IDJweDsKfQoubWpyLW1mdi1mb3JtYXQtc2xpZGVyLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIG9wYWNpdHk6IDAuNjU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZmxleC1zaHJpbms6IDA7Cn0KLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiA3MHB4OwogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoubWpyLW1mdi1mb3JtYXQtcG9wb3ZlciAubWpyLW1mdi10b29sYmFyLXJhbmdlLW91dCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBvcGFjaXR5OiAwLjY1OwogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0biB7CiAgICB3aWR0aDogMzBweDsKICAgIGhlaWdodDogMzBweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBmbGV4LXNocmluazogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAxMjBtcyBlYXNlOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgOCUpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuOmZvY3VzLXZpc2libGUgewogICAgb3V0bGluZTogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyNCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi8qIFVuaXZlcnNhbCBhY3RpdmUgaGlnaGxpZ2h0IOKAlCBhbnkgYXJpYS1wcmVzc2VkPSJ0cnVlIiBidXR0b24gZ2V0cyBhY2NlbnQgZ2xvdy4KICAgUGxhY2VkIGJlZm9yZSB0aGUgY29sb3JlZCBhY3RpdmUgY2xhc3NlcyBzbyB0aGV5IGNhbiBvdmVycmlkZSB3aXRoIHRoZWlyIG93biBjb2xvci4gKi8KLm1qci1tZnYgLm1qci1pY29uLWJ0blthcmlhLXByZXNzZWQ9InRydWUiXSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjU1KTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA4MCUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE1JSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI1JSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItbWZ2IC5tanItaWNvbi1idG5bYXJpYS1wcmVzc2VkPSJ0cnVlIl0gLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLWxpdmUtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItbGl2ZS1hY3RpdmUgLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1ub2Rlc3RyZWFtLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsCiAgICAgICAgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAxMiUKICAgICk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgovKiBQb3AtaW4gbW9kZSAodmlld2VyIHBvcHBlZCBvdXQpOiByYWlzZSBidXR0b24gY29udHJhc3QvYnJpZ2h0bmVzcyAqLwoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgOTIlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDI0cHggNTZweCByZ2JhKDAsIDAsIDAsIDAuNDIpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkwJSwgcmdiYSgwLCAwLCAwLCAwLjI0KSkKICAgICk7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWhlYWRlci10aXRsZSB7CiAgICBvcGFjaXR5OiAwLjk4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA5NCUsICNmZmZmZmYgNiUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtdG9vbGJhciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MCUsIHJnYmEoMCwgMCwgMCwgMC4yNCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXByb2dyZXNzIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDgyJSwgIzBhMTExOCAxOCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MiUsICMwMDAgOCUpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2VlZjRmZikgOTQlLCAjZmZmZmZmIDYlKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWNvbnRlbnQgewogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICAgIGNpcmNsZSBhdCB0b3AsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMCUsIHRyYW5zcGFyZW50KSAwJSwKICAgICAgICAgICAgdHJhbnNwYXJlbnQgNDIlCiAgICAgICAgKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODIlLCAjMDAwIDE4JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA5MiUsICNmZmZmZmYgOCUpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB2YXIoLS1tanItYWNjZW50KSA0MiUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2MiUsIHZhcigtLW1qci1hY2NlbnQpIDM4JSkKICAgICk7CiAgICBjb2xvcjogI2Y0ZjhmZiAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0biAucGkgewogICAgb3BhY2l0eTogMTsKICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1saXZlLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDYwJSwgI2ZmZmZmZiA0MCUpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMjQlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAwIDE4cHggcmdiYSg3NiwgMTc1LCA4MCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1wcmV2aWV3LWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAxOHB4IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgNTglLCAjZmZmZmZmIDQyJSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMzYlLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUpCiAgICApOwogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAyNCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMThweCByZ2JhKDI1NSwgMTUyLCAwLCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXBpbi1idG4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzYlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpIDkyJSwgI2ZmZmZmZiA4JSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTYlLCB2YXIoLS1tanItYWNjZW50KSA0NCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUsIHZhcigtLW1qci1hY2NlbnQpIDM2JSkKICAgICk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDk0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDk0JSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBib3JkZXItbGVmdC1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAxcHggMCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItcmlnaHQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNikpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXNpZGViYXItdGl0bGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA4MiUsIHZhcigtLW1qci1tdXRlZCkgMTglKTsKICAgIG9wYWNpdHk6IDAuODg7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwKSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KAogICAgICAgICAgICAxODBkZWcsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4NiUsIHZhcigtLW1qci1hY2NlbnQpIDE0JSksCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA4NiUsIHJnYmEoMCwgMCwgMCwgMC4xNCkpCiAgICAgICAgKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNlZWY0ZmYpIDk0JSwgI2ZmZmZmZiA2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXdpZGdldC1sYWJlbCwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtc2lkZWJhci1lbXB0eSwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS1lbXB0eSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tdXRlZCkgODQlLCAjZmZmZmZmIDE2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA3NCUsICMwNTA3MGEgMjYlKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMCUpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItcG9waW4tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiA0MiUpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDQ1JSwgdmFyKC0tbWpyLWFjY2VudCkgNTUlKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwp9CgovKiDilIDilIAgQ29udGVudCB3cmFwcGVyIChob3Jpem9udGFsIGZsZXg6IGNvbnRlbnQgKyBzaWRlYmFyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtY29udGVudC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIOKUgOKUgCBTaWRlYmFyIHBvc2l0aW9uIHZhcmlhbnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSAubWpyLXdzLXNpZGViYXIgewogICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci13cy1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGhlaWdodCAwLjJzIGVhc2UsCiAgICAgICAgd2lkdGggMHM7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItd3Mtc2lkZWJhci5vcGVuIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAyMjBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAxMjBweDsKICAgIG1heC1oZWlnaHQ6IDY1JTsKfQoKLyog4pSA4pSAIENvbnRlbnQgYXJlYSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGQ7CiAgICBtaW4taGVpZ2h0OiAwOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleDogMCAwIDMyMHB4OwogICAgd2lkdGg6IDMyMHB4OwogICAgbWluLXdpZHRoOiAyMTBweDsKICAgIG1heC13aWR0aDogbWluKDQyJSwgNDIwcHgpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMTgsIDIwLCAwLjk2KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODgpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci5vcGVuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItbWZ2LWdlbi1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmlnaHQ6IG5vbmU7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBmbGV4OiAwIDAgMTgwcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci10aXRsZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItc2VjdGlvbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZy10b3A6IDhweDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLXNlY3Rpb246Zmlyc3Qtb2YtdHlwZSB7CiAgICBwYWRkaW5nLXRvcDogMDsKICAgIGJvcmRlci10b3A6IG5vbmU7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWhlYWRpbmcgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1nZW4tdGltZS1iYWRnZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjQyKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjE2KSwgcmdiYSg3NiwgMTc1LCA4MCwgMC4xKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjEyKSBpbnNldDsKICAgIGN1cnNvcjogY29weTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE2cyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjE2cyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMC4xNnMgZWFzZTsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtbGFiZWwgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Mik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtdmFsdWUgewogICAgY29sb3I6ICNlMGZmN2E7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIG1vbm9zcGFjZTsKfQoKLm1qci1tZnYtZ2VuLWNhcmQgewogICAgLS1tanItbWZ2LWdlbi1hY2NlbnQ6ICMyMTk2ZjM7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpIDQ1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDEzNWRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSAxNiUsIHRyYW5zcGFyZW50KSAwJSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSA4JSwgdHJhbnNwYXJlbnQpIDEwMCUKICAgICk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgMTQlLCB0cmFuc3BhcmVudCkgaW5zZXQ7CiAgICBjdXJzb3I6IGNvcHk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xNnMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1zZWVkIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYm9yZGVyLXdpZHRoOiAycHg7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1jb21wYWN0IHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCAubWpyLW1mdi1nZW4tY2FyZC10aXRsZSwKLm1qci1tZnYtZ2VuLWNhcmQtLWNvbXBhY3QgLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQ6aG92ZXIsCi5tanItbWZ2LWdlbi10aW1lLWJhZGdlOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCwgI2UwZmY3YSkgNzAlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCwgI2UwZmY3YSkgMjQlLCB0cmFuc3BhcmVudCkKICAgICAgICBpbnNldDsKfQoKLm1qci1tZnYtZ2VuLWNvcHktZmxhc2ggewogICAgYmFja2dyb3VuZDogcmdiYSg3NiwgMTc1LCA4MCwgMC4yOCkgIWltcG9ydGFudDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdGl0bGUgewogICAgY29sb3I6IHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG1pbi13aWR0aDogMDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWNvbXBhY3QgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1tdWx0aWxpbmUgewogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwp9CgoubWpyLW1mdi1nZW4tY2FyZC0tc2VlZCAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIG1vbm9zcGFjZTsKICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICBjb2xvcjogI2ZmZjsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtZmllbGRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1nZW4tZmllbGQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDc4cHgsIGF1dG8pIDFmcjsKICAgIGdhcDogMTBweDsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLWxhYmVsIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMTgwLCAxODAsIDE4MCwgMC43MikpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLXZhbHVlIHsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSk7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2VjOGZmOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmN2E5ZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZTBmZjdhOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdiB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgZGl2Omxhc3QtY2hpbGQgewogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLm1qci1tZnYtb3ZlcmxheS1jYW52YXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTI7Cn0KCi5tanItbWZ2LXRvb2xiYXItc2VsZWN0IHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjQpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA2KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyKSk7CiAgICBjb2xvcjogcmdiYSgyMzAsIDIzMywgMjM4LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICB3aWR0aDogNzJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKfQoKLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgovKiBFViBzbGlkZXIgYWN0aXZlIHN0YXRlICh2YWx1ZSDiiaAgMCkgKi8KLm1qci1tZnYtdG9vbGJhci1yYW5nZS5pcy1hY3RpdmUgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICBhY2NlbnQtY29sb3I6ICNmNWM4NDI7Cn0KLm1qci1tZnYtdG9vbGJhci1yYW5nZS5pcy1hY3RpdmUgLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgY29sb3I6ICNmNWM4NDI7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwcHg7CiAgICBsZWZ0OiAxMHB4OwogICAgei1pbmRleDogNjsKICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gMjBweCk7CiAgICBwYWRkaW5nOiA1cHggOXB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSkgODglLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgcmdiYSg1LCA4LCAxNCwgMC44NikgODYlLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExKSAxNCUpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY3ZmEpOwogICAgYm94LXNoYWRvdzogMCAycHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMTZzIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LW1lZGlhLXByb2dyZXNzLmlzLXZpc2libGUgewogICAgb3BhY2l0eTogMTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MuaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgI2ZmNWM3YSkgNzIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgcmdiYSg2MCwgMTAsIDE4LCAwLjkpIDgyJSwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzExMSkgMTglKTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MtdGV4dCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjsKfQoKLyog4pSA4pSAIFdvcmtmbG93IFNpZGViYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItd3Mtc2lkZWJhciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMnMgZWFzZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLXdzLXNpZGViYXIub3BlbiB7CiAgICB3aWR0aDogMjYwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgbWluLXdpZHRoOiAxODBweDsKICAgIG1heC13aWR0aDogNjUlOwogICAgdHJhbnNpdGlvbjogbm9uZTsKfQoKLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBtaW4taGVpZ2h0OiAzNHB4Owp9Ci5tanItd3Mtc2lkZWJhci10aXRsZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgIG9wYWNpdHk6IDAuNjU7Cn0KLm1qci13cy1zaWRlYmFyLWJvZHkgewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogMDsKfQoubWpyLXdzLXNpZGViYXItZW1wdHkgewogICAgcGFkZGluZzogMjRweCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMS41Owp9CgovKiDilIDilIAgVGFiIGJhciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci13cy10YWItYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGdhcDogMnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItd3MtdGFiIHsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNXMsCiAgICAgICAgY29sb3IgMC4xNXM7Cn0KCi5tanItd3MtdGFiOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNyk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc1KTsKfQoKLm1qci13cy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjE1KTsKICAgIGNvbG9yOiAjNjM5YmZmOwp9CgovKiDilIDilIAgTm9kZXMgdGFiIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLXdzLW5vZGVzLXRhYiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGZsZXg6IDE7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLyogR3JhcGggTWFwIHRhYiAqLwoubWpyLXdnbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDEwMCU7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKfQoKLm1qci13Z20tbWFwLXdyYXAgewogICAgaGVpZ2h0OiAxOTBweDsKICAgIG1pbi1oZWlnaHQ6IDE1MHB4OwogICAgbWFyZ2luOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yMik7Cn0KCi5tanItd2dtLXByZXZpZXcgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMyKTsKfQoKLm1qci13Z20tcHJldmlldyAubWpyLW1mdi1tZWRpYSwKLm1qci13Z20tcHJldmlldyAubWpyLW1mdi1wbGF5ZXItaG9zdCwKLm1qci13Z20tcHJldmlldyAubWpyLW1vZGVsM2QtaG9zdCwKLm1qci13Z20tcHJldmlldy1tZWRpYSB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwp9CgoubWpyLXdnbS1wcmV2aWV3LWVtcHR5IHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1jYW52YXMgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGN1cnNvcjogZ3JhYjsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKfQoKLm1qci13Z20tY2FudmFzOmFjdGl2ZSB7CiAgICBjdXJzb3I6IGdyYWJiaW5nOwp9CgoubWpyLXdnbS0tbGFyZ2UgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLW1hcC13cmFwIHsKICAgIGZsZXg6IDE7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgbWFyZ2luOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogMDsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLXN0YXR1cyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMHB4OwogICAgdG9wOiAxMHB4OwogICAgei1pbmRleDogMjsKICAgIG1heC13aWR0aDogbWluKDQyMHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7CiAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwp9CgoubWpyLXdnbS10b29sYmFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEwcHg7CiAgICB0b3A6IDQ2cHg7CiAgICB6LWluZGV4OiAyOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBnYXA6IDZweDsKICAgIG1heC13aWR0aDogbWluKDQyMHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7Cn0KCi5tanItd2dtLW1vZGUgewogICAgbWluLWhlaWdodDogMjZweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci13Z20tbW9kZTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTQ5LCAxODMsIDI1NSwgMC40NSk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXdnbS1tb2RlLmlzLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTI0LCAxODYsIDI1NSwgMC42Mik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc5LCAxMjMsIDIxNCwgMC4yNik7CiAgICBjb2xvcjogcmdiYSgyMzUsIDI0NSwgMjU1LCAwLjk2KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLWRldGFpbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDEwcHg7CiAgICB0b3A6IDEwcHg7CiAgICBib3R0b206IDEwcHg7CiAgICB6LWluZGV4OiAyOwogICAgd2lkdGg6IG1pbigzMjBweCwgMzglKTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDIwLCAyNiwgMC44NCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7Cn0KCi5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1hY3Rpb24gewogICAgbWluLWhlaWdodDogMzBweDsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLXBhcmFtIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci13Z20tc3RhdHVzIHsKICAgIHBhZGRpbmc6IDAgMTBweCA4cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1Owp9CgoubWpyLXdnbS1kZXRhaWxzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiAwIDhweCAxMHB4Owp9CgoubWpyLXdnbS1ub2RlLXRpdGxlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLm1qci13Z20tbm9kZS1tZXRhIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBtYXJnaW4tdG9wOiAtNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40Mik7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KCi5tanItd2dtLWFjdGlvbnMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLWFjdGlvbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogN3B4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzYpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdnbS1hY3Rpb246aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC40NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC4xMik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKfQoKLm1qci13Z20tYWN0aW9uLmlzLW9rIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3NiwgMTc1LCA4MCwgMC41NSk7CiAgICBjb2xvcjogcmdiYSgxOTAsIDI1NSwgMTk2LCAwLjk2KTsKfQoKLm1qci13Z20tcGFyYW1zIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKICAgIG1hcmdpbi10b3A6IDJweDsKfQoKLm1qci13Z20tcGFyYW0gewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDY0cHgsIDAuNDJmcikgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTgpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLXdnbS1wYXJhbTpob3ZlciwKLm1qci13Z20tcGFyYW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13Z20tcGFyYW0uaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjE2KTsKfQoKLm1qci13Z20tcGFyYW0uaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDkwLCA5MCwgMC4xNik7Cn0KCi5tanItd2dtLXBhcmFtLWtleSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40OCk7Cn0KCi5tanItd2dtLXBhcmFtLXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDExNSwgMTU1LCAyNTUsIDAuODgpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTE1LCAxNTUsIDI1NSwgMC4yMik7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXdnbS1ub2RlLWFjY2VudCkgMzQlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCksCiAgICAgICAgMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdCkgMTAwJSwgdHJhbnNwYXJlbnQpLCByZ2JhKDQ0LCA1NiwgODgsIDAuMikpLAogICAgICAgIHJnYmEoMTMsIDE2LCAyNCwgMC44NSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGhlaWdodDogMnB4OwogICAgbWFyZ2luOiAtOHB4IC04cHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4IDZweCAwIDA7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtbW9kZWwgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDEyNCwgMTg2LCAyNTUsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSg3MCwgMTIzLCAxODEsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy1zYW1wbGVyIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxNDMsIDIyOCwgMTY3LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoNjQsIDEzMywgODgsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy10ZXh0IHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgyNTUsIDE5MiwgMTE0LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTU0LCAxMDIsIDQ5LCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtbWVkaWEgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDE1NCwgMTcwLCAyNTUsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSg4MywgOTMsIDE2NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLWNvbnRyb2wgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDI1NSwgMTM5LCAxNjksIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSgxNDUsIDcwLCA5NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLWxvZ2ljIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxODgsIDE2OCwgMjU1LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTA1LCA4NiwgMTUzLCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItd2dtLW5vZGUtYWNjZW50KSAyNSUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC10eXBlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyMzYsIDI0NCwgMjU1LCAwLjk0KTsKICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLWlkIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDE5NCwgMjEzLCAyNTUsIDAuNzgpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICBnYXA6IDhweDsKfQoKLm1qci13Z20tbm9kZS1wb3J0cy1jb2wgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzLXRpdGxlIHsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40NSk7Cn0KCi5tanItd2dtLW5vZGUtcG9ydHMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiAzcHg7Cn0KCi5tanItd2dtLW5vZGUtcG9ydCwKLm1qci13Z20tbm9kZS1wb3J0LWVtcHR5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAxOHB4OwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjQpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZW1wdHkgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNik7Cn0KCi5tanItd2dtLW5vZGUtcG9ydC1kb3QgewogICAgd2lkdGg6IDhweDsKICAgIGhlaWdodDogOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpIGluc2V0Owp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZG90LmlzLWluIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTM1LCAxOTYsIDI1NSwgMC45KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0LWRvdC5pcy1vdXQgewogICAgYmFja2dyb3VuZDogcmdiYSgxNDQsIDIzOCwgMTc0LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtbmFtZSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzgpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtdHlwZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1heC13aWR0aDogNDUlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBwYWRkaW5nOiAxcHggNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGNvbG9yOiByZ2JhKDIyNCwgMjM2LCAyNTUsIDAuOSk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0cyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0cy10aXRsZSB7CiAgICBtYXJnaW4tYm90dG9tOiAycHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldCwKLm1qci13Z20tbm9kZS13aWRnZXQtZW1wdHkgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDcwcHgsIDAuNDJmcikgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldCB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQ6aG92ZXIsCi5tanItd2dtLW5vZGUtd2lkZ2V0OmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjE2KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDkwLCA5MCwgMC4xNik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LWVtcHR5IHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LWtleSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41Mik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgYWxpZ24taXRlbXM6IHN0YXJ0OwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLW11bHRpbGluZSAubWpyLXdnbS1ub2RlLXdpZGdldC1rZXkgewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lIC5tanItd2dtLW5vZGUtd2lkZ2V0LXZhbHVlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgbWF4LWhlaWdodDogOS4yZW07CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZy1yaWdodDogMnB4Owp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC5pcy1tdWx0aWxpbmUuaXMtdGV4dC1maWVsZCAubWpyLXdnbS1ub2RlLXdpZGdldC12YWx1ZSB7CiAgICBtYXgtaGVpZ2h0OiAxNmVtOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQtbW9yZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ2KTsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgpAbWVkaWEgKG1heC13aWR0aDogODIwcHgpIHsKICAgIC5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1kZXRhaWxzIHsKICAgICAgICB3aWR0aDogbWluKDM4MHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7CiAgICB9CgogICAgLm1qci13Z20tbm9kZS1wb3J0cyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9Cn0KCi5tanItd3Mtc2VhcmNoLXdyYXAgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItd3Mtc2VhcmNoLWljb24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci13cy1zZWFyY2ggewogICAgZmxleDogMTsKICAgIHBhZGRpbmc6IDRweCAyOHB4IDRweCAyNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItd3Mtc2VhcmNoOjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI4KTsKfQoKLm1qci13cy1zZWFyY2g6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC41KTsKfQoKLm1qci13cy1zZWFyY2gtY2xlYXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDE0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXdzLXNlYXJjaC1jbGVhcjpob3ZlciB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci13cy1ub2Rlcy1saXN0IHsKICAgIGZsZXg6IDE7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogNHB4IDA7Cn0KCi5tanItd3Mtbm9kZS1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4IDVweCAxMnB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7CiAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzOwp9CgoubWpyLXdzLW5vZGUtcm93OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItd3Mtbm9kZS1yb3ctdHlwZSB7CiAgICBmbGV4OiAxOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43OCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9CgoubWpyLXdzLW5vZGUtcm93LXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgbWF4LXdpZHRoOiA4MHB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItd3Mtbm9kZS1sb2NhdGUgewogICAgZmxleC1zaHJpbms6IDA7CiAgICB3aWR0aDogMjJweDsKICAgIGhlaWdodDogMjJweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjFzLAogICAgICAgIGNvbG9yIDAuMXMsCiAgICAgICAgYmFja2dyb3VuZCAwLjFzOwp9CgoubWpyLXdzLW5vZGUtcm93OmhvdmVyIC5tanItd3Mtbm9kZS1sb2NhdGUgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci13cy1ub2RlLWxvY2F0ZTpob3ZlciB7CiAgICBjb2xvcjogIzYzOWJmZjsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjE1KTsKfQoKLyog4pSA4pSAIE5vZGUgc2VjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItd3MtdHJlZS1pdGVtIHsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoubWpyLXdzLXRyZWUtaXRlbSA+IC5tanItd3Mtbm9kZSB7CiAgICBib3JkZXItYm90dG9tOiBub25lOwp9Ci5tanItd3MtdHJlZS1pdGVtLS1zdWJncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNCUsIHRyYW5zcGFyZW50IDk2JSk7Cn0KLm1qci13cy1ub2RlIHsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQovKiBTdWJ0bGUgaGlnaGxpZ2h0IHdoZW4gdGhpcyBub2RlIG1hdGNoZXMgdGhlIGN1cnJlbnQgZ3JhcGggc2VsZWN0aW9uLiAqLwoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjEwLCA5MCwgMC4wOCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAycHggMCAwIDAgcmdiYSgyNTUsIDIxMCwgOTAsIDAuNzUpOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmZmQ0NWEgMTglLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA4MiUpOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS10eXBlIHsKICAgIGNvbG9yOiAjZmZkNDVhOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIyNCwgMTMwLCAwLjg4KTsKfQoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUtdG9nZ2xlLAoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLWxvY2F0ZSwKLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLWtpbmQgewogICAgY29sb3I6ICNmZmQ0NWE7Cn0KLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgd2lkdGg6IDE0cHg7CiAgICB6LWluZGV4OiAyOwogICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKfQoKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNTAlOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDRweDsKICAgIGhlaWdodDogNTZweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMTVzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZCAwLjE1cyBlYXNlOwp9CgoubWpyLXdzLXNpZGViYXIub3Blbjpob3ZlciAubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXIuaXMtcmVzaXppbmcgLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIuaXMtZHJhZ2dpbmc6OmJlZm9yZSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLXdzLXNpZGViYXIuaXMtcmVzaXppbmcgLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6aG92ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIuaXMtZHJhZ2dpbmc6OmJlZm9yZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0icmlnaHQiXSAubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICByaWdodDogMDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSAubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICBsZWZ0OiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDQwJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA2MCUKICAgICk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xMnMgZWFzZTsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNpYmxlIC5tanItd3Mtbm9kZS1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgMjglLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDcyJQogICAgKTsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2libGUuaXMtY29sbGFwc2VkIC5tanItd3Mtbm9kZS1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgOCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTIlCiAgICApOwp9Ci5tanItd3Mtbm9kZS10b2dnbGUgewogICAgZmxleDogMCAwIGF1dG87Cn0KLm1qci13cy1ub2RlLXRpdGxlLXdyYXAgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxcHg7Cn0KLm1qci13cy1ub2RlLXR5cGUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLm1qci13cy1ub2RlLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLW5vZGUta2luZCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWF4LXdpZHRoOiAxMTBweDsKICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMzglLCB0cmFuc3BhcmVudCA2MiUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMTIlLCB0cmFuc3BhcmVudCA4OCUpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA3OCUsICNmZmZmZmYgMjIlKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMS4yOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoubWpyLXdzLW5vZGUta2luZCAucGkgewogICAgZm9udC1zaXplOiAxMHB4Owp9Ci5tanItd3Mtbm9kZS1raW5kLWNvdW50IHsKICAgIG1pbi13aWR0aDogMTRweDsKICAgIHBhZGRpbmc6IDAgM3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44Mik7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNlZCAubWpyLXdzLW5vZGUtYm9keSB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItd3Mtbm9kZS1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKfQoubWpyLXdzLW5vZGUtZW1wdHkgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIHBhZGRpbmc6IDRweCAwOwp9CgovKiDilIDilIAgTmVzdGVkIG5vZGVzIChpbnNpZGUgc3ViZ3JhcGhzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci13cy1ub2RlLS1uZXN0ZWQgewogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCByZ2JhKDkxLCAxMzgsIDI0MCwgMC4zNSk7Cn0KLm1qci13cy1ub2RlLS1uZXN0ZWQgLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA1JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5NSUKICAgICk7Cn0KLm1qci13cy1ub2RlLS1uZXN0ZWQuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTAlCiAgICApOwp9CgovKiDilIDilIAgU3ViZ3JhcGggY2hpbGRyZW4gZ3JvdXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItd3MtY2hpbGRyZW4tdG9nZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDVweCAxMHB4IDVweCAyMHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNiUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgOTQlCiAgICApOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIG9wYWNpdHk6IDAuODsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjFzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZCAwLjFzIGVhc2U7Cn0KLm1qci13cy1jaGlsZHJlbi10b2dnbGUtLW5lc3RlZCB7CiAgICBwYWRkaW5nLWxlZnQ6IDI4cHg7Cn0KLm1qci13cy1jaGlsZHJlbi10b2dnbGU6aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDEyJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0wLCAjMWUxZTFlKSA4OCUKICAgICk7Cn0KLm1qci13cy1jaGlsZHJlbi10b2dnbGVbYXJpYS1leHBhbmRlZD0idHJ1ZSJdIHsKICAgIG9wYWNpdHk6IDE7Cn0KLm1qci13cy1jaGlsZHJlbiB7CiAgICBib3JkZXItbGVmdDogMnB4IHNvbGlkIHJnYmEoOTEsIDEzOCwgMjQwLCAwLjI1KTsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBwYWRkaW5nLWxlZnQ6IDZweDsKfQoKLm1qci13cy13aWRnZXQtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogOHB4Owp9Ci5tanItd3Mtd2lkZ2V0LXJvdy0tYmxvY2sgewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4Owp9Ci5tanItd3Mtd2lkZ2V0LXJvdy0tYmxvY2sgLm1qci13cy13aWRnZXQtbGFiZWwgewogICAgZmxleDogbm9uZTsKICAgIHBhZGRpbmctdG9wOiAwOwp9Ci5tanItd3Mtd2lkZ2V0LXJvdy0tYmxvY2sgLm1qci13cy13aWRnZXQtaW5wdXQgewogICAgd2lkdGg6IDEwMCU7Cn0KLm1qci13cy13aWRnZXQtbGFiZWwgewogICAgZmxleDogMCAwIDgwcHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNTUpKTsKICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9Ci5tanItd3Mtd2lkZ2V0LWlucHV0IHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KLm1qci13cy1pbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCAjMjIyKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogNHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgb3V0bGluZTogbm9uZTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9Ci5tanItd3MtaW5wdXQ6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoubWpyLXdzLXRleHRhcmVhIHsKICAgIHJlc2l6ZTogbm9uZTsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwp9Ci5tanItd3MtdGV4dC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItd3MtdGV4dC13cmFwcGVyIC5tanItd3MtdGV4dGFyZWEgewogICAgd2lkdGg6IDEwMCU7Cn0KLm1qci13cy1leHBhbmQtYnRuIHsKICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDAgNHB4OwogICAgb3BhY2l0eTogMC44Owp9Ci5tanItd3MtZXhwYW5kLWJ0bjpob3ZlciB7CiAgICBvcGFjaXR5OiAxOwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KLm1qci13cy1yZWFkb25seSB7CiAgICBvcGFjaXR5OiAwLjU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KLm1qci13cy1jaGVja2JveCB7CiAgICBhY2NlbnQtY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwogICAgd2lkdGg6IDE2cHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBtYXJnaW4tdG9wOiA0cHg7Cn0KLm1qci13cy10b2dnbGUtbGFiZWwgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi8qIOKUgOKUgCBMb2NhdGUgYnV0dG9uIGluc2lkZSBub2RlIGhlYWRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci13cy1sb2NhdGUgewogICAgd2lkdGg6IDI0cHggIWltcG9ydGFudDsKICAgIGhlaWdodDogMjRweCAhaW1wb3J0YW50OwogICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC41Owp9Ci5tanItd3MtbG9jYXRlOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi8qIOKUgOKUgCBSdW4gYnV0dG9uIHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1ydW4tY29udHJvbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7Cn0KLm1qci1tZnYtcnVuLWJ0biAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcywgIzRjYWY1MCk7Cn0KLm1qci1tZnYtcnVuLWJ0bi5ydW5uaW5nIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKfQoubWpyLW1mdi1ydW4tYnRuLnN0b3BwaW5nIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KTsKfQoubWpyLW1mdi1ydW4tYnRuLmVycm9yIC5waSB7CiAgICBjb2xvcjogI2Y0NDMzNjsKfQoKLm1qci1tZnYtc3RvcC1idG4gLnBpIHsKICAgIGNvbG9yOiAjZWY1MzUwOwp9Ci5tanItbWZ2LXN0b3AtYnRuLmFjdGl2ZSAucGkgewogICAgY29sb3I6ICNmZjhhNjU7Cn0KLm1qci1tZnYtc3RvcC1idG4uc3RvcHBpbmcgLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZmE3MjYpOwp9CgovKiDilIDilIAgRmxvYXRpbmcgVmlld2VyIHNpbXBsZSB2aWRlbyBwbGF5ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci5pcy1hdWRpbyB7CiAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDIwJSAyMCUsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjIpLCByZ2JhKDE4LCAyMCwgMjgsIDAuOTUpKTsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1hdWRpby1iYWNrZHJvcCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjJweDsKICAgIHRleHQtc2hhZG93OiAwIDJweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC40NSk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHBhZGRpbmc6IDE4cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItY29udHJvbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTJweDsKICAgIHJpZ2h0OiAxMnB4OwogICAgYm90dG9tOiAxMnB4OwogICAgei1pbmRleDogMzA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogOXB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiAxNHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byB0b3AsIHJnYmEoMTAsIDEwLCAxNCwgMC43NiksIHJnYmEoMTYsIDE2LCAyNCwgMC41NSkpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1yb3cgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItc2VlayB7CiAgICAtLW1qci1zZWVrLXBjdDogMCU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgb3V0bGluZTogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICB0byByaWdodCwKICAgICAgICAjZmYyZjUyIDAlLAogICAgICAgICNmZjJmNTIgdmFyKC0tbWpyLXNlZWstcGN0KSwKICAgICAgICByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjQpIHZhcigtLW1qci1zZWVrLXBjdCksCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSAxMDAlCiAgICApOwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWs6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAxMnB4OwogICAgaGVpZ2h0OiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzUpOwogICAgYmFja2dyb3VuZDogI2ZmMmY1MjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrOjotbW96LXJhbmdlLXRodW1iIHsKICAgIHdpZHRoOiAxMnB4OwogICAgaGVpZ2h0OiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzUpOwogICAgYmFja2dyb3VuZDogI2ZmMmY1MjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1idG4gewogICAgd2lkdGg6IDMwcHg7CiAgICBoZWlnaHQ6IDMwcHg7CiAgICBtaW4td2lkdGg6IDMwcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYnRuLmlzLWRpc2FibGVkLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWsuaXMtZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC40NTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci10aW1lIHsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWZyYW1lIHsKICAgIG1hcmdpbi1yaWdodDogMnB4OwogICAgcGFkZGluZzogM3B4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGNvbnRhaW5lci10eXBlOiBpbmxpbmUtc2l6ZTsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scyB7CiAgICB6LWluZGV4OiAzMDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSB7CiAgICBsZWZ0OiA4cHg7CiAgICByaWdodDogOHB4OwogICAgYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXJvdy0tdG9wLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tcm93LS10b3AgewogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby10aW1lZ3JvdXAsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby10aW1lZ3JvdXAgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1yb3ctLWJvdHRvbSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXJvdy0tYm90dG9tIHsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tYm90dG9tLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYm90dG9tIHsKICAgIGZsZXgtc2hyaW5rOiAxOwogICAgZmxleC13cmFwOiBub3dyYXA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby10cmFuc3BvcnQsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby10cmFuc3BvcnQgewogICAgZmxleC13cmFwOiBub3dyYXA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1ncm91cCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWdyb3VwIHsKICAgIGZsZXgtd3JhcDogbm93cmFwOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tc2Vlay13cmFwLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWJhci10aW1lbGluZSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLXNlZWstd3JhcCwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBvcmRlcjogLTE7CiAgICBmbGV4OiAxIDEgMTAwJTsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLWluLAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLW91dCwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLWdyb3VwLS1pbiwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLWdyb3VwLS1vdXQgewogICAgZmxleDogMCAxIGF1dG87Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1yYW5nZS1jb3VudCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWZyYW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWZyYW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIHBhZGRpbmc6IDNweCA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1idG4tLWluLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYnRuLS1vdXQsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1idG4tLW1hcmsgewogICAgbWluLXdpZHRoOiAzMnB4Owp9CgpAY29udGFpbmVyIChtYXgtd2lkdGg6IDkwMHB4KSB7CiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzIHsKICAgICAgICBsZWZ0OiA4cHg7CiAgICAgICAgcmlnaHQ6IDhweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICAgICAgZ2FwOiA4cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby10aW1lZ3JvdXAgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBnYXA6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXJvdy0tYm90dG9tIHsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGdhcDogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tYm90dG9tIHsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1ncm91cCB7CiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgICAgIG1pbi13aWR0aDogMDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QKICAgICAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIKICAgICAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgICAgIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgICAgICBvcmRlcjogLTE7CiAgICAgICAgZmxleDogMSAxIDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICB9Cn0KCkBjb250YWluZXIgKG1heC13aWR0aDogNjgwcHgpIHsKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMgewogICAgICAgIHBhZGRpbmc6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWJ0biB7CiAgICAgICAgcGFkZGluZzogNXB4IDhweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1udW0gewogICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tdGltZSwKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tZnJhbWUsCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICB9Cn0KCi8qIOKUgOKUgCBTZXR0aW5ncyBidXR0b24gYWN0aXZlIHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1zZXR0aW5ncy1idG4uYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgNTUlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpCiAgICApOwogICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMykgNzAlLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE4JQogICAgKTsKfQoubWpyLW1mdi1zZXR0aW5ncy1idG4uYWN0aXZlIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7Cn0KCi8qIOKUgOKUgCBDbG9zZSBidXR0b24gKHJlZCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItbWZ2IC5tanItbWZ2LWNsb3NlLWJ0biB7CiAgICBjb2xvcjogI2U4NTA1MDsKfQoubWpyLW1mdiAubWpyLW1mdi1jbG9zZS1idG46aG92ZXIgewogICAgY29sb3I6ICNmZjZiNmI7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIzMiwgODAsIDgwLCAwLjE1KTsKfQoKLyog4pSA4pSAIEVtcHR5IHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1lbXB0eSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogMTJweDsKfQoKLyog4pSA4pSAIENvbXBhcmUgbGFiZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1sYWJlbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41OCk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBwYWRkaW5nOiAycHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAyMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjRweDsKfQoKLm1qci1tZnYtbGFiZWwubGFiZWwtbGVmdCB7CiAgICBsZWZ0OiA4cHg7Cn0KLm1qci1tZnYtbGFiZWwubGFiZWwtcmlnaHQgewogICAgcmlnaHQ6IDhweDsKfQoKLyog4pSA4pSAIEFCIGRpdmlkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItbWZ2LWFiLWRpdmlkZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgd2lkdGg6IDAuNXB4OwogICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgei1pbmRleDogMTA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODgpOwogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDAgMCAwLjVweCByZ2JhKDAsIDAsIDAsIDAuNCksCiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTAwbXMgZWFzZTsKfQoKLm1qci1tZnYtYWItZGl2aWRlcjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDEycHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7Cn0KCi5tanItbWZ2LWFiLWRpdmlkZXI6aG92ZXIsCi5tanItbWZ2LWFiLWRpdmlkZXI6YWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgTUZWIEdlb21ldHJ5ICYgTGF5b3V0IENsYXNzZXMgKHJlcGxhY2VzIGlubGluZSBzdHlsZXMgaW4gRmxvYXRpbmdWaWV3ZXIuanMpCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLyogTWFpbiBNRlYgY29udGFpbmVyIGdlb21ldHJ5ICovCi5tanItbWZ2IHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogdmFyKC0tbWpyLW1mdi10b3Atb2Zmc2V0LCA2MHB4KTsKICAgIHJpZ2h0OiAyMHB4OwogICAgd2lkdGg6IDY0MHB4OwogICAgaGVpZ2h0OiAzNjBweDsKICAgIG1pbi13aWR0aDogMjIwcHg7CiAgICBtaW4taGVpZ2h0OiAxNjBweDsKICAgIC8qIEFsd2F5cyBmbGV4OyB2aXNpYmlsaXR5ICsgb3BhY2l0eSBjb250cm9sIHNob3cvaGlkZSBzbyBDU1MgdHJhbnNpdGlvbnMgd29yay4KICAgICAgIHBvaW50ZXItZXZlbnRzOm5vbmUgd2hpbGUgaGlkZGVuIHByZXZlbnRzIGFjY2lkZW50YWwgaW50ZXJhY3Rpb24uICovCiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHJlc2l6ZTogYm90aDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB6LWluZGV4OiAxMDAwMDsKICAgIC8qIEhpZGRlbiBzdGF0ZSAqLwogICAgb3BhY2l0eTogMDsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC02cHgpIHNjYWxlKDAuOTgpOwogICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIHJpZ2h0OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMThzIGVhc2Utb3V0LAogICAgICAgIHRyYW5zZm9ybSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB2aXNpYmlsaXR5IDBzIGxpbmVhciAwLjE4czsKfQoKLm1qci1tZnYubWpyLW1mdi0tcmVzaXppbmcgewogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItbWZ2LmlzLXZpc2libGUgewogICAgb3BhY2l0eTogMTsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgxKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB0cmFuc2Zvcm0gMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdmlzaWJpbGl0eSAwcyBsaW5lYXIgMHM7Cn0KCi8qIE1lZGlhIGVsZW1lbnRzIChpbWcvdmlkZW8pIHNpemluZyB2YXJpYW50cyAqLwoubWpyLW1mdi1tZWRpYSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICBvYmplY3QtcG9zaXRpb246IGNlbnRlcjsKfQoKLm1qci1tZnYtbWVkaWEtLWZpdC1oZWlnaHQgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIG9iamVjdC1wb3NpdGlvbjogY2VudGVyOwp9CgoubWpyLW1mdi1tZWRpYS0tZmlsbCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgb2JqZWN0LXBvc2l0aW9uOiBjZW50ZXI7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLyogQXVkaW8gY2FyZCBpbnNpZGUgTUZWICovCi5tanItbWZ2LWF1ZGlvLWNhcmQgewogICAgd2lkdGg6IG1pbig5MiUsIDU2MHB4KTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE2MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKSk7CiAgICBib3gtc2hhZG93OiAwIDZweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItbWZ2LWF1ZGlvLWhlYWQgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZnYtYXVkaW8taWNvbiB7CiAgICBjb2xvcjogdmFyKC0tbWpyLWJhZGdlLWF1ZGlvLCAjZmY5ODAwKTsKICAgIG9wYWNpdHk6IDAuOTU7Cn0KCi5tanItbWZ2LWF1ZGlvLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLW1mdi1hdWRpby1wbGF5ZXIgewogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItbWZ2LXNpZGUtcGFuZWwgLm1qci1tZnYtYXVkaW8tY2FyZCwKLm1qci1tZnYtYWItbGF5ZXIgLm1qci1tZnYtYXVkaW8tY2FyZCwKLm1qci1tZnYtZ3JpZC1jZWxsIC5tanItbWZ2LWF1ZGlvLWNhcmQgewogICAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpOwp9CgovKiBWaWRlbyBlbGVtZW50IHNwZWNpZmljIHN0eWxlcyAqLwoubWpyLW1mdi1tZWRpYS12aWRlbyB7CiAgICAvKiBJbmhlcml0cyBmcm9tIC5tanItbWZ2LW1lZGlhIG9yIC5tanItbWZ2LW1lZGlhLS1maWxsICovCn0KCi8qIE5vZGUgU3RyZWFtIOKAlCBjdXJyZW50bHktc3RyZWFtZWQgbm9kZSBiYWRnZSAodG9wLWxlZnQgb2YgY29udGVudCBhcmVhLAogICBmb2xsb3dpbmcgdGhlIHNhbWUgb3ZlcmxheSBwYXR0ZXJuIGFzIC5tanItbWZ2LWdlbmluZm8pLiAqLwoubWpyLW1mdi1ub2RlLW92ZXJsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA4cHg7CiAgICBsZWZ0OiA4cHg7CiAgICB6LWluZGV4OiAxMjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgY29sb3I6ICNlNmYzZmY7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMjAsIDE3MCwgMjQwLCAwLjQ1KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDE2cHgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQovKiBHZW4gaW5mbyBvdmVybGF5IOKAlCBhbGwgbW9kZXMgc2hhcmUgYmFzZSBsYXlvdXQgKi8KLm1qci1tZnYtZ2VuaW5mbywKLm1qci1tZnYtZ2VuaW5mby1hLAoubWpyLW1mdi1nZW5pbmZvLWIgewogICAgZGlzcGxheTogbm9uZTsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDhweDsKICAgIHJpZ2h0OiA4cHg7CiAgICBib3R0b206IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42NSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbWF4LWhlaWdodDogNDAlOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7Cn0KCi8qIEtlZXAgR2VuIEluZm8gYWJvdmUgY3VzdG9tIHNpbXBsZS1wbGF5ZXIgY29udHJvbHMgd2hlbiBwcmVzZW50LiAqLwoubWpyLW1mdi1nZW5pbmZvLm1qci1tZnYtZ2VuaW5mby0tYWJvdmUtcGxheWVyLAoubWpyLW1mdi1nZW5pbmZvLWEubWpyLW1mdi1nZW5pbmZvLS1hYm92ZS1wbGF5ZXIsCi5tanItbWZ2LWdlbmluZm8tYi5tanItbWZ2LWdlbmluZm8tLWFib3ZlLXBsYXllciB7CiAgICB0b3A6IDhweDsKICAgIGJvdHRvbTogYXV0bzsKICAgIG1heC1oZWlnaHQ6IG1pbig0NSUsIGNhbGMoMTAwJSAtIDEyNHB4KSk7Cn0KCi8qIEZhbGxiYWNrOiB3aGVuIHNpbXBsZS1wbGF5ZXIgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBnZW5pbmZvIG92ZXJsYXksCiAgIG1vdmUgaXQgdXAgZXZlbiBpZiB0aGUgbW9kaWZpZXIgY2xhc3Mgd2FzIG5vdCBhdHRhY2hlZC4gKi8KLm1qci1tZnYtc2ltcGxlLXBsYXllciArIC5tanItbWZ2LWdlbmluZm8sCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgKyAubWpyLW1mdi1nZW5pbmZvLWEsCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgKyAubWpyLW1mdi1nZW5pbmZvLWIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBBQiBtb2RlIG92ZXJsYXlzIGFyZSBhdHRhY2hlZCBhdCBjb250YWluZXIgbGV2ZWw7IHNoaWZ0IHRoZW0gd2hlbiBBQiBsYXllcnMgdXNlIHNpbXBsZS1wbGF5ZXIuICovCi5tanItbWZ2LWFiLWNvbnRhaW5lcjpoYXMoLm1qci1tZnYtYWItbGF5ZXIgLm1qci1tZnYtc2ltcGxlLXBsYXllcikgLm1qci1tZnYtZ2VuaW5mby1hLAoubWpyLW1mdi1hYi1jb250YWluZXI6aGFzKC5tanItbWZ2LWFiLWxheWVyIC5tanItbWZ2LXNpbXBsZS1wbGF5ZXIpIC5tanItbWZ2LWdlbmluZm8tYiB7CiAgICB0b3A6IDhweDsKICAgIGJvdHRvbTogYXV0bzsKICAgIG1heC1oZWlnaHQ6IG1pbig0NSUsIGNhbGMoMTAwJSAtIDEyNHB4KSk7Cn0KCi8qIFNoYXJlZCBzdHlsZSBmb3IgYWxsIGdlbiBpbmZvIG92ZXJsYXkgdmFyaWFudHMgKi8KLm1qci1tZnYtZ2VuaW5mbyBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7IC8qIGRlZmF1bHQg4oCUIG92ZXJyaWRkZW4gcGVyIGZpZWxkIGJlbG93ICovCn0KCi8qIFBlci1maWVsZCBsYWJlbCBjb2xvcnMgKi8KLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZWM4ZmY7Cn0gLyogYmx1ZSAgIOKAlCBQcm9tcHQgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmZkNDdhOwp9IC8qIGFtYmVyICDigJQgU2VlZCAgICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdkZGE4YTsKfSAvKiBncmVlbiAg4oCUIE1vZGVsICAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcgewogICAgY29sb3I6ICNkNDhjZmY7Cn0gLyogdmlvbGV0IOKAlCBMb1JBICAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9IC8qIG9yYW5nZSDigJQgU2FtcGxlciAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjdhOWY7Cn0gLyogcGluayAgIOKAlCBTY2hlZHVsZXIgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2E5ZmZmOwp9IC8qIGluZGlnbyDigJQgQ0ZHICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfSAvKiB0ZWFsICAg4oCUIFN0ZXAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9ImdlblRpbWUiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0iZ2VuVGltZSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZTBmZjdhOwp9IC8qIGxpbWUgICDigJQgR2VuIFRpbWUgKi8KCi5tanItbWZ2LWdlbmluZm8gZGl2LAoubWpyLW1mdi1nZW5pbmZvLWEgZGl2LAoubWpyLW1mdi1nZW5pbmZvLWIgZGl2IHsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgbWFyZ2luLWJvdHRvbTogM3B4Owp9CgoubWpyLW1mdi1nZW5pbmZvIGRpdjpsYXN0LWNoaWxkLAoubWpyLW1mdi1nZW5pbmZvLWEgZGl2Omxhc3QtY2hpbGQsCi5tanItbWZ2LWdlbmluZm8tYiBkaXY6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgovKiBTaW1wbGUgbW9kZSBjb250YWluZXIgKi8KLm1qci1tZnYtc2ltcGxlLWNvbnRhaW5lciB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgovKiBBQiBtb2RlIGNvbnRhaW5lciAqLwoubWpyLW1mdi1hYi1jb250YWluZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogIzAwMDsKfQoKLyogQUIgbW9kZSBsYXllcnMgKi8KLm1qci1tZnYtYWItbGF5ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLW1mdi1hYi1sYXllci0tYiB7CiAgICAvKiBjbGlwLXBhdGggYXBwbGllZCBpbmxpbmUgZm9yIGR5bmFtaWMgZGl2aWRlciBwb3NpdGlvbiAqLwp9CgovKiBTaWRlLWJ5LXNpZGUgbW9kZSBjb250YWluZXIgKi8KLm1qci1tZnYtc2lkZS1jb250YWluZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZ2FwOiAycHg7CiAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLyogU2lkZS1ieS1zaWRlIGhhbGYgcGFuZWxzICovCi5tanItbWZ2LXNpZGUtcGFuZWwgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgYmFja2dyb3VuZDogIzBkMGQwZDsKfQoKLyogR3JpZCBjb21wYXJlICgyw5cyKSBjb250YWluZXIgKi8KLm1qci1tZnYtZ3JpZC1jb250YWluZXIgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgIGdyaWQtdGVtcGxhdGUtcm93czogMWZyIDFmcjsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZ2FwOiAycHg7CiAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLyogR3JpZCBjZWxscyAqLwoubWpyLW1mdi1ncmlkLWNlbGwgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiAjMGQwZDBkOwogICAgbWluLXdpZHRoOiAwOwogICAgbWluLWhlaWdodDogMDsKfQoKLyogR2VuIGluZm8gb3ZlcmxheXMgZm9yIGdyaWQgY2VsbHMgQyBhbmQgRCAqLwoubWpyLW1mdi1nZW5pbmZvLWMsCi5tanItbWZ2LWdlbmluZm8tZCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogOHB4OwogICAgcmlnaHQ6IDhweDsKICAgIGJvdHRvbTogOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjY1KTsKICAgIGNvbG9yOiAjZmZmOwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBtYXgtaGVpZ2h0OiA0MCU7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKfQoKLm1qci1tZnYtZ2VuaW5mby1jIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLyogUGVyLWZpZWxkIGxhYmVsIGNvbG9ycyBmb3IgQy9EIGdlbiBpbmZvIG92ZXJsYXlzICovCi5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdlYzhmZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmZDQ3YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2RkYThhOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZDQ4Y2ZmOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmN2E5ZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcgewogICAgY29sb3I6ICM3YWZmZDQ7Cn0KCi8qIEdlbiBpbmZvIGFjdGl2ZSBzdGF0ZSDigJQgYnV0dG9uIGdsb3dzIHdoZW4gYXQgbGVhc3Qgb25lIGZpZWxkIGlzIHNlbGVjdGVkICovCi5tanItbWZ2IC5tanItaWNvbi1idG4uaXMtb24gewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQsIDk1LCAxNzksIDI1NSksIDAuNTUpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMTUlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4uaXMtb3BlbiB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSA2MiUsICNmZmZmZmYgMTIlKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSg5NSwgMTc5LCAyNTUsIDAuMjgpLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNCkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0bi5pcy1vcGVuIHsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7Cn0KCi8qIEdlbiBpbmZvIGRyb3Bkb3duIHBhbmVsICovCi5tanItbWZ2LWdlbi1kcm9wZG93biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB6LWluZGV4OiAxMDAwMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5NiUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIHBhZGRpbmc6IDZweCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMTgpOwogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSksCiAgICAgICAgMCAycHggNnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd246OmJlZm9yZSB7CiAgICBjb250ZW50OiAiR0VOIElORk8iOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDlweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC44cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIHBhZGRpbmc6IDJweCAxMHB4IDZweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMSk7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi5pcy12aXNpYmxlIHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24tcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTAwbXMgZWFzZTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24tcm93OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNyk7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi1yb3cgaW5wdXRbdHlwZT0iY2hlY2tib3giXSB7CiAgICB3aWR0aDogMTNweDsKICAgIGhlaWdodDogMTNweDsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKfQoKLyogVHJhbnNmb3JtIGZvciBwYW4vem9vbSAtIGFwcGxpZWQgaW5saW5lIGZvciBkeW5hbWljIHZhbHVlcyAqLwoubWpyLW1mdi1tZWRpYS0tdHJhbnNmb3JtIHsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsKfQoKLyogQ3Vyc29yIGZlZWRiYWNrIGZvciBwYW4vem9vbSBpbnRlcmFjdGlvbnMgKi8KLm1qci1tZnYtY29udGVudC0tZ3JhYiB7CiAgICBjdXJzb3I6IGdyYWI7Cn0KCi5tanItbWZ2LWNvbnRlbnQtLWdyYWJiaW5nIHsKICAgIGN1cnNvcjogZ3JhYmJpbmc7Cn0KCi8qIFNpZGViYXIgdGFiIGJ1dHRvbjogYWxsb3cgMi1saW5lIGxhYmVsIHZpYSBcbiBpbiBsYWJlbCBzdHJpbmcgKi8KLm1ham9vci1hc3NldHMtdGFiLWJ1dHRvbiAuc2lkZS1iYXItYnV0dG9uLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZTsKfQoKLyogQm90dG9tLXBhbmVsIGdlbmVyYXRlZCBmZWVkOiBjb21wYWN0IGNhcmRzIHdpdGggb25seSB0aGUgZ2VuZXJhdGlvbi10aW1lIHBpbGwgKi8KLm1qci1ib3R0b20tZmVlZCB7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLWhlaWdodDogMDsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzJmMzU0MCkgNzAlLCAjN2Y4ZWEzIDMwJSkKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODglLCAjMDAwIDEyJSk7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIsCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iLAoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzJmMzU0MCkgNzAlLCAjN2Y4ZWEzIDMwJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci10cmFjaywKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDg4JSwgIzAwMCAxMiUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkIHsKICAgIGdhcDogNnB4ICFpbXBvcnRhbnQ7CiAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heChtaW4oMTAwJSwgMTMycHgpLCAxZnIpKSAhaW1wb3J0YW50OwogICAgbWluLWhlaWdodDogMDsKICAgIGhlaWdodDogYXV0bzsKICAgIGFsaWduLWNvbnRlbnQ6IHN0YXJ0Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZCwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmQgewogICAgYm9yZGVyLXJhZGl1czogMTJweCAhaW1wb3J0YW50OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsICMwMDAgOCUpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yMikgIWltcG9ydGFudDsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZDpob3ZlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmQ6aG92ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiAwIDEwcHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjgpICFpbXBvcnRhbnQ7CgogICAgLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmQuaXMtc2VsZWN0ZWQgewogICAgICAgIGJveC1zaGFkb3c6CiAgICAgICAgICAgIDAgMCAwIDNweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA4MCUsIHZhcigtLWNvbnRlbnQtZmcpKSwKICAgICAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAgICAgMCAxMHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjI4KSAhaW1wb3J0YW50OwogICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpICFpbXBvcnRhbnQ7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKICAgIH0KfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gewogICAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iIHsKICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7CiAgICBpc29sYXRpb246IGlzb2xhdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAtMTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDE0MG1zIGVhc2UsCiAgICAgICAgb3BhY2l0eSAxNDBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDVweCwgNXB4KSBzY2FsZSgwLjk4NSk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMyMDI0MmIpIDg0JSwgIzAwMCAxNiUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE2KTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTBweCwgMTBweCkgc2NhbGUoMC45Nyk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNiksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4MiUsICMwMDAgMTglKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjJweCByZ2JhKDAsIDAsIDAsIDAuMTQpOwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmJlZm9yZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg2cHgsIDZweCkgc2NhbGUoMC45ODUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YWZ0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMnB4LCAxMnB4KSBzY2FsZSgwLjk3KTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMC45NSAvIDEgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA3MiUsICMwMDAgMjglKSAhaW1wb3J0YW50Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWItcGxheSB7CiAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgY2lyY2xlIGF0IGNlbnRlciwKICAgICAgICByZ2JhKDAsIDAsIDAsIDAuMTgpLAogICAgICAgIHJnYmEoMCwgMCwgMCwgMC4wNCkgMzglLAogICAgICAgIHRyYW5zcGFyZW50IDcwJQogICAgKTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLWV4dCwKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXJhdGluZywKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXRhZ3MgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkyKTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCBsZWZ0Owp9CgovKiDilIDilIAgRmVlZCBjYXJkIGluZm86IGRlZmF1bHQgaGlkZGVuLCB0b2dnbGVkIHZpYSBtanItZmVlZC1zaG93LSogY2xhc3NlcyBvbiAubWpyLWdyaWQg4pSA4pSAICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogNHB4IDZweCAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctaW5mbyAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGZpbGVuYW1lICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWZpbGVuYW1lIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWZpbGVuYW1lIC5tanItY2FyZC1maWxlbmFtZSB7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGRpbWVuc2lvbnMgLyBkdXJhdGlvbiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItbWV0YS1yZXMsCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWR1cmF0aW9uIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRpbWVuc2lvbnMgLm1qci1tZXRhLXJlcywKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kaW1lbnNpb25zIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKfQoKLyogRmVlZCBkYXRlL3RpbWUgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtZGF0ZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtdGltZS12YWwgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGF0ZSAubWpyLW1ldGEtZGF0ZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kYXRlIC5tanItbWV0YS10aW1lLXZhbCB7CiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKfQoKLyogRmVlZCBnZW5lcmF0aW9uIHRpbWUgYmFkZ2UgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtZ2VudGltZSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1nZW50aW1lIC5tanItbWV0YS1nZW50aW1lIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgd29ya2Zsb3cgZG90ICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWRvdC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRvdCAubWpyLWNhcmQtZG90LXdyYXBwZXIgewogICAgZGlzcGxheTogaW5saW5lLWZsZXggIWltcG9ydGFudDsKfQoKLyogRmVlZCBiYWRnZXMgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLWV4dCB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1iYWRnZXMtZXh0IC5tanItYmFkZ2UtZXh0IHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXJhdGluZyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1iYWRnZXMtcmF0aW5nIC5tanItYmFkZ2UtcmF0aW5nIHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXRhZ3MgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLXRhZ3MgLm1qci1iYWRnZS10YWdzIHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLyogRmVlZCBtZXRhIHJvdyBzdHlsaW5nIOKAlCBmbGV4IGxheW91dCBzbyB2aXNpYmxlIGl0ZW1zIHN0YXkgc2VwYXJhdGVkICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93IHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKICAgIGZsZXgtd3JhcDogbm93cmFwICFpbXBvcnRhbnQ7CiAgICBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7CiAgICBnYXA6IDVweCAhaW1wb3J0YW50OwogICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMS4zICFpbXBvcnRhbnQ7CiAgICBvcGFjaXR5OiAwLjc4ICFpbXBvcnRhbnQ7CiAgICBmb250LXNpemU6IDAuOGVtICFpbXBvcnRhbnQ7CiAgICAvKiB0ZXh0LW92ZXJmbG93IGVsbGlwc2lzIGRvZXNuJ3QgYXBwbHkgb24gYSBmbGV4IGNvbnRhaW5lciBpdHNlbGYgKi8KfQovKiBFYWNoIG1ldGEgc3BhbiB0cnVuY2F0ZXMgaW5kaXZpZHVhbGx5IGlmIHRvbyBsb25nICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gc3BhbiB7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC1zaHJpbms6IDE7Cn0KLyogR2VudGltZSBiYWRnZSBhbmQgdGltZSB2YWx1ZSBzaG91bGQgc3RheSB2aXNpYmxlIChkb24ndCBzaHJpbmsgYXdheSkgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtbWV0YS1yb3cgPiAubWpyLW1ldGEtZ2VudGltZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtbWV0YS1yb3cgPiAubWpyLW1ldGEtdGltZS12YWwgewogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZ2VudGltZSAubWpyLW1ldGEtZ2VudGltZSB7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwLCAxNCwgMjAsIDAuNzQpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMCAhaW1wb3J0YW50OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE1ZW07CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk4KTsKICAgIHRleHQtc2hhZG93OgogICAgICAgIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuOSksCiAgICAgICAgMCAwIDEwcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKfQoKLyog4pSA4pSAIEF1ZGlvIC8gM0QgcGxhY2Vob2xkZXIgdGh1bWJuYWlscyBpbiB0aGUgZmVlZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi8qIEF1ZGlvIGNhcmRzIHNob3cgdGhlIHdhdmVmb3JtIHNwcml0ZTsgZ2l2ZSBpdCBhIGRpc3RpbmN0IGJhY2tncm91bmQgc28gaXQKICAgZG9lc24ndCBsb29rIGxpa2UgYSBicm9rZW4gaW1hZ2UgcGxhY2Vob2xkZXIgaW4gdGhlIGZlZWQuICovCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWtpbmQ9ImF1ZGlvIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJtcDMiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9IndhdiJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0ib2dnIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJmbGFjIl0gLm1qci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNjAlLCAjMWExZjJiIDQwJSkgIWltcG9ydGFudDsKfQoKLyogM0QgbW9kZWwgY2FyZHMgdXNlIGFuIGljb24gcGxhY2Vob2xkZXIg4oCUIGFkZCBhIHN1YnRsZSBncmFkaWVudCBzbyB0aGV5IHJlYWQKICAgYXMgaW50ZW50aW9uYWwgcmF0aGVyIHRoYW4gbWlzc2luZy4gKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanIta2luZD0ibW9kZWwzZCJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZ2xiIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJnbHRmIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJvYmoiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9ImZieCJdIC5tanItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDUwJSwgIzBkMTExNyA1MCUpICFpbXBvcnRhbnQ7Cn0KCi8qIOKUgOKUgCBGZWVkIGdyb3VwIGJ1dHRvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5tanItYm90dG9tLWZlZWQgLm1qci1mZWVkLWdyb3VwLWJ1dHRvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDM0cHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwLCAxNCwgMjAsIDAuNzQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWZlZWQtZ3JvdXAtYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDI0LCAzNCwgMC45KTsKfQoKLm1qci1mZWVkLWdyb3VwLWJ1dHRvbi1pY29uIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1mZWVkLWdyb3VwLWJ1dHRvbi1jb3VudCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi8qIOKUgOKUgCBGZWVkIGdyb3VwIHBvcG92ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgoubWpyLWZlZWQtZ3JvdXAtcG9wb3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvciwgIzNhM2EzYSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZywgOHB4KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLXRpdGxlIHsKICAgIHBhZGRpbmc6IDhweCAxMHB4IDRweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkIHsKICAgIHBhZGRpbmc6IDRweCA4cHggMTBweDsKICAgIG1heC1oZWlnaHQ6IDM2MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICBzY3JvbGxiYXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMmYzNTQwKSA3MCUsICM3ZjhlYTMgMzAlKQogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4OCUsICMwMDAgMTIlKTsKfQoKLm1qci1mZWVkLWdyb3VwLWJ1dHRvbi1pY29uLAoubWpyLWZlZWQtZ3JvdXAtYnV0dG9uLWNvdW50IHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWZlZWQtZ3JvdXAtbWVtYmVyLWNhcmQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWZlZWQtZ3JvdXAtbWVtYmVyLWNhcmQgLm1qci10aHVtYiB7CiAgICBhc3BlY3QtcmF0aW86IDEgLyAxICFpbXBvcnRhbnQ7Cn0KCi5tanItZmVlZC1ncm91cC1tZW1iZXItY2FyZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAzNHB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDExOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIG1pbi13aWR0aDogMjhweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTYpOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE4LCAyNCwgMzQsIDAuOSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b24gPiAqIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWZpbG1zdHJpcDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDRweDsKICAgIGhlaWdodDogNHB4Owp9CgoubWpyLWZpbG1zdHJpcDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItZmlsbXN0cmlwOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7Cn0KCi5tanItZmlsbXN0cmlwOmhvdmVyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLyog4pSA4pSAIER1cGxpY2F0ZSBzdGFjayBidXR0b24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi8qIFNob3dzIG9uIHRoZSBwcmltYXJ5IGNhcmQgd2hlbiBzYW1lLWZpbGVuYW1lIGR1cGxpY2F0ZXMgZXhpc3QuICAgICAgICAgICAgICovCi8qIFBvc2l0aW9uZWQgYXQgYm90dG9tLXJpZ2h0IHRvIG5vdCBvdmVybGFwIHRoZSBzdGFjay1ncm91cCBidXR0b24gKHRvcC1yaWdodCkuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stYnV0dG9uIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogMzBweDsKICAgIHJpZ2h0OiA2cHg7CiAgICB6LWluZGV4OiAxMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBtaW4td2lkdGg6IDI4cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAxODAsIDAsIDAuMzgpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDMwLCAxOCwgMCwgMC44Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIwMCwgNjAsIDAuOTYpOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zMik7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDAuMTVzLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNTAsIDMwLCAwLCAwLjk0KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDE4MCwgMCwgMC42KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWR1cC1zdGFjay1idXR0b24gPiAqIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZHVwLXN0YWNrZWQ9InRydWUiXSAubWpyLWR1cC1zdGFjay1idXR0b24gewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjMyKSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyNTUsIDE4MCwgMCwgMC4yKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci1mZWVkLWdyb3VwLWJ1dHRvbiB7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpLAogICAgICAgIDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWR1cC1zdGFja2VkPSJ0cnVlIl06aG92ZXIgewogICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7Cn0KCi8qIOKUgOKUgCBWaXN1YWwgc3RhY2tpbmcgZWZmZWN0IOKAlCBsYXllcmVkIGNhcmRzIGJlaGluZCB0aGUgbWFpbiBjYXJkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwovKiBDcmVhdGVzIHBzZXVkby1lbGVtZW50ICJjYXJkcyIgb2Zmc2V0IGJlaGluZCB0aGUgcHJpbWFyeSBjYXJkIHRvIHZpc3VhbGx5ICAgICovCi8qIGNvbW11bmljYXRlIHRoYXQgdGhpcyBjYXJkIHJlcHJlc2VudHMgYSBncm91cCBvZiBtdWx0aXBsZSBpbWFnZXMuICAgICAgICAgICAgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTo6YmVmb3JlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzFhMWEyZSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAtMTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDE4MG1zIGVhc2UsCiAgICAgICAgb3BhY2l0eSAxODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmJlZm9yZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgzcHgsIDNweCkgcm90YXRlKDFkZWcpOwogICAgb3BhY2l0eTogMC40NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg2cHgsIDZweCkgcm90YXRlKDIuMmRlZyk7CiAgICBvcGFjaXR5OiAwLjI1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXI6OmJlZm9yZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg0cHgsIDRweCkgcm90YXRlKDEuNWRlZyk7CiAgICBvcGFjaXR5OiAwLjU1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXI6OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDhweCwgOHB4KSByb3RhdGUoM2RlZyk7CiAgICBvcGFjaXR5OiAwLjM1Owp9CgoubWpyLXN0YWNrLWdyb3VwLXBvcG92ZXIgewogICAgd2lkdGg6IG1pbig0NDBweCwgOTJ2dyk7Cn0KCi5tanItc3RhY2stZ3JvdXAtbWVtYmVyLWNhcmQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXN0YWNrLWdyb3VwLW1lbWJlci1jYXJkIC5tanItdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAxIC8gMSAhaW1wb3J0YW50Owp9CgoubWpyLXN0YWNrLWdyb3VwLW1lbWJlci1jYXJkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIExpZ2h0IG1vZGUgb3ZlcnJpZGVzIChDb21meVVJIHYxLjQyKyBpbXByb3ZlZCBsaWdodCB0aGVtZSkKICogVXNlcyBDb21meVVJIGRhdGEtdGhlbWUgYXR0cmlidXRlIHdoZW4gc2V0LCB3aXRoCiAqIHByZWZlcnMtY29sb3Itc2NoZW1lIGFzIGEgZmFsbGJhY2sgZm9yIG9sZGVyIHZlcnNpb25zLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qIENvbWZ5VUkgc2V0cyBkYXRhLXRoZW1lPSJsaWdodCIgb24gPGh0bWw+IG9yIDxib2R5PiAqLwo6aXMoW2RhdGEtdGhlbWU9ImxpZ2h0Il0sIFtkYXRhLWNvbG9yLXNjaGVtZT0ibGlnaHQiXSkgLm1qci1hc3NldHMtbWFuYWdlciwKOmlzKFtkYXRhLXRoZW1lPSJsaWdodCJdLCBbZGF0YS1jb2xvci1zY2hlbWU9ImxpZ2h0Il0pIC5tanItcG9wb3ZlciB7CiAgICAtLW1qci1zdXJmYWNlLTA6IHZhcigtLWludGVyZmFjZS1wYW5lbC1zdXJmYWNlLCAjZjBmMGYwKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgI2ZhZmFmYSk7CiAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZThlOGU4KTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAjZmZmZmZmKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWRlZmF1bHQsIHJnYmEoMCwgMCwgMCwgMC4xNCkpOwogICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHJnYmEoMCwgMCwgMCwgMC41NSkpOwogICAgLS1tanItY2FyZC1ob3Zlci1jb2xvcjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLWhvdmVyLXN1cmZhY2UsICNlMGUwZTApOwp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkgewogICAgLyogRmFsbGJhY2s6IG9ubHkgYXBwbHkgaWYgQ29tZnlVSSBoYXNuJ3Qgc2V0IGFuIGV4cGxpY2l0IGRhdGEtdGhlbWUgKi8KICAgIC5tanItYXNzZXRzLW1hbmFnZXI6bm90KFtkYXRhLXRoZW1lLWFwcGxpZWRdKSwKICAgIC5tanItcG9wb3Zlcjpub3QoW2RhdGEtdGhlbWUtYXBwbGllZF0pIHsKICAgICAgICAtLW1qci1zdXJmYWNlLTA6IHZhcigtLWludGVyZmFjZS1wYW5lbC1zdXJmYWNlLCAjZjBmMGYwKTsKICAgICAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsICNmYWZhZmEpOwogICAgICAgIC0tbWpyLXN1cmZhY2UtMjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLWhvdmVyLXN1cmZhY2UsICNlOGU4ZTgpOwogICAgICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAjZmZmZmZmKTsKICAgICAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCByZ2JhKDAsIDAsIDAsIDAuMTQpKTsKICAgICAgICAtLW1qci1tdXRlZDogdmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCwgcmdiYSgwLCAwLCAwLCAwLjU1KSk7CiAgICAgICAgLS1tanItY2FyZC1ob3Zlci1jb2xvcjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLWhvdmVyLXN1cmZhY2UsICNlMGUwZTApOwogICAgfQp9CgovKiDilIDilIDilIAgU2tlbGV0b24gbG9hZGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5tanItY2FyZC1za2VsZXRvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsICMzYTNhM2EpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcsIDhweCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgLyogTWF0Y2ggLm1qci10aHVtYiBhc3BlY3QgcmF0aW8gc28gc2tlbGV0b25zIGhhdmUgdGhlIHNhbWUgZm9vdHByaW50IGFzIHJlYWwgY2FyZHMuICovCiAgICBhc3BlY3QtcmF0aW86IDEgLyAxOwp9CgovKiBTaGltbWVyIHN3ZWVwICovCi5tanItY2FyZC1za2VsZXRvbjo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICA5MGRlZywKICAgICAgICB0cmFuc3BhcmVudCAwJSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzNhM2EzYSkgODAlLCB0cmFuc3BhcmVudCkgNTAlLAogICAgICAgIHRyYW5zcGFyZW50IDEwMCUKICAgICk7CiAgICBhbmltYXRpb246IG1qci1zaGltbWVyIDEuNHMgZWFzZS1pbi1vdXQgaW5maW5pdGU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOwp9CgpAa2V5ZnJhbWVzIG1qci1zaGltbWVyIHsKICAgIGZyb20gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgfQp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci1jYXJkLXNrZWxldG9uOjphZnRlciB7CiAgICAgICAgYW5pbWF0aW9uOiBub25lOwogICAgfQp9CgovKiDilIDilIDilIAgUmVzcG9uc2l2ZSBzdW1tYXJ5IGJhciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi8qCiAqIEVuYWJsZSBjb250YWluZXIgcXVlcmllcyBvbiB0aGUgc3VtbWFyeSBiYXIgc28gY2hpbGRyZW4gY2FuIHJlc3BvbmQgdG8gaXRzCiAqIGFjdHVhbCByZW5kZXJlZCB3aWR0aCAoZS5nLiB3aGVuIHRoZSBwYW5lbCBpcyBkb2NrZWQgaW4gYSBuYXJyb3cgc2lkZWJhcikuCiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeSB7CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7CiAgICBjb250YWluZXItbmFtZTogbWpyLXN1bW1hcnktYmFyOwp9CgovKiBCZWxvdyB+MzgwIHB4OiBoaWRlIHRoZSBwaWxscy9yaWdodCBzZWN0aW9uIHRvIHByZXZlbnQgb3ZlcmZsb3cuICovCkBjb250YWluZXIgbWpyLXN1bW1hcnktYmFyIChtYXgtd2lkdGg6IDM4MHB4KSB7CiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS1yaWdodCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KICAgIC5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXRleHQgewogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgIH0KfQo=", "" + 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();
@@ -442,7 +443,7 @@ function Pr({ enabled: e = !0 } = {}) {
}
}, document.head.appendChild(n), n.onload = () => {
try {
- document.documentElement.dataset.mjrThemeComfy = "1", Nr();
+ document.documentElement.dataset.mjrThemeComfy = "1", Pr();
} catch (e) {
console.debug?.(e);
}
@@ -451,30 +452,30 @@ function Pr({ enabled: e = !0 } = {}) {
console.warn("Majoor: failed to load Comfy theme CSS", e);
}
}
-Nr();
+Pr();
//#endregion
//#region ui/features/grid/gridApi.ts
-function Fr() {
+function Ir() {
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: 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 Ir(e) {
+function Lr(e) {
if (!e) return;
- Fr();
+ Ir();
let t = (t, n) => {
n ? e.classList.add(t) : e.classList.remove(t);
};
- t("mjr-show-filename", I.GRID_SHOW_DETAILS_FILENAME), t("mjr-show-dimensions", I.GRID_SHOW_DETAILS_DIMENSIONS), t("mjr-show-date", I.GRID_SHOW_DETAILS_DATE), t("mjr-show-gentime", I.GRID_SHOW_DETAILS_GENTIME), t("mjr-show-hover-info", I.GRID_SHOW_HOVER_INFO), t("mjr-show-dot", I.GRID_SHOW_WORKFLOW_DOT), t("mjr-show-badges-ext", I.GRID_SHOW_BADGES_EXTENSION), t("mjr-show-badges-rating", I.GRID_SHOW_BADGES_RATING), t("mjr-show-badges-tags", I.GRID_SHOW_BADGES_TAGS), t("mjr-show-details", I.GRID_SHOW_DETAILS), e.style.setProperty("--mjr-grid-min-size", `${I.GRID_MIN_SIZE}px`), e.style.setProperty("--mjr-grid-gap", `${I.GRID_GAP}px`), e.style.setProperty("--mjr-star-active", I.BADGE_STAR_COLOR), e.style.setProperty("--mjr-badge-image", I.BADGE_IMAGE_COLOR), e.style.setProperty("--mjr-badge-video", I.BADGE_VIDEO_COLOR), e.style.setProperty("--mjr-badge-audio", I.BADGE_AUDIO_COLOR), e.style.setProperty("--mjr-badge-model3d", I.BADGE_MODEL3D_COLOR), e.style.setProperty("--mjr-badge-duplicate-alert", I.BADGE_DUPLICATE_ALERT_COLOR), e.style.setProperty("--mjr-card-hover-color", I.UI_CARD_HOVER_COLOR), e.style.setProperty("--mjr-card-selection-color", I.UI_CARD_SELECTION_COLOR), e.style.setProperty("--mjr-rating-color", I.UI_RATING_COLOR), e.style.setProperty("--mjr-tag-color", I.UI_TAG_COLOR);
+ 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);
}
-function Lr(e, { applySettingsClasses: t = !0 } = {}) {
+function Rr(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) {
- Ir(e);
+ Lr(e);
let t = () => {
requestAnimationFrame(() => {
- Ir(e);
+ Lr(e);
});
};
try {
@@ -492,7 +493,7 @@ function Lr(e, { applySettingsClasses: t = !0 } = {}) {
}
return e;
}
-function Rr(e, t, ...n) {
+function zr(e, t, ...n) {
let r = {
_mjrCaptureAnchor: "captureAnchor",
_mjrDispose: "dispose",
@@ -515,78 +516,78 @@ function Rr(e, t, ...n) {
console.debug?.(e);
}
}
-function zr(e, t = {}, n = {}) {
- return Rr(e, "_mjrHydrateFromSnapshot", t, n) ?? !1;
+function Br(e, t = {}, n = {}) {
+ return zr(e, "_mjrHydrateFromSnapshot", t, n) ?? !1;
}
-function Br(e, t = "*", n = {}) {
- return Rr(e, "_mjrLoadAssets", t, n) ?? Promise.resolve({
+function Vr(e, t = "*", n = {}) {
+ return zr(e, "_mjrLoadAssets", t, n) ?? Promise.resolve({
ok: !1,
error: "Grid API unavailable"
});
}
-function Vr(e, t, n = {}) {
- return Rr(e, "_mjrLoadAssetsFromList", t, n) ?? Promise.resolve({
+function Hr(e, t, n = {}) {
+ return zr(e, "_mjrLoadAssetsFromList", t, n) ?? Promise.resolve({
ok: !1,
error: "Grid API unavailable"
});
}
-function Hr(e) {
- return Rr(e, "_mjrPrepareForScopeSwitch");
-}
function Ur(e) {
+ return zr(e, "_mjrPrepareForScopeSwitch");
+}
+function Wr(e) {
try {
e?._mjrSettingsChangedCleanup?.();
} catch (e) {
console.debug?.(e);
}
- return Rr(e, "_mjrDispose");
-}
-function Wr(e) {
- return Rr(e, "_mjrRefreshGrid");
+ return zr(e, "_mjrDispose");
}
function Gr(e) {
- return Rr(e, "_mjrCaptureAnchor") ?? null;
+ return zr(e, "_mjrRefreshGrid");
}
-function Kr(e, t) {
- return Rr(e, "_mjrRestoreAnchor", t);
+function Kr(e) {
+ return zr(e, "_mjrCaptureAnchor") ?? null;
}
-function qr(e, t, n = {}) {
- return Rr(e, "_mjrRemoveAssets", t, n) ?? {
+function qr(e, t) {
+ return zr(e, "_mjrRestoreAnchor", t);
+}
+function Jr(e, t, n = {}) {
+ return zr(e, "_mjrRemoveAssets", t, n) ?? {
ok: !1,
removed: 0,
selectedIds: []
};
}
-function Jr(e, t) {
- return !!Rr(e, "_mjrUpsertAsset", t);
-}
function Yr(e, t) {
- return !!Rr(e, "_mjrUpsertAssetNow", t);
+ return !!zr(e, "_mjrUpsertAsset", t);
+}
+function Xr(e, t) {
+ return !!zr(e, "_mjrUpsertAssetNow", t);
}
//#endregion
//#region ui/features/collections/contextmenu/addToCollectionMenuState.ts
-var Xr = Dn({
+var Zr = Dn({
open: !1,
x: 0,
y: 0,
assets: []
});
-function Zr() {
+function Qr() {
try {
window.dispatchEvent(new CustomEvent("mjr-close-all-menus"));
} catch (e) {
console.debug?.(e);
}
}
-function Qr({ x: e = 0, y: t = 0, assets: n = [] } = {}) {
- Zr(), Xr.open = Array.isArray(n) && n.length > 0, Xr.x = Number(e) || 0, Xr.y = Number(t) || 0, Xr.assets = Array.isArray(n) ? [...n] : [];
+function $r({ x: e = 0, y: t = 0, assets: n = [] } = {}) {
+ Qr(), Zr.open = Array.isArray(n) && n.length > 0, Zr.x = Number(e) || 0, Zr.y = Number(t) || 0, Zr.assets = Array.isArray(n) ? [...n] : [];
}
-function $r() {
- Xr.open = !1, Xr.x = 0, Xr.y = 0, Xr.assets = [];
+function ei() {
+ Zr.open = !1, Zr.x = 0, Zr.y = 0, Zr.assets = [];
}
//#endregion
//#region ui/features/collections/contextmenu/addToCollectionMenu.ts
-function ei(e) {
+function ti(e) {
if (!e || typeof e != "object") return null;
let t = e.filepath || e.path || e?.file_info?.filepath || "";
return t ? {
@@ -598,26 +599,26 @@ function ei(e) {
kind: e.kind || ""
} : null;
}
-async function ti({ x: e, y: t, assets: n }) {
- let i = Array.isArray(n) ? n.map(ei).filter(Boolean) : [];
- if (!i.length) {
- s(r("toast.noValidAssetsSelected", "No valid assets selected."), "warning");
+async function ni({ x: e, y: t, assets: n }) {
+ let r = Array.isArray(n) ? n.map(ti).filter(Boolean) : [];
+ if (!r.length) {
+ m(R("toast.noValidAssetsSelected", "No valid assets selected."), "warning");
return;
}
- Qr({
+ $r({
x: Number(e) || 0,
y: Number(t) || 0,
- assets: i
+ assets: r
});
}
//#endregion
//#region ui/utils/deleteGuard.ts
-async function ni(e, t) {
- return I.DELETE_CONFIRMATION ? !!await gt(e > 1 ? r("dialog.deleteSelectedFiles", "Delete {count} selected files?", { count: e }) : r("dialog.deleteSingleFile", "Delete \"{label}\"?", { label: String(t || r("label.thisFile", "this file")) }), r("dialog.confirmDeleteTitle", "Majoor: Confirm delete")) : !0;
+async function ri(e, t) {
+ return z.DELETE_CONFIRMATION ? !!await Bt(e > 1 ? R("dialog.deleteSelectedFiles", "Delete {count} selected files?", { count: e }) : R("dialog.deleteSingleFile", "Delete \"{label}\"?", { label: String(t || R("label.thisFile", "this file")) }), R("dialog.confirmDeleteTitle", "Majoor: Confirm delete")) : !0;
}
//#endregion
//#region ui/utils/filenames.ts
-var ri = new Set([
+var ii = new Set([
"CON",
"PRN",
"AUX",
@@ -640,17 +641,17 @@ var ri = new Set([
"LPT7",
"LPT8",
"LPT9"
-]), ii = 255;
-function ai(e) {
+]), ai = 255;
+function oi(e) {
try {
let t = String(e ?? "").trim();
if (!t) return {
valid: !1,
reason: "Filename cannot be empty"
};
- if (t.length > ii) return {
+ if (t.length > ai) return {
valid: !1,
- reason: `Filename is too long (max ${ii} characters)`
+ reason: `Filename is too long (max ${ai} characters)`
};
if (t.includes("/") || t.includes("\\")) return {
valid: !1,
@@ -673,7 +674,7 @@ function ai(e) {
reason: "Filename cannot end with a dot or space"
};
let n = t.split(".")[0].toUpperCase();
- return ri.has(n) ? {
+ return ii.has(n) ? {
valid: !1,
reason: "Filename uses a reserved Windows name"
} : {
@@ -687,15 +688,15 @@ function ai(e) {
};
}
}
-function oi(e) {
+function si(e) {
try {
return String(e ?? "").trim();
} catch {
return "";
}
}
-function si(e) {
- let t = oi(e);
+function ci(e) {
+ let t = si(e);
if (!t) return {
stem: "",
ext: ""
@@ -709,17 +710,17 @@ function si(e) {
ext: t.slice(n)
};
}
-function ci(e, t) {
- let n = oi(e);
+function li(e, t) {
+ let n = si(e);
if (!n) return "";
- let r = si(t);
- return !si(n).ext && r.ext ? `${n}${r.ext}` : n;
+ let r = ci(t);
+ return !ci(n).ext && r.ext ? `${n}${r.ext}` : n;
}
//#endregion
//#region ui/features/contextmenu/ratingUpdater.ts
-var li = 350, ui = /* @__PURE__ */ new Map();
-function di(e) {
- let t = ui.get(e);
+var ui = 350, di = /* @__PURE__ */ new Map();
+function fi(e) {
+ let t = di.get(e);
if (t) {
try {
clearTimeout(t.timer);
@@ -731,39 +732,39 @@ function di(e) {
} catch (e) {
console.debug?.(e);
}
- ui.delete(e);
+ di.delete(e);
}
}
-function fi(e) {
- e && di(String(e));
+function pi(e) {
+ e && fi(String(e));
}
-function pi() {
- for (let e of Array.from(ui.keys())) fi(e);
+function mi() {
+ for (let e of Array.from(di.keys())) pi(e);
}
-function mi(e, t, { onSuccess: n, onFailure: r, successMessage: i = null, errorMessage: a = null, warnPrefix: o = "[RatingUpdater]" } = {}) {
+function hi(e, t, { onSuccess: n, onFailure: r, successMessage: i = null, errorMessage: a = null, warnPrefix: o = "[RatingUpdater]" } = {}) {
if (!e) return;
- fi(e);
- let c = new AbortController(), l = setTimeout(async () => {
- ui.delete(String(e));
+ pi(e);
+ let s = new AbortController(), c = setTimeout(async () => {
+ di.delete(String(e));
try {
- let o = await we(e, t, { signal: c.signal });
+ let o = await O(e, t, { signal: s.signal });
if (!o?.ok) {
- s(o?.error || a || "Failed to update rating", "error"), r?.(o);
+ m(o?.error || a || "Failed to update rating", "error"), r?.(o);
return;
}
- i && s(i, "success", 1500), n?.(o);
+ i && m(i, "success", 1500), n?.(o);
} catch (e) {
- at(e, o, { showToast: !0 }), r?.(e);
+ st(e, o, { showToast: !0 }), r?.(e);
}
- }, li);
- ui.set(String(e), {
- timer: l,
- controller: c
+ }, ui);
+ di.set(String(e), {
+ timer: c,
+ controller: s
});
}
//#endregion
//#region ui/features/contextmenu/viewerContextMenuState.ts
-function hi() {
+function gi() {
return {
open: !1,
x: 0,
@@ -772,11 +773,11 @@ function hi() {
title: ""
};
}
-var Z = Dn({
+var _i = Dn({
portalOwnerId: "",
mountedPortalIds: [],
- main: hi(),
- submenu: hi(),
+ main: gi(),
+ submenu: gi(),
tags: {
open: !1,
x: 0,
@@ -784,52 +785,52 @@ var Z = Dn({
asset: null,
onChanged: null
}
-}), gi = 1;
-function _i(e) {
+}), vi = 1;
+function yi(e) {
e && (e.open = !1, e.x = 0, e.y = 0, e.items = [], e.title = "");
}
-function vi(e = "") {
+function bi(e = "") {
try {
window.dispatchEvent(new CustomEvent("mjr-close-all-menus", { detail: { source: String(e || "") } }));
} catch (e) {
console.debug?.(e);
}
}
-function yi() {
- let e = `mjr-viewer-context-menu-portal-${gi++}`;
- return Z.mountedPortalIds.push(e), Z.portalOwnerId ||= e, e;
+function xi() {
+ let e = `mjr-viewer-context-menu-portal-${vi++}`;
+ return _i.mountedPortalIds.push(e), _i.portalOwnerId ||= e, e;
}
-function bi(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 Si(e) {
+ let t = _i.mountedPortalIds.filter((t) => t !== e);
+ _i.mountedPortalIds.splice(0, _i.mountedPortalIds.length, ...t), _i.portalOwnerId === e && (_i.portalOwnerId = _i.mountedPortalIds[0] || "");
}
-function xi(e) {
- return String(Z.portalOwnerId || "") === String(e || "");
-}
-function Si({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) {
- vi("viewer"), Di(), Ti(), 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 Ci() {
- _i(Z.main), Ti();
+function Ci(e) {
+ return String(_i.portalOwnerId || "") === String(e || "");
}
function wi({ 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 || "");
+ bi("viewer"), ki(), Di(), _i.main.open = !0, _i.main.x = Number(e) || 0, _i.main.y = Number(t) || 0, _i.main.items = Array.isArray(n) ? n.filter(Boolean) : [], _i.main.title = String(r || "");
}
function Ti() {
- _i(Z.submenu);
+ yi(_i.main), Di();
}
-function Ei({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) {
- Ci(), 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 Ei({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) {
+ _i.submenu.open = !0, _i.submenu.x = Number(e) || 0, _i.submenu.y = Number(t) || 0, _i.submenu.items = Array.isArray(n) ? n.filter(Boolean) : [], _i.submenu.title = String(r || "");
}
function Di() {
- Z.tags.open = !1, Z.tags.x = 0, Z.tags.y = 0, Z.tags.asset = null, Z.tags.onChanged = null;
+ yi(_i.submenu);
}
-function Oi() {
- Ci(), Di();
+function Oi({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) {
+ Ti(), _i.tags.open = !!n, _i.tags.x = Number(e) || 0, _i.tags.y = Number(t) || 0, _i.tags.asset = n || null, _i.tags.onChanged = typeof r == "function" ? r : null;
+}
+function ki() {
+ _i.tags.open = !1, _i.tags.x = 0, _i.tags.y = 0, _i.tags.asset = null, _i.tags.onChanged = null;
+}
+function Ai() {
+ Ti(), ki();
}
//#endregion
//#region ui/features/viewer/ViewerContextMenu.ts
-var ki = {
+var ji = {
COPY_PATH: "Ctrl+Shift+C",
DOWNLOAD: "S",
OPEN_IN_FOLDER: "Ctrl+Shift+E",
@@ -838,19 +839,19 @@ var ki = {
RATING_SUBMENU: "1-5",
RENAME: "F2",
DELETE: "Del"
-}, Ai = [
+}, Mi = [
"B",
"KB",
"MB",
"GB",
"TB"
-], ji = /* @__PURE__ */ new WeakMap(), Mi = 1;
-function Ni(e = "viewer-menu-item") {
- return `${e}-${Mi++}`;
+], Ni = /* @__PURE__ */ new WeakMap(), Pi = 1;
+function Fi(e = "viewer-menu-item") {
+ return `${e}-${Pi++}`;
}
-function Pi(e, t, n, r, i = {}) {
+function Ii(e, t, n, r, i = {}) {
return {
- id: Ni(),
+ id: Fi(),
type: "item",
label: String(e || ""),
iconClass: t ? String(t) : "",
@@ -861,13 +862,13 @@ function Pi(e, t, n, r, i = {}) {
submenu: Array.isArray(i.submenu) ? i.submenu.filter(Boolean) : null
};
}
-function Fi() {
+function Li() {
return {
- id: Ni("viewer-menu-separator"),
+ id: Fi("viewer-menu-separator"),
type: "separator"
};
}
-function Ii(e) {
+function Ri(e) {
let t = String(e || "").trim();
if (!t) return !1;
if (t.startsWith("/")) return !0;
@@ -878,7 +879,7 @@ function Ii(e) {
return !1;
}
}
-function Li(e, t, n) {
+function zi(e, t, n) {
let r = e?.id;
try {
e.rating = t;
@@ -891,181 +892,181 @@ function Li(e, t, n) {
console.debug?.(e);
}
if (r) {
- mi(String(r), t, {
+ hi(String(r), t, {
successMessage: t > 0 ? `Rating set to ${t} stars` : "Rating cleared",
errorMessage: "Failed to update rating",
warnPrefix: "[ViewerContextMenu]",
onSuccess: () => {
- ht(qt, {
+ kt(Zt, {
assetId: String(r),
rating: t
}, { warnPrefix: "[ViewerContextMenu]" });
},
onFailure: (e) => {
- at(e, "[ViewerContextMenu] Rating update", { showToast: !0 });
+ st(e, "[ViewerContextMenu] Rating update", { showToast: !0 });
}
});
return;
}
- we(e, t).catch((e) => {
- at(e, "[ViewerContextMenu] Rating update", { showToast: !0 });
+ O(e, t).catch((e) => {
+ st(e, "[ViewerContextMenu] Rating update", { showToast: !0 });
});
}
-function Ri(e) {
+function Bi(e) {
let t = Number(e);
if (!Number.isFinite(t) || t < 0) return "";
let n = 0;
- for (; t >= 1024 && n < Ai.length - 1;) t /= 1024, n += 1;
- return `${n === 0 ? `${Math.round(t)}` : t.toFixed(2)} ${Ai[n]}`;
+ for (; t >= 1024 && n < Mi.length - 1;) t /= 1024, n += 1;
+ return `${n === 0 ? `${Math.round(t)}` : t.toFixed(2)} ${Mi[n]}`;
}
-function zi(e, t, n) {
- let i = [
+function Vi(e, t, n) {
+ let r = [
5,
4,
3,
2,
1
- ].map((r) => Pi(`${r} Stars`, "pi pi-star", null, async () => {
- Li(e, r, t);
+ ].map((r) => Ii(`${r} Stars`, "pi pi-star", null, async () => {
+ zi(e, r, t);
}, { disabled: !n }));
- return i.push(Fi()), i.push(Pi(r("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => {
- Li(e, 0, t);
- }, { disabled: !n })), i;
+ return r.push(Li()), r.push(Ii(R("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => {
+ zi(e, 0, t);
+ }, { disabled: !n })), r;
}
-function Bi({ asset: e, event: t, getCurrentViewUrl: n, onAssetChanged: i }) {
- let a = typeof n == "function" ? n(e) : De(e), o = !!(e?.id || e?.filepath);
+function Hi({ asset: t, event: n, getCurrentViewUrl: r, onAssetChanged: a }) {
+ let o = typeof r == "function" ? r(t) : Fe(t), s = !!(t?.id || t?.filepath);
return [
- Pi(r("ctx.openInNewTab", "Open in New Tab"), "pi pi-external-link", null, async () => {
- Ii(a) && window.open(a, "_blank", "noopener,noreferrer");
+ Ii(R("ctx.openInNewTab", "Open in New Tab"), "pi pi-external-link", null, async () => {
+ Ri(o) && window.open(o, "_blank", "noopener,noreferrer");
}),
- Pi(r("ctx.copyPath", "Copy path"), "pi pi-copy", ki.COPY_PATH, async () => {
- let t = e?.filepath ? String(e.filepath) : "";
- if (!t) {
- s(r("toast.noFilePath"), "error");
+ Ii(R("ctx.copyPath", "Copy path"), "pi pi-copy", ji.COPY_PATH, async () => {
+ let e = t?.filepath ? String(t.filepath) : "";
+ if (!e) {
+ m(R("toast.noFilePath"), "error");
return;
}
try {
- await navigator.clipboard.writeText(t), s(r("toast.pathCopied"), "success", 2e3);
+ await navigator.clipboard.writeText(e), m(R("toast.pathCopied"), "success", 2e3);
} catch (e) {
- console.error("[ViewerContextMenu] Copy failed:", e), s(r("toast.pathCopyFailed"), "error");
+ console.error("[ViewerContextMenu] Copy failed:", e), m(R("toast.pathCopyFailed"), "error");
}
}),
- Pi(r("ctx.downloadOriginal", "Download Original"), "pi pi-download", ki.DOWNLOAD, async () => {
- if (!e || !e.filepath) return;
- let t = ze(e.filepath), n = document.createElement("a");
- n.href = t, n.download = e.filename, document.body.appendChild(n), n.click(), document.body.removeChild(n), s(r("toast.downloadingFile", "Downloading {filename}...", { filename: e.filename }), "info", 3e3);
- }, { disabled: !e?.filepath }),
- Pi(r("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", ki.OPEN_IN_FOLDER, async () => {
- let t = await E(e);
- t?.ok ? s(r("toast.openedInFolder"), "info", 2e3) : s(t?.error || r("toast.openFolderFailed"), "error");
- }, { disabled: !(e?.id || e?.filepath) }),
- Pi(r("ctx.addToCollection", "Add to collection"), "pi pi-bookmark", ki.ADD_TO_COLLECTION, async () => {
+ Ii(R("ctx.downloadOriginal", "Download Original"), "pi pi-download", ji.DOWNLOAD, async () => {
+ if (!t || !t.filepath) return;
+ let e = ye(t.filepath), n = document.createElement("a");
+ n.href = e, n.download = t.filename, document.body.appendChild(n), n.click(), document.body.removeChild(n), m(R("toast.downloadingFile", "Downloading {filename}...", { filename: t.filename }), "info", 3e3);
+ }, { disabled: !t?.filepath }),
+ Ii(R("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", ji.OPEN_IN_FOLDER, async () => {
+ let n = await e(t);
+ n?.ok ? m(R("toast.openedInFolder"), "info", 2e3) : m(n?.error || R("toast.openFolderFailed"), "error");
+ }, { disabled: !(t?.id || t?.filepath) }),
+ Ii(R("ctx.addToCollection", "Add to collection"), "pi pi-bookmark", ji.ADD_TO_COLLECTION, async () => {
try {
- await ti({
- x: t?.clientX,
- y: t?.clientY,
- assets: [e]
+ await ni({
+ x: n?.clientX,
+ y: n?.clientY,
+ assets: [t]
});
} catch (e) {
console.error("[ViewerContextMenu] Add to collection failed:", e);
}
}),
- Fi(),
- Pi(r("ctx.editTags", "Edit tags"), "pi pi-tags", ki.EDIT_TAGS, async () => {
- Ei({
- x: (Number(t?.clientX) || 0) + 6,
- y: (Number(t?.clientY) || 0) + 6,
- asset: e,
- onChanged: ((...t) => {
- let n = t[0];
- e.tags = n, ht(Kt, {
- assetId: String(e.id),
+ Li(),
+ Ii(R("ctx.editTags", "Edit tags"), "pi pi-tags", ji.EDIT_TAGS, async () => {
+ Oi({
+ x: (Number(n?.clientX) || 0) + 6,
+ y: (Number(n?.clientY) || 0) + 6,
+ asset: t,
+ onChanged: ((...e) => {
+ let n = e[0];
+ t.tags = n, kt(Xt, {
+ assetId: String(t.id),
tags: n
}, { warnPrefix: "[ViewerContextMenu]" });
try {
- i?.();
+ a?.();
} catch (e) {
console.debug?.(e);
}
})
});
}, { closeOnSelect: !1 }),
- Fi(),
- Pi(r("ctx.setRating", "Set rating"), "pi pi-star", `${ki.RATING_SUBMENU} >`, null, {
- disabled: !o,
+ Li(),
+ Ii(R("ctx.setRating", "Set rating"), "pi pi-star", `${ji.RATING_SUBMENU} >`, null, {
+ disabled: !s,
closeOnSelect: !1,
- submenu: zi(e, i, o)
+ submenu: Vi(t, a, s)
}),
- Pi(r("ctx.refreshMetadata", "Refresh metadata"), "pi pi-sync", "R", async () => {
- if (e?.id) try {
- let t = await j(e.id, { refresh: !0 });
- if (!t?.ok || !t?.data) {
- s(t?.error || r("toast.metadataRefreshFailed", "Failed to refresh metadata."), "error");
+ Ii(R("ctx.refreshMetadata", "Refresh metadata"), "pi pi-sync", "R", async () => {
+ if (t?.id) try {
+ let e = await te(t.id, { refresh: !0 });
+ if (!e?.ok || !e?.data) {
+ m(e?.error || R("toast.metadataRefreshFailed", "Failed to refresh metadata."), "error");
return;
}
- let n = t.data;
+ let n = e.data;
try {
- ht(Gt, {
- assetId: String(e.id),
+ kt(Yt, {
+ assetId: String(t.id),
info: n
}, { warnPrefix: "[ViewerContextMenu]" });
} catch (e) {
console.debug?.(e);
}
- let i = [], a = Ri(n?.size_bytes);
- a && i.push(a), n?.mime && i.push(n.mime), s(r("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: i.length ? ` (${i.join(", ")})` : "" }), "success", 3e3);
+ let r = [], i = Bi(n?.size_bytes);
+ i && r.push(i), n?.mime && r.push(n.mime), m(R("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: r.length ? ` (${r.join(", ")})` : "" }), "success", 3e3);
} catch (e) {
- at(e, "[ViewerContextMenu] Metadata refresh", { showToast: !0 });
+ st(e, "[ViewerContextMenu] Metadata refresh", { showToast: !0 });
}
- }, { disabled: !e?.id }),
- Fi(),
- Pi(r("ctx.rename", "Rename"), "pi pi-pencil", ki.RENAME, async () => {
- if (!(e?.id || e?.filepath)) return;
- let t = e.filename || "", n = ci(await Lt(r("dialog.rename.title", "Rename file"), t), t);
- if (!n || n === t) return;
- let a = ai(n);
- if (!a.valid) {
- s(a.reason, "error");
+ }, { disabled: !t?.id }),
+ Li(),
+ Ii(R("ctx.rename", "Rename"), "pi pi-pencil", ji.RENAME, async () => {
+ if (!(t?.id || t?.filepath)) return;
+ let e = t.filename || "", n = li(await gt(R("dialog.rename.title", "Rename file"), e), e);
+ if (!n || n === e) return;
+ let r = oi(n);
+ if (!r.valid) {
+ m(r.reason, "error");
return;
}
try {
- let t = await v(e, n);
- if (t?.ok) {
- let a = t?.data?.asset;
- a && typeof a == "object" ? Object.assign(e, a) : (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)))), s(r("toast.fileRenamedSuccess"), "success");
+ let e = await i(t, n);
+ if (e?.ok) {
+ let r = e?.data?.asset;
+ r && typeof r == "object" ? Object.assign(t, r) : (t.filename = n, t.filepath = t.filepath.replace(/[^\\/]+$/, n), t.path &&= String(t.path).replace(/[^\\/]+$/, n), t.file_info && typeof t.file_info == "object" && (t.file_info.filename = n, t.file_info.filepath && (t.file_info.filepath = String(t.file_info.filepath).replace(/[^\\/]+$/, n)), t.file_info.path && (t.file_info.path = String(t.file_info.path).replace(/[^\\/]+$/, n)))), m(R("toast.fileRenamedSuccess"), "success");
try {
window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "viewer-rename" } }));
} catch (e) {
console.debug?.(e);
}
- i?.();
- } else s(t?.error || r("toast.fileRenameFailed"), "error");
+ a?.();
+ } else m(e?.error || R("toast.fileRenameFailed"), "error");
} catch (e) {
- s(r("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error");
+ m(R("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error");
}
- }, { disabled: !(e?.id || e?.filepath) }),
- Pi(r("ctx.delete", "Delete"), "pi pi-trash", ki.DELETE, async () => {
- if ((e?.id || e?.filepath) && await ni(1, e?.filename)) try {
- let t = await x(e);
- t?.ok ? (s(r("toast.fileDeletedSuccess"), "success"), i?.()) : s(t?.error || r("toast.fileDeleteFailed"), "error");
+ }, { disabled: !(t?.id || t?.filepath) }),
+ Ii(R("ctx.delete", "Delete"), "pi pi-trash", ji.DELETE, async () => {
+ if ((t?.id || t?.filepath) && await ri(1, t?.filename)) try {
+ let e = await w(t);
+ e?.ok ? (m(R("toast.fileDeletedSuccess"), "success"), a?.()) : m(e?.error || R("toast.fileDeleteFailed"), "error");
} catch (e) {
- s(r("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error");
+ m(R("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error");
}
- }, { disabled: !(e?.id || e?.filepath) })
+ }, { disabled: !(t?.id || t?.filepath) })
];
}
-function Vi({ overlayEl: e, getCurrentAsset: t, getCurrentViewUrl: n, onAssetChanged: r } = {}) {
+function Ui({ overlayEl: e, getCurrentAsset: t, getCurrentViewUrl: n, onAssetChanged: r } = {}) {
if (!e || typeof t != "function") return;
- let i = ji.get(e);
+ let i = Ni.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 && Si({
+ a && wi({
x: i.clientX,
y: i.clientY,
- items: Bi({
+ items: Hi({
asset: a,
event: i,
getCurrentViewUrl: n,
@@ -1085,23 +1086,23 @@ function Vi({ overlayEl: e, getCurrentAsset: t, getCurrentViewUrl: n, onAssetCha
console.debug?.(e);
}
try {
- pi();
+ mi();
let e = globalThis?._ratingDebounceTimers;
e && typeof e.clear == "function" && e.clear();
} catch (e) {
console.debug?.(e);
}
try {
- Oi();
+ Ai();
} catch (e) {
console.debug?.(e);
}
- ji.delete(e);
+ Ni.delete(e);
};
- return ji.set(e, { unbind: o }), o;
+ return Ni.set(e, { unbind: o }), o;
}
-function Hi(e) {
- let t = e ? ji.get(e) : null;
+function Wi(e) {
+ let t = e ? Ni.get(e) : null;
try {
t?.unbind?.();
} catch (e) {
@@ -1110,10 +1111,10 @@ function Hi(e) {
}
//#endregion
//#region ui/features/viewer/ViewerState.ts
-var Ui = "mjr_viewer_prefs_v1";
-function Wi() {
+var Gi = "mjr_viewer_prefs_v1";
+function Ki() {
try {
- let e = w.get(Ui);
+ let e = Re.get(Gi);
if (!e) return {};
let t = JSON.parse(e);
return t && typeof t == "object" ? t : {};
@@ -1121,7 +1122,7 @@ function Wi() {
return {};
}
}
-function Gi(e) {
+function qi(e) {
try {
if (!e) return;
let t = {
@@ -1133,14 +1134,14 @@ function Gi(e) {
audioVisualizerMode: String(e.audioVisualizerMode || "artistic"),
abWipePercent: Number.isFinite(Number(e._abWipePercent)) ? Number(e._abWipePercent) : 50
};
- w.set(Ui, JSON.stringify(t));
+ Re.set(Gi, JSON.stringify(t));
} catch (e) {
console.debug?.(e);
}
}
//#endregion
//#region ui/features/viewer/lifecycle.ts
-function Ki(e) {
+function Ji(e) {
if (e) {
try {
e._mjrSyncAbort?.abort?.();
@@ -1213,7 +1214,7 @@ function Ki(e) {
}
}
}
-function qi(e) {
+function Yi(e) {
let t = [];
try {
e._mjrViewerUnsubs = t;
@@ -1222,9 +1223,9 @@ function qi(e) {
}
let n = {
unsubs: t,
- safeAddListener: z,
- safeCall: R,
- destroyMediaProcessorsIn: Ki,
+ safeAddListener: wt,
+ safeCall: V,
+ destroyMediaProcessorsIn: Ji,
_observer: null,
disposeAll: () => {
try {
@@ -1233,7 +1234,7 @@ function qi(e) {
console.debug?.(e);
}
try {
- for (let e of t) R(e);
+ for (let e of t) V(e);
} catch (e) {
console.debug?.(e);
}
@@ -1254,7 +1255,7 @@ function qi(e) {
} catch (e) {
console.debug?.(e);
}
- R(() => n.disposeAll?.(), "lifecycle:autoDispose");
+ V(() => n.disposeAll?.(), "lifecycle:autoDispose");
}
} catch (e) {
console.debug?.(e);
@@ -1274,7 +1275,7 @@ function qi(e) {
}
//#endregion
//#region ui/components/buttons.ts
-function Ji(e, t) {
+function Xi(e, t) {
let n = document.createElement("button");
n.textContent = e, n.title = t || "";
try {
@@ -1288,7 +1289,7 @@ function Ji(e, t) {
n.disabled || (n.style.background = "transparent");
}, n;
}
-function Yi(e, t) {
+function Zi(e, t) {
let n = document.createElement("button");
n.textContent = e, n.dataset.mode = t;
try {
@@ -1300,8 +1301,8 @@ function Yi(e, t) {
}
//#endregion
//#region ui/features/viewer/toolbarControls.ts
-function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged: i, onExportFrame: a, onCopyFrame: o, onAudioVizModeChanged: s, getCanAB: c } = {}) {
- let l = {
+function Qi({ 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,
@@ -1318,11 +1319,11 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
genInfoOpen: !0,
abCompareMode: "wipe",
audioVisualizerMode: "artistic"
- }, u = document.createElement("div");
- u.className = "mjr-viewer-tools", u.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 d = document.createElement("div");
- d.className = "mjr-viewer-tools-deck", d.style.cssText = "display:flex; flex-wrap:nowrap; gap:8px; align-items:center; min-width:0; overflow-x:auto; overflow-y:hidden;";
- let f = ({ key: e, eyebrow: t, title: n } = {}) => {
+ }, 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");
@@ -1342,38 +1343,38 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
eyebrowEl: o,
titleEl: s
};
- }, p = f({
+ }, f = d({
key: "grade",
eyebrow: "Image",
title: "Adjustments"
- }), m = f({
+ }), p = d({
key: "overlay",
eyebrow: "Viewer",
title: "Guides & Compare"
- }), h = f({
+ }), m = d({
key: "inspect",
eyebrow: "Inspect",
title: "Probe"
- }), g = f({
+ }), h = d({
key: "actions",
eyebrow: "Actions",
title: "Reset & Export"
- }), _ = f({
+ }), g = d({
key: "info",
eyebrow: "Infos",
title: "Help"
- }), v = document.createElement("div");
- v.className = "mjr-viewer-tools-actions", v.style.cssText = "display:flex; align-items:center; justify-content:flex-start; gap:6px; flex-wrap:wrap; min-width:0;";
- let y = document.createElement("div");
- y.className = "mjr-viewer-tools-meta", y.style.cssText = "display:flex; align-items:center; justify-content:flex-start; gap:6px; flex-wrap:nowrap; min-width:0;";
- let b = ({ key: e, label: t, accentRgb: n } = {}) => {
+ }), _ = 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;
- }, x = (e, t) => {
+ }, 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 || []) {
@@ -1381,7 +1382,7 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
t.value = String(e.value), t.textContent = String(e.label), n.appendChild(t);
}
return n;
- }, S = (e, { min: t, max: n, step: r, value: i }) => {
+ }, 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");
@@ -1392,7 +1393,7 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
input: o,
out: s
};
- }, C = (e, t, { iconClass: n = null, accentRgb: r = null } = {}) => {
+ }, 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);
@@ -1421,7 +1422,7 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
b: i,
setActive: a
};
- }, w = x("Channel View", [
+ }, C = b("Channel View", [
{
value: "rgb",
label: "RGB"
@@ -1447,18 +1448,18 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
label: "Luma"
}
]);
- w.title = r("tooltip.colorChannels", "View color channels or luminance");
- let T = S("Exposure (EV)", {
+ C.title = R("tooltip.colorChannels", "View color channels or luminance");
+ let w = x("Exposure (EV)", {
min: -10,
max: 10,
step: .1,
value: 0
- }), E = S("Gamma", {
+ }), T = x("Gamma", {
min: .1,
max: 3,
step: .01,
value: 1
- }), D = Object.freeze({
+ }), E = Object.freeze({
channel: "120, 180, 255",
exposure: "255, 200, 70",
gamma: "190, 150, 255",
@@ -1470,15 +1471,15 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
compare: "90, 220, 220",
geninfo: "200, 170, 255",
audioviz: "255, 150, 80"
- }), O = Object.freeze({
+ }), D = 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 } = {}) => {
+ }), O = (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;
+ e.style.borderColor = D.borderColor, e.style.background = D.background, e.style.boxShadow = D.boxShadow;
return;
}
let i = String(t || "").trim();
@@ -1487,38 +1488,38 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
} catch (e) {
console.debug?.(e);
}
- }, A = (e) => {
+ }, k = (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";
+ if (C.style.boxShadow = "", t === "r") {
+ C.style.borderColor = "rgba(255,90,90,0.60)", C.style.background = "rgba(255,90,90,0.14)", C.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";
+ C.style.borderColor = "rgba(90,255,140,0.55)", C.style.background = "rgba(90,255,140,0.12)", C.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";
+ C.style.borderColor = "rgba(90,160,255,0.60)", C.style.background = "rgba(90,160,255,0.12)", C.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";
+ C.style.borderColor = "rgba(255,210,90,0.60)", C.style.background = "rgba(255,210,90,0.12)", C.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";
+ C.style.borderColor = "rgba(220,220,220,0.35)", C.style.background = "rgba(255,255,255,0.10)", C.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";
+ C.style.borderColor = "rgba(255,255,255,0.22)", C.style.background = "linear-gradient(90deg, rgba(255,90,90,0.16), rgba(90,255,140,0.14), rgba(90,160,255,0.16))", C.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)";
+ C.style.borderColor = "rgba(255,255,255,0.14)", C.style.background = "rgba(255,255,255,0.08)";
} catch (e) {
console.debug?.(e);
}
- }, j = (e, { accentRgb: t, active: n } = {}) => {
+ }, A = (e, { accentRgb: t, active: n } = {}) => {
try {
if (!e) return;
if (!n) {
@@ -1531,7 +1532,7 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
} catch (e) {
console.debug?.(e);
}
- }, M = (e, { accentRgb: t, active: n } = {}) => {
+ }, j = (e, { accentRgb: t, active: n } = {}) => {
try {
if (!e) return;
if (!n) {
@@ -1544,13 +1545,13 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
} catch (e) {
console.debug?.(e);
}
- }, N = C("Zebra", "Zebra Highlights (Z)", {
+ }, M = S("Zebra", "Zebra Highlights (Z)", {
iconClass: "pi-bars",
- accentRgb: D.zebra
- }), P = C("Scopes", "Scopes overlay", {
+ accentRgb: E.zebra
+ }), N = S("Scopes", "Scopes overlay", {
iconClass: "pi-chart-bar",
- accentRgb: D.analysis
- }), F = x("Scopes", [
+ accentRgb: E.analysis
+ }), P = b("Scopes", [
{
value: "off",
label: "Off"
@@ -1568,11 +1569,11 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
label: "Both"
}
]);
- F.title = r("tooltip.scopesHistogram", "Show histogram/waveform scopes");
- let ee = C("Grid", "Grid (G)", {
+ P.title = R("tooltip.scopesHistogram", "Show histogram/waveform scopes");
+ let F = S("Grid", "Grid (G)", {
iconClass: "pi-th-large",
- accentRgb: D.overlay
- }), te = x("Grid Overlay", [
+ accentRgb: E.overlay
+ }), I = b("Grid Overlay", [
{
value: 0,
label: "Off"
@@ -1594,11 +1595,11 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
label: "Golden"
}
]);
- te.title = $t(r("tooltip.gridOverlay", "Grid overlay (rule of thirds, center)"), "G");
- let ne = C("Mask", "Format mask (dim outside)", {
+ I.title = $t(R("tooltip.gridOverlay", "Grid overlay (rule of thirds, center)"), "G");
+ let ee = S("Mask", "Format mask (dim outside)", {
iconClass: "pi-stop",
- accentRgb: D.overlay
- }), re = x("Format", [
+ accentRgb: E.overlay
+ }), te = b("Format", [
{
value: "image",
label: "Image"
@@ -1624,28 +1625,28 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
label: "9:16"
}
]);
- re.title = r("tooltip.aspectRatioMask", "Aspect ratio overlay mask");
- let ie = S("Mask Opacity", {
+ te.title = R("tooltip.aspectRatioMask", "Aspect ratio overlay mask");
+ let ne = x("Mask Opacity", {
min: 0,
max: .9,
step: .05,
value: .65
- }), ae = C("Probe", "Pixel Probe (I)", {
+ }), re = S("Probe", "Pixel Probe (I)", {
iconClass: "pi-eye",
- accentRgb: D.probe
- }), oe = C("Loupe", "Loupe (L)", {
+ accentRgb: E.probe
+ }), ie = S("Loupe", "Loupe (L)", {
iconClass: "pi-search-plus",
- accentRgb: D.loupe
- }), se = C("HUD", "Viewer HUD", {
+ accentRgb: E.loupe
+ }), ae = S("HUD", "Viewer HUD", {
iconClass: "pi-info-circle",
- accentRgb: D.overlay
- }), ce = C("Focus", "Distraction-free mode (X)", {
+ accentRgb: E.overlay
+ }), oe = S("Focus", "Distraction-free mode (X)", {
iconClass: "pi-window-maximize",
- accentRgb: D.overlay
- }), le = C("Gen", $t("Generation info (prompt/model)", "D"), {
+ accentRgb: E.overlay
+ }), se = S("Gen", $t("Generation info (prompt/model)", "D"), {
iconClass: "pi-book",
- accentRgb: D.geninfo
- }), ue = x("A/B Compare Mode", [
+ accentRgb: E.geninfo
+ }), ce = b("A/B Compare Mode", [
{
value: "wipe",
label: "Wipe (H)"
@@ -1679,147 +1680,147 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
label: "Screen"
}
]);
- ue.title = r("tooltip.compareBlendMode", "Compare blend mode");
- let de = x("Audio Visualizer", [{
+ ce.title = R("tooltip.compareBlendMode", "Compare blend mode");
+ let le = b("Audio Visualizer", [{
value: "simple",
label: "Simple"
}, {
value: "artistic",
label: "Artistic"
}]);
- de.title = r("tooltip.audioVisualizer", "Audio visualizer mode");
- let fe = Ji("Reset", r("tooltip.resetPlayerControls", "Reset all viewer controls"));
- fe.style.height = "26px", fe.style.fontSize = "11px", fe.style.padding = "0 8px", fe.classList?.add?.("mjr-viewer-tool-btn", "mjr-viewer-tool-btn--reset"), fe.classList?.add?.("mjr-viewer-tools-action", "mjr-viewer-tools-action--primary"), fe.style.marginLeft = "auto";
+ le.title = R("tooltip.audioVisualizer", "Audio visualizer mode");
+ let ue = Xi("Reset", R("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 = R("tooltip.exportFrame", "Save current frame as PNG"), de.setAttribute("aria-label", R("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 fe = document.createElement("span");
+ fe.className = "pi pi-download", fe.setAttribute("aria-hidden", "true"), fe.style.fontSize = "14px", de.appendChild(fe), de.classList?.add?.("mjr-viewer-tools-action");
+ try {
+ de.style.display = "none";
+ } catch (e) {
+ console.debug?.(e);
+ }
let pe = document.createElement("button");
- pe.type = "button", pe.title = r("tooltip.exportFrame", "Save current frame as PNG"), pe.setAttribute("aria-label", r("tooltip.exportFrame", "Save frame as PNG")), pe.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", pe.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;";
- let me = document.createElement("span");
- me.className = "pi pi-download", me.setAttribute("aria-hidden", "true"), me.style.fontSize = "14px", pe.appendChild(me), pe.classList?.add?.("mjr-viewer-tools-action");
+ pe.type = "button", pe.title = R("tooltip.copyFrame", "Copy current frame to clipboard"), pe.setAttribute("aria-label", R("tooltip.copyFrame", "Copy frame to clipboard")), pe.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", pe.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;";
+ let L = document.createElement("span");
+ L.className = "pi pi-copy", L.setAttribute("aria-hidden", "true"), L.style.fontSize = "14px", pe.appendChild(L), pe.classList?.add?.("mjr-viewer-tools-action");
try {
pe.style.display = "none";
} catch (e) {
console.debug?.(e);
}
- let he = document.createElement("button");
- he.type = "button", he.title = r("tooltip.copyFrame", "Copy current frame to clipboard"), he.setAttribute("aria-label", r("tooltip.copyFrame", "Copy frame to clipboard")), he.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", he.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;";
- let ge = document.createElement("span");
- ge.className = "pi pi-copy", ge.setAttribute("aria-hidden", "true"), ge.style.fontSize = "14px", he.appendChild(ge), he.classList?.add?.("mjr-viewer-tools-action");
- try {
- he.style.display = "none";
- } catch (e) {
- console.debug?.(e);
- }
- let _e = b({
+ let me = y({
key: "channel",
label: "Channel",
- accentRgb: D.channel
+ accentRgb: E.channel
});
- _e.appendChild(w), p.body.appendChild(_e);
- let ve = b({
+ me.appendChild(C), f.body.appendChild(me);
+ let he = y({
key: "exposure",
label: "EV",
- accentRgb: D.exposure
+ accentRgb: E.exposure
});
- ve.appendChild(T.wrap), p.body.appendChild(ve);
- let ye = b({
+ he.appendChild(w.wrap), f.body.appendChild(he);
+ let ge = y({
key: "gamma",
label: "Gamma",
- accentRgb: D.gamma
+ accentRgb: E.gamma
});
- ye.appendChild(E.wrap), p.body.appendChild(ye);
- let be = () => {
+ ge.appendChild(T.wrap), f.body.appendChild(ge);
+ let _e = () => {
try {
t.exposureEV = 0;
} catch (e) {
console.debug?.(e);
}
try {
- T.input.value = "0", T.out.textContent = "0.0EV";
+ w.input.value = "0", w.out.textContent = "0.0EV";
} catch (e) {
console.debug?.(e);
}
- R(n);
- }, xe = () => {
+ V(n);
+ }, ve = () => {
try {
t.gamma = 1;
} catch (e) {
console.debug?.(e);
}
try {
- E.input.value = "1", E.out.textContent = "1.00";
+ T.input.value = "1", T.out.textContent = "1.00";
} catch (e) {
console.debug?.(e);
}
- R(n);
- }, Se = () => {
+ V(n);
+ }, ye = () => {
try {
- Object.assign(t, l);
+ Object.assign(t, c);
} catch (e) {
console.debug?.(e);
}
- R(i), R(s), R(n);
+ V(r), V(o), V(n);
};
try {
- let e = ve.querySelector?.(".mjr-viewer-tools-group-label");
- e && (e.title = r("tooltip.resetExposure", "Reset EV to 0"), e.style.cursor = "pointer", e.style.userSelect = "none");
+ let e = he.querySelector?.(".mjr-viewer-tools-group-label");
+ e && (e.title = R("tooltip.resetExposure", "Reset EV to 0"), e.style.cursor = "pointer", e.style.userSelect = "none");
} catch (e) {
console.debug?.(e);
}
try {
- T.out.title = r("tooltip.resetExposure", "Reset EV to 0"), T.out.style.cursor = "pointer", T.out.style.userSelect = "none";
+ w.out.title = R("tooltip.resetExposure", "Reset EV to 0"), w.out.style.cursor = "pointer", w.out.style.userSelect = "none";
} catch (e) {
console.debug?.(e);
}
try {
- let e = ye.querySelector?.(".mjr-viewer-tools-group-label");
- e && (e.title = r("tooltip.resetGamma", "Reset Gamma to 1.00"), e.style.cursor = "pointer", e.style.userSelect = "none");
+ let e = ge.querySelector?.(".mjr-viewer-tools-group-label");
+ e && (e.title = R("tooltip.resetGamma", "Reset Gamma to 1.00"), e.style.cursor = "pointer", e.style.userSelect = "none");
} catch (e) {
console.debug?.(e);
}
try {
- E.out.title = r("tooltip.resetGamma", "Reset Gamma to 1.00"), E.out.style.cursor = "pointer", E.out.style.userSelect = "none";
+ T.out.title = R("tooltip.resetGamma", "Reset Gamma to 1.00"), T.out.style.cursor = "pointer", T.out.style.userSelect = "none";
} catch (e) {
console.debug?.(e);
}
- let Ce = b({
+ let be = y({
key: "analysis",
label: "Analysis",
- accentRgb: D.analysis
+ accentRgb: E.analysis
});
- Ce.appendChild(N.b), Ce.appendChild(P.b), Ce.appendChild(F), p.body.appendChild(Ce);
- let we = b({
+ be.appendChild(M.b), be.appendChild(N.b), be.appendChild(P), f.body.appendChild(be);
+ let xe = y({
key: "overlay-guides",
label: "Guides",
- accentRgb: D.overlay
+ accentRgb: E.overlay
});
- we.appendChild(ee.b), we.appendChild(te), we.appendChild(ne.b), we.appendChild(re), we.appendChild(ie.wrap), m.body.appendChild(we);
- let Te = b({
+ xe.appendChild(F.b), xe.appendChild(I), xe.appendChild(ee.b), xe.appendChild(te), xe.appendChild(ne.wrap), p.body.appendChild(xe);
+ let Se = y({
key: "overlay-inspect",
label: "Inspect",
- accentRgb: D.overlay
+ accentRgb: E.overlay
});
[
+ re.b,
+ ie.b,
ae.b,
oe.b,
- se.b,
- ce.b,
- le.b
+ se.b
].forEach((e, t) => {
- t > 0 && (e.style.marginLeft = "4px"), Te.appendChild(e);
- }), h.body.appendChild(Te);
- let Ee = b({
+ t > 0 && (e.style.marginLeft = "4px"), Se.appendChild(e);
+ }), m.body.appendChild(Se);
+ let Ce = y({
key: "compare",
label: "Compare",
- accentRgb: D.compare
+ accentRgb: E.compare
});
- Ee.style.borderRadius = "8px", Ee.style.padding = "4px 6px", Ee.style.border = "1px solid transparent", Ee.style.transition = "background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease", Ee.appendChild(ue), m.body.appendChild(Ee);
- let De = b({
+ Ce.style.borderRadius = "8px", Ce.style.padding = "4px 6px", Ce.style.border = "1px solid transparent", Ce.style.transition = "background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease", Ce.appendChild(ce), p.body.appendChild(Ce);
+ let we = y({
key: "audio-viz",
label: "Audio Viz",
- accentRgb: D.audioviz
+ accentRgb: E.audioviz
});
- De.appendChild(de), m.body.appendChild(De), v.appendChild(fe), v.appendChild(pe), v.appendChild(he);
- let Oe = document.createElement("div");
- Oe.className = "mjr-viewer-tools-group mjr-viewer-tools-group--3d", Oe.textContent = "LMB rotate · RMB pan · Scroll zoom", Oe.style.cssText = [
+ we.appendChild(le), p.body.appendChild(we), _.appendChild(ue), _.appendChild(de), _.appendChild(pe);
+ let Te = document.createElement("div");
+ Te.className = "mjr-viewer-tools-group mjr-viewer-tools-group--3d", Te.textContent = "LMB rotate · RMB pan · Scroll zoom", Te.style.cssText = [
"display:none",
"align-items:center",
"padding:2px 8px",
@@ -1830,15 +1831,15 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
"font-size:10px",
"font-weight:400",
"letter-spacing:0.01em"
- ].join(";"), y.appendChild(Oe);
+ ].join(";"), v.appendChild(Te);
+ let Ee = document.createElement("div");
+ Ee.style.cssText = "position: relative; display:inline-flex; align-items:center;", Ee.className = "mjr-viewer-tools-action", Ee.style.marginLeft = "4px";
+ let De = document.createElement("button");
+ De.type = "button", De.title = R("tooltip.viewerShortcuts", "Viewer shortcuts"), De.setAttribute("aria-label", R("tooltip.viewerShortcuts", "Viewer shortcuts")), De.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 Oe = document.createElement("span");
+ Oe.className = "pi pi-question-circle", Oe.setAttribute("aria-hidden", "true"), Oe.style.fontSize = "14px", De.appendChild(Oe);
let ke = document.createElement("div");
- ke.style.cssText = "position: relative; display:inline-flex; align-items:center;", ke.className = "mjr-viewer-tools-action", ke.style.marginLeft = "4px";
- let Ae = document.createElement("button");
- Ae.type = "button", Ae.title = r("tooltip.viewerShortcuts", "Viewer shortcuts"), Ae.setAttribute("aria-label", r("tooltip.viewerShortcuts", "Viewer shortcuts")), Ae.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 je = document.createElement("span");
- je.className = "pi pi-question-circle", je.setAttribute("aria-hidden", "true"), je.style.fontSize = "14px", Ae.appendChild(je);
- let Me = document.createElement("div");
- Me.className = "mjr-viewer-help", Me.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 ";
+ ke.className = "mjr-viewer-help", ke.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;";
@@ -1848,88 +1849,88 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged
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"), Me.appendChild(e), Me.appendChild(t);
+ 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"), ke.appendChild(e), ke.appendChild(t);
} catch (e) {
console.debug?.(e);
}
- return ke.appendChild(Ae), ke.appendChild(Me), y.appendChild(ke), g.body.appendChild(v), _.body.appendChild(y), d.appendChild(p.panel), d.appendChild(m.panel), d.appendChild(h.panel), d.appendChild(g.panel), d.appendChild(_.panel), u.appendChild(d), {
- toolsRow: u,
- gradePanel: p,
- overlayPanel: m,
- inspectPanel: h,
- actionPanel: g,
- infoPanel: _,
- toolsActions: v,
- toolsMeta: y,
- chGroup: _e,
- expGroup: ve,
- gamGroup: ye,
- anaGroup: Ce,
- ovGuidesGroup: we,
- ovInspectGroup: Te,
- cmpGroup: Ee,
- audGroup: De,
- model3dHint: Oe,
- helpWrap: ke,
- helpBtn: Ae,
- helpPop: Me,
- channelsSelect: w,
- exposureCtl: T,
- gammaCtl: E,
- zebraToggle: N,
- scopesToggle: P,
- scopesSelect: F,
- gridToggle: ee,
- gridModeSelect: te,
- maskToggle: ne,
- formatSelect: re,
- maskOpacityCtl: ie,
- probeToggle: ae,
- loupeToggle: oe,
- hudToggle: se,
- focusToggle: ce,
- genInfoToggle: le,
- compareModeSelect: ue,
- audioVizModeSelect: de,
- resetGradeBtn: fe,
- exportBtn: pe,
- copyBtn: he,
- resetExposure: be,
- resetGamma: xe,
- resetViewerTools: Se,
- ACCENT: D,
- setSelectHighlighted: k,
- setChannelSelectStyle: A,
- setValueHighlighted: j,
- setGroupHighlighted: M,
- DEFAULT_TOOL_STATE: l
+ return Ee.appendChild(De), Ee.appendChild(ke), v.appendChild(Ee), 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: me,
+ expGroup: he,
+ gamGroup: ge,
+ anaGroup: be,
+ ovGuidesGroup: xe,
+ ovInspectGroup: Se,
+ cmpGroup: Ce,
+ audGroup: we,
+ model3dHint: Te,
+ helpWrap: Ee,
+ helpBtn: De,
+ helpPop: ke,
+ channelsSelect: C,
+ exposureCtl: w,
+ gammaCtl: T,
+ zebraToggle: M,
+ scopesToggle: N,
+ scopesSelect: P,
+ gridToggle: F,
+ gridModeSelect: I,
+ maskToggle: ee,
+ formatSelect: te,
+ maskOpacityCtl: ne,
+ probeToggle: re,
+ loupeToggle: ie,
+ hudToggle: ae,
+ focusToggle: oe,
+ genInfoToggle: se,
+ compareModeSelect: ce,
+ audioVizModeSelect: le,
+ resetGradeBtn: ue,
+ exportBtn: de,
+ copyBtn: pe,
+ resetExposure: _e,
+ resetGamma: ve,
+ resetViewerTools: ye,
+ ACCENT: E,
+ setSelectHighlighted: O,
+ setChannelSelectStyle: k,
+ setValueHighlighted: A,
+ setGroupHighlighted: j,
+ DEFAULT_TOOL_STATE: c
};
}
//#endregion
//#region ui/features/viewer/toolbarActions.ts
-function Zi({ 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: P, resetExposure: F, resetGamma: ee, resetViewerTools: te, 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", () => {
+function $i({ 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: P, resetExposure: F, resetGamma: I, resetViewerTools: ee, expGroup: te, gamGroup: ne }) {
+ e.push(wt(u, "click", () => r?.(n.SINGLE))), e.push(wt(d, "click", () => r?.(n.AB_COMPARE))), e.push(wt(f, "click", () => r?.(n.SIDE_BY_SIDE))), e.push(wt(p, "click", () => i?.())), e.push(wt(m, "change", () => {
try {
t.channel = String(m.value || "rgb");
} catch (e) {
console.debug?.(e);
}
- R(a);
- })), e.push(z(h, "change", () => {
+ V(a);
+ })), e.push(wt(h, "change", () => {
try {
t.abCompareMode = String(h.value || "wipe");
} catch (e) {
console.debug?.(e);
}
- R(o), R(a);
- })), e.push(z(g, "change", () => {
+ V(o), V(a);
+ })), e.push(wt(g, "change", () => {
try {
t.audioVisualizerMode = String(g.value || "artistic");
} catch (e) {
console.debug?.(e);
}
- R(s), R(a);
- })), e.push(z(_.input, "input", () => {
+ V(s), V(a);
+ })), e.push(wt(_.input, "input", () => {
let e = Math.max(-10, Math.min(10, Number(_.input.value) || 0));
t.exposureEV = Math.round(e * 10) / 10;
try {
@@ -1937,8 +1938,8 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo
} catch (e) {
console.debug?.(e);
}
- R(a);
- })), e.push(z(_.input, "dblclick", F)), e.push(z(_.out, "click", F)), e.push(z(ne.querySelector?.(".mjr-viewer-tools-group-label"), "click", F)), e.push(z(v.input, "input", () => {
+ V(a);
+ })), e.push(wt(_.input, "dblclick", F)), e.push(wt(_.out, "click", F)), e.push(wt(te.querySelector?.(".mjr-viewer-tools-group-label"), "click", F)), e.push(wt(v.input, "input", () => {
let e = Math.max(.1, Math.min(3, Number(v.input.value) || 1));
t.gamma = Math.round(e * 100) / 100;
try {
@@ -1946,10 +1947,10 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo
} catch (e) {
console.debug?.(e);
}
- R(a);
- })), e.push(z(v.input, "dblclick", ee)), e.push(z(v.out, "click", ee)), e.push(z(re.querySelector?.(".mjr-viewer-tools-group-label"), "click", ee)), e.push(z(y.b, "click", () => {
- t.analysisMode = t.analysisMode === "zebra" ? "none" : "zebra", R(a);
- })), e.push(z(b.b, "click", () => {
+ V(a);
+ })), e.push(wt(v.input, "dblclick", I)), e.push(wt(v.out, "click", I)), e.push(wt(ne.querySelector?.(".mjr-viewer-tools-group-label"), "click", I)), e.push(wt(y.b, "click", () => {
+ t.analysisMode = t.analysisMode === "zebra" ? "none" : "zebra", V(a);
+ })), e.push(wt(b.b, "click", () => {
try {
let e = String(t.scopesMode || "off") === "off" ? "both" : "off";
t.scopesMode = e;
@@ -1961,8 +1962,8 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo
} catch (e) {
console.debug?.(e);
}
- R(a);
- })), e.push(z(x, "change", () => {
+ V(a);
+ })), e.push(wt(x, "change", () => {
try {
t.scopesMode = String(x.value || "off");
} catch {
@@ -1972,10 +1973,10 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo
console.debug?.(e);
}
}
- R(a);
- })), e.push(z(S.b, "click", () => {
- t.gridMode = +!Number(t.gridMode), R(a);
- })), e.push(z(C, "change", () => {
+ V(a);
+ })), e.push(wt(S.b, "click", () => {
+ t.gridMode = +!Number(t.gridMode), V(a);
+ })), e.push(wt(C, "change", () => {
try {
let e = Number(C.value);
t.gridMode = Number.isFinite(e) ? e : 0;
@@ -1986,15 +1987,15 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo
console.debug?.(e);
}
}
- R(a);
- })), e.push(z(w.b, "click", () => {
+ V(a);
+ })), e.push(wt(w.b, "click", () => {
try {
t.overlayMaskEnabled = !t.overlayMaskEnabled;
} catch (e) {
console.debug?.(e);
}
- R(a);
- })), e.push(z(T, "change", () => {
+ V(a);
+ })), e.push(wt(T, "change", () => {
try {
t.overlayFormat = String(T.value || "image");
} catch {
@@ -2004,39 +2005,39 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo
console.debug?.(e);
}
}
- R(a);
- })), e.push(z(E.input, "input", () => {
+ V(a);
+ })), e.push(wt(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);
}
- R(a);
- })), e.push(z(D.b, "click", () => {
- t.probeEnabled = !t.probeEnabled, R(a);
- })), e.push(z(O.b, "click", () => {
- t.loupeEnabled = !t.loupeEnabled, R(a);
- })), e.push(z(k.b, "click", () => {
- t.hudEnabled = !t.hudEnabled, R(a);
- })), e.push(z(A.b, "click", () => {
- t.distractionFree = !t.distractionFree, R(a);
- })), e.push(z(j.b, "click", () => {
+ V(a);
+ })), e.push(wt(D.b, "click", () => {
+ t.probeEnabled = !t.probeEnabled, V(a);
+ })), e.push(wt(O.b, "click", () => {
+ t.loupeEnabled = !t.loupeEnabled, V(a);
+ })), e.push(wt(k.b, "click", () => {
+ t.hudEnabled = !t.hudEnabled, V(a);
+ })), e.push(wt(A.b, "click", () => {
+ t.distractionFree = !t.distractionFree, V(a);
+ })), e.push(wt(j.b, "click", () => {
try {
t.genInfoOpen = !t.genInfoOpen;
} catch (e) {
console.debug?.(e);
}
- R(a);
- })), e.push(z(M, "click", () => {
- te();
- })), e.push(z(N, "click", () => {
+ V(a);
+ })), e.push(wt(M, "click", () => {
+ ee();
+ })), e.push(wt(N, "click", () => {
try {
c?.();
} catch (e) {
console.debug?.(e);
}
- })), e.push(z(P, "click", () => {
+ })), e.push(wt(P, "click", () => {
try {
l?.();
} catch (e) {
@@ -2044,13 +2045,13 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo
}
}));
}
-function Qi({ 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: P, genInfoToggle: F, exportBtn: ee, copyBtn: te, resetGradeBtn: ne, cmpGroup: re, audGroup: ie, ACCENT: ae, setSelectHighlighted: oe, setChannelSelectStyle: se, setValueHighlighted: ce, setGroupHighlighted: le }) {
- let ue = e?.assets?.[e?.currentIndex] || null, de = String(ue?.kind || "").toLowerCase() === "model3d";
+function ea({ 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: P, genInfoToggle: F, exportBtn: I, copyBtn: ee, resetGradeBtn: te, cmpGroup: ne, audGroup: re, ACCENT: ie, setSelectHighlighted: ae, setChannelSelectStyle: oe, setValueHighlighted: se, setGroupHighlighted: ce }) {
+ let le = e?.assets?.[e?.currentIndex] || null, ue = String(le?.kind || "").toLowerCase() === "model3d";
try {
- let e = de ? "none" : "";
- a.style.display = e, o.style.display = e, s.style.display = e, c.style.display = e, ne.style.display = e, g.style.display = de ? "inline-flex" : "none", l.panel.style.display = de ? "none" : "", u.panel.style.display = de ? "none" : "", f.panel.style.display = "", p.panel.style.display = "";
+ let e = ue ? "none" : "";
+ a.style.display = e, o.style.display = e, s.style.display = e, c.style.display = e, te.style.display = e, g.style.display = ue ? "inline-flex" : "none", l.panel.style.display = ue ? "none" : "", u.panel.style.display = ue ? "none" : "", f.panel.style.display = "", p.panel.style.display = "";
let t = h.querySelector?.(".mjr-viewer-tools-group-label");
- if (de) {
+ if (ue) {
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,
@@ -2092,10 +2093,10 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch
let r = typeof n == "function" ? !!n() : !1, 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,
+ ne.dataset.active = o ? "1" : "0", ne.style.display = o ? "" : "none", ce(ne, {
+ accentRgb: ie.compare,
active: o
- }), re.title = o ? "Compare tools (active)" : "Compare tools";
+ }), ne.title = o ? "Compare tools (active)" : "Compare tools";
} catch (e) {
console.debug?.(e);
}
@@ -2103,8 +2104,8 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch
console.debug?.(e);
}
try {
- let t = String(ue?.kind || "") === "audio";
- ie.style.display = t ? "" : "none", b.disabled = !t, b.value = String(e.audioVisualizerMode || "artistic");
+ let t = String(le?.kind || "") === "audio";
+ re.style.display = t ? "" : "none", b.disabled = !t, b.value = String(e.audioVisualizerMode || "artistic");
} catch (e) {
console.debug?.(e);
}
@@ -2132,10 +2133,10 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch
console.debug?.(e);
}
try {
- let e = String(ue?.kind || ""), t = e === "video" || e === "model3d";
- ee.style.display = t ? "" : "none", te.style.display = t ? "" : "none";
+ let e = String(le?.kind || ""), t = e === "video" || e === "model3d";
+ I.style.display = t ? "" : "none", ee.style.display = t ? "" : "none";
let n = !!(globalThis?.ClipboardItem && navigator?.clipboard?.write);
- te.style.display = t && n ? "" : "none";
+ ee.style.display = t && n ? "" : "none";
} catch (e) {
console.debug?.(e);
}
@@ -2175,14 +2176,14 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch
console.debug?.(e);
}
try {
- se(String(e.channel || "rgb"));
+ oe(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,
+ se(x.out, {
+ accentRgb: ie.exposure,
active: Math.abs(t) > 1e-4
});
} catch (e) {
@@ -2190,8 +2191,8 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch
}
try {
let t = Math.round((Number(e.gamma) || 1) * 100) / 100;
- ce(S.out, {
- accentRgb: ae.gamma,
+ se(S.out, {
+ accentRgb: ie.gamma,
active: Math.abs(t - 1) > 1e-4
});
} catch (e) {
@@ -2199,8 +2200,8 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch
}
try {
let t = String(e.scopesMode || "off");
- oe(T, {
- accentRgb: ae.analysis,
+ ae(T, {
+ accentRgb: ie.analysis,
active: t !== "off",
title: t === "off" ? "Scopes" : "Scopes (active)"
});
@@ -2209,8 +2210,8 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch
}
try {
let t = Number(e.gridMode) || 0;
- oe(D, {
- accentRgb: ae.overlay,
+ ae(D, {
+ accentRgb: ie.overlay,
active: t !== 0,
title: t === 0 ? "Grid Overlay" : "Grid Overlay (active)"
});
@@ -2219,8 +2220,8 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch
}
try {
let t = String(e.overlayFormat || "image");
- oe(k, {
- accentRgb: ae.overlay,
+ ae(k, {
+ accentRgb: ie.overlay,
active: t !== "image",
title: t === "image" ? "Format" : "Format (active)"
});
@@ -2229,8 +2230,8 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch
}
try {
let r = typeof n == "function" ? !!n() : !1, i = e.mode === t.AB_COMPARE && r, a = String(e.abCompareMode || "wipe");
- oe(y, {
- accentRgb: ae.compare,
+ ae(y, {
+ accentRgb: ie.compare,
active: i && a !== "wipe",
title: i && a !== "wipe" ? "Compare Mode (modified)" : "A/B Compare Mode"
});
@@ -2238,9 +2239,9 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch
console.debug?.(e);
}
try {
- let t = String(ue?.kind || "") === "audio", n = String(e.audioVisualizerMode || "artistic");
- oe(b, {
- accentRgb: ae.audioviz,
+ let t = String(le?.kind || "") === "audio", n = String(e.audioVisualizerMode || "artistic");
+ ae(b, {
+ accentRgb: ie.audioviz,
active: t && n !== "simple",
title: "Audio visualizer mode"
});
@@ -2249,12 +2250,12 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch
}
try {
let t = !!e.genInfoOpen, n = F?.b;
- n && t && (n.style.borderColor = `rgba(${ae.geninfo},0.55)`, n.style.background = `rgba(${ae.geninfo},0.14)`);
+ n && t && (n.style.borderColor = `rgba(${ie.geninfo},0.55)`, n.style.background = `rgba(${ie.geninfo},0.14)`);
} catch (e) {
console.debug?.(e);
}
}
-function $i({ state: e, VIEWER_MODES: t, singleBtn: n, abBtn: r, sideBtn: i, canAB: a, canSide: o }) {
+function ta({ 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";
@@ -2269,65 +2270,65 @@ function $i({ state: e, VIEWER_MODES: t, singleBtn: n, abBtn: r, sideBtn: i, can
}
//#endregion
//#region ui/features/viewer/toolbar.ts
-function ea({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: i, _onZoomIn: a, _onZoomOut: o, _onZoomReset: s, _onZoomOneToOne: c, onMode: l, onToolsChanged: u, onCompareModeChanged: d, onExportFrame: f, onCopyFrame: p, onAudioVizModeChanged: m, onToggleFullscreen: h, getCanAB: g } = {}) {
- let _ = n?.unsubs || [], v = document.createElement("div");
- v.className = "mjr-viewer-header", v.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 ";
+function na({ 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-top", y.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 ";
+ 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-header-meta mjr-viewer-header-meta--left", b.style.cssText = "display:flex; align-items:center; gap:10px; min-width:0; overflow:hidden;";
+ 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-line", x.style.cssText = "display:flex; align-items:center; justify-content:center; gap:8px; min-width:0; flex-wrap:nowrap; overflow:hidden;";
- let S = document.createElement("div");
- S.className = "mjr-viewer-title-wrap", S.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 C = document.createElement("span");
- C.className = "mjr-viewer-filename", C.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;";
+ 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 C = document.createElement("div");
+ C.className = "mjr-viewer-badges", C.style.cssText = "display:flex; gap:6px; align-items:center; flex-wrap:nowrap; min-width:0;";
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;";
+ w.className = "mjr-viewer-header-meta mjr-viewer-header-meta--right", w.style.cssText = "display:none; align-items:center; gap:10px; min-width:0; justify-content:flex-end; overflow:hidden;";
+ let T = document.createElement("span");
+ T.className = "mjr-viewer-filename mjr-viewer-filename--right", T.style.cssText = "font-size: 14px; font-weight: 500; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; text-align:right;";
+ let E = document.createElement("div");
+ E.className = "mjr-viewer-badges mjr-viewer-badges--right", E.style.cssText = "display:flex; gap:8px; align-items:center; flex-wrap:wrap; justify-content:flex-end;", b.appendChild(S), b.appendChild(C), x.appendChild(b), w.appendChild(E), w.appendChild(T);
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;", x.appendChild(C), x.appendChild(w), S.appendChild(x), 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 = Yi("Single", e.SINGLE);
- k.title = r("tooltip.singleViewMode", "Single view mode (one image)");
- let A = Yi("A/B", e.AB_COMPARE);
- A.title = r("tooltip.compareOverlayMode", "A/B compare mode (overlay)");
- let j = Yi("Side", e.SIDE_BY_SIDE);
- j.title = r("tooltip.compareSideBySide", "Side-by-side comparison mode"), O.appendChild(k), O.appendChild(A), O.appendChild(j);
- let M = Ji("X", "Close (Esc)");
- M.style.fontSize = "18px";
+ D.className = "mjr-viewer-mode-buttons", D.style.cssText = "display: flex; gap: 4px;";
+ let O = Zi("Single", e.SINGLE);
+ O.title = R("tooltip.singleViewMode", "Single view mode (one image)");
+ let k = Zi("A/B", e.AB_COMPARE);
+ k.title = R("tooltip.compareOverlayMode", "A/B compare mode (overlay)");
+ let A = Zi("Side", e.SIDE_BY_SIDE);
+ A.title = R("tooltip.compareSideBySide", "Side-by-side comparison mode"), D.appendChild(O), D.appendChild(k), D.appendChild(A);
+ let j = Xi("X", "Close (Esc)");
+ j.style.fontSize = "18px";
try {
- M.classList.add("mjr-viewer-close"), M.textContent = "";
+ j.classList.add("mjr-viewer-close"), j.textContent = "";
let e = document.createElement("span");
- e.className = "pi pi-times", e.setAttribute("aria-hidden", "true"), M.appendChild(e);
+ e.className = "pi pi-times", e.setAttribute("aria-hidden", "true"), j.appendChild(e);
} catch (e) {
console.debug?.(e);
}
- let N = Ji("[ ]", "Toggle Fullscreen (F)");
+ let M = Xi("[ ]", "Toggle Fullscreen (F)");
try {
- N.classList.add("mjr-viewer-fs");
+ M.classList.add("mjr-viewer-fs");
} catch (e) {
console.debug?.(e);
}
- N.style.fontSize = "16px";
+ M.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";
+ M.style.position = "absolute", M.style.top = "8px", M.style.left = "", M.style.right = "48px", 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";
let e = document.createElement("span");
- e.className = "pi pi-window-maximize", e.setAttribute("aria-hidden", "true"), N.textContent = "", N.appendChild(e);
+ e.className = "pi pi-window-maximize", e.setAttribute("aria-hidden", "true"), M.textContent = "", M.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)";
+ e.className = t ? "pi pi-window-minimize" : "pi pi-window-maximize", M.title = t ? "Exit Fullscreen (F)" : "Enter Fullscreen (F)";
} catch (e) {
console.debug?.(e);
}
};
- if (N.onclick = (e) => {
- e.stopPropagation(), h?.();
+ if (M.onclick = (e) => {
+ e.stopPropagation(), m?.();
}, n?.safeAddListener) n.safeAddListener(document, "fullscreenchange", t);
else try {
document.addEventListener("fullscreenchange", t);
@@ -2338,7 +2339,7 @@ function ea({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: i, _onZoomIn: a,
console.debug?.(e);
}
};
- v._mjrCleanup ? v._mjrCleanup.push(e) : v._mjrCleanup = [e];
+ _._mjrCleanup ? _._mjrCleanup.push(e) : _._mjrCleanup = [e];
} catch (e) {
console.debug?.(e);
}
@@ -2346,123 +2347,123 @@ function ea({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: i, _onZoomIn: a,
} catch (e) {
console.debug?.(e);
}
+ let N = document.createElement("div");
+ N.className = "mjr-viewer-header-area mjr-viewer-header-area--left", N.style.cssText = "display:none; align-items:center; gap:12px; min-width:0; flex:1 1 0; overflow:hidden;", N.appendChild(y);
let P = document.createElement("div");
- P.className = "mjr-viewer-header-area mjr-viewer-header-area--left", P.style.cssText = "display:none; align-items:center; gap:12px; min-width:0; flex:1 1 0; overflow:hidden;", P.appendChild(b);
+ 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(D), P.appendChild(x);
let F = document.createElement("div");
- F.className = "mjr-viewer-header-area mjr-viewer-header-area--center", F.style.cssText = "display:flex; align-items:center; justify-content:center; gap:12px; flex:1 1 auto; min-width:0;", S.appendChild(O), F.appendChild(S);
- let ee = document.createElement("div");
- ee.className = "mjr-viewer-header-area mjr-viewer-header-area--right", ee.style.cssText = "display:none; align-items:center; justify-content:flex-end; gap:12px; min-width:0; flex:1 1 0; overflow:hidden;", ee.appendChild(T), y.appendChild(P), y.appendChild(F), y.appendChild(ee);
+ F.className = "mjr-viewer-header-area mjr-viewer-header-area--right", F.style.cssText = "display:none; align-items:center; justify-content:flex-end; gap:12px; min-width:0; flex:1 1 0; overflow:hidden;", F.appendChild(w), v.appendChild(N), v.appendChild(P), v.appendChild(F);
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";
+ j.style.position = "absolute", j.style.top = "8px", j.style.left = "", j.style.right = "8px", j.style.transform = "", j.style.zIndex = "10002", j.style.width = "34px", j.style.height = "34px", j.style.padding = "0", j.style.display = "inline-flex", j.style.alignItems = "center", j.style.justifyContent = "center", j.style.borderRadius = "8px";
} catch (e) {
console.debug?.(e);
}
- v.appendChild(y), v.appendChild(N), v.appendChild(M);
- let { toolsRow: te, gradePanel: ne, overlayPanel: re, inspectPanel: ie, actionPanel: ae, infoPanel: oe, toolsActions: se, toolsMeta: ce, chGroup: le, expGroup: ue, gamGroup: de, anaGroup: fe, ovGuidesGroup: pe, ovInspectGroup: me, cmpGroup: he, audGroup: ge, model3dHint: _e, helpWrap: ve, helpBtn: ye, helpPop: be, channelsSelect: xe, exposureCtl: Se, gammaCtl: Ce, zebraToggle: we, scopesToggle: Te, scopesSelect: Ee, gridToggle: De, gridModeSelect: Oe, maskToggle: ke, formatSelect: Ae, maskOpacityCtl: je, probeToggle: Me, loupeToggle: Ne, hudToggle: Pe, focusToggle: Fe, genInfoToggle: Ie, compareModeSelect: Le, audioVizModeSelect: Re, resetGradeBtn: I, exportBtn: ze, copyBtn: Be, resetExposure: Ve, resetGamma: He, resetViewerTools: Ue, ACCENT: We, setSelectHighlighted: Ge, setChannelSelectStyle: Ke, setValueHighlighted: qe, setGroupHighlighted: Je } = Xi({
+ _.appendChild(v), _.appendChild(M), _.appendChild(j);
+ let { toolsRow: I, gradePanel: ee, overlayPanel: te, inspectPanel: ne, actionPanel: re, infoPanel: ie, toolsActions: ae, toolsMeta: oe, chGroup: se, expGroup: ce, gamGroup: le, anaGroup: ue, ovGuidesGroup: de, ovInspectGroup: fe, cmpGroup: pe, audGroup: L, model3dHint: me, helpWrap: he, helpBtn: ge, helpPop: _e, channelsSelect: ve, exposureCtl: ye, gammaCtl: be, zebraToggle: xe, scopesToggle: Se, scopesSelect: Ce, gridToggle: we, gridModeSelect: Te, maskToggle: Ee, formatSelect: De, maskOpacityCtl: Oe, probeToggle: ke, loupeToggle: Ae, hudToggle: je, focusToggle: Me, genInfoToggle: Ne, compareModeSelect: Pe, audioVizModeSelect: Fe, resetGradeBtn: Ie, exportBtn: z, copyBtn: Le, resetExposure: Re, resetGamma: ze, resetViewerTools: Be, ACCENT: Ve, setSelectHighlighted: He, setChannelSelectStyle: Ue, setValueHighlighted: We, setGroupHighlighted: Ge } = Qi({
VIEWER_MODES: e,
state: t,
- onToolsChanged: u,
- onCompareModeChanged: d,
- onExportFrame: f,
- onCopyFrame: p,
- onAudioVizModeChanged: m,
- getCanAB: g
+ onToolsChanged: l,
+ onCompareModeChanged: u,
+ onExportFrame: d,
+ onCopyFrame: f,
+ onAudioVizModeChanged: p,
+ getCanAB: h
});
- v.appendChild(te), Zi({
- unsubs: _,
+ _.appendChild(I), $i({
+ unsubs: g,
state: t,
VIEWER_MODES: e,
- onMode: l,
- onClose: i,
- onToolsChanged: u,
- onCompareModeChanged: d,
- onAudioVizModeChanged: m,
- onExportFrame: f,
- onCopyFrame: p,
- singleBtn: k,
- abBtn: A,
- sideBtn: j,
- closeBtn: M,
- channelsSelect: xe,
- compareModeSelect: Le,
- audioVizModeSelect: Re,
- exposureCtl: Se,
- gammaCtl: Ce,
- zebraToggle: we,
- scopesToggle: Te,
- scopesSelect: Ee,
- gridToggle: De,
- gridModeSelect: Oe,
- maskToggle: ke,
- formatSelect: Ae,
- maskOpacityCtl: je,
- probeToggle: Me,
- loupeToggle: Ne,
- hudToggle: Pe,
- focusToggle: Fe,
- genInfoToggle: Ie,
- resetGradeBtn: I,
- exportBtn: ze,
- copyBtn: Be,
- resetExposure: Ve,
- resetGamma: He,
- resetViewerTools: Ue,
- expGroup: ue,
- gamGroup: de
+ onMode: c,
+ onClose: r,
+ onToolsChanged: l,
+ onCompareModeChanged: u,
+ onAudioVizModeChanged: p,
+ onExportFrame: d,
+ onCopyFrame: f,
+ singleBtn: O,
+ abBtn: k,
+ sideBtn: A,
+ closeBtn: j,
+ channelsSelect: ve,
+ compareModeSelect: Pe,
+ audioVizModeSelect: Fe,
+ exposureCtl: ye,
+ gammaCtl: be,
+ zebraToggle: xe,
+ scopesToggle: Se,
+ scopesSelect: Ce,
+ gridToggle: we,
+ gridModeSelect: Te,
+ maskToggle: Ee,
+ formatSelect: De,
+ maskOpacityCtl: Oe,
+ probeToggle: ke,
+ loupeToggle: Ae,
+ hudToggle: je,
+ focusToggle: Me,
+ genInfoToggle: Ne,
+ resetGradeBtn: Ie,
+ exportBtn: z,
+ copyBtn: Le,
+ resetExposure: Re,
+ resetGamma: ze,
+ resetViewerTools: Be,
+ expGroup: ce,
+ gamGroup: le
});
- let Ye = () => Qi({
+ let Ke = () => ea({
state: t,
VIEWER_MODES: e,
- getCanAB: g,
- header: v,
- toolsRow: te,
- chGroup: le,
- expGroup: ue,
- gamGroup: de,
- anaGroup: fe,
- gradePanel: ne,
- overlayPanel: re,
- inspectPanel: ie,
- infoPanel: oe,
- actionPanel: ae,
- ovGuidesGroup: pe,
- ovInspectGroup: me,
- model3dHint: _e,
- helpWrap: ve,
- channelsSelect: xe,
- compareModeSelect: Le,
- audioVizModeSelect: Re,
- exposureCtl: Se,
- gammaCtl: Ce,
- zebraToggle: we,
- scopesToggle: Te,
- scopesSelect: Ee,
- gridToggle: De,
- gridModeSelect: Oe,
- maskToggle: ke,
- formatSelect: Ae,
- maskOpacityCtl: je,
- probeToggle: Me,
- loupeToggle: Ne,
- hudToggle: Pe,
- focusToggle: Fe,
- genInfoToggle: Ie,
- exportBtn: ze,
- copyBtn: Be,
- resetGradeBtn: I,
- cmpGroup: he,
- audGroup: ge,
- ACCENT: We,
- setSelectHighlighted: Ge,
- setChannelSelectStyle: Ke,
- setValueHighlighted: qe,
- setGroupHighlighted: Je
- }), L = ({ canAB: n, canSide: r } = {}) => $i({
+ getCanAB: h,
+ header: _,
+ toolsRow: I,
+ chGroup: se,
+ expGroup: ce,
+ gamGroup: le,
+ anaGroup: ue,
+ gradePanel: ee,
+ overlayPanel: te,
+ inspectPanel: ne,
+ infoPanel: ie,
+ actionPanel: re,
+ ovGuidesGroup: de,
+ ovInspectGroup: fe,
+ model3dHint: me,
+ helpWrap: he,
+ channelsSelect: ve,
+ compareModeSelect: Pe,
+ audioVizModeSelect: Fe,
+ exposureCtl: ye,
+ gammaCtl: be,
+ zebraToggle: xe,
+ scopesToggle: Se,
+ scopesSelect: Ce,
+ gridToggle: we,
+ gridModeSelect: Te,
+ maskToggle: Ee,
+ formatSelect: De,
+ maskOpacityCtl: Oe,
+ probeToggle: ke,
+ loupeToggle: Ae,
+ hudToggle: je,
+ focusToggle: Me,
+ genInfoToggle: Ne,
+ exportBtn: z,
+ copyBtn: Le,
+ resetGradeBtn: Ie,
+ cmpGroup: pe,
+ audGroup: L,
+ ACCENT: Ve,
+ setSelectHighlighted: He,
+ setChannelSelectStyle: Ue,
+ setValueHighlighted: We,
+ setGroupHighlighted: Ge
+ }), B = ({ canAB: n, canSide: r } = {}) => ta({
state: t,
VIEWER_MODES: e,
- singleBtn: k,
- abBtn: A,
- sideBtn: j,
+ singleBtn: O,
+ abBtn: k,
+ sideBtn: A,
canAB: n,
canSide: r
});
@@ -2475,20 +2476,20 @@ function ea({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: i, _onZoomIn: a,
}
e = null;
try {
- be.style.display = "none";
+ _e.style.display = "none";
} catch (e) {
console.debug?.(e);
}
}, n = () => {
t(), e = new AbortController();
try {
- be.style.display = "";
+ _e.style.display = "";
} catch (e) {
console.debug?.(e);
}
try {
document.addEventListener("mousedown", (e) => {
- ve.contains(e.target) || t();
+ he.contains(e.target) || t();
}, {
capture: !0,
signal: e.signal
@@ -2506,34 +2507,34 @@ function ea({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: i, _onZoomIn: a,
console.debug?.(e);
}
};
- _.push(() => t()), _.push(z(ye, "click", () => {
- be.style.display === "none" ? n() : t();
+ g.push(() => t()), g.push(wt(ge, "click", () => {
+ _e.style.display === "none" ? n() : t();
}));
} catch (e) {
console.debug?.(e);
}
return {
- headerEl: v,
- headerTopEl: y,
- filenameEl: C,
- badgesBarEl: w,
- filenameRightEl: E,
- badgesBarRightEl: D,
- leftAreaEl: P,
- leftMetaEl: b,
- centerAreaEl: F,
- rightMetaEl: T,
- rightAreaEl: ee,
- titleLineEl: x,
- titleWrapEl: S,
- modeButtonsEl: O,
- syncToolsUIFromState: Ye,
- syncModeButtons: L
+ headerEl: _,
+ headerTopEl: v,
+ filenameEl: S,
+ badgesBarEl: C,
+ filenameRightEl: T,
+ badgesBarRightEl: E,
+ leftAreaEl: N,
+ leftMetaEl: y,
+ centerAreaEl: P,
+ rightMetaEl: w,
+ rightAreaEl: F,
+ titleLineEl: b,
+ titleWrapEl: x,
+ modeButtonsEl: D,
+ syncToolsUIFromState: Ke,
+ syncModeButtons: B
};
}
//#endregion
//#region ui/features/viewer/keyboard.ts
-function ta(e) {
+function ra(e) {
if (!e) return null;
try {
if (typeof e.prompt == "string" && e.prompt.trim()) return e.prompt.trim();
@@ -2563,49 +2564,49 @@ function ta(e) {
}
return null;
}
-function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a, computeOneToOneZoom: o, setZoom: c, scheduleOverlayRedraw: l, scheduleApplyGrade: u, syncToolsUIFromState: d, 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: C } = {}) {
- let w = S?.unsubs || [], T = null, E = null, D = () => {
+function ia({ overlay: e, _content: t, singleView: n, state: r, VIEWER_MODES: i, computeOneToOneZoom: a, setZoom: o, scheduleOverlayRedraw: s, scheduleApplyGrade: c, syncToolsUIFromState: l, applyDistractionFreeUI: u, navigateViewerAssets: d, closeViewer: f, renderBadges: p, updateAssetRating: h, safeDispatchCustomEvent: g, ASSET_RATING_CHANGED_EVENT: _, probeTooltip: v, loupeWrap: y, getVideoControls: b, lifecycle: x, renderGenInfoPanel: S } = {}) {
+ let C = x?.unsubs || [], w = null, T = null, E = () => {
try {
- T && clearTimeout(T);
+ w && clearTimeout(w);
} catch (e) {
console.debug?.(e);
}
- T = null, E = null;
- }, O = (e, t) => {
- D(), E = {
+ w = null, T = null;
+ }, D = (e, t) => {
+ E(), T = {
assetId: e,
rating: t
- }, T = setTimeout(async () => {
- let e = E;
- if (T = null, E = null, e?.assetId) try {
- let t = await g?.(e.assetId, e.rating);
+ }, w = setTimeout(async () => {
+ let e = T;
+ if (w = null, T = null, e?.assetId) try {
+ let t = await h?.(e.assetId, e.rating);
if (!t?.ok) {
- s(t?.error || r("toast.ratingUpdateFailed"), "error");
+ m(t?.error || R("toast.ratingUpdateFailed"), "error");
return;
}
- s(r("toast.ratingSetN", { n: e.rating }), "success", 1500), _?.(v, {
+ m(R("toast.ratingSetN", { n: e.rating }), "success", 1500), g?.(_, {
assetId: String(e.assetId),
rating: e.rating
}, { warnPrefix: "[Viewer]" });
} catch {
- s(r("toast.ratingUpdateError"), "error");
+ m(R("toast.ratingUpdateError"), "error");
}
}, 300);
- }, k = () => {
+ }, O = () => {
try {
document.fullscreenElement ? document?.exitFullscreen?.() : e?.requestFullscreen?.();
} catch (e) {
console.debug?.(e);
}
- }, A = (t) => {
- let g = () => {
+ }, k = (t) => {
+ let h = () => {
try {
t.preventDefault(), t.stopPropagation(), t.stopImmediatePropagation?.();
} catch (e) {
console.debug?.(e);
}
};
- if (L()) return;
+ if (Ze()) return;
try {
if (e?.style?.display === "none") return;
} catch (e) {
@@ -2615,34 +2616,34 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a,
let e = t?.target;
if (e && (e.tagName === "INPUT" || e.tagName === "TEXTAREA" || e.isContentEditable)) {
if (t.key === "f" || t.key === "F") {
- g(), k();
+ h(), O();
return;
}
- t.key === "Escape" && (g(), R(m));
+ t.key === "Escape" && (h(), V(f));
return;
}
} catch (e) {
console.debug?.(e);
}
- let _ = i?.mode === a?.SINGLE, v = i?.assets?.[i?.currentIndex], S = async (e) => {
- if (!_ || !v?.id || e !== "0" && e !== "1" && e !== "2" && e !== "3" && e !== "4" && e !== "5") return !1;
+ let g = r?.mode === i?.SINGLE, _ = r?.assets?.[r?.currentIndex], x = async (e) => {
+ if (!g || !_?.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 v.rating = t, R(h), O(v.id, t), !0;
+ return _.rating = t, V(p), D(_.id, t), !0;
} catch {
return !0;
}
- }, w = () => {
+ }, C = () => {
try {
- return x?.() || null;
+ return b?.() || null;
} catch {
return null;
}
- }, T = async (e) => {
- if (!_ || v?.kind !== "video") return !1;
+ }, w = async (e) => {
+ if (!g || _?.kind !== "video") return !1;
try {
- let t = w();
+ let t = C();
if (t?.stepFrames) return t.stepFrames(e), !0;
} catch (e) {
console.debug?.(e);
@@ -2670,44 +2671,44 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a,
} catch {
return !0;
}
- }, E = (e, { absolute: t = !1 } = {}) => {
+ }, T = (e, { absolute: t = !1 } = {}) => {
try {
- let n = w();
+ let n = C();
if (!n) return !1;
if (t) {
let t = n.setPlaybackRate?.(e);
- return Number.isFinite(Number(t)) ? (i.playbackRate = Number(t), s(r("toast.playbackRate", "Playback {rate}x", { rate: Number(t).toFixed(2) }), "info", 1200), !0) : !1;
+ return Number.isFinite(Number(t)) ? (r.playbackRate = Number(t), m(R("toast.playbackRate", "Playback {rate}x", { rate: Number(t).toFixed(2) }), "info", 1200), !0) : !1;
}
- let a = n.adjustPlaybackRate?.(e);
- return Number.isFinite(Number(a)) ? (i.playbackRate = Number(a), s(r("toast.playbackRate", "Playback {rate}x", { rate: Number(a).toFixed(2) }), "info", 1200), !0) : !1;
+ let i = n.adjustPlaybackRate?.(e);
+ return Number.isFinite(Number(i)) ? (r.playbackRate = Number(i), m(R("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 = ta(v);
+ let e = ra(_);
if (e) {
- g(), navigator.clipboard?.writeText?.(e).then(() => s(r("toast.promptCopied", "Prompt copied to clipboard"), "success", 1500)).catch(() => s(r("toast.copyFailed", "Copy failed"), "error", 1500));
+ h(), navigator.clipboard?.writeText?.(e).then(() => m(R("toast.promptCopied", "Prompt copied to clipboard"), "success", 1500)).catch(() => m(R("toast.copyFailed", "Copy failed"), "error", 1500));
return;
}
} catch (e) {
console.debug?.(e);
}
- if (_ && !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(), S(t.key);
+ if (g && !t.altKey && !t.ctrlKey && !t.metaKey && (t.key === "0" || t.key === "1" || t.key === "2" || t.key === "3" || t.key === "4" || t.key === "5")) {
+ h(), x(t.key);
return;
}
switch (t.key) {
case "1": {
if (!t.altKey) break;
- let e = R(o);
+ let e = V(a);
if (e == null) break;
- g();
+ h();
try {
- let t = Math.abs((Number(i?.zoom) || 1) - e) < .01;
- c?.(t ? 1 : e, {
- clientX: i?._lastPointerX,
- clientY: i?._lastPointerY
+ let t = Math.abs((Number(r?.zoom) || 1) - e) < .01;
+ o?.(t ? 1 : e, {
+ clientX: r?._lastPointerX,
+ clientY: r?._lastPointerY
});
} catch (e) {
console.debug?.(e);
@@ -2716,104 +2717,104 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a,
}
case "g":
case "G":
- g();
+ h();
try {
- i.gridMode = ((Number(i.gridMode) || 0) + 1) % 5;
+ r.gridMode = ((Number(r.gridMode) || 0) + 1) % 5;
} catch (e) {
console.debug?.(e);
}
- R(l), R(d);
+ V(s), V(l);
break;
case "f":
case "F":
- g(), k();
+ h(), O();
break;
case "d":
case "D":
- g();
+ h();
try {
- i.genInfoOpen = !i.genInfoOpen;
+ r.genInfoOpen = !r.genInfoOpen;
} catch (e) {
console.debug?.(e);
}
- R(d), R(C);
+ V(l), V(S);
break;
case "z":
case "Z":
- g();
+ h();
try {
- i.analysisMode = i.analysisMode === "zebra" ? "none" : "zebra";
+ r.analysisMode = r.analysisMode === "zebra" ? "none" : "zebra";
} catch (e) {
console.debug?.(e);
}
- R(d), R(u);
+ V(l), V(c);
break;
case "i":
case "I":
- if (_ && v?.kind === "video" && w()?.setInPoint?.()) {
- g(), s(r("toast.inPointSet", "In point set"), "info", 1200);
+ if (g && _?.kind === "video" && C()?.setInPoint?.()) {
+ h(), m(R("toast.inPointSet", "In point set"), "info", 1200);
break;
}
- g();
+ h();
try {
- i.probeEnabled = !i.probeEnabled;
+ r.probeEnabled = !r.probeEnabled;
} catch (e) {
console.debug?.(e);
}
try {
- i.probeEnabled || (y.style.display = "none");
+ r.probeEnabled || (v.style.display = "none");
} catch (e) {
console.debug?.(e);
}
- R(d);
+ V(l);
break;
case "o":
case "O":
- if (_ && v?.kind === "video" && w()?.setOutPoint?.()) {
- g(), s(r("toast.outPointSet", "Out point set"), "info", 1200);
+ if (g && _?.kind === "video" && C()?.setOutPoint?.()) {
+ h(), m(R("toast.outPointSet", "Out point set"), "info", 1200);
break;
}
break;
case "Home":
- if (_ && v?.kind === "video" && w()?.goToIn?.()) {
- g();
+ if (g && _?.kind === "video" && C()?.goToIn?.()) {
+ h();
break;
}
break;
case "End":
- if (_ && v?.kind === "video" && w()?.goToOut?.()) {
- g();
+ if (g && _?.kind === "video" && C()?.goToOut?.()) {
+ h();
break;
}
break;
case "l":
case "L":
- g();
+ h();
try {
- i.loupeEnabled = !i.loupeEnabled;
+ r.loupeEnabled = !r.loupeEnabled;
} catch (e) {
console.debug?.(e);
}
try {
- i.loupeEnabled || (b.style.display = "none");
+ r.loupeEnabled || (y.style.display = "none");
} catch (e) {
console.debug?.(e);
}
- R(d);
+ V(l);
break;
case "x":
case "X":
- g();
+ h();
try {
- i.distractionFree = !i.distractionFree;
+ r.distractionFree = !r.distractionFree;
} catch (e) {
console.debug?.(e);
}
- R(d), R(f), R(C);
+ V(l), V(u), V(S);
break;
case "c":
case "C": {
- let e = i?._probe;
+ let e = r?._probe;
if (!e || e.r == null || e.g == null || e.b == null) break;
let t = `#${[
e.r,
@@ -2822,7 +2823,7 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a,
].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(() => {}));
+ e?.writeText && (h(), e.writeText(t).catch(() => {}));
} catch (e) {
console.debug?.(e);
}
@@ -2830,12 +2831,12 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a,
}
case " ":
case "Spacebar":
- if (_ && v?.kind === "video") {
+ if (g && _?.kind === "video") {
let e = n?.querySelector?.("video");
if (e) {
- g();
+ h();
try {
- let e = w();
+ let e = C();
if (e?.togglePlay) {
e.togglePlay();
break;
@@ -2856,7 +2857,7 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a,
}
break;
case "Tab":
- g();
+ h();
try {
e?.contains?.(document.activeElement) || e?.focus?.();
} catch (e) {
@@ -2864,41 +2865,41 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a,
}
break;
case "Escape":
- g(), R(m);
+ h(), V(f);
break;
case "ArrowLeft":
- if (_ && t.target?.closest?.(".mjr-viewer-playerbar")) {
- g(), T(-1);
+ if (g && t.target?.closest?.(".mjr-viewer-playerbar")) {
+ h(), w(-1);
break;
}
- g(), R(() => p?.(-1));
+ h(), V(() => d?.(-1));
break;
case "ArrowRight":
- if (_ && t.target?.closest?.(".mjr-viewer-playerbar")) {
- g(), T(1);
+ if (g && t.target?.closest?.(".mjr-viewer-playerbar")) {
+ h(), w(1);
break;
}
- g(), R(() => p?.(1));
+ h(), V(() => d?.(1));
break;
case "[":
case "{":
- g(), E(-.25) || s(r("toast.playbackVideoOnly"), "warning", 1400);
+ h(), T(-.25) || m(R("toast.playbackVideoOnly"), "warning", 1400);
break;
case "]":
case "}":
- g(), E(.25) || s(r("toast.playbackVideoOnly"), "warning", 1400);
+ h(), T(.25) || m(R("toast.playbackVideoOnly"), "warning", 1400);
break;
case "\\":
case "|":
- g(), E(1, { absolute: !0 }) || s(r("toast.playbackVideoOnly"), "warning", 1400);
+ h(), T(1, { absolute: !0 }) || m(R("toast.playbackVideoOnly"), "warning", 1400);
break;
case "+":
case "=":
- g();
+ h();
try {
- c?.((Number(i?.zoom) || 1) + .25, {
- clientX: i?._lastPointerX,
- clientY: i?._lastPointerY
+ o?.((Number(r?.zoom) || 1) + .25, {
+ clientX: r?._lastPointerX,
+ clientY: r?._lastPointerY
});
} catch (e) {
console.debug?.(e);
@@ -2906,43 +2907,43 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a,
break;
case "-":
case "_":
- g();
+ h();
try {
- c?.((Number(i?.zoom) || 1) - .25, {
- clientX: i?._lastPointerX,
- clientY: i?._lastPointerY
+ o?.((Number(r?.zoom) || 1) - .25, {
+ clientX: r?._lastPointerX,
+ clientY: r?._lastPointerY
});
} catch (e) {
console.debug?.(e);
}
break;
}
- }, j = null, M = () => {
+ }, A = null, j = () => {
try {
- if (j) return;
- j = z(window, "keydown", A, !0);
+ if (A) return;
+ A = wt(window, "keydown", k, !0);
} catch (e) {
console.debug?.(e);
}
- }, N = () => {
+ }, M = () => {
try {
- R(j);
+ V(A);
} catch (e) {
console.debug?.(e);
}
- j = null;
+ A = null;
};
- return w.push(() => D()), w.push(() => N()), {
- bind: M,
- unbind: N,
+ return C.push(() => E()), C.push(() => M()), {
+ bind: j,
+ unbind: M,
dispose: () => {
- D(), N();
+ E(), M();
}
};
}
//#endregion
//#region ui/features/viewer/grid.ts
-function ra({ gridCanvas: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia: i, getViewportRect: a, clearCanvas: o } = {}) {
+function aa({ gridCanvas: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia: i, getViewportRect: a, clearCanvas: o } = {}) {
let s = () => {
try {
let e = n?.mode;
@@ -3356,7 +3357,7 @@ function ra({ gridCanvas: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMe
}
//#endregion
//#region ui/features/viewer/probe.ts
-function ia({ 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 } = {}) {
+function oa({ 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;
@@ -3472,7 +3473,7 @@ function ia({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia
} catch (e) {
console.debug?.(e);
}
- R(() => s?.(c, t, o, {
+ V(() => s?.(c, t, o, {
offsetX: 18,
offsetY: 18
}));
@@ -3481,7 +3482,7 @@ function ia({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia
} catch (e) {
console.debug?.(e);
}
- if (n?.loupeEnabled) R(() => u?.(d, S, C, t, o));
+ if (n?.loupeEnabled) V(() => u?.(d, S, C, t, o));
else try {
l.style.display = "none";
} catch (e) {
@@ -3502,7 +3503,7 @@ function ia({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia
}
};
try {
- t && !t._mjrProbeBound && (f.push(z(t, "mousemove", (e) => {
+ t && !t._mjrProbeBound && (f.push(wt(t, "mousemove", (e) => {
try {
S(e.clientX, e.clientY);
} catch (e) {
@@ -3511,7 +3512,7 @@ function ia({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia
}, {
passive: !0,
capture: !0
- })), f.push(z(t, "mouseleave", () => {
+ })), f.push(wt(t, "mouseleave", () => {
v();
}, {
passive: !0,
@@ -3534,7 +3535,7 @@ function ia({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia
}
//#endregion
//#region ui/features/viewer/loupe.ts
-function aa({ state: e, loupeCanvas: t, loupeWrap: n, getMediaNaturalSize: r, positionOverlayBox: i } = {}) {
+function sa({ state: e, loupeCanvas: t, loupeWrap: n, getMediaNaturalSize: r, positionOverlayBox: i } = {}) {
let a = null;
try {
a = t?.getContext?.("2d", { willReadFrequently: !0 });
@@ -3588,7 +3589,7 @@ function aa({ state: e, loupeCanvas: t, loupeWrap: n, getMediaNaturalSize: r, po
}
//#endregion
//#region ui/features/viewer/metadata.ts
-function oa({ state: e, VIEWER_MODES: t, APP_CONFIG: n, getAssetMetadata: r, getAssetsBatch: i } = {}) {
+function ca({ 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();
@@ -3716,27 +3717,27 @@ function oa({ state: e, VIEWER_MODES: t, APP_CONFIG: n, getAssetMetadata: r, get
}
},
abort: () => {
- R(() => l?.abort?.()), l = null;
+ V(() => l?.abort?.()), l = null;
},
dispose: () => {
- R(() => l?.abort?.()), l = null, R(() => a.clear());
+ V(() => l?.abort?.()), l = null, V(() => a.clear());
},
cleanupCache: () => {
- R(u);
+ V(u);
},
- _noop: Ot
+ _noop: Kt
};
}
//#endregion
//#region ui/features/viewer/constants.ts
-var sa = Object.freeze({
+var la = Object.freeze({
MIN: .1,
MAX: 16
});
//#endregion
//#region ui/features/viewer/panzoom.ts
-function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, state: a, VIEWER_MODES: o, scheduleOverlayRedraw: s, lifecycle: c } = {}) {
- let l = c?.safeCall || R, u = c?.safeAddListener || z, d = c?.unsubs || [], f = () => {
+function ua({ overlay: e, content: t, singleView: n, abView: r, sideView: i, state: a, VIEWER_MODES: o, scheduleOverlayRedraw: s, lifecycle: c } = {}) {
+ let l = c?.safeCall || V, u = c?.safeAddListener || wt, d = c?.unsubs || [], f = () => {
try {
return a?.mode === o?.SINGLE && n?.querySelector?.(".mjr-viewer-media") || null;
} catch {
@@ -3814,7 +3815,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta
}, _ = () => {
try {
if (!e || e.style.display === "none") return;
- let s = Math.max(sa.MIN, Math.min(sa.MAX, Number(a?.zoom) || 1)), c = a?.assets?.[a?.currentIndex], l = Number(c?.width) || 0, u = Number(c?.height) || 0;
+ let s = Math.max(la.MIN, Math.min(la.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;
@@ -3879,7 +3880,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta
console.debug?.(e);
}
}, v = () => {
- let e = Math.max(sa.MIN, Math.min(sa.MAX, Number(a?.zoom) || 1)), t = Number(a?.panX) || 0, n = Number(a?.panY) || 0;
+ let e = Math.max(la.MIN, Math.min(la.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 {
@@ -3934,7 +3935,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta
}
}, x = (e, { clientX: n = null, clientY: r = null } = {}) => {
try {
- let i = Math.max(sa.MIN, Math.min(sa.MAX, Number(a?.zoom) || 1)), o = Math.max(sa.MIN, Math.min(sa.MAX, Number(e) || i));
+ let i = Math.max(la.MIN, Math.min(la.MAX, Number(a?.zoom) || 1)), o = Math.max(la.MIN, Math.min(la.MAX, Number(e) || i));
try {
a._userInteracted = !0;
} catch (e) {
@@ -4006,7 +4007,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta
try {
let a = S(e, t, n, r);
if (!(a.w > 0 && a.h > 0)) return !1;
- let o = Math.max(sa.MIN, Math.min(sa.MAX, Number(i) || 1)), s = a.w * o, c = a.h * o;
+ let o = Math.max(la.MIN, Math.min(la.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;
@@ -4022,7 +4023,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta
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(sa.MIN, Math.min(sa.MAX, a));
+ return !Number.isFinite(a) || a <= 0 ? null : Math.max(la.MIN, Math.min(la.MAX, a));
} catch {
return null;
}
@@ -4037,7 +4038,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta
if (!e || e.style.display === "none" || Hn(n?.target)) return;
let r = Number(a?.zoom) || 1, i = (() => {
try {
- return !!I?.VIEWER_ALLOW_PAN_AT_ZOOM_1;
+ return !!z?.VIEWER_ALLOW_PAN_AT_ZOOM_1;
} catch {
return !1;
}
@@ -4138,7 +4139,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta
} catch (e) {
console.debug?.(e);
}
- let t = (Number(e.clientX) || 0) - D.startX, n = (Number(e.clientY) || 0) - D.startY, r = Math.max(sa.MIN, Math.min(sa.MAX, Number(a?.zoom) || 1)), i = Math.max(1, r);
+ let t = (Number(e.clientX) || 0) - D.startX, n = (Number(e.clientY) || 0) - D.startY, r = Math.max(la.MIN, Math.min(la.MAX, Number(a?.zoom) || 1)), i = Math.max(1, r);
a.panX = D.startPanX + t * i, a.panY = D.startPanY + n * i;
try {
a._lastPointerX = e.clientX, a._lastPointerY = e.clientY;
@@ -4228,12 +4229,12 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta
}
//#endregion
//#region ui/features/viewer/videoProcessorWebGL.ts
-var la = "\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", ua = "\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 da(e, t, n) {
+var da = "\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", fa = "\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 pa(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 fa(e, t, n) {
+function ma(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));
@@ -4246,7 +4247,7 @@ function fa(e, t, n) {
}
return r;
}
-function pa() {
+function ha() {
try {
let e = document.createElement("canvas");
return !!(window.WebGLRenderingContext && (e.getContext("webgl") || e.getContext("experimental-webgl")));
@@ -4254,7 +4255,7 @@ function pa() {
return !1;
}
}
-function ma(e) {
+function ga(e) {
let { canvas: t, videoEl: n, getGradeParams: r } = e, i = null, a = null, o = 4096, s = !1, c = {
type: "webgl",
ready: !1,
@@ -4324,9 +4325,9 @@ function ma(e) {
}, f = () => {
if (!i) return null;
d();
- let e = da(i, i.VERTEX_SHADER, la), t = da(i, i.FRAGMENT_SHADER, ua);
+ let e = pa(i, i.VERTEX_SHADER, da), t = pa(i, i.FRAGMENT_SHADER, fa);
if (!e || !t) return e && i.deleteShader(e), t && i.deleteShader(t), null;
- let n = fa(i, e, t);
+ let n = ma(i, e, t);
if (i.deleteShader(e), i.deleteShader(t), !n) return null;
u("setupResources:createProgram");
let r = {
@@ -4403,10 +4404,10 @@ function ma(e) {
}
//#endregion
//#region ui/features/viewer/videoProcessor.ts
-function ha({ 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 ? !!I?.VIEWER_PAUSE_DURING_EXECUTION : !!r, p = null;
- if (!n && pa()) try {
- p = ma({
+function _a({ 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 ? !!z?.VIEWER_PAUSE_DURING_EXECUTION : !!r, p = null;
+ if (!n && ha()) try {
+ p = ga({
canvas: e,
videoEl: t,
getGradeParams: i,
@@ -4786,7 +4787,7 @@ function ha({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r =
} catch (e) {
console.debug?.(e);
}
- }, { passive: !0 }) || (() => {})), f && (window.addEventListener(B.RUNTIME_STATUS, F), String(window?.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && j());
+ }, { passive: !0 }) || (() => {})), f && (window.addEventListener(H.RUNTIME_STATUS, F), String(window?.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && j());
} catch (e) {
console.debug?.(e);
}
@@ -4802,7 +4803,7 @@ function ha({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r =
destroy: () => {
p && p.destroy(), y._destroyed = !0;
try {
- window.removeEventListener(B.RUNTIME_STATUS, F);
+ window.removeEventListener(H.RUNTIME_STATUS, F);
} catch (e) {
console.debug?.(e);
}
@@ -4854,11 +4855,11 @@ function ha({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r =
}
//#endregion
//#region ui/features/viewer/audioVisualizer.ts
-function ga(e, t, n) {
+function va(e, t, n) {
let r = Number(e);
return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t;
}
-function _a(e) {
+function ya(e) {
try {
let t = String(e || "").toLowerCase();
if (t === "simple" || t === "artistic") return t;
@@ -4867,7 +4868,7 @@ function _a(e) {
console.debug?.(e);
}
try {
- let e = String(I?.VIEWER_AUDIO_VISUALIZER_MODE || "simple").toLowerCase();
+ let e = String(z?.VIEWER_AUDIO_VISUALIZER_MODE || "simple").toLowerCase();
if (e === "artistic") return "artistic";
if (e === "webgl3d" || e === "webgl") return "simple";
} catch (e) {
@@ -4875,7 +4876,7 @@ function _a(e) {
}
return "simple";
}
-function va(e) {
+function ba(e) {
let t = e.getContext("2d");
if (!t) return null;
let n = (e, t) => {
@@ -4925,7 +4926,7 @@ function va(e) {
destroy() {}
};
}
-function ya(e, { pseudo3d: t = !1 } = {}) {
+function xa(e, { pseudo3d: t = !1 } = {}) {
let n = null;
try {
n = e.getContext("webgl", {
@@ -4972,7 +4973,7 @@ function ya(e, { pseudo3d: t = !1 } = {}) {
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 = ga((.18 + c * .32) * u, -.95, .95);
+ 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 = va((.18 + c * .32) * u, -.95, .95);
s[e * 2] = a, s[e * 2 + 1] = d;
}
u(s, [
@@ -4983,7 +4984,7 @@ function ya(e, { pseudo3d: t = !1 } = {}) {
]);
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 = ga(-u * .62 * f, -.95, 0);
+ 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 = va(-u * .62 * f, -.95, 0);
c[e * 2] = a, c[e * 2 + 1] = h;
}
u(c, [
@@ -5020,17 +5021,17 @@ function ya(e, { pseudo3d: t = !1 } = {}) {
}
};
}
-function ba({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = {}) {
+function Sa({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = {}) {
if (!e || !t) return { destroy() {} };
- let i = r == null ? !!I?.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 / ga(I?.VIEWER_AUDIO_VIS_FPS ?? 24, 8, 60), g = _a(n), _ = () => {
+ let i = r == null ? !!z?.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 / va(z?.VIEWER_AUDIO_VIS_FPS ?? 24, 8, 60), g = ya(n), _ = () => {
try {
- let t = ga(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));
+ let t = va(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 = _a(t);
+ g = ya(t);
try {
f?.destroy?.();
} catch (e) {
@@ -5043,12 +5044,12 @@ function ba({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } =
console.debug?.(e);
}
try {
- g === "artistic" && !I?.VIEWER_DISABLE_WEBGL_AUDIO && (f = ya(e, { pseudo3d: !0 }));
+ g === "artistic" && !z?.VIEWER_DISABLE_WEBGL_AUDIO && (f = xa(e, { pseudo3d: !0 }));
} catch (e) {
console.debug?.(e);
}
if (!f) try {
- f = va(e);
+ f = ba(e);
} catch (e) {
console.debug?.(e), f = null;
}
@@ -5114,7 +5115,7 @@ function ba({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } =
console.debug?.(e);
}
try {
- t.addEventListener("play", C, { passive: !0 }), t.addEventListener("pause", w, { passive: !0 }), t.addEventListener("ended", T, { passive: !0 }), window.addEventListener("resize", E, { passive: !0 }), i && (window.addEventListener(B.RUNTIME_STATUS, D), String(window?.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (m = !0));
+ t.addEventListener("play", C, { passive: !0 }), t.addEventListener("pause", w, { passive: !0 }), t.addEventListener("ended", T, { passive: !0 }), window.addEventListener("resize", E, { passive: !0 }), i && (window.addEventListener(H.RUNTIME_STATUS, D), String(window?.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (m = !0));
} catch (e) {
console.debug?.(e);
}
@@ -5126,7 +5127,7 @@ function ba({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } =
if (!o) {
o = !0, S();
try {
- t.removeEventListener("play", C), t.removeEventListener("pause", w), t.removeEventListener("ended", T), window.removeEventListener("resize", E), window.removeEventListener(B.RUNTIME_STATUS, D);
+ t.removeEventListener("play", C), t.removeEventListener("pause", w), t.removeEventListener("ended", T), window.removeEventListener("resize", E), window.removeEventListener(H.RUNTIME_STATUS, D);
} catch (e) {
console.debug?.(e);
}
@@ -5157,8 +5158,8 @@ function ba({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } =
}
//#endregion
//#region ui/features/viewer/mediaFactory.ts
-function xa({ 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 || R, _ = m || z, v = (e) => {
+function Ca({ 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 || V, _ = m || wt, v = (e) => {
try {
let t = String(e?.ext || "").trim().toLowerCase();
if (t) return t.startsWith(".") ? t : `.${t}`;
@@ -5355,7 +5356,7 @@ function xa({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r
let o = document.createElement("audio");
o.className = "mjr-viewer-audio-src", o.src = n, o.controls = !1, o.autoplay = !0, o.preload = "metadata", o.style.cssText = "width: min(680px, 90%);";
try {
- let e = ba({
+ let e = Sa({
canvas: a,
audioEl: o,
mode: t?.audioVisualizerMode,
@@ -5441,10 +5442,10 @@ function xa({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r
} catch {}
v.style.cssText = "position:absolute; width:1px; height:1px; opacity:0; pointer-events:none;", T(v, e);
try {
- u._mjrProc = ha({
+ u._mjrProc = _a({
canvas: u,
videoEl: v,
- disableWebGL: f || !!I.VIEWER_DISABLE_WEBGL_VIDEO,
+ disableWebGL: f || !!z.VIEWER_DISABLE_WEBGL_VIDEO,
pauseDuringExecution: !0,
getGradeParams: s,
isDefaultGrade: c,
@@ -5621,7 +5622,7 @@ function xa({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r
} catch {}
h.style.cssText = "position:absolute; width:1px; height:1px; opacity:0; pointer-events:none;", T(h, e);
try {
- m._mjrProc = ha({
+ m._mjrProc = _a({
canvas: m,
videoEl: h,
pauseDuringExecution: !0,
@@ -5723,7 +5724,7 @@ function xa({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r
}
//#endregion
//#region ui/features/viewer/imagePreloader.ts
-function Sa({ buildAssetViewURL: e, IMAGE_PRELOAD_EXTENSIONS: t, state: n }) {
+function wa({ buildAssetViewURL: e, IMAGE_PRELOAD_EXTENSIONS: t, state: n }) {
function r(e) {
if (!e) return null;
if (e.id != null) return `id:${e.id}`;
@@ -5807,8 +5808,8 @@ function Sa({ buildAssetViewURL: e, IMAGE_PRELOAD_EXTENSIONS: t, state: n }) {
}
//#endregion
//#region ui/features/viewer/viewerInstanceManager.ts
-function Ca(e) {
- let t = Ue();
+function Ta(e) {
+ let t = Ge();
if (t.length) {
let e = t[t.length - 1];
for (let n of t) if (n !== e) {
@@ -5831,11 +5832,11 @@ function Ca(e) {
}
}
let n = e();
- return Ye(n), n._mjrViewerAPI;
+ return Xe(n), n._mjrViewerAPI;
}
//#endregion
//#region ui/features/viewer/playerBarManager.ts
-function wa({ 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 Ea({ 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();
@@ -5934,10 +5935,10 @@ function wa({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, p
try {
let e = (e) => {
try {
- let t = Vt(e);
+ let t = qt(e);
return {
fps: t,
- frameCount: Ut(e, t)
+ frameCount: At(e, t)
};
} catch {
return {
@@ -6076,7 +6077,7 @@ function wa({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, p
}
if (E === "video") {
try {
- let t = (e) => Dt(e), n = (e) => {
+ let t = (e) => Wt(e), n = (e) => {
let t = Number(e);
return !Number.isFinite(t) || t <= 0 ? null : Math.floor(t);
}, r = (e) => {
@@ -6169,12 +6170,12 @@ function wa({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, p
}
//#endregion
//#region ui/features/viewer/viewerThemeStyles.ts
-var Ta = "min(400px, 42vw)", Ea = `calc(${Ta} + 24px)`, Da = "mjr-viewer-modern-theme";
-function Oa() {
+var Da = "min(400px, 42vw)", Oa = `calc(${Da} + 24px)`, ka = "mjr-viewer-modern-theme";
+function Aa() {
try {
- if (document.getElementById(Da)) return;
+ if (document.getElementById(ka)) return;
let e = document.createElement("style");
- e.id = Da, e.textContent = `
+ e.id = ka, e.textContent = `
.mjr-viewer-overlay {
--mjr-viewer-surface: rgba(14, 18, 24, 0.78);
--mjr-viewer-surface-strong: rgba(10, 13, 18, 0.9);
@@ -6277,7 +6278,7 @@ function Oa() {
}
.mjr-viewer-geninfo {
- width: ${Ta} !important;
+ width: ${Da} !important;
top: 16px !important;
bottom: 16px !important;
border-radius: 20px;
@@ -6376,15 +6377,15 @@ function Oa() {
}
//#endregion
//#region ui/features/viewer/filmstrip.ts
-var ka = 84, Aa = 56, ja = 74, Ma = .45, Na = "0px 240px 0px 240px", Pa = 3500;
-function Fa(e) {
+var ja = 84, Ma = 56, Na = 74, Pa = .45, Fa = "0px 240px 0px 240px", Ia = 3500;
+function La(e) {
try {
e?._mjrFilmstripReleaseTimer && (clearTimeout(e._mjrFilmstripReleaseTimer), e._mjrFilmstripReleaseTimer = null);
} catch (e) {
console.debug?.(e);
}
}
-function Ia(e) {
+function Ra(e) {
if (!e) return;
let t = String(e.dataset.lazySrc || "").trim();
if (t) try {
@@ -6393,7 +6394,7 @@ function Ia(e) {
console.debug?.(e);
}
}
-function La(e) {
+function za(e) {
if (e) try {
let t = e.play?.();
t && typeof t.catch == "function" && t.catch(() => {});
@@ -6401,16 +6402,16 @@ function La(e) {
console.debug?.(e);
}
}
-function Ra(e) {
+function Ba(e) {
if (e) try {
e.pause?.();
} catch (e) {
console.debug?.(e);
}
}
-function za(e, { releaseSrc: t = !0 } = {}) {
+function Va(e, { releaseSrc: t = !0 } = {}) {
if (e) {
- Fa(e), Ra(e);
+ La(e), Ba(e);
try {
e._mjrFilmstripInView = !1;
} catch (e) {
@@ -6423,11 +6424,11 @@ function za(e, { releaseSrc: t = !0 } = {}) {
}
}
}
-function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
+function Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
let i = document.createElement("div");
i.className = "mjr-filmstrip", i.style.cssText = `
width: 100%;
- height: ${ja}px;
+ height: ${Na}px;
overflow-x: auto;
overflow-y: hidden;
background: linear-gradient(180deg, rgba(16, 20, 27, 0.82), rgba(10, 13, 18, 0.92));
@@ -6455,20 +6456,20 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
} catch (e) {
console.debug?.(e);
}
- if (i && (Fa(e), Ia(e)), i && r.intersectionRatio >= Ma && t && n ? La(e) : Ra(e), !i) {
- Fa(e);
+ if (i && (La(e), Ra(e)), i && r.intersectionRatio >= Pa && t && n ? za(e) : Ba(e), !i) {
+ La(e);
try {
e._mjrFilmstripReleaseTimer = setTimeout(() => {
try {
if (!e.isConnected) {
- za(e, { releaseSrc: !0 });
+ Va(e, { releaseSrc: !0 });
return;
}
- e._mjrFilmstripInView || za(e, { releaseSrc: !0 });
+ e._mjrFilmstripInView || Va(e, { releaseSrc: !0 });
} catch (e) {
console.debug?.(e);
}
- }, Pa);
+ }, Ia);
} catch (e) {
console.debug?.(e);
}
@@ -6476,8 +6477,8 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
}
}, {
root: i,
- rootMargin: Na,
- threshold: [0, Ma]
+ rootMargin: Fa,
+ threshold: [0, Pa]
});
} catch {
return null;
@@ -6497,11 +6498,11 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
}
}
}, p = ({ releaseSrc: e = !1 } = {}) => {
- for (let t of Array.from(c)) za(t, { releaseSrc: e });
+ for (let t of Array.from(c)) Va(t, { releaseSrc: e });
}, m = () => {
for (let e of Array.from(c)) try {
if (!e?._mjrFilmstripInView || !e?.isConnected) continue;
- Ia(e), La(e);
+ Ra(e), za(e);
} catch (e) {
console.debug?.(e);
}
@@ -6551,8 +6552,8 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
let r = document.createElement("div");
r.className = "mjr-filmstrip-item", r.dataset.fidx = String(n), r.style.cssText = `
position: relative;
- width: ${ka}px;
- height: ${Aa}px;
+ width: ${ja}px;
+ height: ${Ma}px;
border-radius: 14px;
overflow: hidden;
cursor: pointer;
@@ -6575,7 +6576,7 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
}
return e.addEventListener("loadeddata", () => {
try {
- e._mjrFilmstripInView && i.style.display !== "none" && !document.hidden && La(e);
+ e._mjrFilmstripInView && i.style.display !== "none" && !document.hidden && za(e);
} catch (e) {
console.debug?.(e);
}
@@ -6585,7 +6586,7 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
} catch (e) {
console.debug?.(e);
}
- za(e, { releaseSrc: !0 }), y(r);
+ Va(e, { releaseSrc: !0 }), y(r);
}, { once: !0 }), r.appendChild(e), S(r), f(e), r;
}
if (a === "audio") {
@@ -6613,7 +6614,7 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
...e,
filename: r,
kind: "image"
- }) : Pe(r, i || null, a);
+ }) : Ne(r, i || null, a);
} catch {
return "";
}
@@ -6764,11 +6765,11 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
}
//#endregion
//#region ui/features/viewer/viewerShell.ts
-function Va() {
+function Ua() {
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 Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
+function Wa({ 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");
@@ -6795,7 +6796,7 @@ function Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
top: 16px;
right: 16px;
bottom: 16px;
- width: ${Ta};
+ width: ${Da};
display: none;
flex-direction: column;
overflow: hidden;
@@ -6817,7 +6818,7 @@ function Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
top: 16px;
left: 16px;
bottom: 16px;
- width: ${Ta};
+ width: ${Da};
display: none;
flex-direction: column;
overflow: hidden;
@@ -6835,11 +6836,11 @@ function Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
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 = Ji("<", "Previous (Left Arrow)");
+ let C = Xi("<", "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 = Ji(">", "Next (Right Arrow)");
+ let T = Xi(">", "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);
@@ -6867,7 +6868,7 @@ function Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
nextBtn: T,
navBar: E,
playerBarHost: D,
- filmstrip: Ba({
+ filmstrip: Ha({
state: e,
buildAssetViewURL: t,
onNavigate: n,
@@ -6877,7 +6878,7 @@ function Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) {
}
//#endregion
//#region ui/features/viewer/viewerOverlayDismiss.ts
-function Ua({ overlay: e, requestClose: t }) {
+function Ga({ overlay: e, requestClose: t }) {
try {
let n = null;
e.addEventListener("pointerdown", (e) => {
@@ -6909,20 +6910,20 @@ function Ua({ overlay: e, requestClose: t }) {
}
//#endregion
//#region ui/components/ViewerRuntime.ts
-var Wa = null, Ga = null, Ka = null, qa = null, Ja = null, Ya = null;
-function Xa() {
- Wa || import("./chunks/abCompare-BXOoRlmV.js").then((e) => {
- Wa = e;
- }), Ga || import("./chunks/sideBySide-DX0t_oIi.js").then((e) => {
- Ga = e;
- }), Ka || import("./chunks/model3dRenderer-DtGg_3hW.js").then((e) => e.t).then((e) => {
+var Ka = null, qa = null, Ja = null, Ya = null, Xa = null, Za = null;
+function Qa() {
+ Ka || import("./chunks/abCompare-BXOoRlmV.js").then((e) => {
Ka = e;
- }), qa || import("./chunks/scopes-X1iFrTle.js").then((e) => {
+ }), qa || import("./chunks/sideBySide-Dp8qRb0r.js").then((e) => {
qa = e;
- }), Ja || import("./chunks/genInfo-DPkTyDKA.js").then((e) => e.n).then((e) => {
+ }), Ja || import("./chunks/model3dRenderer-BtzSm2ZA.js").then((e) => e.t).then((e) => {
Ja = e;
- }), Ya || import("./chunks/frameExport-tksSZ7sb.js").then((e) => {
+ }), Ya || import("./chunks/scopes-X1iFrTle.js").then((e) => {
Ya = e;
+ }), Xa || import("./chunks/genInfo-oNZ5Okna.js").then((e) => e.n).then((e) => {
+ Xa = e;
+ }), Za || import("./chunks/frameExport-tksSZ7sb.js").then((e) => {
+ Za = e;
});
}
var Q = {
@@ -6930,12 +6931,12 @@ var Q = {
AB_COMPARE: "ab",
SIDE_BY_SIDE: "sidebyside"
};
-function Za() {
- Xa(), Oa();
- let e = Va(), t = qi(e), n = t.unsubs || [], r = Vn();
+function $a() {
+ Qa(), Aa();
+ let e = Ua(), t = Yi(e), n = t.unsubs || [], r = Vn();
r.mode = Q.SINGLE;
try {
- let e = Wi();
+ let e = Ki();
e && typeof e == "object" && (typeof e.analysisMode == "string" && (r.analysisMode = e.analysisMode || "none"), typeof e.loupeEnabled == "boolean" && (r.loupeEnabled = e.loupeEnabled), typeof e.probeEnabled == "boolean" && (r.probeEnabled = e.probeEnabled), typeof e.hudEnabled == "boolean" && (r.hudEnabled = e.hudEnabled), typeof e.genInfoOpen == "boolean" && (r.genInfoOpen = e.genInfoOpen), typeof e.audioVisualizerMode == "string" && (r.audioVisualizerMode = e.audioVisualizerMode || "artistic"), typeof e.abWipePercent == "number" && Number.isFinite(e.abWipePercent) && e.abWipePercent >= 0 && e.abWipePercent <= 100 && (r._abWipePercent = e.abWipePercent));
} catch (e) {
console.debug?.(e);
@@ -7016,38 +7017,38 @@ function Za() {
return null;
}
}
- function h() {
+ function g() {
try {
return a?.computeOneToOneZoom?.() ?? null;
} catch {
return null;
}
}
- function g() {
+ function _() {
try {
a?.updateMediaNaturalSize?.();
} catch (e) {
console.debug?.(e);
}
}
- function _(e, t) {
+ function v(e, t) {
try {
return o?.createMediaElement?.(e, t) || document.createElement("div");
} catch {
return document.createElement("div");
}
}
- function v(e, t) {
+ function y(e, t) {
try {
return o?.createCompareMediaElement?.(e, t) || document.createElement("div");
} catch {
return document.createElement("div");
}
}
- function y() {
+ function b() {
let e = !1;
try {
- let t = r.mode === Q.AB_COMPARE ? oe : r.mode === Q.SIDE_BY_SIDE ? se : ae, n = Array.from(t?.querySelectorAll?.(".mjr-viewer-audio-viz") || []);
+ let t = r.mode === Q.AB_COMPARE ? se : r.mode === Q.SIDE_BY_SIDE ? ce : oe, n = Array.from(t?.querySelectorAll?.(".mjr-viewer-audio-viz") || []);
for (let t of n) try {
let n = t?._mjrProc || null;
if (!n?.setMode) continue;
@@ -7060,24 +7061,24 @@ function Za() {
}
return e;
}
- let b = null, x = () => kt(), S = document.createElement("div");
- S.className = "mjr-viewer-header", S.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 C = document.createElement("span");
- C.className = "mjr-viewer-filename", C.style.cssText = "font-size: 14px; font-weight: 500; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;";
- let w = document.createElement("div");
- w.className = "mjr-viewer-badges", w.style.cssText = "display:flex; gap:8px; align-items:center; flex-wrap:wrap;";
- let T = null, E = null, D = null, O = null, k = null, A = null, M = null, N = null, P = null, F = null, te = null;
+ let x = null, S = () => Ot(), C = document.createElement("div");
+ C.className = "mjr-viewer-header", C.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 w = document.createElement("span");
+ w.className = "mjr-viewer-filename", w.style.cssText = "font-size: 14px; font-weight: 500; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;";
+ let T = document.createElement("div");
+ T.className = "mjr-viewer-badges", T.style.cssText = "display:flex; gap:8px; align-items:center; flex-wrap:wrap;";
+ let E = null, D = null, k = null, A = null, j = null, N = null, P = null, F = null, I = null, ne = null, re = null;
try {
- S.appendChild(C), S.appendChild(w);
+ C.appendChild(w), C.appendChild(T);
} catch (e) {
console.debug?.(e);
}
try {
- b = ea({
+ x = na({
VIEWER_MODES: Q,
state: r,
lifecycle: t,
- getCanAB: () => Ze(),
+ getCanAB: () => Ye(),
onToggleFullscreen: () => {
try {
if (document.fullscreenElement) try {
@@ -7094,13 +7095,13 @@ function Za() {
console.debug?.(e);
}
},
- onClose: () => x?.(),
+ onClose: () => S?.(),
onMode: (e) => {
try {
- if (e === Q.AB_COMPARE && !Ze() || e === Q.SIDE_BY_SIDE && !Qe()) return;
- r.mode = e, et();
+ if (e === Q.AB_COMPARE && !Ye() || e === Q.SIDE_BY_SIDE && !Xe()) return;
+ r.mode = e, Qe();
try {
- b?.syncToolsUIFromState?.();
+ x?.syncToolsUIFromState?.();
} catch (e) {
console.debug?.(e);
}
@@ -7138,7 +7139,7 @@ function Za() {
onZoomOneToOne: () => {
try {
let e = () => {
- let e = h();
+ let e = g();
return e == null ? !1 : (u(Math.abs((Number(r.zoom) || 1) - e) < .01 ? 1 : e, {
clientX: r._lastPointerX,
clientY: r._lastPointerY
@@ -7148,7 +7149,7 @@ function Za() {
try {
requestAnimationFrame(() => {
try {
- g();
+ _();
} catch (e) {
console.debug?.(e);
}
@@ -7167,21 +7168,21 @@ function Za() {
},
onCompareModeChanged: () => {
try {
- r.mode === Q.AB_COMPARE && (tt(), ct());
+ r.mode === Q.AB_COMPARE && ($e(), ot());
} catch (e) {
console.debug?.(e);
}
},
onExportFrame: () => {
try {
- L({ toClipboard: !1 });
+ qe({ toClipboard: !1 });
} catch (e) {
console.debug?.(e);
}
},
onCopyFrame: () => {
try {
- L({ toClipboard: !0 });
+ qe({ toClipboard: !0 });
} catch (e) {
console.debug?.(e);
}
@@ -7190,71 +7191,71 @@ function Za() {
try {
let e = r.assets[r.currentIndex];
if (String(e?.kind || "") !== "audio") return;
- y() || (tt(), ct());
+ b() || ($e(), ot());
} catch (e) {
console.debug?.(e);
}
},
onToolsChanged: () => {
try {
- b?.syncToolsUIFromState?.();
+ x?.syncToolsUIFromState?.();
} catch (e) {
console.debug?.(e);
}
try {
- Gi(r);
+ qi(r);
} catch (e) {
console.debug?.(e);
}
try {
- $e();
+ Ze();
} catch (e) {
console.debug?.(e);
}
try {
if (r.mode === Q.AB_COMPARE) {
let e = String(r.abCompareMode || "wipe");
- e !== "wipe" && e !== "wipeV" && oe?._mjrDiffRequest?.();
+ e !== "wipe" && e !== "wipeV" && se?._mjrDiffRequest?.();
}
} catch (e) {
console.debug?.(e);
}
try {
- r.probeEnabled || (ue.style.display = "none");
+ r.probeEnabled || (de.style.display = "none");
} catch (e) {
console.debug?.(e);
}
try {
- r.loupeEnabled || (de.style.display = "none");
+ r.loupeEnabled || (fe.style.display = "none");
} catch (e) {
console.debug?.(e);
}
try {
- Be();
+ Re();
} catch (e) {
console.debug?.(e);
}
try {
- vt?.();
+ gt?.();
} catch (e) {
console.debug?.(e);
}
try {
- Je();
+ Ge();
} catch (e) {
console.debug?.(e);
}
}
- }), b?.headerEl && (S = b.headerEl), b?.headerTopEl && (te = b.headerTopEl), b?.filenameEl && (C = b.filenameEl), b?.badgesBarEl && (w = b.badgesBarEl), b?.filenameRightEl && (T = b.filenameRightEl), b?.badgesBarRightEl && (E = b.badgesBarRightEl), b?.leftAreaEl && (k = b.leftAreaEl), b?.leftMetaEl && (A = b.leftMetaEl), b?.centerAreaEl && (M = b.centerAreaEl), b?.rightMetaEl && (D = b.rightMetaEl), b?.rightAreaEl && (O = b.rightAreaEl), b?.titleLineEl && (N = b.titleLineEl), b?.titleWrapEl && (P = b.titleWrapEl), b?.modeButtonsEl && (F = b.modeButtonsEl);
+ }), x?.headerEl && (C = x.headerEl), x?.headerTopEl && (re = x.headerTopEl), x?.filenameEl && (w = x.filenameEl), x?.badgesBarEl && (T = x.badgesBarEl), x?.filenameRightEl && (E = x.filenameRightEl), x?.badgesBarRightEl && (D = x.badgesBarRightEl), x?.leftAreaEl && (j = x.leftAreaEl), x?.leftMetaEl && (N = x.leftMetaEl), x?.centerAreaEl && (P = x.centerAreaEl), x?.rightMetaEl && (k = x.rightMetaEl), x?.rightAreaEl && (A = x.rightAreaEl), x?.titleLineEl && (F = x.titleLineEl), x?.titleWrapEl && (I = x.titleWrapEl), x?.modeButtonsEl && (ne = x.modeButtonsEl);
} catch (e) {
console.debug?.(e);
}
- let { contentRow: ne, content: ie, singleView: ae, abView: oe, sideView: se, overlayLayer: ce, gridCanvas: le, probeTooltip: ue, loupeWrap: de, loupeCanvas: fe, genInfoOverlay: me, genInfoTitle: he, genInfoBody: ge, genInfoOverlayLeft: _e, genInfoTitleLeft: ve, genInfoBodyLeft: ye, footer: be, prevBtn: xe, indexInfo: Se, nextBtn: Ce, navBar: Te, playerBarHost: Ee, filmstrip: Oe } = Ha({
+ let { contentRow: ie, content: ae, singleView: oe, abView: se, sideView: ce, overlayLayer: le, gridCanvas: ue, probeTooltip: de, loupeWrap: fe, loupeCanvas: pe, genInfoOverlay: L, genInfoTitle: me, genInfoBody: he, genInfoOverlayLeft: ge, genInfoTitleLeft: _e, genInfoBodyLeft: ve, footer: ye, prevBtn: be, indexInfo: xe, nextBtn: Se, navBar: Ce, playerBarHost: we, filmstrip: Te } = Wa({
state: r,
- buildAssetViewURL: De,
+ buildAssetViewURL: Fe,
onNavigate: (e) => {
try {
- r.compareAsset != null && (r.compareAsset = null, r.mode = Q.SINGLE), r.currentIndex = e, et();
+ r.compareAsset != null && (r.compareAsset = null, r.mode = Q.SINGLE), r.currentIndex = e, Qe();
} catch (e) {
console.debug?.(e);
}
@@ -7264,17 +7265,17 @@ function Za() {
let t = Array.isArray(r.assets) ? r.assets : [], n = t[e];
if (!n || n === t[r.currentIndex]) return;
if (n === r.compareAsset) {
- r.compareAsset = null, r.mode = Q.SINGLE, et();
+ r.compareAsset = null, r.mode = Q.SINGLE, Qe();
return;
}
- t.length === 2 ? (r.compareAsset = t[1 - r.currentIndex], r.mode = Ae() ? Q.SIDE_BY_SIDE : Q.AB_COMPARE) : (r.compareAsset = n, r.mode = Qe() ? Q.SIDE_BY_SIDE : Q.AB_COMPARE), et();
+ t.length === 2 ? (r.compareAsset = t[1 - r.currentIndex], r.mode = De() ? Q.SIDE_BY_SIDE : Q.AB_COMPARE) : (r.compareAsset = n, r.mode = Xe() ? Q.SIDE_BY_SIDE : Q.AB_COMPARE), Qe();
} catch (e) {
console.debug?.(e);
}
}
});
- e.appendChild(S), e.appendChild(ne);
- function ke() {
+ e.appendChild(C), e.appendChild(ie);
+ function Ee() {
try {
if (r.compareAsset) return r.compareAsset;
let e = Array.isArray(r.assets) ? r.assets : [];
@@ -7284,109 +7285,109 @@ function Za() {
}
return null;
}
- function Ae() {
+ function De() {
try {
let e = r.assets?.[r.currentIndex] || null;
- return (Ka?.isModel3DAsset?.(e) ?? !1) || (Ka?.isModel3DAsset?.(ke()) ?? !1);
+ return (Ja?.isModel3DAsset?.(e) ?? !1) || (Ja?.isModel3DAsset?.(Ee()) ?? !1);
} catch (e) {
console.debug?.(e);
}
return !1;
}
- e.appendChild(Oe.el), e.appendChild(be), e.appendChild(me), e.appendChild(_e), Ua({
+ e.appendChild(Te.el), e.appendChild(ye), e.appendChild(L), e.appendChild(ge), Ga({
overlay: e,
- requestClose: () => x()
+ requestClose: () => S()
});
- let je = oa({
+ let Oe = ca({
state: r,
VIEWER_MODES: Q,
- APP_CONFIG: I,
- getAssetMetadata: ee,
- getAssetsBatch: pe
- }), Me = 300 * 1e3, Ne = /* @__PURE__ */ new Map(), Pe = () => {
+ APP_CONFIG: z,
+ getAssetMetadata: M,
+ getAssetsBatch: ee
+ }), ke = 300 * 1e3, Ae = /* @__PURE__ */ new Map(), je = () => {
try {
let e = Date.now();
- for (let [t, n] of Ne.entries()) {
+ for (let [t, n] of Ae.entries()) {
let r = Number(n?.at) || 0;
- (!r || e - r > Me) && Ne.delete(t);
+ (!r || e - r > ke) && Ae.delete(t);
}
- if (Ne.size <= 256) return;
- let t = Array.from(Ne.entries()).sort((e, t) => (Number(e?.[1]?.at) || 0) - (Number(t?.[1]?.at) || 0)), n = Ne.size - 256;
+ 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 && Ne.delete(n);
+ n != null && Ae.delete(n);
}
} catch (e) {
console.debug?.(e);
}
- }, Fe = (e) => {
+ }, Me = (e) => {
try {
let t = String(e ?? "");
if (!t) return null;
- let n = Ne.get(t);
+ let n = Ae.get(t);
if (!n || typeof n != "object") return null;
let r = Number(n?.at) || 0;
- return !r || Date.now() - r > Me ? (Ne.delete(t), null) : n?.data || null;
+ return !r || Date.now() - r > ke ? (Ae.delete(t), null) : n?.data || null;
} catch {
return null;
}
- }, Ie = (e, t) => {
+ }, Ne = (e, t) => {
try {
let n = String(e ?? "");
if (!n || !t) return;
- Ne.set(n, {
+ Ae.set(n, {
data: t,
at: Date.now()
- }), Pe();
+ }), je();
} catch (e) {
console.debug?.(e);
}
- }, Le = async () => {
+ }, Pe = async () => {
try {
- await je?.hydrateVisibleMetadata?.();
+ await Oe?.hydrateVisibleMetadata?.();
} catch (e) {
console.debug?.(e);
}
};
try {
- a = ca({
+ a = ua({
overlay: e,
- content: ie,
- singleView: ae,
- abView: oe,
- sideView: se,
+ content: ae,
+ singleView: oe,
+ abView: se,
+ sideView: ce,
state: r,
VIEWER_MODES: Q,
- scheduleOverlayRedraw: Be,
+ scheduleOverlayRedraw: Re,
lifecycle: t
});
} catch {
a = null;
}
- let Re = (e, t, n) => {
+ let Ie = (e, t, n) => {
try {
e.clearRect(0, 0, t, n);
} catch (e) {
console.debug?.(e);
}
- }, ze = null;
- function Be(t) {
+ }, Le = null;
+ function Re(t) {
try {
if (e.style.display === "none") return;
if (t === !0) {
- ze != null && (cancelAnimationFrame(ze), ze = null);
+ Le != null && (cancelAnimationFrame(Le), Le = null);
try {
- He();
+ Be();
} catch (e) {
console.debug?.(e);
}
return;
}
- if (ze != null) return;
- ze = requestAnimationFrame(() => {
- ze = null;
+ if (Le != null) return;
+ Le = requestAnimationFrame(() => {
+ Le = null;
try {
- He();
+ Be();
} catch (e) {
console.debug?.(e);
}
@@ -7395,24 +7396,24 @@ function Za() {
console.debug?.(e);
}
}
- let Ve = ra({
- gridCanvas: le,
- content: ie,
+ let ze = aa({
+ gridCanvas: ue,
+ content: ae,
state: r,
VIEWER_MODES: Q,
getPrimaryMedia: () => {
try {
- if (r?.mode === Q.SINGLE) return ae?.querySelector?.(".mjr-viewer-media") || null;
- if (r?.mode === Q.AB_COMPARE) return oe?.querySelector?.(".mjr-viewer-media") || null;
- if (r?.mode === Q.SIDE_BY_SIDE) return se?.querySelector?.(".mjr-viewer-media") || null;
+ if (r?.mode === Q.SINGLE) return oe?.querySelector?.(".mjr-viewer-media") || null;
+ if (r?.mode === Q.AB_COMPARE) return se?.querySelector?.(".mjr-viewer-media") || null;
+ if (r?.mode === Q.SIDE_BY_SIDE) return ce?.querySelector?.(".mjr-viewer-media") || null;
} catch (e) {
console.debug?.(e);
}
return null;
},
getViewportRect: m,
- clearCanvas: Re
- }), He = () => {
+ clearCanvas: Ie
+ }), Be = () => {
let t = (() => {
try {
let e = Number(r?._panHintAt) || 0;
@@ -7423,26 +7424,26 @@ function Za() {
})();
try {
let e = r?.mode === Q.SINGLE && !!r?.hudEnabled, n = String(r?.scopesMode || "off") !== "off", i = !!r?.overlayMaskEnabled;
- le.style.display = r.gridMode === 0 && !i && !t && !e && !n ? "none" : "";
+ ue.style.display = r.gridMode === 0 && !i && !t && !e && !n ? "none" : "";
} catch (e) {
console.debug?.(e);
}
- let n = Ve.ensureCanvasSize();
+ let n = ze.ensureCanvasSize();
if (n.w > 0 && n.h > 0) {
if ((() => {
let e = r?.mode === Q.SINGLE && !!r?.hudEnabled;
return (Number(r.gridMode) || 0) !== 0 || !!r?.overlayMaskEnabled || e;
- })()) Ve.redrawGrid(n);
+ })()) ze.redrawGrid(n);
else try {
- let e = le.getContext("2d");
- e && Re(e, n.w, n.h);
+ let e = ue.getContext("2d");
+ e && Ie(e, n.w, n.h);
} catch (e) {
console.debug?.(e);
}
if (t) try {
- let e = le.getContext("2d");
+ let e = ue.getContext("2d");
if (e) {
- let t = ie?.getBoundingClientRect?.(), i = Number(r?._panHintX), a = Number(r?._panHintY), o = t && Number.isFinite(i) ? i - t.left : n.w / 2, s = t && Number.isFinite(a) ? a - t.top : n.h * .78, c = Math.max(10, Math.min(n.w - 10, o)), l = Math.max(10, Math.min(n.h - 10, s));
+ let t = ae?.getBoundingClientRect?.(), i = Number(r?._panHintX), a = Number(r?._panHintY), o = t && Number.isFinite(i) ? i - t.left : n.w / 2, s = t && Number.isFinite(a) ? a - t.top : n.h * .78, c = Math.max(10, Math.min(n.w - 10, o)), 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();
@@ -7455,12 +7456,12 @@ function Za() {
try {
let t = String(r?.scopesMode || "off");
if (t !== "off") {
- let i = le.getContext("2d");
+ let i = ue.getContext("2d");
if (i) {
- let a = ae;
- r?.mode === Q.AB_COMPARE ? a = oe : r?.mode === Q.SIDE_BY_SIDE && (a = se);
+ let a = oe;
+ r?.mode === Q.AB_COMPARE ? a = se : r?.mode === Q.SIDE_BY_SIDE && (a = ce);
let o = a?.querySelector?.("canvas.mjr-viewer-media") || e?.querySelector?.("canvas.mjr-viewer-media");
- o && o instanceof HTMLCanvasElement && qa?.drawScopesLight?.(i, {
+ o && o instanceof HTMLCanvasElement && Ya?.drawScopesLight?.(i, {
w: n.w,
h: n.h
}, o, {
@@ -7474,18 +7475,18 @@ function Za() {
}
if (r.mode !== Q.SINGLE) {
try {
- ue.style.display = "none";
+ de.style.display = "none";
} catch (e) {
console.debug?.(e);
}
try {
- de.style.display = "none";
+ fe.style.display = "none";
} catch (e) {
console.debug?.(e);
}
}
}
- }, Ue = (e) => {
+ }, Ve = (e) => {
if (e) {
try {
for (let t of Array.from(e.childNodes || [])) try {
@@ -7502,7 +7503,7 @@ function Za() {
console.debug?.(e);
}
}
- }, Ge = () => {
+ }, He = () => {
try {
r._genInfoAbort?.abort?.();
} catch (e) {
@@ -7514,18 +7515,18 @@ function Za() {
} catch (e) {
console.debug?.(e);
}
- }, Ke = async (e, { signal: t } = {}) => {
+ }, Ue = async (e, { signal: t } = {}) => {
try {
- return await Ja?.ensureViewerMetadataAsset?.(e, {
- getAssetMetadata: ee,
- getFileMetadataScoped: re,
- metadataCache: je,
+ return await Xa?.ensureViewerMetadataAsset?.(e, {
+ getAssetMetadata: M,
+ getFileMetadataScoped: h,
+ metadataCache: Oe,
signal: t
});
} catch {
return e;
}
- }, qe = (e) => {
+ }, We = (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;
@@ -7542,18 +7543,18 @@ function Za() {
} catch {
return !1;
}
- }, Je = async () => {
- let t = Ze(), n = Qe(), i = r.mode, a = !!r?.genInfoOpen && !r?.distractionFree, o = a && (i === Q.AB_COMPARE && t || i === Q.SIDE_BY_SIDE && n), s = o && i === Q.SIDE_BY_SIDE && !r?.compareAsset && (r?.assets?.length ?? 0) > 2;
+ }, Ge = async () => {
+ let t = Ye(), n = Xe(), i = r.mode, a = !!r?.genInfoOpen && !r?.distractionFree, o = a && (i === Q.AB_COMPARE && t || i === Q.SIDE_BY_SIDE && n), s = o && i === Q.SIDE_BY_SIDE && !r?.compareAsset && (r?.assets?.length ?? 0) > 2;
try {
- if (me.style.display = a ? "flex" : "none", _e.style.display = o ? "flex" : "none", e.style.paddingRight = a ? Ea : "0px", e.style.paddingLeft = o ? Ea : "0px", !a) {
- Ge();
+ if (L.style.display = a ? "flex" : "none", ge.style.display = o ? "flex" : "none", e.style.paddingRight = a ? Oa : "0px", e.style.paddingLeft = o ? Oa : "0px", !a) {
+ He();
try {
- Ue(ge);
+ Ve(he);
} catch (e) {
console.debug?.(e);
}
try {
- Ue(ye);
+ Ve(ve);
} catch (e) {
console.debug?.(e);
}
@@ -7562,7 +7563,7 @@ function Za() {
} catch {
return;
}
- Ge();
+ He();
let c = (Number(r?._genInfoReqId) || 0) + 1;
try {
r._genInfoReqId = c;
@@ -7573,25 +7574,25 @@ function Za() {
r._genInfoAbort = l;
let u = ({ left: e = null, leftExtra: t = null, right: n = null, rightExtra: i = null, single: a = null } = {}) => {
try {
- Ue(ge);
+ Ve(he);
} catch (e) {
console.debug?.(e);
}
try {
- Ue(ye);
+ Ve(ve);
} catch (e) {
console.debug?.(e);
}
let s = () => {
try {
- r?.genInfoOpen || (r.genInfoOpen = !0), Je();
+ r?.genInfoOpen || (r.genInfoOpen = !0), Ge();
} catch (e) {
console.debug?.(e);
}
}, c = (e, t, n, r) => {
if (e) try {
try {
- let i = Ja?.buildViewerMetadataBlocks?.({
+ let i = Xa?.buildViewerMetadataBlocks?.({
title: t,
asset: n,
ui: {
@@ -7612,14 +7613,14 @@ function Za() {
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 a = document.createElement("div");
- a.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);", a.textContent = "No generation data found for this file.", i.appendChild(a);
+ a.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);", a.textContent = R("viewer.noGenerationDataFile", "No generation data found for this file."), i.appendChild(a);
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 = "Raw metadata", n.style.cssText = "cursor: pointer; padding: 10px 12px; color: rgba(255,255,255,0.78); user-select: none;";
+ n.textContent = R("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 = "";
@@ -7638,7 +7639,7 @@ function Za() {
console.debug?.(e);
}
};
- o ? (e && (ve.textContent = e.title || "Asset A", c(ye, t ? "Asset A" : "", e.asset, e.loading)), t && c(ye, "Asset C", t.asset, t.loading), n && (he.textContent = n.title || "Asset B", c(ge, i ? "Asset B" : "", n.asset, n.loading)), i && c(ge, "Asset D", i.asset, i.loading)) : a && (he.textContent = a.title || "Generation Info", c(ge, "", a.asset, a.loading));
+ o ? (e && (_e.textContent = e.title || "Asset A", c(ve, t ? "Asset A" : "", e.asset, e.loading)), t && c(ve, "Asset C", t.asset, t.loading), n && (me.textContent = n.title || "Asset B", c(he, i ? "Asset B" : "", n.asset, n.loading)), i && c(he, "Asset D", i.asset, i.loading)) : a && (me.textContent = a.title || "Generation Info", c(he, "", a.asset, a.loading));
};
try {
let e = r?.assets?.[r?.currentIndex] || null;
@@ -7648,34 +7649,34 @@ function Za() {
}
let t = null, n = null, a = null, d = null, f = null;
o ? i === Q.SIDE_BY_SIDE ? r?.compareAsset ? (t = e, n = r.compareAsset) : (t = r.assets[0] || null, n = r.assets[1] || null, s && (a = r.assets[2] || null, d = r.assets[3] || null)) : (t = e, n = r?.compareAsset || (r.assets.length === 2 ? r.assets[1 - r.currentIndex] : null)) : f = e;
- let p = (e) => e ? je?.getCached?.(e.id)?.data || e : null;
+ let p = (e) => e ? Oe?.getCached?.(e.id)?.data || e : null;
if (u({
left: o ? {
title: s ? "Assets A & C" : "Asset A",
asset: p(t),
- loading: qe(p(t))
+ loading: We(p(t))
} : null,
leftExtra: s && a ? {
asset: p(a),
- loading: qe(p(a))
+ loading: We(p(a))
} : null,
right: o ? {
title: s ? "Assets B & D" : "Asset B",
asset: p(n),
- loading: qe(p(n))
+ loading: We(p(n))
} : null,
rightExtra: s && d ? {
asset: p(d),
- loading: qe(p(d))
+ loading: We(p(d))
} : null,
single: o ? null : {
title: "Generation Info",
asset: p(f),
- loading: qe(p(f))
+ loading: We(p(f))
}
}), r._genInfoReqId !== c) return;
if (o) {
- let e = t ? await Ke(t, { signal: l.signal }) : null, i = n ? await Ke(n, { signal: l.signal }) : null, o = a ? await Ke(a, { signal: l.signal }) : null, f = d ? await Ke(d, { signal: l.signal }) : null;
+ let e = t ? await Ue(t, { signal: l.signal }) : null, i = n ? await Ue(n, { signal: l.signal }) : null, o = a ? await Ue(a, { signal: l.signal }) : null, f = d ? await Ue(d, { signal: l.signal }) : null;
if (r._genInfoReqId !== c) return;
u({
left: {
@@ -7698,7 +7699,7 @@ function Za() {
} : null
});
} else {
- let e = f ? await Ke(f, { signal: l.signal }) : null;
+ let e = f ? await Ue(f, { signal: l.signal }) : null;
if (r._genInfoReqId !== c) return;
u({ single: {
title: "Generation Info",
@@ -7709,21 +7710,21 @@ function Za() {
} catch (e) {
console.debug?.(e);
}
- }, Ye = null;
- function L(e) {
+ }, B = null;
+ function qe(e) {
try {
- return !Ye && Ya && (Ye = Ya.createFrameExporter({
+ return !B && Za && (B = Za.createFrameExporter({
state: r,
VIEWER_MODES: Q,
- singleView: ae,
- abView: oe,
- sideView: se
- })), Ye?.exportCurrentFrame?.(e);
+ singleView: oe,
+ abView: se,
+ sideView: ce
+ })), B?.exportCurrentFrame?.(e);
} catch (e) {
console.debug?.(e);
}
}
- let Xe = () => {
+ let Je = () => {
let e = (e) => {
try {
e && e.replaceChildren();
@@ -7731,20 +7732,20 @@ function Za() {
console.debug?.(e);
}
};
- e(w), e(E);
+ e(T), e(D);
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 = Ht(e.filename, e.kind, !!e?._mjrNameCollision);
+ let i = Tt(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 = Ct(e.rating || 0);
+ let a = dt(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) {
@@ -7763,16 +7764,16 @@ function Za() {
console.debug?.(e);
}
return n;
- }, n = r.mode === Q.SINGLE, i = r.mode === Q.AB_COMPARE && Ze(), a = r.mode === Q.SIDE_BY_SIDE && Qe();
- if ((i || a) && E) {
+ }, n = r.mode === Q.SINGLE, i = r.mode === Q.AB_COMPARE && Ye(), a = r.mode === Q.SIDE_BY_SIDE && Xe();
+ if ((i || a) && D) {
let e = r.assets?.[r.currentIndex] || null, n = a && r.compareAsset != null, o = i ? r.compareAsset == null ? r.assets?.[0] || null : e : n ? e : r.assets?.[0] || null, s = i ? r.compareAsset == null ? r.assets?.[1] || null : r.compareAsset : n ? r.compareAsset : r.assets?.[Math.max(0, (r.assets?.length || 1) - 1)] || null, c = t(o, { showName: !1 }), l = t(s, { showName: !1 });
try {
- c && w.appendChild(c);
+ c && T.appendChild(c);
} catch (e) {
console.debug?.(e);
}
try {
- l && E.appendChild(l);
+ l && D.appendChild(l);
} catch (e) {
console.debug?.(e);
}
@@ -7782,28 +7783,28 @@ function Za() {
for (let e of o) {
let r = t(e, { showName: !n });
if (r) try {
- w.appendChild(r);
+ T.appendChild(r);
} catch (e) {
console.debug?.(e);
}
}
};
- function Ze() {
- return (r.assets.length === 2 || r.compareAsset != null) && !Ae();
+ function Ye() {
+ return (r.assets.length === 2 || r.compareAsset != null) && !De();
}
- function Qe() {
+ function Xe() {
let e = r.assets.length;
return e >= 2 && e <= 4 || e >= 1 && r.compareAsset != null;
}
- function $e() {
+ function Ze() {
let t = !!r?.distractionFree;
try {
- S.style.display = t ? "none" : "";
+ C.style.display = t ? "none" : "";
} catch (e) {
console.debug?.(e);
}
try {
- be.style.display = t ? "none" : "";
+ ye.style.display = t ? "none" : "";
} catch (e) {
console.debug?.(e);
}
@@ -7813,87 +7814,87 @@ function Za() {
console.debug?.(e);
}
try {
- t && (e.style.paddingRight = "0px", e.style.paddingLeft = "0px", me.style.display = "none", _e.style.display = "none");
+ t && (e.style.paddingRight = "0px", e.style.paddingLeft = "0px", L.style.display = "none", ge.style.display = "none");
} catch (e) {
console.debug?.(e);
}
}
- function et() {
+ function Qe() {
r.zoom = 1, r.panX = 0, r.panY = 0, r.targetZoom = 1;
try {
r.mode !== Q.AB_COMPARE && r.mode !== Q.SIDE_BY_SIDE && r.compareAsset != null && (r.compareAsset = null);
} catch (e) {
console.debug?.(e);
}
- let e = r.assets[r.currentIndex], t = r.mode === Q.AB_COMPARE && Ze(), n = r.mode === Q.SIDE_BY_SIDE && Qe(), i = t && r.compareAsset != null, a = n && r.compareAsset != null, o = t ? (i ? e : r.assets?.[0]) || null : n ? (a ? e : r.assets?.[0]) || null : e || null, s = t ? (i ? r.compareAsset : r.assets?.[1]) || null : n ? a ? r.compareAsset : Array.isArray(r.assets) && r.assets.length >= 2 ? r.assets[r.assets.length - 1] : null : null;
+ let e = r.assets[r.currentIndex], t = r.mode === Q.AB_COMPARE && Ye(), n = r.mode === Q.SIDE_BY_SIDE && Xe(), i = t && r.compareAsset != null, a = n && r.compareAsset != null, o = t ? (i ? e : r.assets?.[0]) || null : n ? (a ? e : r.assets?.[0]) || null : e || null, s = t ? (i ? r.compareAsset : r.assets?.[1]) || null : n ? a ? r.compareAsset : Array.isArray(r.assets) && r.assets.length >= 2 ? r.assets[r.assets.length - 1] : null : null;
try {
- C.textContent = o?.filename || "";
+ w.textContent = o?.filename || "";
} catch (e) {
console.debug?.(e);
}
try {
- D && T && s && s !== o ? (D.style.display = "flex", O && (O.style.display = "flex"), T.textContent = s?.filename || "", k && A && N && (k.style.display = "flex", A.appendChild(N), N.style.justifyContent = "flex-start"), te && (te.style.justifyContent = "center", te.style.paddingLeft = "84px"), M && (M.style.flex = "0 0 auto"), P && (P.style.flex = "0 0 auto"), C && (C.style.textAlign = "left")) : D && T && (D.style.display = "none", O && (O.style.display = "none"), T.textContent = "", k && (k.style.display = "none"), P && N && F && (P.insertBefore(N, F), N.style.justifyContent = "center"), te && (te.style.justifyContent = "center", te.style.paddingLeft = "12px"), M && (M.style.flex = "1 1 auto"), P && (P.style.flex = ""), C && (C.style.textAlign = "center"));
+ k && E && s && s !== o ? (k.style.display = "flex", A && (A.style.display = "flex"), E.textContent = s?.filename || "", j && N && F && (j.style.display = "flex", N.appendChild(F), F.style.justifyContent = "flex-start"), re && (re.style.justifyContent = "center", re.style.paddingLeft = "84px"), P && (P.style.flex = "0 0 auto"), I && (I.style.flex = "0 0 auto"), w && (w.style.textAlign = "left")) : k && E && (k.style.display = "none", A && (A.style.display = "none"), E.textContent = "", j && (j.style.display = "none"), I && F && ne && (I.insertBefore(F, ne), F.style.justifyContent = "center"), re && (re.style.justifyContent = "center", re.style.paddingLeft = "12px"), P && (P.style.flex = "1 1 auto"), I && (I.style.flex = ""), w && (w.style.textAlign = "center"));
} catch (e) {
console.debug?.(e);
}
- r.mode === Q.AB_COMPARE && Ze() ? Se.textContent = "2 selected" : r.mode === Q.SIDE_BY_SIDE && Qe() ? Se.textContent = r.compareAsset == null ? `${r.assets.length} selected` : "2 selected" : Se.textContent = `${r.currentIndex + 1} / ${r.assets.length}`, r.mode === Q.AB_COMPARE && !Ze() && (r.mode = Qe() ? Q.SIDE_BY_SIDE : Q.SINGLE), r.mode === Q.SIDE_BY_SIDE && !Qe() && (r.mode = Q.SINGLE);
+ r.mode === Q.AB_COMPARE && Ye() ? xe.textContent = "2 selected" : r.mode === Q.SIDE_BY_SIDE && Xe() ? xe.textContent = r.compareAsset == null ? `${r.assets.length} selected` : "2 selected" : xe.textContent = `${r.currentIndex + 1} / ${r.assets.length}`, r.mode === Q.AB_COMPARE && !Ye() && (r.mode = Xe() ? Q.SIDE_BY_SIDE : Q.SINGLE), r.mode === Q.SIDE_BY_SIDE && !Xe() && (r.mode = Q.SINGLE);
try {
- b?.syncModeButtons?.({
- canAB: Ze,
- canSide: Qe
+ x?.syncModeButtons?.({
+ canAB: Ye,
+ canSide: Xe
});
} catch (e) {
console.debug?.(e);
}
- ae.style.display = r.mode === Q.SINGLE ? "flex" : "none", oe.style.display = r.mode === Q.AB_COMPARE ? "block" : "none", se.style.display = r.mode === Q.SIDE_BY_SIDE ? "flex" : "none";
+ oe.style.display = r.mode === Q.SINGLE ? "flex" : "none", se.style.display = r.mode === Q.AB_COMPARE ? "block" : "none", ce.style.display = r.mode === Q.SIDE_BY_SIDE ? "flex" : "none";
try {
- r.mode !== Q.SINGLE && (Ki(ae), ae.replaceChildren());
+ r.mode !== Q.SINGLE && (Ji(oe), oe.replaceChildren());
} catch (e) {
console.debug?.(e);
}
try {
- r.mode !== Q.AB_COMPARE && (Ki(oe), oe.replaceChildren());
+ r.mode !== Q.AB_COMPARE && (Ji(se), se.replaceChildren());
} catch (e) {
console.debug?.(e);
}
try {
- r.mode !== Q.SIDE_BY_SIDE && (Ki(se), se.replaceChildren());
+ r.mode !== Q.SIDE_BY_SIDE && (Ji(ce), ce.replaceChildren());
} catch (e) {
console.debug?.(e);
}
- Xe();
- let c = r.mode === Q.AB_COMPARE && Ze() || r.mode === Q.SIDE_BY_SIDE && Qe();
+ Je();
+ let c = r.mode === Q.AB_COMPARE && Ye() || r.mode === Q.SIDE_BY_SIDE && Xe();
try {
- xe.style.display = c ? "none" : "", Ce.style.display = c ? "none" : "";
+ be.style.display = c ? "none" : "", Se.style.display = c ? "none" : "";
} catch (e) {
console.debug?.(e);
}
- tt(), nt(r.assets, r.currentIndex), ct();
+ $e(), et(r.assets, r.currentIndex), ot();
try {
- b?.syncToolsUIFromState?.();
+ x?.syncToolsUIFromState?.();
} catch (e) {
console.debug?.(e);
}
try {
- $e();
+ Ze();
} catch (e) {
console.debug?.(e);
}
try {
- vt?.();
+ gt?.();
} catch (e) {
console.debug?.(e);
}
- Be();
+ Re();
try {
- Je();
+ Ge();
} catch (e) {
console.debug?.(e);
}
try {
- Le().then(() => {
+ Pe().then(() => {
try {
- Xe();
+ Je();
} catch (e) {
console.debug?.(e);
}
@@ -7903,25 +7904,25 @@ function Za() {
}
try {
let e = r.mode === Q.SINGLE;
- Oe.sync({ isSingle: e });
+ Te.sync({ isSingle: e });
} catch (e) {
console.debug?.(e);
}
}
- function tt() {
+ function $e() {
let e = r.assets[r.currentIndex];
if (!e) return;
- let t = De(e);
+ let t = Fe(e);
if (!t) {
try {
- Ki(ae);
+ Ji(oe);
} catch (e) {
console.debug?.(e);
}
try {
- ae.replaceChildren();
+ oe.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.", ae.appendChild(e);
+ 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.", oe.appendChild(e);
} catch (e) {
console.debug?.(e);
}
@@ -7929,64 +7930,64 @@ function Za() {
}
if (r.mode === Q.SINGLE) {
try {
- Ki(ae);
+ Ji(oe);
} catch (e) {
console.debug?.(e);
}
- ae.innerHTML = "", r._mediaW = 0, r._mediaH = 0;
- let n = _(e, t);
- ae.appendChild(n);
- } else r.mode === Q.AB_COMPARE ? Ze() && Wa?.renderABCompareView?.({
- abView: oe,
+ oe.innerHTML = "", r._mediaW = 0, r._mediaH = 0;
+ let n = v(e, t);
+ oe.appendChild(n);
+ } else r.mode === Q.AB_COMPARE ? Ye() && Ka?.renderABCompareView?.({
+ abView: se,
state: r,
currentAsset: e,
viewUrl: t,
- buildAssetViewURL: De,
- createCompareMediaElement: v,
- destroyMediaProcessorsIn: Ki
- }) : r.mode === Q.SIDE_BY_SIDE && Qe() && Ga?.renderSideBySideView?.({
- sideView: se,
+ buildAssetViewURL: Fe,
+ createCompareMediaElement: y,
+ destroyMediaProcessorsIn: Ji
+ }) : r.mode === Q.SIDE_BY_SIDE && Xe() && qa?.renderSideBySideView?.({
+ sideView: ce,
state: r,
currentAsset: e,
viewUrl: t,
- buildAssetViewURL: De,
- createMediaElement: _,
- destroyMediaProcessorsIn: Ki
+ buildAssetViewURL: Fe,
+ createMediaElement: v,
+ destroyMediaProcessorsIn: Ji
});
l(), d();
}
- let { preloadAdjacentAssets: nt, preloadImageForAsset: it, trackPreloadRef: at } = Sa({
- buildAssetViewURL: De,
+ let { preloadAdjacentAssets: et, preloadImageForAsset: tt, trackPreloadRef: nt } = wa({
+ buildAssetViewURL: Fe,
IMAGE_PRELOAD_EXTENSIONS: i,
state: r
- }), { destroyPlayerBar: ot, syncPlayerBar: st } = wa({
+ }), { destroyPlayerBar: rt, syncPlayerBar: it } = Ea({
state: r,
- APP_CONFIG: I,
+ APP_CONFIG: z,
VIEWER_MODES: Q,
overlay: e,
- navBar: Te,
- playerBarHost: Ee,
- singleView: ae,
- abView: oe,
- sideView: se,
- metadataHydrator: je,
+ navBar: Ce,
+ playerBarHost: we,
+ singleView: oe,
+ abView: se,
+ sideView: ce,
+ metadataHydrator: Oe,
isPlayableViewerKind: en,
collectPlayableMediaElements: un,
pickPrimaryPlayableMedia: on,
mountUnifiedMediaControls: tn,
installFollowerVideoSync: cn,
- getViewerInfo: j,
- scheduleOverlayRedraw: Be,
- viewerInfoCacheGet: Fe,
- viewerInfoCacheSet: Ie
- }), ct = () => st(), lt = I.VIEWER_MAX_PROC_PIXELS ?? 12e6, dt = () => ({
+ getViewerInfo: te,
+ scheduleOverlayRedraw: Re,
+ viewerInfoCacheGet: Me,
+ viewerInfoCacheSet: Ne
+ }), ot = () => it(), st = z.VIEWER_MAX_PROC_PIXELS ?? 12e6, ct = () => ({
exposureEV: Number(r.exposureEV) || 0,
gamma: Math.max(.1, Math.min(3, Number(r.gamma) || 1)),
channel: r.channel || "rgb",
analysisMode: r.analysisMode || "none",
zebraThreshold: Math.max(0, Math.min(1, Number(r.zebraThreshold) || .95))
- }), ft = () => {
- let t = dt();
+ }), lt = () => {
+ let t = ct();
try {
let n = e.querySelectorAll(".mjr-viewer-media");
for (let e of n) try {
@@ -7999,11 +8000,11 @@ function Za() {
console.debug?.(e);
}
try {
- r?.mode === Q.AB_COMPARE && oe?._mjrDiffRequest?.();
+ r?.mode === Q.AB_COMPARE && se?._mjrDiffRequest?.();
} catch (e) {
console.debug?.(e);
}
- }, pt = (e) => {
+ }, ft = (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");
@@ -8011,41 +8012,41 @@ function Za() {
} catch {
return !0;
}
- }, mt = I.VIEWER_MAX_PROC_PIXELS_VIDEO ?? 3e6, gt = I.VIEWER_VIDEO_GRADE_THROTTLE_FPS ?? 15;
+ }, pt = z.VIEWER_MAX_PROC_PIXELS_VIDEO ?? 3e6, mt = z.VIEWER_VIDEO_GRADE_THROTTLE_FPS ?? 15;
try {
- o = xa({
+ o = Ca({
overlay: e,
state: r,
mediaTransform: s,
- updateMediaNaturalSize: g,
+ updateMediaNaturalSize: _,
clampPanToBounds: c,
applyTransform: l,
- scheduleOverlayRedraw: Be,
- getGradeParams: dt,
- isDefaultGrade: pt,
+ scheduleOverlayRedraw: Re,
+ getGradeParams: ct,
+ isDefaultGrade: ft,
tonemap: null,
- maxProcPixels: lt,
- maxProcPixelsVideo: mt,
- disableWebGL: !!I.VIEWER_DISABLE_WEBGL_VIDEO,
- videoGradeThrottleFps: gt,
- safeAddListener: z,
- safeCall: R
+ maxProcPixels: st,
+ maxProcPixelsVideo: pt,
+ disableWebGL: !!z.VIEWER_DISABLE_WEBGL_VIDEO,
+ videoGradeThrottleFps: mt,
+ safeAddListener: wt,
+ safeCall: V
});
} catch {
o = null;
}
- n.push(z(xe, "click", () => {
- r.currentIndex > 0 && (r.currentIndex--, et());
- })), n.push(z(Ce, "click", () => {
- r.currentIndex < r.assets.length - 1 && (r.currentIndex++, et());
+ n.push(wt(be, "click", () => {
+ r.currentIndex > 0 && (r.currentIndex--, Qe());
+ })), n.push(wt(Se, "click", () => {
+ r.currentIndex < r.assets.length - 1 && (r.currentIndex++, Qe());
}));
- let _t = null, vt = () => {
+ let ht = null, gt = () => {
try {
- if (_t != null) return;
- _t = requestAnimationFrame(() => {
- _t = null;
+ if (ht != null) return;
+ ht = requestAnimationFrame(() => {
+ ht = null;
try {
- ft();
+ lt();
} catch (e) {
console.debug?.(e);
}
@@ -8053,17 +8054,17 @@ function Za() {
} catch (e) {
console.debug?.(e);
}
- }, yt = () => {
+ }, _t = () => {
try {
- b?.syncToolsUIFromState?.();
+ x?.syncToolsUIFromState?.();
} catch (e) {
console.debug?.(e);
}
- }, bt = (e) => {
+ }, vt = (e) => {
if (!Array.isArray(r.assets) || r.assets.length === 0) return !1;
let t = r.currentIndex + e;
- return t < 0 || t >= r.assets.length ? !1 : (r.currentIndex = t, et(), !0);
- }, xt = (t) => {
+ return t < 0 || t >= r.assets.length ? !1 : (r.currentIndex = t, Qe(), !0);
+ }, yt = (t) => {
if (e.style.display === "none") return;
try {
let e = t.target;
@@ -8072,12 +8073,12 @@ function Za() {
console.debug?.(e);
}
try {
- if (!ie.contains(t.target)) return;
+ if (!ae.contains(t.target)) return;
} catch (e) {
console.debug?.(e);
}
try {
- if (Ka?.isModel3DInteractionTarget?.(t?.target)) return;
+ if (Ja?.isModel3DInteractionTarget?.(t?.target)) return;
} catch (e) {
console.debug?.(e);
}
@@ -8087,43 +8088,43 @@ function Za() {
console.debug?.(e);
}
let n = Number(t.deltaX) || 0, i = Number(t.deltaY) || 0;
- if (t.shiftKey && i && bt(i > 0 ? 1 : -1) || Math.abs(n) > Math.abs(i) && Math.abs(n) > 30 && bt(n > 0 ? 1 : -1) || !i) return;
+ if (t.shiftKey && i && vt(i > 0 ? 1 : -1) || Math.abs(n) > Math.abs(i) && Math.abs(n) > 30 && vt(n > 0 ? 1 : -1) || !i) return;
let a = Math.exp(-i * .0015);
u((Number(r.zoom) || 1) * a, {
clientX: t.clientX,
clientY: t.clientY
});
- }, St = (e, t, n, { offsetX: r = 16, offsetY: i = 16 } = {}) => {
+ }, bt = (e, t, n, { offsetX: r = 16, offsetY: i = 16 } = {}) => {
try {
let a = m();
if (!a) return;
- let o = ie.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;
+ let o = ae.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);
}
- }, wt = ia({
+ }, xt = oa({
overlay: e,
- content: ie,
+ content: ae,
state: r,
VIEWER_MODES: Q,
getPrimaryMedia: f,
getMediaNaturalSize: p,
getViewportRect: m,
- positionOverlayBox: St,
- probeTooltip: ue,
- loupeWrap: de,
- onLoupeRedraw: aa({
+ positionOverlayBox: bt,
+ probeTooltip: de,
+ loupeWrap: fe,
+ onLoupeRedraw: sa({
state: r,
- loupeCanvas: fe,
- loupeWrap: de,
+ loupeCanvas: pe,
+ loupeWrap: fe,
getMediaNaturalSize: p,
- positionOverlayBox: St
+ positionOverlayBox: bt
}).redraw,
lifecycle: t
});
try {
- if (!ie._mjrOverlayResizeBound && "ResizeObserver" in window) {
+ if (!ae._mjrOverlayResizeBound && "ResizeObserver" in window) {
try {
e._mjrResizeObserver?.disconnect?.();
} catch (e) {
@@ -8135,10 +8136,10 @@ function Za() {
} catch (e) {
console.debug?.(e);
}
- Be();
+ Re();
});
try {
- t.observe(ie);
+ t.observe(ae);
} catch (e) {
console.debug?.(e);
}
@@ -8148,32 +8149,32 @@ function Za() {
} catch (e) {
console.debug?.(e);
}
- }), ie._mjrOverlayResizeBound = !0;
+ }), ae._mjrOverlayResizeBound = !0;
}
} catch (e) {
console.debug?.(e);
}
- let Tt = na({
+ let St = ia({
overlay: e,
- content: ie,
- singleView: ae,
+ content: ae,
+ singleView: oe,
state: r,
VIEWER_MODES: Q,
- computeOneToOneZoom: h,
+ computeOneToOneZoom: g,
setZoom: u,
- scheduleOverlayRedraw: Be,
- scheduleApplyGrade: vt,
- syncToolsUIFromState: yt,
- applyDistractionFreeUI: $e,
- navigateViewerAssets: bt,
- closeViewer: kt,
- renderBadges: Xe,
- updateAssetRating: we,
- safeDispatchCustomEvent: ht,
- ASSET_RATING_CHANGED_EVENT: qt,
- probeTooltip: ue,
- loupeWrap: de,
- renderGenInfoPanel: Je,
+ scheduleOverlayRedraw: Re,
+ scheduleApplyGrade: gt,
+ syncToolsUIFromState: _t,
+ applyDistractionFreeUI: Ze,
+ navigateViewerAssets: vt,
+ closeViewer: Ot,
+ renderBadges: Je,
+ updateAssetRating: O,
+ safeDispatchCustomEvent: kt,
+ ASSET_RATING_CHANGED_EVENT: Zt,
+ probeTooltip: de,
+ loupeWrap: fe,
+ renderGenInfoPanel: Ge,
getVideoControls: () => {
try {
return r?._videoControlsMounted || null;
@@ -8182,34 +8183,34 @@ function Za() {
}
},
lifecycle: t
- }), Et = [], Dt = () => {
+ }), Ct = [], Et = () => {
try {
- for (let e of Et) R(e);
+ for (let e of Ct) V(e);
} catch (e) {
console.debug?.(e);
}
- Et = [];
+ Ct = [];
try {
- Tt?.unbind?.();
+ St?.unbind?.();
} catch (e) {
console.debug?.(e);
}
- }, Ot = () => {
- Dt();
+ }, Dt = () => {
+ Et();
try {
- Et.push(z(e, "click", (t) => {
+ Ct.push(wt(e, "click", (t) => {
try {
if (t.target !== e) return;
} catch (e) {
console.debug?.(e);
}
- kt();
+ Ot();
}));
} catch (e) {
console.debug?.(e);
}
try {
- Et.push(z(ie, "wheel", xt, {
+ Ct.push(wt(ae, "wheel", yt, {
passive: !1,
capture: !0
}));
@@ -8218,7 +8219,7 @@ function Za() {
}
try {
let e = null;
- Et.push(z(ie, "touchstart", (t) => {
+ Ct.push(wt(ae, "touchstart", (t) => {
try {
if (t.touches?.length !== 1) return;
let n = t.touches[0];
@@ -8230,7 +8231,7 @@ function Za() {
} catch (e) {
console.debug?.(e);
}
- }, { passive: !0 })), Et.push(z(ie, "touchend", (t) => {
+ }, { passive: !0 })), Ct.push(wt(ae, "touchend", (t) => {
try {
if (!e) return;
if (t.changedTouches?.length !== 1) {
@@ -8239,18 +8240,18 @@ function Za() {
}
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 && bt(r < 0 ? 1 : -1);
+ Math.abs(r) >= 60 && vt(r < 0 ? 1 : -1);
} catch (e) {
console.debug?.(e);
}
- }, { passive: !0 })), Et.push(z(ie, "touchcancel", () => {
+ }, { passive: !0 })), Ct.push(wt(ae, "touchcancel", () => {
e = null;
}, { passive: !0 }));
} catch (e) {
console.debug?.(e);
}
try {
- Et.push(z(ie, "mousemove", (e) => {
+ Ct.push(wt(ae, "mousemove", (e) => {
try {
r._lastPointerX = e.clientX, r._lastPointerY = e.clientY;
} catch (e) {
@@ -8264,37 +8265,37 @@ function Za() {
console.debug?.(e);
}
try {
- Tt?.bind?.();
+ St?.bind?.();
} catch (e) {
console.debug?.(e);
}
};
try {
- e._mjrBadgeSyncBound ||= (n.push(z(window, qt, (e) => {
+ e._mjrBadgeSyncBound ||= (n.push(wt(window, Zt, (e) => {
try {
let t = e?.detail?.assetId, n = e?.detail?.rating;
if (t == null) return;
for (let e of r.assets || []) e?.id != null && String(e.id) === String(t) && (e.rating = n);
try {
- je?.deleteCached?.(t);
+ Oe?.deleteCached?.(t);
} catch (e) {
console.debug?.(e);
}
- Xe();
+ Je();
} catch (e) {
console.debug?.(e);
}
- }, { passive: !0 })), n.push(z(window, Kt, (e) => {
+ }, { passive: !0 })), n.push(wt(window, Xt, (e) => {
try {
let t = e?.detail?.assetId, n = e?.detail?.tags;
if (t == null) return;
for (let e of r.assets || []) e?.id != null && String(e.id) === String(t) && (e.tags = n);
try {
- je?.deleteCached?.(t);
+ Oe?.deleteCached?.(t);
} catch (e) {
console.debug?.(e);
}
- Xe();
+ Je();
} catch (e) {
console.debug?.(e);
}
@@ -8302,19 +8303,19 @@ function Za() {
} catch (e) {
console.debug?.(e);
}
- function kt() {
+ function Ot() {
try {
- r.distractionFree = !1, $e();
+ r.distractionFree = !1, Ze();
} catch (e) {
console.debug?.(e);
}
try {
- je?.abort?.();
+ Oe?.abort?.();
} catch (e) {
console.debug?.(e);
}
try {
- ot();
+ rt();
} catch (e) {
console.debug?.(e);
}
@@ -8335,43 +8336,43 @@ function Za() {
} catch (e) {
console.debug?.(e);
}
- try {
- oe?._mjrSyncAbort?.abort?.();
- } catch (e) {
- console.debug?.(e);
- }
- try {
- oe?._mjrDiffAbort?.abort?.();
- } catch (e) {
- console.debug?.(e);
- }
- try {
- oe._mjrSyncAbort = null;
- } catch (e) {
- console.debug?.(e);
- }
- try {
- oe._mjrDiffAbort = null;
- } catch (e) {
- console.debug?.(e);
- }
try {
se?._mjrSyncAbort?.abort?.();
} catch (e) {
console.debug?.(e);
}
+ try {
+ se?._mjrDiffAbort?.abort?.();
+ } catch (e) {
+ console.debug?.(e);
+ }
try {
se._mjrSyncAbort = null;
} catch (e) {
console.debug?.(e);
}
try {
- oe?._mjrSliderAbort?.abort?.();
+ se._mjrDiffAbort = null;
} catch (e) {
console.debug?.(e);
}
try {
- oe._mjrSliderAbort = null;
+ ce?._mjrSyncAbort?.abort?.();
+ } catch (e) {
+ console.debug?.(e);
+ }
+ try {
+ ce._mjrSyncAbort = null;
+ } catch (e) {
+ console.debug?.(e);
+ }
+ try {
+ se?._mjrSliderAbort?.abort?.();
+ } catch (e) {
+ console.debug?.(e);
+ }
+ try {
+ se._mjrSliderAbort = null;
} catch (e) {
console.debug?.(e);
}
@@ -8418,17 +8419,17 @@ function Za() {
console.debug?.(e);
}
try {
- Ki(ae), ae.replaceChildren();
+ Ji(oe), oe.replaceChildren();
} catch (e) {
console.debug?.(e);
}
try {
- Ki(oe), oe.replaceChildren();
+ Ji(se), se.replaceChildren();
} catch (e) {
console.debug?.(e);
}
try {
- Ki(se), se.replaceChildren();
+ Ji(ce), ce.replaceChildren();
} catch (e) {
console.debug?.(e);
}
@@ -8438,21 +8439,21 @@ function Za() {
console.debug?.(e);
}
try {
- Ge();
+ He();
} catch (e) {
console.debug?.(e);
}
try {
- me.style.display = "none", Ue(ge);
+ L.style.display = "none", Ve(he);
} catch (e) {
console.debug?.(e);
}
try {
- _e.style.display = "none", Ue(ye);
+ ge.style.display = "none", Ve(ve);
} catch (e) {
console.debug?.(e);
}
- e.style.display = "none", e.style.pointerEvents = "none", Dt();
+ e.style.display = "none", e.style.pointerEvents = "none", Et();
try {
document.body.style.overflow = r._prevBodyOverflow ?? "";
} catch {
@@ -8464,13 +8465,13 @@ function Za() {
console.debug?.(e);
}
let t = r?._prevHotkeyScope;
- rt(t || "panel"), r._prevHotkeyScope = null;
+ at(t || "panel"), r._prevHotkeyScope = null;
}
let At = {
open(t, n = 0, i = null) {
- Ot(), r.assets = Array.isArray(t) ? t : [t], r.currentIndex = Math.max(0, Math.min(n, r.assets.length - 1)), r.distractionFree = !1;
+ Dt(), r.assets = Array.isArray(t) ? t : [t], r.currentIndex = Math.max(0, Math.min(n, r.assets.length - 1)), r.distractionFree = !1;
try {
- Oe.rebuild();
+ Te.rebuild();
} catch (e) {
console.debug?.(e);
}
@@ -8480,14 +8481,14 @@ function Za() {
} catch (e) {
console.debug?.(e);
}
- r._panHintTimer = null, r._lastPointerX = null, r._lastPointerY = null, r._mediaW = 0, r._mediaH = 0, r.compareAsset = i, r.gridMode = 0, Ge(), r._probe = null;
+ r._panHintTimer = null, r._lastPointerX = null, r._lastPointerY = null, r._mediaW = 0, r._mediaH = 0, r.compareAsset = i, r.gridMode = 0, He(), r._probe = null;
try {
- ue.style.display = "none";
+ de.style.display = "none";
} catch (e) {
console.debug?.(e);
}
try {
- de.style.display = "none";
+ fe.style.display = "none";
} catch (e) {
console.debug?.(e);
}
@@ -8503,71 +8504,71 @@ function Za() {
} catch {
r._prevBodyOverflow = "";
}
- document.body.style.overflow = "hidden", r._prevHotkeyScope = We().scope || null, rt("viewer"), et();
+ document.body.style.overflow = "hidden", r._prevHotkeyScope = Ke().scope || null, at("viewer"), Qe();
try {
- yt();
+ _t();
} catch (e) {
console.debug?.(e);
}
try {
- vt();
+ gt();
} catch (e) {
console.debug?.(e);
}
- Be();
+ Re();
},
close() {
- kt();
+ Ot();
},
setMode(e) {
- Object.values(Q).includes(e) && (r.mode = e, et());
+ Object.values(Q).includes(e) && (r.mode = e, Qe());
},
setCompareAsset(e) {
- r.compareAsset = e, et();
+ r.compareAsset = e, Qe();
},
dispose() {
try {
- kt();
+ Ot();
} catch (e) {
console.debug?.(e);
}
try {
- Ne.clear();
+ Ae.clear();
} catch (e) {
console.debug?.(e);
}
try {
- Ki(ae);
+ Ji(oe);
} catch (e) {
console.debug?.(e);
}
try {
- Ki(oe);
+ Ji(se);
} catch (e) {
console.debug?.(e);
}
try {
- Ki(se);
+ Ji(ce);
} catch (e) {
console.debug?.(e);
}
try {
- ze != null && cancelAnimationFrame(ze);
+ Le != null && cancelAnimationFrame(Le);
} catch (e) {
console.debug?.(e);
}
try {
- _t != null && cancelAnimationFrame(_t);
+ ht != null && cancelAnimationFrame(ht);
} catch (e) {
console.debug?.(e);
}
try {
- wt?.dispose?.();
+ xt?.dispose?.();
} catch (e) {
console.debug?.(e);
}
try {
- Tt?.dispose?.();
+ St?.dispose?.();
} catch (e) {
console.debug?.(e);
}
@@ -8582,17 +8583,17 @@ function Za() {
console.debug?.(e);
}
try {
- je?.dispose?.();
+ Oe?.dispose?.();
} catch (e) {
console.debug?.(e);
}
try {
- Hi(e);
+ Wi(e);
} catch (e) {
console.debug?.(e);
}
try {
- for (let t of e._mjrViewerUnsubs || []) R(t);
+ for (let t of e._mjrViewerUnsubs || []) V(t);
} catch (e) {
console.debug?.(e);
}
@@ -8619,19 +8620,19 @@ function Za() {
}
};
try {
- x = () => At.close();
+ S = () => At.close();
} catch (e) {
console.debug?.(e);
}
e._mjrViewerAPI = At;
try {
- Vi({
+ Ui({
overlayEl: e,
getCurrentAsset: () => r.assets[r.currentIndex],
- getCurrentViewUrl: (e) => De(e),
+ getCurrentViewUrl: (e) => Fe(e),
onAssetChanged: () => {
try {
- Xe();
+ Je();
} catch (e) {
console.debug?.(e);
}
@@ -8642,35 +8643,35 @@ function Za() {
}
return e;
}
-function Qa() {
- return Ca(Za);
+function eo() {
+ return Ta($a);
}
//#endregion
//#region ui/features/viewer/viewerOpenRequest.ts
-function $a(e) {
+function to(e) {
let t = String(e || "").trim().toLowerCase();
return t === "ab" || t === "sidebyside" ? t : "";
}
-function eo(e, t) {
+function no(e, t) {
let n = Array.isArray(e) ? e.filter(Boolean) : [];
return n.length ? n : t ? [t] : [];
}
-function to({ assets: e = [], asset: t = null, index: n = 0, mode: r = "" } = {}) {
- let i = eo(e, t);
+function ro({ assets: e = [], asset: t = null, index: n = 0, mode: r = "" } = {}) {
+ let i = no(e, t);
if (!i.length) return !1;
- let a = Math.max(0, Math.min(Number(n) || 0, i.length - 1)), o = $a(r), s = {
+ let a = Math.max(0, Math.min(Number(n) || 0, i.length - 1)), o = to(r), s = {
assets: i,
index: a,
mode: o,
handled: !1
};
try {
- if (window.dispatchEvent(new CustomEvent(B.OPEN_VIEWER, { detail: s })), s.handled === !0) return !0;
+ if (window.dispatchEvent(new CustomEvent(H.OPEN_VIEWER, { detail: s })), s.handled === !0) return !0;
} catch (e) {
console.debug?.(e);
}
try {
- let e = Qa();
+ let e = eo();
return e.open(i, a), o && e.setMode?.(o), !0;
} catch (e) {
console.debug?.(e);
@@ -8679,7 +8680,7 @@ function to({ assets: e = [], asset: t = null, index: n = 0, mode: r = "" } = {}
}
//#endregion
//#region ui/features/panel/views/popoverManager.ts
-function no(e, t) {
+function io(e, t) {
if (!e || !t?.size) return !1;
for (let n of t.values()) {
let t = n?.popover || null;
@@ -8694,7 +8695,7 @@ function no(e, t) {
}
return !1;
}
-function ro(e) {
+function ao(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 = (e, t = "y") => {
if (!e) return !1;
let n = globalThis.getComputedStyle?.(e), r = String(t === "x" ? n?.overflowX || n?.overflow || "" : n?.overflowY || n?.overflow || "");
@@ -8780,7 +8781,7 @@ function ro(e) {
for (let e of t.values()) g(e.popover, e.anchor);
}));
}, v = (e) => {
- no(e?.target, t) || _();
+ io(e?.target, t) || _();
}, y = () => {
if (t.size) {
try {
@@ -8977,7 +8978,7 @@ function ro(e) {
}
//#endregion
//#region ui/features/grid/GridKeyboard.ts
-var io = {
+var oo = {
OPEN_VIEWER: {
key: "Enter",
description: "Open selected in viewer"
@@ -9094,25 +9095,25 @@ var io = {
description: "Navigate right"
}
};
-function ao(e) {
+function so(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 oo(e, t) {
+function co(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 so = /* @__PURE__ */ new Map();
-function co(e, t, n) {
- let i = e?.id;
- if (!i) return;
- let a = String(i);
+var lo = /* @__PURE__ */ new Map();
+function uo(e, t, n) {
+ let r = e?.id;
+ if (!r) return;
+ let i = String(r);
try {
- let e = so.get(a);
+ let e = lo.get(i);
e && clearTimeout(e);
} catch (e) {
console.debug?.(e);
@@ -9122,138 +9123,138 @@ function co(e, t, n) {
} catch (e) {
console.debug?.(e);
}
- let o = setTimeout(async () => {
+ let a = setTimeout(async () => {
try {
- so.delete(a);
- let e = await we(i, t);
+ lo.delete(i);
+ let e = await O(r, t);
if (!e?.ok) {
- s(e?.error || r("toast.ratingUpdateFailed"), "error");
+ m(e?.error || R("toast.ratingUpdateFailed"), "error");
return;
}
- s(r("toast.ratingSetN", { n: t }), "success", 1500), ht(qt, {
- assetId: String(i),
+ m(R("toast.ratingSetN", { n: t }), "success", 1500), kt(Zt, {
+ assetId: String(r),
rating: t
}, { warnPrefix: "[GridKeyboard]" });
} catch (e) {
- console.error("[GridKeyboard] Rating update failed:", e), s(r("toast.ratingUpdateError"), "error");
+ console.error("[GridKeyboard] Rating update failed:", e), m(R("toast.ratingUpdateError"), "error");
}
}, 350);
- so.set(a, o);
+ lo.set(i, a);
}
-function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = () => [], getActiveAsset: i = () => null, onOpenDetails: a = () => {}, onOpenTagsEditor: o = () => {}, onSelectionChanged: c = () => {}, onAssetChanged: l = () => {} } = {}) {
- if (!e) return {
+function fo({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = () => [], getActiveAsset: a = () => null, onOpenDetails: o = () => {}, onOpenTagsEditor: s = () => {}, onSelectionChanged: c = () => {}, onAssetChanged: l = () => {} } = {}) {
+ if (!t) return {
bind: () => {},
unbind: () => {},
dispose: () => {}
};
- let u = null, d = null, f = null, p = null, m = !1, h = !1, g = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => {
- to({
+ let u = null, f = null, p = null, h = null, g = !1, _ = !1, v = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => {
+ ro({
assets: e,
index: t,
mode: n
});
- }, _ = () => {
- try {
- He(e);
- } catch (e) {
- console.debug?.(e);
- }
- try {
- window.__MJR_LAST_SELECTION_GRID__ = e;
- } catch (e) {
- console.debug?.(e);
- }
}, y = () => {
try {
- return n() || [];
- } catch {
- return [];
+ We(t);
+ } catch (e) {
+ console.debug?.(e);
+ }
+ try {
+ window.__MJR_LAST_SELECTION_GRID__ = t;
+ } catch (e) {
+ console.debug?.(e);
}
}, b = () => {
try {
- if (typeof e?._mjrGetRenderedCards == "function") {
- let t = e._mjrGetRenderedCards();
- if (Array.isArray(t)) return t;
+ return r() || [];
+ } catch {
+ return [];
+ }
+ }, x = () => {
+ try {
+ if (typeof t?._mjrGetRenderedCards == "function") {
+ let e = t._mjrGetRenderedCards();
+ if (Array.isArray(e)) return e;
}
} catch (e) {
console.debug?.(e);
}
try {
- return Array.from(e.querySelectorAll(".mjr-asset-card"));
+ return Array.from(t.querySelectorAll(".mjr-asset-card"));
} catch {
return [];
}
}, S = () => {
try {
- return i() || y()[0] || null;
+ return a() || b()[0] || null;
} catch {
return null;
}
}, C = (e) => {
if (!e?.filepath) return !1;
- let t = ze(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), s(r("toast.downloadingFile", "Downloading {filename}...", { filename: e.filename }), "info", 3e3), !0;
- }, w = () => {
+ 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), m(R("toast.downloadingFile", "Downloading {filename}...", { filename: e.filename }), "info", 3e3), !0;
+ }, T = () => {
try {
- if (Array.isArray(t?.()?.assets) && t().assets.length) return t().assets;
+ if (Array.isArray(n?.()?.assets) && n().assets.length) return n().assets;
} catch (e) {
console.debug?.(e);
}
try {
- if (typeof e?._mjrGetAssets == "function") {
- let t = e._mjrGetAssets();
- if (Array.isArray(t) && t.length) return t;
+ if (typeof t?._mjrGetAssets == "function") {
+ let e = t._mjrGetAssets();
+ if (Array.isArray(e) && e.length) return e;
}
} catch (e) {
console.debug?.(e);
}
try {
- return b().map((e) => e?._mjrAsset).filter(Boolean);
+ return x().map((e) => e?._mjrAsset).filter(Boolean);
} catch {
return [];
}
- }, T = () => {
+ }, E = () => {
try {
- let t = b();
- if (t.length >= 2) {
- let e = Math.round(t[0].getBoundingClientRect().top), n = t.filter((t) => {
+ let e = x();
+ if (e.length >= 2) {
+ let t = Math.round(e[0].getBoundingClientRect().top), n = e.filter((e) => {
try {
- return Math.abs(Math.round(t.getBoundingClientRect().top) - e) <= 4;
+ return Math.abs(Math.round(e.getBoundingClientRect().top) - t) <= 4;
} catch {
return !1;
}
});
if (n.length >= 1) return Math.max(1, n.length);
}
- if (t.length >= 1) {
- let n = t[0].getBoundingClientRect(), r = e.getBoundingClientRect(), i = Math.max(1, Math.round(n.width)), a = Math.max(1, Math.round(r.width));
+ if (e.length >= 1) {
+ let n = e[0].getBoundingClientRect(), r = t.getBoundingClientRect(), i = Math.max(1, Math.round(n.width)), a = Math.max(1, Math.round(r.width));
return Math.max(1, Math.floor(a / i));
}
} catch (e) {
console.debug?.(e);
}
return 1;
- }, D = (t, n) => {
- let r = Array.isArray(t) ? t.map(String).filter(Boolean) : [], i = String(n || r[0] || "");
+ }, D = (e, n) => {
+ let r = Array.isArray(e) ? e.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);
+ typeof t?._mjrSetSelection == "function" ? t._mjrSetSelection(r, i) : (t.dataset.mjrSelectedAssetIds = JSON.stringify(r), t.dataset.mjrSelectedAssetId = i);
} catch (e) {
console.debug?.(e);
}
- }, O = (t) => {
- let n = String(t || "").trim();
+ }, O = (e) => {
+ let n = String(e || "").trim();
if (n) {
try {
- if (typeof e?._mjrScrollToAssetId == "function") {
- e._mjrScrollToAssetId(n);
+ if (typeof t?._mjrScrollToAssetId == "function") {
+ t._mjrScrollToAssetId(n);
return;
}
} catch (e) {
console.debug?.(e);
}
try {
- let t = typeof CSS < "u" && CSS?.escape ? CSS.escape(n) : n.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1");
- e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${t}"]`)?.scrollIntoView?.({
+ let e = typeof CSS < "u" && CSS?.escape ? CSS.escape(n) : n.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1");
+ t.querySelector(`.mjr-asset-card[data-mjr-asset-id="${e}"]`)?.scrollIntoView?.({
block: "nearest",
inline: "nearest"
});
@@ -9261,23 +9262,23 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n =
console.debug?.(e);
}
}
- }, A = (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 = w();
+ }, k = (e) => {
+ let n = String(e.key || "");
+ if (!(n === "ArrowLeft" || n === "ArrowRight" || n === "ArrowUp" || n === "ArrowDown") && !(n === "Home" || n === "End") || e.ctrlKey || e.altKey || e.metaKey) return !1;
+ let r = T();
if (!Array.isArray(r) || r.length === 0) return !1;
- let i = S(), a = String(i?.id || e?.dataset?.mjrSelectedAssetId || ""), o = r.findIndex((e) => String(e?.id || "") === a), s = o >= 0;
+ let i = S(), a = String(i?.id || t?.dataset?.mjrSelectedAssetId || ""), o = r.findIndex((e) => String(e?.id || "") === a), s = o >= 0;
o < 0 && (o = 0);
- let l = Math.max(1, T()), u = o;
+ let l = Math.max(1, E()), u = o;
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)), s && u === o && n !== "Home" && n !== "End") return !1;
let d = String(r[u]?.id || "");
if (!d) return !1;
- if (_(), t.shiftKey) {
- let t = String(e?._mjrSelectionAnchorId || "");
- t ||= a || d;
- let n = r.findIndex((e) => String(e?.id || "") === t), i = n >= 0 ? n : o, s = Math.min(i, u), c = Math.max(i, u);
+ if (y(), e.shiftKey) {
+ let e = String(t?._mjrSelectionAnchorId || "");
+ e ||= a || d;
+ let n = r.findIndex((t) => String(t?.id || "") === e), i = n >= 0 ? n : o, s = Math.min(i, u), c = Math.max(i, u);
D(r.slice(s, c + 1).map((e) => String(e?.id || "")).filter(Boolean), d);
- } else e._mjrSelectionAnchorId = d, D([d], d);
+ } else t._mjrSelectionAnchorId = d, D([d], d);
O(d);
try {
c?.();
@@ -9285,76 +9286,76 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n =
console.debug?.(e);
}
return !0;
- }, j = async (n) => {
- let i = n.target;
- if (i && (i.tagName === "INPUT" || i.tagName === "TEXTAREA" || i.isContentEditable) || L() || We().scope === "viewer") return;
+ }, A = async (r) => {
+ let a = r.target;
+ if (a && (a.tagName === "INPUT" || a.tagName === "TEXTAREA" || a.isContentEditable) || Ze() || Ke().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");
+ let e = document.activeElement, n = t.contains(e), r = e && e.contains && e.contains(t), i = e?.closest?.(".mjr-asset-card");
if (!n && !r && !i) return;
} else {
- let t = qe();
- if (t && t !== e) return;
+ let e = Je();
+ if (e && e !== t) return;
}
let u = () => {
- n.preventDefault(), n.stopPropagation();
+ r.preventDefault(), r.stopPropagation();
};
try {
- if (A(n)) {
+ if (k(r)) {
u();
return;
}
} catch (e) {
console.debug?.(e);
}
- let d = y(), f = S(), p = t();
- if (oo(n, io.DOWNLOAD) && f?.filepath) {
- u(), h = !0;
+ let f = b(), p = S(), h = n();
+ if (co(r, oo.DOWNLOAD) && p?.filepath) {
+ u(), _ = !0;
return;
}
- let m = !!We().ratingHotkeysActive;
- if (!n.ctrlKey && !n.altKey && !n.metaKey && !n.shiftKey) {
- if (!m && oo(n, io.RATING_1) && f?.id) {
- u(), co(f, 1, l);
+ let g = !!Ke().ratingHotkeysActive;
+ if (!r.ctrlKey && !r.altKey && !r.metaKey && !r.shiftKey) {
+ if (!g && co(r, oo.RATING_1) && p?.id) {
+ u(), uo(p, 1, l);
return;
}
- if (!m && oo(n, io.RATING_2) && f?.id) {
- u(), co(f, 2, l);
+ if (!g && co(r, oo.RATING_2) && p?.id) {
+ u(), uo(p, 2, l);
return;
}
- if (!m && oo(n, io.RATING_3) && f?.id) {
- u(), co(f, 3, l);
+ if (!g && co(r, oo.RATING_3) && p?.id) {
+ u(), uo(p, 3, l);
return;
}
- if (!m && oo(n, io.RATING_4) && f?.id) {
- u(), co(f, 4, l);
+ if (!g && co(r, oo.RATING_4) && p?.id) {
+ u(), uo(p, 4, l);
return;
}
- if (!m && oo(n, io.RATING_5) && f?.id) {
- u(), co(f, 5, l);
+ if (!g && co(r, oo.RATING_5) && p?.id) {
+ u(), uo(p, 5, l);
return;
}
- if (!m && oo(n, io.RATING_RESET) && f?.id) {
- u(), co(f, 0, l);
+ if (!g && co(r, oo.RATING_RESET) && p?.id) {
+ u(), uo(p, 0, l);
return;
}
}
- if ((oo(n, io.OPEN_VIEWER) || oo(n, io.OPEN_VIEWER_ALT)) && d.length > 0) {
+ if ((co(r, oo.OPEN_VIEWER) || co(r, oo.OPEN_VIEWER_ALT)) && f.length > 0) {
u();
try {
- if (d.length >= 2 && d.length <= 4) g({
- assets: d,
+ if (f.length >= 2 && f.length <= 4) v({
+ assets: f,
index: 0
});
else {
- let t = [];
- if (Array.isArray(p?.assets) && p.assets.length) t = p.assets;
- else if (typeof e?._mjrGetAssets == "function") {
- let n = e._mjrGetAssets();
- Array.isArray(n) && n.length && (t = n);
- } else t = b().map((e) => e._mjrAsset).filter(Boolean);
- let n = t.findIndex((e) => String(e?.id) === String(f?.id));
- g({
- assets: t,
+ let e = [];
+ if (Array.isArray(h?.assets) && h.assets.length) e = h.assets;
+ else if (typeof t?._mjrGetAssets == "function") {
+ let n = t._mjrGetAssets();
+ Array.isArray(n) && n.length && (e = n);
+ } else e = x().map((e) => e._mjrAsset).filter(Boolean);
+ let n = e.findIndex((e) => String(e?.id) === String(p?.id));
+ v({
+ assets: e,
index: Math.max(0, n)
});
}
@@ -9363,15 +9364,15 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n =
}
return;
}
- if (oo(n, io.METADATA_PANEL) && f) {
- u(), a(f);
+ if (co(r, oo.METADATA_PANEL) && p) {
+ u(), o(p);
return;
}
- if (oo(n, io.COMPARE_AB) && d.length === 2) {
+ if (co(r, oo.COMPARE_AB) && f.length === 2) {
u();
try {
- g({
- assets: d,
+ v({
+ assets: f,
index: 0,
mode: "ab"
});
@@ -9380,11 +9381,11 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n =
}
return;
}
- if (oo(n, io.SIDE_BY_SIDE) && d.length >= 2 && d.length <= 4) {
+ if (co(r, oo.SIDE_BY_SIDE) && f.length >= 2 && f.length <= 4) {
u();
try {
- g({
- assets: d,
+ v({
+ assets: f,
index: 0,
mode: "sidebyside"
});
@@ -9393,33 +9394,33 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n =
}
return;
}
- if (oo(n, io.EDIT_TAGS) && f?.id) {
- u(), o(f);
+ if (co(r, oo.EDIT_TAGS) && p?.id) {
+ u(), s(p);
return;
}
- if (oo(n, io.ADD_TO_COLLECTION) && (d.length > 0 || f)) {
+ if (co(r, oo.ADD_TO_COLLECTION) && (f.length > 0 || p)) {
u();
- let t = d.length > 0 ? d : [f], n = e.getBoundingClientRect();
- await ti({
+ let e = f.length > 0 ? f : [p], n = t.getBoundingClientRect();
+ await ni({
x: n.left + n.width / 2,
y: n.top + n.height / 2,
- assets: t
+ assets: e
});
return;
}
- if (oo(n, io.REMOVE_FROM_COLLECTION)) {
- let e = p?.collectionId;
- if (e && (d.length > 0 || f)) {
+ if (co(r, oo.REMOVE_FROM_COLLECTION)) {
+ let e = h?.collectionId;
+ if (e && (f.length > 0 || p)) {
u();
try {
- let t = (d.length > 0 ? d : [f]).map((e) => String(e?.filepath || e?.path || e?.file_info?.filepath || "").trim()).filter(Boolean);
+ let t = (f.length > 0 ? f : [p]).map((e) => String(e?.filepath || e?.path || e?.file_info?.filepath || "").trim()).filter(Boolean);
if (!t.length) {
- s(r("toast.removeFromCollectionFailed", "No valid files to remove from collection"), "warning");
+ m(R("toast.removeFromCollectionFailed", "No valid files to remove from collection"), "warning");
return;
}
- let n = await k(e, t);
+ let n = await d(e, t);
if (!n?.ok) {
- s(n?.error || r("toast.removeFromCollectionFailed", "Failed to remove from collection"), "error");
+ m(n?.error || R("toast.removeFromCollectionFailed", "Failed to remove from collection"), "error");
return;
}
try {
@@ -9427,78 +9428,78 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n =
} catch (e) {
console.debug?.(e);
}
- s(r("toast.removedFromCollection", "Removed from collection"), "success", 1400);
+ m(R("toast.removedFromCollection", "Removed from collection"), "success", 1400);
} catch (e) {
- s(r("toast.removeFromCollectionError", "Error removing from collection: {error}", { error: e?.message || String(e || "") }), "error");
+ m(R("toast.removeFromCollectionError", "Error removing from collection: {error}", { error: e?.message || String(e || "") }), "error");
}
return;
}
}
- if (oo(n, io.COPY_PATH) && f?.filepath) {
+ if (co(r, oo.COPY_PATH) && p?.filepath) {
u();
try {
- await navigator.clipboard.writeText(f.filepath), s(r("toast.pathCopied"), "success", 2e3);
+ await navigator.clipboard.writeText(p.filepath), m(R("toast.pathCopied"), "success", 2e3);
} catch {
- s(r("toast.pathCopyFailed"), "error");
+ m(R("toast.pathCopyFailed"), "error");
}
return;
}
- if (oo(n, io.OPEN_IN_FOLDER) && f?.id) {
+ if (co(r, oo.OPEN_IN_FOLDER) && p?.id) {
u();
- let e = await E(f.id);
- e?.ok ? s(r("toast.openedInFolder"), "info", 2e3) : s(e?.error || r("toast.openFolderFailed"), "error");
+ let t = await e(p.id);
+ t?.ok ? m(R("toast.openedInFolder"), "info", 2e3) : m(t?.error || R("toast.openFolderFailed"), "error");
return;
}
- if (oo(n, io.RENAME) && f?.id) {
+ if (co(r, oo.RENAME) && p?.id) {
u();
- let e = f.filename || "", t = ci(await Lt(r("dialog.rename.title", "Rename file"), e), e);
+ let e = p.filename || "", t = li(await gt(R("dialog.rename.title", "Rename file"), e), e);
if (t && t !== e) {
- let e = ai(t);
+ let e = oi(t);
if (!e.valid) {
- s(e.reason, "error");
+ m(e.reason, "error");
return;
}
try {
- let e = await v(f, t);
+ let e = await i(p, t);
if (e?.ok) {
let n = e?.data?.asset;
- n && typeof n == "object" ? Object.assign(f, n) : (f.filename = t, f.filepath = f.filepath?.replace(/[^\\/]+$/, t), f.path &&= String(f.path).replace(/[^\\/]+$/, t), f.file_info && typeof f.file_info == "object" && (f.file_info.filename = t, f.file_info.filepath && (f.file_info.filepath = String(f.file_info.filepath).replace(/[^\\/]+$/, t)), f.file_info.path && (f.file_info.path = String(f.file_info.path).replace(/[^\\/]+$/, t)))), s(r("toast.fileRenamedSuccess"), "success");
+ n && typeof n == "object" ? Object.assign(p, n) : (p.filename = t, p.filepath = p.filepath?.replace(/[^\\/]+$/, t), p.path &&= String(p.path).replace(/[^\\/]+$/, t), p.file_info && typeof p.file_info == "object" && (p.file_info.filename = t, p.file_info.filepath && (p.file_info.filepath = String(p.file_info.filepath).replace(/[^\\/]+$/, t)), p.file_info.path && (p.file_info.path = String(p.file_info.path).replace(/[^\\/]+$/, t)))), m(R("toast.fileRenamedSuccess"), "success");
try {
window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "rename-keyboard" } }));
} catch (e) {
console.debug?.(e);
}
l();
- } else s(e?.error || r("toast.fileRenameFailed"), "error");
+ } else m(e?.error || R("toast.fileRenameFailed"), "error");
} catch (e) {
- s(r("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error");
+ m(R("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error");
}
}
return;
}
- if ((oo(n, io.DELETE) || oo(n, io.DELETE_ALT)) && (f?.id || d.length > 0)) {
+ if ((co(r, oo.DELETE) || co(r, oo.DELETE_ALT)) && (p?.id || f.length > 0)) {
u();
- let t = d.length > 0 ? d : [f], n = 0, i = 0, a = [];
- for (let e of t) if (e?.id) try {
- (await x(e.id))?.ok ? (n++, a.push(String(e.id))) : i++;
+ let e = f.length > 0 ? f : [p], n = 0, r = 0, i = [];
+ for (let t of e) if (t?.id) try {
+ (await w(t.id))?.ok ? (n++, i.push(String(t.id))) : r++;
} catch {
- i++;
+ r++;
}
- if (a.length) try {
- let t = e?._mjrRemoveAssets;
- if (typeof t == "function") t(a);
- else for (let t of a) e.querySelector(`[data-mjr-asset-id="${t}"]`)?.remove?.();
+ if (i.length) try {
+ let e = t?._mjrRemoveAssets;
+ if (typeof e == "function") e(i);
+ else for (let e of i) t.querySelector(`[data-mjr-asset-id="${e}"]`)?.remove?.();
} catch (e) {
console.debug?.(e);
}
- i === 0 ? s(r("toast.filesDeletedShort", "{n} files deleted", { n }), "success") : s(r("toast.filesDeletedShortPartial", "{success} deleted, {failed} failed", {
+ r === 0 ? m(R("toast.filesDeletedShort", "{n} files deleted", { n }), "success") : m(R("toast.filesDeletedShortPartial", "{success} deleted, {failed} failed", {
success: n,
- failed: i
+ failed: r
}), "warning");
try {
- if (typeof e?._mjrSetSelection == "function") {
- let t = d.filter((e) => !a.includes(String(e?.id || ""))).map((e) => String(e?.id || "")).filter(Boolean);
- e._mjrSetSelection(t, t[0] || "");
+ if (typeof t?._mjrSetSelection == "function") {
+ let e = f.filter((e) => !i.includes(String(e?.id || ""))).map((e) => String(e?.id || "")).filter(Boolean);
+ t._mjrSetSelection(e, e[0] || "");
}
} catch (e) {
console.debug?.(e);
@@ -9506,96 +9507,96 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n =
c();
return;
}
- if (oo(n, io.SELECT_ALL)) {
+ if (co(r, oo.SELECT_ALL)) {
u();
- let t = [];
+ let e = [];
try {
- if (Array.isArray(p?.assets) && p.assets.length) t = p.assets.map((e) => String(e?.id || "")).filter(Boolean);
- else if (typeof e?._mjrGetAssets == "function") {
- let n = e._mjrGetAssets();
- Array.isArray(n) && (t = n.map((e) => String(e?.id || "")).filter(Boolean));
+ if (Array.isArray(h?.assets) && h.assets.length) e = h.assets.map((e) => String(e?.id || "")).filter(Boolean);
+ else if (typeof t?._mjrGetAssets == "function") {
+ let n = t._mjrGetAssets();
+ Array.isArray(n) && (e = n.map((e) => String(e?.id || "")).filter(Boolean));
}
} catch (e) {
console.debug?.(e);
}
- if (!t.length) try {
- t = b().map((e) => String(e?._mjrAsset?.id || "")).filter(Boolean);
+ if (!e.length) try {
+ e = x().map((e) => String(e?._mjrAsset?.id || "")).filter(Boolean);
} catch (e) {
console.debug?.(e);
}
try {
- typeof e?._mjrSetSelection == "function" ? e._mjrSetSelection(t, t[0] || "") : (b().forEach((e) => {
+ typeof t?._mjrSetSelection == "function" ? t._mjrSetSelection(e, e[0] || "") : (x().forEach((e) => {
e.classList.add("is-selected"), e.setAttribute("aria-selected", "true");
- }), e.dataset.mjrSelectedAssetIds = JSON.stringify(t), e.dataset.mjrSelectedAssetId = String(t[0] || ""));
+ }), t.dataset.mjrSelectedAssetIds = JSON.stringify(e), t.dataset.mjrSelectedAssetId = String(e[0] || ""));
} catch (e) {
console.debug?.(e);
}
c();
return;
}
- if (oo(n, io.DESELECT_ALL)) {
+ if (co(r, oo.DESELECT_ALL)) {
u();
try {
- typeof e?._mjrSetSelection == "function" ? e._mjrSetSelection([], "") : (b().filter((e) => e?.classList?.contains?.("is-selected")).forEach((e) => {
+ typeof t?._mjrSetSelection == "function" ? t._mjrSetSelection([], "") : (x().filter((e) => e?.classList?.contains?.("is-selected")).forEach((e) => {
e.classList.remove("is-selected"), e.setAttribute("aria-selected", "false");
- }), delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId);
+ }), delete t.dataset.mjrSelectedAssetIds, delete t.dataset.mjrSelectedAssetId);
} catch (e) {
console.debug?.(e);
}
c();
return;
}
- }, M = (e) => {
- if (String(e?.key || "").toLowerCase() !== "s" || !h || (h = !1, L()) || We().scope === "viewer") return;
+ }, j = (e) => {
+ if (String(e?.key || "").toLowerCase() !== "s" || !_ || (_ = !1, Ze()) || Ke().scope === "viewer") return;
let t = S();
t?.filepath && (e.preventDefault?.(), e.stopPropagation?.(), e.stopImmediatePropagation?.(), C(t));
+ }, M = () => {
+ _ = !1;
}, N = () => {
- h = !1;
+ g ||= (u = A, f = j, p = M, h = () => y(), document.addEventListener("keydown", u, !0), document.addEventListener("keyup", f, !0), document.addEventListener("dragstart", p, !0), t.addEventListener("pointerdown", h, !0), t.addEventListener("focusin", h, !0), !0);
}, P = () => {
- m ||= (u = j, d = M, f = N, p = () => _(), document.addEventListener("keydown", u, !0), document.addEventListener("keyup", d, !0), document.addEventListener("dragstart", f, !0), e.addEventListener("pointerdown", p, !0), e.addEventListener("focusin", p, !0), !0);
- }, F = () => {
- if (!(!m || !u)) {
- document.removeEventListener("keydown", u, !0), d && document.removeEventListener("keyup", d, !0), f && document.removeEventListener("dragstart", f, !0), p && (e.removeEventListener("pointerdown", p, !0), e.removeEventListener("focusin", p, !0)), u = null, d = null, f = null, p = null, h = !1;
+ if (!(!g || !u)) {
+ document.removeEventListener("keydown", u, !0), f && document.removeEventListener("keyup", f, !0), p && document.removeEventListener("dragstart", p, !0), h && (t.removeEventListener("pointerdown", h, !0), t.removeEventListener("focusin", h, !0)), u = null, f = null, p = null, h = null, _ = !1;
try {
- Je(e);
+ Ye(t);
} catch (e) {
console.debug?.(e);
}
try {
- window.__MJR_LAST_SELECTION_GRID__ === e && delete window.__MJR_LAST_SELECTION_GRID__;
+ window.__MJR_LAST_SELECTION_GRID__ === t && delete window.__MJR_LAST_SELECTION_GRID__;
} catch (e) {
console.debug?.(e);
}
- m = !1;
- for (let e of so.values()) try {
+ g = !1;
+ for (let e of lo.values()) try {
clearTimeout(e);
} catch (e) {
console.debug?.(e);
}
- so.clear();
+ lo.clear();
}
};
return {
- bind: P,
- unbind: F,
+ bind: N,
+ unbind: P,
dispose: () => {
- F();
- for (let e of so.values()) try {
+ P();
+ for (let e of lo.values()) try {
clearTimeout(e);
} catch (e) {
console.debug?.(e);
}
- so.clear();
+ lo.clear();
}
};
}
-function uo(e) {
- let t = io[e];
- return t ? ao(t) : "";
+function po(e) {
+ let t = oo[e];
+ return t ? so(t) : "";
}
//#endregion
//#region ui/features/contextmenu/gridContextMenuState.ts
-function fo() {
+function mo() {
return {
open: !1,
x: 0,
@@ -9607,8 +9608,8 @@ function fo() {
var $ = Dn({
portalOwnerId: "",
mountedPortalIds: [],
- main: fo(),
- submenu: fo(),
+ main: mo(),
+ submenu: mo(),
tags: {
open: !1,
x: 0,
@@ -9616,52 +9617,52 @@ var $ = Dn({
asset: null,
onChanged: null
}
-}), po = 1;
-function mo(e) {
+}), ho = 1;
+function go(e) {
e && (e.open = !1, e.x = 0, e.y = 0, e.items = [], e.title = "");
}
-function ho(e = "") {
+function _o(e = "") {
try {
window.dispatchEvent(new CustomEvent("mjr-close-all-menus", { detail: { source: String(e || "") } }));
} catch (e) {
console.debug?.(e);
}
}
-function go() {
- let e = `mjr-grid-context-menu-portal-${po++}`;
+function vo() {
+ let e = `mjr-grid-context-menu-portal-${ho++}`;
return $.mountedPortalIds.push(e), $.portalOwnerId ||= e, e;
}
-function _o(e) {
+function yo(e) {
let t = $.mountedPortalIds.filter((t) => t !== e);
$.mountedPortalIds.splice(0, $.mountedPortalIds.length, ...t), $.portalOwnerId === e && ($.portalOwnerId = $.mountedPortalIds[0] || "");
}
-function vo(e) {
+function bo(e) {
return String($.portalOwnerId || "") === String(e || "");
}
-function yo({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) {
- ho("grid"), wo(), So(), $.main.open = !0, $.main.x = Number(e) || 0, $.main.y = Number(t) || 0, $.main.items = Array.isArray(n) ? n.filter(Boolean) : [], $.main.title = String(r || "");
-}
-function bo() {
- mo($.main), So();
-}
function xo({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) {
- $.submenu.open = !0, $.submenu.x = Number(e) || 0, $.submenu.y = Number(t) || 0, $.submenu.items = Array.isArray(n) ? n.filter(Boolean) : [], $.submenu.title = String(r || "");
+ _o("grid"), Eo(), wo(), $.main.open = !0, $.main.x = Number(e) || 0, $.main.y = Number(t) || 0, $.main.items = Array.isArray(n) ? n.filter(Boolean) : [], $.main.title = String(r || "");
}
function So() {
- mo($.submenu);
+ go($.main), wo();
}
-function Co({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) {
- bo(), $.tags.open = !!n, $.tags.x = Number(e) || 0, $.tags.y = Number(t) || 0, $.tags.asset = n || null, $.tags.onChanged = typeof r == "function" ? r : null;
+function Co({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) {
+ $.submenu.open = !0, $.submenu.x = Number(e) || 0, $.submenu.y = Number(t) || 0, $.submenu.items = Array.isArray(n) ? n.filter(Boolean) : [], $.submenu.title = String(r || "");
}
function wo() {
+ go($.submenu);
+}
+function To({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) {
+ So(), $.tags.open = !!n, $.tags.x = Number(e) || 0, $.tags.y = Number(t) || 0, $.tags.asset = n || null, $.tags.onChanged = typeof r == "function" ? r : null;
+}
+function Eo() {
$.tags.open = !1, $.tags.x = 0, $.tags.y = 0, $.tags.asset = null, $.tags.onChanged = null;
}
-function To() {
- bo(), wo();
+function Do() {
+ So(), Eo();
}
//#endregion
//#region ui/features/dnd/utils/constants.ts
-var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "application/x-comfy-asset-info", ko = new Set([
+var Oo = "application/x-mjr-asset", ko = "application/x-mjr-assets", Ao = "application/x-comfy-asset-info", jo = new Set([
".png",
".jpg",
".jpeg",
@@ -9669,13 +9670,13 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
".gif",
".bmp",
".avif"
-]), Ao = new Set([
+]), Mo = new Set([
".mp4",
".mov",
".mkv",
".webm",
".avi"
-]), jo = new Set([
+]), No = new Set([
".wav",
".mp3",
".flac",
@@ -9683,7 +9684,7 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
".m4a",
".aac",
".opus"
-]), Mo = new Set([
+]), Po = new Set([
".obj",
".fbx",
".glb",
@@ -9693,23 +9694,23 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
".splat",
".ksplat",
".spz"
-]), No = (e) => {
- if (!e) return !1;
- let t = e.lastIndexOf(".");
- return t === -1 ? !1 : ko.has(e.slice(t).toLowerCase());
-}, Po = (e) => e ? String(e.kind || "").toLowerCase() === "image" ? !0 : No(e.filename) : !1, Fo = (e) => {
- if (!e) return !1;
- let t = e.lastIndexOf(".");
- return t === -1 ? !1 : Ao.has(e.slice(t).toLowerCase());
-}, Io = (e) => e ? String(e.kind || "").toLowerCase() === "video" ? !0 : Fo(e.filename) : !1, Lo = (e) => {
+]), Fo = (e) => {
if (!e) return !1;
let t = e.lastIndexOf(".");
return t === -1 ? !1 : jo.has(e.slice(t).toLowerCase());
-}, Ro = (e) => e ? String(e.kind || "").toLowerCase() === "audio" ? !0 : Lo(e.filename) : !1, zo = (e) => {
+}, Io = (e) => e ? String(e.kind || "").toLowerCase() === "image" ? !0 : Fo(e.filename) : !1, Lo = (e) => {
if (!e) return !1;
let t = e.lastIndexOf(".");
return t === -1 ? !1 : Mo.has(e.slice(t).toLowerCase());
-}, Bo = (e) => e ? String(e.kind || "").toLowerCase() === "model3d" ? !0 : zo(e.filename) : !1, Vo = (e) => Po(e) || Io(e) || Ro(e) || Bo(e), Ho = {
+}, Ro = (e) => e ? String(e.kind || "").toLowerCase() === "video" ? !0 : Lo(e.filename) : !1, zo = (e) => {
+ if (!e) return !1;
+ let t = e.lastIndexOf(".");
+ return t === -1 ? !1 : No.has(e.slice(t).toLowerCase());
+}, Bo = (e) => e ? String(e.kind || "").toLowerCase() === "audio" ? !0 : zo(e.filename) : !1, Vo = (e) => {
+ if (!e) return !1;
+ let t = e.lastIndexOf(".");
+ return t === -1 ? !1 : Po.has(e.slice(t).toLowerCase());
+}, Ho = (e) => e ? String(e.kind || "").toLowerCase() === "model3d" ? !0 : Vo(e.filename) : !1, Uo = (e) => Io(e) || Ro(e) || Bo(e) || Ho(e), Wo = {
mp4: "video/mp4",
mov: "video/quicktime",
webm: "video/webm",
@@ -9719,45 +9720,45 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
obj: "model/obj",
stl: "model/stl",
ply: "application/ply"
-}, Uo = (e) => Ho[String(e || "").split(".").pop()?.toLowerCase()] ?? "application/octet-stream", Wo = (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 : Ao.has(`.${r}`) : !1;
-}, Go = (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;
-}, Ko = (e, t) => Go(e, t, Wo), qo = (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 : ko.has(`.${r}`) : !1;
-}, Jo = (e, t) => Go(e, t, qo), Yo = (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 : jo.has(`.${r}`) : !1;
-}, Xo = (e, t) => Go(e, t, Yo), Zo = (e, t) => {
+}, Go = (e) => Wo[String(e || "").split(".").pop()?.toLowerCase()] ?? "application/octet-stream", Ko = (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 : Mo.has(`.${r}`) : !1;
-}, Qo = (e, t) => Go(e, t, Zo), $o = /* @__PURE__ */ new WeakMap(), es = (e) => {
+}, qo = (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;
+}, Jo = (e, t) => qo(e, t, Ko), Yo = (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 : jo.has(`.${r}`) : !1;
+}, Xo = (e, t) => qo(e, t, Yo), Zo = (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 : No.has(`.${r}`) : !1;
+}, Qo = (e, t) => qo(e, t, Zo), $o = (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 : Po.has(`.${r}`) : !1;
+}, es = (e, t) => qo(e, t, $o), ts = /* @__PURE__ */ new WeakMap(), ns = (e) => {
if (!e || typeof e != "object") return {
node: null,
prev: null
};
- let t = $o.get(e);
+ let t = ts.get(e);
return t || (t = {
node: null,
prev: null
- }, $o.set(e, t)), t;
-}, ts = (e, t, n) => {
+ }, ts.set(e, t)), t;
+}, rs = (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();
@@ -9772,14 +9773,14 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
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;
-}, ns = (e, t, n) => {
- let r = es(e);
- !t || r.node === t || (rs(e, n), r.node = t, r.prev = {
+}, is = (e, t, n) => {
+ let r = ns(e);
+ !t || r.node === t || (as(e, n), r.node = t, r.prev = {
color: t.color,
bgcolor: t.bgcolor
}, t.bgcolor = "#3355ff", t.color = "#a9c4ff", n(e));
-}, rs = (e, t) => {
- let n = es(e);
+}, as = (e, t) => {
+ let n = ns(e);
if (n.node) {
try {
n.prev && (n.node.color = n.prev.color, n.node.bgcolor = n.prev.bgcolor);
@@ -9788,7 +9789,7 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
}
n.node = null, n.prev = null, t(e);
}
-}, is = (e, t) => {
+}, os = (e, t) => {
if (!e || e.type !== "combo" || !e.options) return;
let n = e.options.values, r = e.options;
if (typeof n != "function") {
@@ -9800,41 +9801,41 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
value: t
}), r.values = n);
}
-}, as = new Set([
+}, ss = new Set([
"number",
"int",
"float",
"boolean",
"toggle",
"checkbox"
-]), os = [
+]), cs = [
"output",
"save",
"export",
"folder",
"dir"
-], ss = ["file", "path"], cs = [
+], ls = ["file", "path"], us = [
"path",
"file",
"input",
"src",
"source"
-], ls = (e, t, n) => {
+], ds = (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 (as.has(t) || typeof r == "number" || typeof r == "boolean") continue;
+ if (ss.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 = cs.some((e) => l.includes(e));
- d && f && (u += 80), ss.some((e) => l.includes(e)) && (u += 35);
+ let d = n.mediaTerms.some((e) => l.includes(e)), f = us.some((e) => l.includes(e));
+ d && f && (u += 80), ls.some((e) => l.includes(e)) && (u += 35);
for (let { terms: e, score: t } of n.extraTerms) e.some((e) => l.includes(e)) && (u += t);
- os.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);
+ cs.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,
@@ -9853,7 +9854,7 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
console.debug?.(e);
}
return c.w;
-}, us = {
+}, fs = {
exactNames: new Set([
"video_path",
"input_video",
@@ -9896,10 +9897,10 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
score: 45
}],
exactSingleNames: new Set(["video"]),
- looksLikeFn: Wo,
- comboChecker: Ko,
+ looksLikeFn: Ko,
+ comboChecker: Jo,
scoreKey: "__mjrVideoPickScore"
-}, ds = {
+}, ps = {
exactNames: new Set([
"image",
"image_path",
@@ -9954,10 +9955,10 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
score: 35
}],
exactSingleNames: new Set(["image", "face"]),
- looksLikeFn: qo,
- comboChecker: Jo,
+ looksLikeFn: Yo,
+ comboChecker: Xo,
scoreKey: "__mjrImagePickScore"
-}, fs = {
+}, ms = {
exactNames: new Set([
"audio_path",
"input_audio",
@@ -10005,10 +10006,10 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
score: 45
}],
exactSingleNames: new Set(["audio", "voice"]),
- looksLikeFn: Yo,
- comboChecker: Xo,
+ looksLikeFn: Zo,
+ comboChecker: Qo,
scoreKey: "__mjrAudioPickScore"
-}, ps = {
+}, hs = {
exactNames: new Set([
"model_path",
"input_model",
@@ -10067,13 +10068,13 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
"mesh",
"geometry"
]),
- looksLikeFn: Zo,
- comboChecker: Qo,
+ looksLikeFn: $o,
+ comboChecker: es,
scoreKey: "__mjrModel3DPickScore"
-}, ms = (e, t, n) => {
+}, gs = (e, t, n) => {
let r = String(t?.kind || "").toLowerCase();
- return ls(e, n, r === "model3d" ? ps : r === "audio" ? fs : r === "image" ? ds : us);
-}, hs = (e, t, n, r) => {
+ return ds(e, n, r === "model3d" ? hs : r === "audio" ? ms : r === "image" ? ps : fs);
+}, _s = (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;
@@ -10086,15 +10087,15 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
};
}
return null;
-}, gs = (e) => {
+}, vs = (e) => {
let t = e?.canvas?.canvas || document.querySelector("canvas");
return t ? t.getBoundingClientRect() : null;
-}, _s = (e, t) => {
- let n = gs(e);
+}, ys = (e, t) => {
+ let n = vs(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;
-}, vs = (e) => {
+}, bs = (e) => {
try {
e?.graph?.setDirtyCanvas?.(!0, !0);
} catch (e) {
@@ -10105,21 +10106,21 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
} catch (e) {
console.debug?.(e);
}
-}, ys = (e) => {
+}, xs = (e) => {
let t = String(e?.filename || ""), n = t.lastIndexOf(".");
return n >= 0 ? t.slice(n).toLowerCase() : "";
-}, bs = (e) => {
- let t = String(e?.kind || "").toLowerCase(), n = ys(e);
- return t === "image" || ko.has(n) ? ["LoadImage"] : t === "video" || Ao.has(n) ? [
+}, Ss = (e) => {
+ let t = String(e?.kind || "").toLowerCase(), n = xs(e);
+ return t === "image" || jo.has(n) ? ["LoadImage"] : t === "video" || Mo.has(n) ? [
"LoadVideo",
"VHS_LoadVideo",
"VideoLoader"
- ] : t === "audio" || jo.has(n) ? [
+ ] : t === "audio" || No.has(n) ? [
"LoadAudio",
"VHS_LoadAudioUpload",
"VHS_LoadAudio",
"AudioLoader"
- ] : t === "model3d" || Mo.has(n) ? [
+ ] : t === "model3d" || Po.has(n) ? [
"Load3D",
"LoadModel",
"LoadMesh",
@@ -10128,9 +10129,9 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
"LoadSTL",
"LoadPLY"
] : [];
-}, xs = (e, t) => {
+}, Cs = (e, t) => {
if (e) {
- e.type === "combo" && is(e, t), e.value = t;
+ e.type === "combo" && os(e, t), e.value = t;
try {
e.callback?.(e.value);
} catch (e) {
@@ -10142,41 +10143,41 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
console.debug?.(e);
}
}
-}, Ss = (e) => {
+}, ws = (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 Cs(e, s + Math.max(0, a / 2), c + Math.max(0, o / 2));
-}, Cs = (e, t, n) => {
+ return Ts(e, s + Math.max(0, a / 2), c + Math.max(0, o / 2));
+}, Ts = (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)) ? Ss(e) : [(Number(t) - r.left) / a - s, (Number(n) - r.top) / a - c];
-}, ws = (e, t = null) => {
- if (Number.isFinite(Number(t?.clientX)) && Number.isFinite(Number(t?.clientY))) return Cs(e, t.clientX, t.clientY);
+ return !r || !Number.isFinite(Number(t)) || !Number.isFinite(Number(n)) ? ws(e) : [(Number(t) - r.left) / a - s, (Number(n) - r.top) / a - c];
+}, Es = (e, t = null) => {
+ if (Number.isFinite(Number(t?.clientX)) && Number.isFinite(Number(t?.clientY))) return Ts(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 Cs(e, t?.clientX, t?.clientY);
-}, Ts = ({ app: e, payload: t, relativePath: n, event: r = null, droppedExt: i = "", position: a = null }) => {
+ return Ts(e, t?.clientX, t?.clientY);
+}, Ds = ({ app: e, payload: t, relativePath: n, event: r = null, droppedExt: i = "", position: a = null }) => {
let o = e?.graph ?? e?.canvas?.graph ?? null, s = globalThis?.LiteGraph || globalThis?.window?.LiteGraph || null;
if (!o || typeof o.add != "function" || !s?.createNode) return !1;
let c = null;
- for (let e of bs(t)) try {
+ for (let e of Ss(t)) try {
if (c = s.createNode(e), c) break;
} catch (e) {
console.debug?.(e);
}
if (!c) return !1;
- c.pos = Array.isArray(a) ? [Number(a[0]) || 0, Number(a[1]) || 0] : ws(e, r), o.add(c);
- let l = ms(c, t, i);
- return l && xs(l, n), vs(e), !0;
-}, Es = ({ app: e, items: t = [], event: n = null, gap: r = 90 }) => {
+ c.pos = Array.isArray(a) ? [Number(a[0]) || 0, Number(a[1]) || 0] : Es(e, r), o.add(c);
+ let l = gs(c, t, i);
+ return l && Cs(l, n), bs(e), !0;
+}, Os = ({ 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 = ws(e, n), o = 0;
- for (let t of i) Ts({
+ let a = Es(e, n), o = 0;
+ for (let t of i) Ds({
app: e,
payload: t.payload,
relativePath: t.relativePath,
@@ -10185,11 +10186,11 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
position: [a[0] + o * Number(r || 90), a[1]]
}) && (o += 1);
return o;
-}, Ds = xs, Os = ({ app: e, payload: t, relativePath: n, targetNode: r, inputSlotIndex: i, event: a = null }) => {
+}, ks = Cs, As = ({ app: e, payload: t, relativePath: n, targetNode: r, inputSlotIndex: i, event: a = null }) => {
let o = e?.graph ?? e?.canvas?.graph ?? null, s = globalThis?.LiteGraph || globalThis?.window?.LiteGraph || null;
if (!o || typeof o.add != "function" || !s?.createNode || !r) return !1;
let c = null;
- for (let e of bs(t)) try {
+ for (let e of Ss(t)) try {
if (c = s.createNode(e), c) break;
} catch (e) {
console.debug?.(e);
@@ -10197,15 +10198,15 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
if (!c) return !1;
let l = Number(r.pos[0]) || 0, u = Number(r.pos[1]) || 0, d = Array.isArray(c.size) && Number(c.size[0]) || 220;
c.pos = [l - d - 60, u + Number(i) * 20], o.add(c);
- let f = ys(t), p = ms(c, t, f);
- p && xs(p, n);
+ let f = xs(t), p = gs(c, t, f);
+ p && Cs(p, n);
try {
c.connect(0, r, i);
} catch (e) {
console.debug?.(e);
}
- return vs(e), !0;
-}, ks = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => {
+ return bs(e), !0;
+}, js = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => {
let a = {
index: !!r,
files: [{
@@ -10217,8 +10218,8 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
}]
};
return i && (a.purpose = i), e(t, a);
-}, As = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => {
- let a = await ks({
+}, Ms = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => {
+ let a = await js({
post: e,
endpoint: t,
payload: n,
@@ -10233,16 +10234,16 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli
name: o?.name || null,
subfolder: o?.subfolder || ""
} : null;
-}, js = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => (await As({
+}, Ns = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => (await Ms({
post: e,
endpoint: t,
payload: n,
index: r,
purpose: i
-}))?.relativePath || null, Ms = 1;
-function Ns(e, t, n, r, { disabled: i = !1, closeOnSelect: a = !0, submenu: o = null } = {}) {
+}))?.relativePath || null, Ps = 1;
+function Fs(e, t, n, r, { disabled: i = !1, closeOnSelect: a = !0, submenu: o = null } = {}) {
return {
- id: `mjr-grid-menu-item-${Ms++}`,
+ id: `mjr-grid-menu-item-${Ps++}`,
type: "item",
label: String(e || ""),
iconClass: t ? String(t) : "",
@@ -10253,13 +10254,13 @@ function Ns(e, t, n, r, { disabled: i = !1, closeOnSelect: a = !0, submenu: o =
action: typeof r == "function" ? r : null
};
}
-function Ps() {
+function Is() {
return {
- id: `mjr-grid-menu-separator-${Ms++}`,
+ id: `mjr-grid-menu-separator-${Ps++}`,
type: "separator"
};
}
-var Fs = (e) => {
+var Ls = (e) => {
let t = /* @__PURE__ */ new Set();
if (!e) return t;
try {
@@ -10281,7 +10282,7 @@ var Fs = (e) => {
console.debug?.(e);
}
return t;
-}, Is = (e) => {
+}, Rs = (e) => {
let t = [];
if (!e) return t;
try {
@@ -10316,14 +10317,14 @@ var Fs = (e) => {
console.debug?.(e);
}
return t;
-}, Ls = (e) => {
+}, zs = (e) => {
try {
let t = e?.filepath || e?.path || e?.file_info?.filepath || "";
return t ? String(t) : "";
} catch {
return "";
}
-}, Rs = (e) => {
+}, Bs = (e) => {
if (!e || typeof e != "object") return null;
let t = String(e.filename || "").trim();
return t ? {
@@ -10333,7 +10334,7 @@ var Fs = (e) => {
root_id: Oe(e) || void 0,
kind: String(e.kind || "").toLowerCase()
} : null;
-}, zs = (e) => {
+}, Vs = (e) => {
if (!e || typeof e != "object") return null;
let t = String(e.filename || e.name || "").trim();
return t ? {
@@ -10343,44 +10344,44 @@ var Fs = (e) => {
root_id: Oe(e) || void 0
} : null;
};
-function Bs(e, t = "") {
+function Hs(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 Vs(e) {
- let t = (Array.isArray(e) ? e.filter((e) => !$s(e)) : []).map(zs).filter(Boolean);
+async function Us(e) {
+ let t = (Array.isArray(e) ? e.filter((e) => !tc(e)) : []).map(Vs).filter(Boolean);
if (t.length < 2) {
- s("Select at least two files to download a ZIP.", "warning", 2600);
+ m("Select at least two files to download a ZIP.", "warning", 2600);
return;
}
let n = "";
try {
- n = Ee("mjr_", 24);
+ n = De("mjr_", 24);
} catch (e) {
- at(e, "[GridContextMenu] Batch ZIP token", { showToast: I.DEBUG_VERBOSE_ERRORS }), s("Could not create a secure ZIP token.", "error");
+ st(e, "[GridContextMenu] Batch ZIP token", { showToast: z.DEBUG_VERBOSE_ERRORS }), m("Could not create a secure ZIP token.", "error");
return;
}
- s(`Preparing ZIP for ${t.length} files...`, "info", 1800);
- let r = await ye(Le.BATCH_ZIP_CREATE, {
+ m(`Preparing ZIP for ${t.length} files...`, "info", 1800);
+ let r = await y(L.BATCH_ZIP_CREATE, {
token: n,
items: t,
strip_metadata: !1
});
if (!r?.ok) {
- s(r?.error || "Failed to create ZIP.", "error");
+ m(r?.error || "Failed to create ZIP.", "error");
return;
}
let i = r?.data?.filename || `Majoor_Batch_${t.length}.zip`;
- Bs(Fe(n), i), s(`Downloading ${i}...`, "info", 3e3);
+ Hs(he(n), i), m(`Downloading ${i}...`, "info", 3e3);
}
-async function Hs(e) {
+async function Ws(e) {
let t = Array.isArray(e) ? e.filter(Boolean) : [], n = await Promise.all(t.map(async (e) => {
- let t = Rs(e);
+ let t = Bs(e);
if (!t) return null;
- let n = (await As({
- post: ye,
- endpoint: Le.STAGE_TO_INPUT,
+ let n = (await Ms({
+ post: y,
+ endpoint: L.STAGE_TO_INPUT,
payload: t,
index: !1
}))?.relativePath;
@@ -10390,13 +10391,13 @@ async function Hs(e) {
droppedExt: String(t.filename || "").split(".").pop() || ""
} : null;
}));
- return Es({
- app: fe(),
+ return Os({
+ app: be(),
items: n.filter(Boolean),
event: null
});
}
-var Us = (e) => {
+var Gs = (e) => {
if (e) {
try {
if (typeof e?._mjrSetSelection == "function") e._mjrSetSelection([], "");
@@ -10408,15 +10409,15 @@ var Us = (e) => {
} catch (e) {
console.debug?.(e);
}
- ht("mjr:selection-changed", { selectedIds: [] }, {
+ kt("mjr:selection-changed", { selectedIds: [] }, {
target: e,
warnPrefix: "[GridContextMenu]"
});
}
-}, Ws = (e, t, n, r) => {
+}, Ks = (e, t, n, r) => {
if (!e) return;
try {
- Us(e);
+ Gs(e);
} catch (e) {
console.debug?.(e);
}
@@ -10436,7 +10437,7 @@ var Us = (e) => {
} catch (e) {
console.debug?.(e);
}
-}, Gs = (e) => {
+}, qs = (e) => {
let t = [];
if (!e) return t;
try {
@@ -10458,7 +10459,7 @@ var Us = (e) => {
console.debug?.(e);
}
return t;
-}, Ks = (e, t) => {
+}, Js = (e, t) => {
try {
let n = String(t ?? "");
return (e || []).findIndex((e) => String(e?.id ?? "") === n);
@@ -10466,7 +10467,7 @@ var Us = (e) => {
return -1;
}
};
-function qs(e) {
+function Ys(e) {
if (e == null) return null;
try {
return document.querySelector(`[data-mjr-asset-id="${an(e)}"]`);
@@ -10474,8 +10475,8 @@ function qs(e) {
return console.debug?.(e), null;
}
}
-function Js(e, t = null) {
- let n = qs(e?.id);
+function Xs(e, t = null) {
+ let n = Ys(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);
@@ -10484,7 +10485,7 @@ function Js(e, t = null) {
}
return n;
}
-var Ys = (e) => {
+var Zs = (e) => {
try {
let t = e ? "grid-contextmenu" : "grid-contextmenu-global";
window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: t } }));
@@ -10492,7 +10493,7 @@ var Ys = (e) => {
console.debug?.(e);
}
};
-async function Xs(e, t) {
+async function Qs(e, t) {
if (!e) return {
ok: !1,
error: "Missing asset"
@@ -10507,7 +10508,7 @@ async function Xs(e, t) {
ok: !1,
error: "Missing filename"
};
- let r = await ye(Le.INDEX_FILES, {
+ let r = await y(L.INDEX_FILES, {
files: [n],
incremental: !1
});
@@ -10516,24 +10517,24 @@ async function Xs(e, t) {
error: "Index refresh failed"
};
if (e?.id != null) try {
- let t = await ee(e.id);
+ let t = await M(e.id);
if (t?.ok && t?.data && typeof t.data == "object") {
Object.assign(e, t.data);
- let n = Js(e, t.data), r = n?.querySelector?.(".mjr-workflow-dot");
+ let n = Xs(e, t.data), r = n?.querySelector?.(".mjr-workflow-dot");
if (r) {
- let e = lt(n._mjrAsset);
+ let e = xt(n._mjrAsset);
e && r.replaceWith(e);
}
}
} catch (e) {
console.debug?.(e);
}
- return Ys(t), {
+ return Zs(t), {
ok: !0,
data: { refreshed: !0 }
};
}
-function Zs(e, t, n) {
+function $s(e, t, n) {
let r = e?.id;
try {
e.rating = t;
@@ -10546,34 +10547,34 @@ function Zs(e, t, n) {
console.debug?.(e);
}
if (r) {
- mi(String(r), t, {
+ hi(String(r), t, {
successMessage: t > 0 ? `Rating set to ${t} stars` : "Rating cleared",
errorMessage: "Failed to update rating",
warnPrefix: "[GridContextMenu]",
onSuccess: () => {
- ht(qt, {
+ kt(Zt, {
assetId: String(r),
rating: t
}, { warnPrefix: "[GridContextMenu]" });
},
onFailure: (e) => {
- at(e, "[GridContextMenu] Rating update", { showToast: I.DEBUG_VERBOSE_ERRORS });
+ st(e, "[GridContextMenu] Rating update", { showToast: z.DEBUG_VERBOSE_ERRORS });
}
});
return;
}
- we(e, t).catch((e) => {
- at(e, "[GridContextMenu] Rating update", { showToast: I.DEBUG_VERBOSE_ERRORS });
+ O(e, t).catch((e) => {
+ st(e, "[GridContextMenu] Rating update", { showToast: z.DEBUG_VERBOSE_ERRORS });
});
}
-function Qs(e) {
+function ec(e) {
return String(e?.scope || "").toLowerCase() === "custom";
}
-function $s(e) {
+function tc(e) {
return String(e?.kind || "").toLowerCase() === "folder";
}
-function ec(e) {
- let t = Fs(e), n = Is(e), r = n.length || t.size;
+function nc(e) {
+ let t = Ls(e), n = Rs(e), r = n.length || t.size;
return {
selectedIds: t,
selectedAssetsNow: n,
@@ -10582,54 +10583,54 @@ function ec(e) {
hasSelection: r > 0
};
}
-function tc(e, t) {
- let n = (e) => "*".repeat(e) + "o".repeat(Math.max(0, 5 - e)), i = (t) => {
- Js(e, { rating: t });
+function rc(e, t) {
+ let n = (e) => "*".repeat(e) + "o".repeat(Math.max(0, 5 - e)), r = (t) => {
+ Xs(e, { rating: t });
};
return [
- Ns(n(5), "pi pi-star", null, async () => {
- Zs(e, 5, () => i(5));
+ Fs(n(5), "pi pi-star", null, async () => {
+ $s(e, 5, () => r(5));
}, { disabled: !t }),
- Ns(n(4), "pi pi-star", null, async () => {
- Zs(e, 4, () => i(4));
+ Fs(n(4), "pi pi-star", null, async () => {
+ $s(e, 4, () => r(4));
}, { disabled: !t }),
- Ns(n(3), "pi pi-star", null, async () => {
- Zs(e, 3, () => i(3));
+ Fs(n(3), "pi pi-star", null, async () => {
+ $s(e, 3, () => r(3));
}, { disabled: !t }),
- Ns(n(2), "pi pi-star", null, async () => {
- Zs(e, 2, () => i(2));
+ Fs(n(2), "pi pi-star", null, async () => {
+ $s(e, 2, () => r(2));
}, { disabled: !t }),
- Ns(n(1), "pi pi-star", null, async () => {
- Zs(e, 1, () => i(1));
+ Fs(n(1), "pi pi-star", null, async () => {
+ $s(e, 1, () => r(1));
}, { disabled: !t }),
- Ps(),
- Ns(r("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => {
- Zs(e, 0, () => i(0));
+ Is(),
+ Fs(R("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => {
+ $s(e, 0, () => r(0));
}, { disabled: !t })
];
}
-function nc({ currentPath: e, gridContainer: t } = {}) {
- return [Ns(r("ctx.createFolderHere", "Create folder here..."), "pi pi-plus", null, async () => {
+function ic({ currentPath: e, gridContainer: t } = {}) {
+ return [Fs(R("ctx.createFolderHere", "Create folder here..."), "pi pi-plus", null, async () => {
try {
- let n = await Lt(r("dialog.newFolderName", "New folder name"), ""), a = String(n || "").trim();
- if (!a) return;
- let o = await i({
+ let n = await gt(R("dialog.newFolderName", "New folder name"), ""), r = String(n || "").trim();
+ if (!r) return;
+ let i = await F({
op: "create",
path: e,
- name: a
+ name: r
});
- if (!o?.ok) {
- s(o?.error || "Failed to create folder", "error");
+ if (!i?.ok) {
+ m(i?.error || "Failed to create folder", "error");
return;
}
- Ys(t), s(r("toast.folderCreated", "Folder created: {name}", { name: a }), "success");
+ Zs(t), m(R("toast.folderCreated", "Folder created: {name}", { name: r }), "success");
} catch (e) {
- s(r("toast.createFolderFailedDetail", "Create folder failed: {error}", { error: e?.message || String(e || "") }), "error");
+ m(R("toast.createFolderFailedDetail", "Create folder failed: {error}", { error: e?.message || String(e || "") }), "error");
}
})];
}
-function rc({ asset: e, gridContainer: t, panelState: n } = {}) {
- let a = String(e?.filepath || "").trim(), o = [Ns(r("ctx.openFolder", "Open folder"), "pi pi-folder-open", null, () => {
+function ac({ asset: e, gridContainer: t, panelState: n } = {}) {
+ let r = String(e?.filepath || "").trim(), i = [Fs(R("ctx.openFolder", "Open folder"), "pi pi-folder-open", null, () => {
try {
t.dispatchEvent(new CustomEvent("mjr:open-folder-asset", {
bubbles: !0,
@@ -10638,311 +10639,311 @@ function rc({ asset: e, gridContainer: t, panelState: n } = {}) {
} catch (e) {
console.debug?.(e);
}
- }), Ns(r("ctx.pinAsBrowserRoot"), "pi pi-bookmark", null, async () => {
- if (!a) {
- s(r("toast.unableResolveFolderPath"), "error");
+ }), Fs(R("ctx.pinAsBrowserRoot"), "pi pi-bookmark", null, async () => {
+ if (!r) {
+ m(R("toast.unableResolveFolderPath"), "error");
return;
}
- let t = await Lt(r("dialog.browserRootLabelOptional"), String(e?.filename || "")), n = await ye(Le.CUSTOM_ROOTS, {
- path: a,
+ let t = await gt(R("dialog.browserRootLabelOptional"), String(e?.filename || "")), n = await y(L.CUSTOM_ROOTS, {
+ path: r,
label: String(t || "").trim() || void 0
});
if (!n?.ok) {
- s(n?.error || r("toast.pinFolderFailed"), "error");
+ m(n?.error || R("toast.pinFolderFailed"), "error");
return;
}
- s(r("toast.folderPinnedAsBrowserRoot"), "success");
+ m(R("toast.folderPinnedAsBrowserRoot"), "success");
try {
window.dispatchEvent(new CustomEvent("mjr:custom-roots-changed", { detail: { preferredId: String(n?.data?.id || "") } }));
} catch (e) {
console.debug?.(e);
}
})];
- return Qs(n) && a && o.push(Ps(), Ns(r("ctx.createFolderHere"), "pi pi-plus", null, async () => {
+ return ec(n) && r && i.push(Is(), Fs(R("ctx.createFolderHere"), "pi pi-plus", null, async () => {
try {
- let e = await Lt(r("dialog.newFolderName"), ""), n = String(e || "").trim();
+ let e = await gt(R("dialog.newFolderName"), ""), n = String(e || "").trim();
if (!n) return;
- let o = await i({
+ let i = await F({
op: "create",
- path: a,
+ path: r,
name: n
});
- if (!o?.ok) {
- s(o?.error || r("toast.createFolderFailed"), "error");
+ if (!i?.ok) {
+ m(i?.error || R("toast.createFolderFailed"), "error");
return;
}
- Ys(t), s(r("toast.folderCreated", { name: n }), "success");
+ Zs(t), m(R("toast.folderCreated", { name: n }), "success");
} catch (e) {
- s(r("toast.createFolderFailedDetail", { error: e?.message || String(e || "") }), "error");
+ m(R("toast.createFolderFailedDetail", { error: e?.message || String(e || "") }), "error");
}
- }), Ns(r("ctx.renameFolder"), "pi pi-pencil", null, async () => {
+ }), Fs(R("ctx.renameFolder"), "pi pi-pencil", null, async () => {
try {
- let n = String(e?.filename || "").trim(), o = await Lt(r("dialog.renameFolder"), n), c = String(o || "").trim();
- if (!c || c === n) return;
- let l = await i({
+ let n = String(e?.filename || "").trim(), i = await gt(R("dialog.renameFolder"), n), a = String(i || "").trim();
+ if (!a || a === n) return;
+ let o = await F({
op: "rename",
- path: a,
- name: c
+ path: r,
+ name: a
});
- if (!l?.ok) {
- s(l?.error || r("toast.renameFolderFailed"), "error");
+ if (!o?.ok) {
+ m(o?.error || R("toast.renameFolderFailed"), "error");
return;
}
- Ys(t), s(r("toast.folderRenamed"), "success");
+ Zs(t), m(R("toast.folderRenamed"), "success");
} catch (e) {
- s(r("toast.renameFolderFailedDetail", { error: e?.message || String(e || "") }), "error");
+ m(R("toast.renameFolderFailedDetail", { error: e?.message || String(e || "") }), "error");
}
- }), Ns(r("ctx.moveFolder"), "pi pi-arrow-right", null, async () => {
+ }), Fs(R("ctx.moveFolder"), "pi pi-arrow-right", null, async () => {
try {
- let e = await Lt(r("dialog.destinationDirectoryPath"), ""), n = String(e || "").trim();
+ let e = await gt(R("dialog.destinationDirectoryPath"), ""), n = String(e || "").trim();
if (!n) return;
- let o = await i({
+ let i = await F({
op: "move",
- path: a,
+ path: r,
destination: n
});
- if (!o?.ok) {
- s(o?.error || r("toast.moveFolderFailed"), "error");
+ if (!i?.ok) {
+ m(i?.error || R("toast.moveFolderFailed"), "error");
return;
}
- Ys(t), s(r("toast.folderMoved"), "success");
+ Zs(t), m(R("toast.folderMoved"), "success");
} catch (e) {
- s(r("toast.moveFolderFailedDetail", { error: e?.message || String(e || "") }), "error");
+ m(R("toast.moveFolderFailedDetail", { error: e?.message || String(e || "") }), "error");
}
- }), Ns(r("ctx.deleteFolder"), "pi pi-trash", null, async () => {
+ }), Fs(R("ctx.deleteFolder"), "pi pi-trash", null, async () => {
try {
- if (!await gt(r("dialog.deleteFolderRecursive", { name: String(e?.filename || r("label.thisFolder", "this folder")) }))) return;
- let n = await i({
+ if (!await Bt(R("dialog.deleteFolderRecursive", { name: String(e?.filename || R("label.thisFolder", "this folder")) }))) return;
+ let n = await F({
op: "delete",
- path: a,
+ path: r,
recursive: !0
});
if (!n?.ok) {
- s(n?.error || r("toast.deleteFolderFailed"), "error");
+ m(n?.error || R("toast.deleteFolderFailed"), "error");
return;
}
- Ys(t), s(r("toast.folderDeleted"), "success");
+ Zs(t), m(R("toast.folderDeleted"), "success");
} catch (e) {
- s(r("toast.deleteFolderFailedDetail", { error: e?.message || String(e || "") }), "error");
+ m(R("toast.deleteFolderFailedDetail", { error: e?.message || String(e || "") }), "error");
}
- })), o;
+ })), i;
}
-function ic({ asset: e, card: t, gridContainer: n, panelState: i, pointerX: a, pointerY: o, selection: c } = {}) {
- let { selectedAssetsNow: l, effectiveSelectionCount: u, isMultiSelected: d, hasSelection: f } = c, p = [], m = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => to({
+function oc({ asset: t, card: n, gridContainer: r, panelState: a, pointerX: o, pointerY: s, selection: c } = {}) {
+ let { selectedAssetsNow: l, effectiveSelectionCount: u, isMultiSelected: f, hasSelection: p } = c, h = [], g = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => ro({
assets: e,
index: t,
mode: n
});
- p.push(Ns("Open Viewer", "pi pi-image", uo("OPEN_VIEWER"), () => {
+ h.push(Fs("Open Viewer", "pi pi-image", po("OPEN_VIEWER"), () => {
try {
- let t = (f ? Is(n) : []).filter((e) => !$s(e)), r = t.length;
- if (r >= 2 && r <= 4) {
- m({
- assets: t,
+ let e = (p ? Rs(r) : []).filter((e) => !tc(e)), n = e.length;
+ if (n >= 2 && n <= 4) {
+ g({
+ assets: e,
index: 0
});
return;
}
- let i = Gs(n).filter((e) => !$s(e)), a = Ks(i, e?.id);
+ let i = qs(r).filter((e) => !tc(e)), a = Js(i, t?.id);
if (!i.length || a < 0) return;
- m({
+ g({
assets: i,
index: Math.max(0, a)
});
} catch (e) {
console.debug?.(e);
}
- }), Ns("Open in Floating Viewer", "pi pi-window-maximize", uo("OPEN_FLOATING_VIEWER"), async () => {
+ }), Fs("Open in Floating Viewer", "pi pi-window-maximize", po("OPEN_FLOATING_VIEWER"), async () => {
try {
- let t = (f ? Is(n) : []).filter((e) => !$s(e));
- if (t.length) {
- await nt.openAssets({
- assets: t,
- index: Math.max(0, t.findIndex((t) => String(t?.id || "") === String(e?.id || "")))
+ let e = (p ? Rs(r) : []).filter((e) => !tc(e));
+ if (e.length) {
+ await it.openAssets({
+ assets: e,
+ index: Math.max(0, e.findIndex((e) => String(e?.id || "") === String(t?.id || "")))
});
return;
}
- await nt.openAssets({
- assets: [e],
+ await it.openAssets({
+ assets: [t],
index: 0
});
} catch (e) {
console.debug?.(e);
}
- }), Ns("Load Asset", "pi pi-upload", "L / L+Drop", async () => {
- let t = (f ? Is(n) : []).filter((e) => !$s(e));
- await Hs(t.length ? t : [e]) || s("Failed to create a loader node for this asset.", "error");
- }), Ns("Open Graph Map", "pi pi-sitemap", null, async () => {
+ }), Fs("Load Asset", "pi pi-upload", "L / L+Drop", async () => {
+ let e = (p ? Rs(r) : []).filter((e) => !tc(e));
+ await Ws(e.length ? e : [t]) || m("Failed to create a loader node for this asset.", "error");
+ }), Fs("Open Graph Map", "pi pi-sitemap", null, async () => {
try {
- await nt.openAssets({
- assets: [e],
+ await it.openAssets({
+ assets: [t],
index: 0,
mode: "graph"
});
} catch (e) {
console.debug?.(e);
}
- }), Ns(r("ctx.showMetadataPanel", "Show metadata panel"), "pi pi-info-circle", uo("METADATA_PANEL"), () => {
+ }), Fs(R("ctx.showMetadataPanel", "Show metadata panel"), "pi pi-info-circle", po("METADATA_PANEL"), () => {
try {
- Ws(n, t, e, i);
- let r = n?._mjrOpenDetails;
- typeof r == "function" && r();
+ Ks(r, n, t, a);
+ let e = r?._mjrOpenDetails;
+ typeof e == "function" && e();
} catch (e) {
console.debug?.(e);
}
}));
- let h = (f ? l : []).filter((e) => !$s(e)), g = h.length;
- g === 2 && p.push(Ns("Compare A/B (2 selected)", "pi pi-clone", uo("COMPARE_AB"), () => {
+ let _ = (p ? l : []).filter((e) => !tc(e)), v = _.length;
+ v === 2 && h.push(Fs("Compare A/B (2 selected)", "pi pi-clone", po("COMPARE_AB"), () => {
try {
- m({
- assets: h,
+ g({
+ assets: _,
index: 0,
mode: "ab"
});
} catch (e) {
console.debug?.(e);
}
- })), g >= 2 && g <= 4 && p.push(Ns(`Side-by-side (2x2) (${g} selected)`, "pi pi-table", uo("SIDE_BY_SIDE"), () => {
+ })), v >= 2 && v <= 4 && h.push(Fs(`Side-by-side (2x2) (${v} selected)`, "pi pi-table", po("SIDE_BY_SIDE"), () => {
try {
- m({
- assets: h,
+ g({
+ assets: _,
index: 0,
mode: "sidebyside"
});
} catch (e) {
console.debug?.(e);
}
- })), p.push(Ns(r("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", uo("OPEN_IN_FOLDER"), async () => {
- let t = await E(e);
- t?.ok ? s(r("toast.openedInFolder"), "info", 2e3) : s(t?.error || r("toast.openFolderFailed"), "error");
- }, { disabled: !(e?.id || Ls(e)) }), Ns(r("ctx.copyPath", "Copy path"), "pi pi-copy", uo("COPY_PATH"), async () => {
- let t = e?.filepath ? String(e.filepath) : "";
- if (!t) {
- s(r("toast.noFilePath"), "error");
+ })), h.push(Fs(R("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", po("OPEN_IN_FOLDER"), async () => {
+ let n = await e(t);
+ n?.ok ? m(R("toast.openedInFolder"), "info", 2e3) : m(n?.error || R("toast.openFolderFailed"), "error");
+ }, { disabled: !(t?.id || zs(t)) }), Fs(R("ctx.copyPath", "Copy path"), "pi pi-copy", po("COPY_PATH"), async () => {
+ let e = t?.filepath ? String(t.filepath) : "";
+ if (!e) {
+ m(R("toast.noFilePath"), "error");
return;
}
try {
- await navigator.clipboard.writeText(t), s(r("toast.pathCopied"), "success", 2e3);
+ await navigator.clipboard.writeText(e), m(R("toast.pathCopied"), "success", 2e3);
} catch (e) {
- console.warn(r("log.clipboardCopyFailed", "Clipboard copy failed"), e), s(r("toast.pathCopyFailed"), "error");
+ console.warn(R("log.clipboardCopyFailed", "Clipboard copy failed"), e), m(R("toast.pathCopyFailed"), "error");
}
- }), Ns(r("ctx.download", "Download"), "pi pi-download", uo("DOWNLOAD"), () => {
- if (!e?.filepath) return;
- let t = ze(e.filepath), n = e.filename || "download";
- Bs(t, n), s(r("toast.downloadingFile", "Downloading {filename}...", { filename: n }), "info", 3e3);
- }, { disabled: !e?.filepath }), Ns(`Download selected as ZIP (${g})`, "pi pi-file-zip", null, async () => {
- await Vs(h);
- }, { disabled: g < 2 }), Ns("Add to collection...", "pi pi-bookmark", uo("ADD_TO_COLLECTION"), async () => {
- let t = Is(n);
- await ti({
- x: a,
- y: o,
- assets: t.length ? t : [e]
+ }), Fs(R("ctx.download", "Download"), "pi pi-download", po("DOWNLOAD"), () => {
+ if (!t?.filepath) return;
+ let e = ye(t.filepath), n = t.filename || "download";
+ Hs(e, n), m(R("toast.downloadingFile", "Downloading {filename}...", { filename: n }), "info", 3e3);
+ }, { disabled: !t?.filepath }), Fs(`Download selected as ZIP (${v})`, "pi pi-file-zip", null, async () => {
+ await Us(_);
+ }, { disabled: v < 2 }), Fs("Add to collection...", "pi pi-bookmark", po("ADD_TO_COLLECTION"), async () => {
+ let e = Rs(r);
+ await ni({
+ x: o,
+ y: s,
+ assets: e.length ? e : [t]
});
}));
- let _ = String(i?.collectionId || "").trim();
- if (_) {
- let t = Is(n), i = (t.length ? t : [e]).map(Ls).filter(Boolean), a = i.length > 1 ? `Remove from collection (${i.length})` : "Remove from collection";
- p.push(Ns(a, "pi pi-bookmark", null, async () => {
- if (!i.length) {
- s(r("toast.noFilePath"), "error");
+ let y = String(a?.collectionId || "").trim();
+ if (y) {
+ let e = Rs(r), n = (e.length ? e : [t]).map(zs).filter(Boolean), i = n.length > 1 ? `Remove from collection (${n.length})` : "Remove from collection";
+ h.push(Fs(i, "pi pi-bookmark", null, async () => {
+ if (!n.length) {
+ m(R("toast.noFilePath"), "error");
return;
}
- let e = await k(_, i);
+ let e = await d(y, n);
if (!e?.ok) {
- s(e?.error || r("toast.removeFromCollectionFailed"), "error");
+ m(e?.error || R("toast.removeFromCollectionFailed"), "error");
return;
}
- Ys(n);
+ Zs(r);
}));
}
- let y = !!(e?.id || Ls(e));
- return p.push(Ps(), Ns(r("ctx.editTags", "Edit tags"), "pi pi-tags", uo("EDIT_TAGS"), () => {
- ac(a + 6, o + 6, e, () => {
- Js(e, { tags: Array.isArray(e?.tags) ? [...e.tags] : [] });
+ let b = !!(t?.id || zs(t));
+ return h.push(Is(), Fs(R("ctx.editTags", "Edit tags"), "pi pi-tags", po("EDIT_TAGS"), () => {
+ sc(o + 6, s + 6, t, () => {
+ Xs(t, { tags: Array.isArray(t?.tags) ? [...t.tags] : [] });
});
- }, { closeOnSelect: !1 }), Ps(), Ns(r("ctx.setRating", "Set rating"), "pi pi-star", "1-5 >", null, {
- disabled: !y,
+ }, { closeOnSelect: !1 }), Is(), Fs(R("ctx.setRating", "Set rating"), "pi pi-star", "1-5 >", null, {
+ disabled: !b,
closeOnSelect: !1,
- submenu: tc(e, y)
- }), Ps(), Ns(r("ctx.resetIndexFile", "Reset index (this file)"), "pi pi-refresh", null, async () => {
- if (e?.filename || e?.id) {
- s(r("toast.rescanningFile", "Rescanning file..."), "info", 1600);
+ submenu: rc(t, b)
+ }), Is(), Fs(R("ctx.resetIndexFile", "Reset index (this file)"), "pi pi-refresh", null, async () => {
+ if (t?.filename || t?.id) {
+ m(R("toast.rescanningFile", "Rescanning file..."), "info", 1600);
try {
- let t = await Xs(e, n);
- t?.ok ? s(r("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: "" }), "success", 1800) : s(t?.error || r("toast.resetFailed", "Failed to reset index"), "error");
+ let e = await Qs(t, r);
+ e?.ok ? m(R("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: "" }), "success", 1800) : m(e?.error || R("toast.resetFailed", "Failed to reset index"), "error");
} catch (e) {
- s(`${r("toast.resetFailed", "Failed to reset index")}: ${e?.message || String(e || "")}`, "error");
+ m(`${R("toast.resetFailed", "Failed to reset index")}: ${e?.message || String(e || "")}`, "error");
}
}
- }, { disabled: !(e?.filename || e?.id) }), Ns("Rename...", "pi pi-pencil", uo("RENAME"), async () => {
- if (!(e?.id || Ls(e))) return;
- let t = e.filename || "", i = ci(await Lt(r("dialog.rename.title", "Rename file"), t), t);
- if (!i || i === t) return;
- let a = ai(i);
+ }, { disabled: !(t?.filename || t?.id) }), Fs("Rename...", "pi pi-pencil", po("RENAME"), async () => {
+ if (!(t?.id || zs(t))) return;
+ let e = t.filename || "", n = li(await gt(R("dialog.rename.title", "Rename file"), e), e);
+ if (!n || n === e) return;
+ let a = oi(n);
if (!a.valid) {
- s(a.reason, "error");
+ m(a.reason, "error");
return;
}
try {
- let t = await v(e, i);
- if (!t?.ok) {
- s(t?.error || r("toast.fileRenameFailed"), "error");
+ let e = await i(t, n);
+ if (!e?.ok) {
+ m(e?.error || R("toast.fileRenameFailed"), "error");
return;
}
- let a = t?.data?.asset;
- a && typeof a == "object" ? (Object.assign(e, a), Js(e, a)) : (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))), Js(e, {
- filename: e.filename,
- filepath: e.filepath,
- path: e.path,
- file_info: e.file_info
+ let a = e?.data?.asset;
+ a && typeof a == "object" ? (Object.assign(t, a), Xs(t, a)) : (t.filename = n, t.filepath &&= String(t.filepath).replace(/[^\\/]+$/, n), t.path &&= String(t.path).replace(/[^\\/]+$/, n), t.file_info && typeof t.file_info == "object" && (t.file_info.filename = n, t.file_info.filepath && (t.file_info.filepath = String(t.file_info.filepath).replace(/[^\\/]+$/, n)), t.file_info.path && (t.file_info.path = String(t.file_info.path).replace(/[^\\/]+$/, n))), Xs(t, {
+ filename: t.filename,
+ filepath: t.filepath,
+ path: t.path,
+ file_info: t.file_info
}));
- let o = qs(e.id)?.querySelector?.(".mjr-filename");
- o && (o.textContent = e.filename || i), s(r("toast.fileRenamedSuccess"), "success"), Ys(n);
+ let o = Ys(t.id)?.querySelector?.(".mjr-filename");
+ o && (o.textContent = t.filename || n), m(R("toast.fileRenamedSuccess"), "success"), Zs(r);
} catch (e) {
- s(r("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error");
+ m(R("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error");
}
- }, { disabled: !(e?.id || Ls(e)) })), d ? p.push(Ns(`Delete ${u} files...`, "pi pi-trash", uo("DELETE"), async () => {
- if (await ni(Number(u) || 0)) try {
- let t = 0, a = 0, o = [], c = 0, u = l.length ? l : [e];
- for (let e of u) (await x(e))?.ok ? (t += 1, e?.id == null ? c += 1 : o.push(String(e.id))) : a += 1;
- if (o.length) {
- let e = qr(n, o);
- i && Array.isArray(e?.selectedIds) && (i.selectedAssetIds = e.selectedIds, i.activeAssetId = e.selectedIds[0] || "");
+ }, { disabled: !(t?.id || zs(t)) })), f ? h.push(Fs(`Delete ${u} files...`, "pi pi-trash", po("DELETE"), async () => {
+ if (await ri(Number(u) || 0)) try {
+ let e = 0, n = 0, i = [], o = 0, s = l.length ? l : [t];
+ for (let t of s) (await w(t))?.ok ? (e += 1, t?.id == null ? o += 1 : i.push(String(t.id))) : n += 1;
+ if (i.length) {
+ let e = Jr(r, i);
+ a && Array.isArray(e?.selectedIds) && (a.selectedAssetIds = e.selectedIds, a.activeAssetId = e.selectedIds[0] || "");
}
- c > 0 && Ys(n), a === 0 ? s(r("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n: t }), "success") : s(r("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", {
- success: t,
- failed: a
+ o > 0 && Zs(r), n === 0 ? m(R("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n: e }), "success") : m(R("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", {
+ success: e,
+ failed: n
}), "warning");
} catch (e) {
- s(r("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error");
+ m(R("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error");
}
- })) : p.push(Ns(r("ctx.delete", "Delete"), "pi pi-trash", uo("DELETE"), async () => {
- if (await ni(1, e?.filename)) try {
- let t = await x(e);
- if (!t?.ok) {
- s(t?.error || r("toast.fileDeleteFailed"), "error");
+ })) : h.push(Fs(R("ctx.delete", "Delete"), "pi pi-trash", po("DELETE"), async () => {
+ if (await ri(1, t?.filename)) try {
+ let e = await w(t);
+ if (!e?.ok) {
+ m(e?.error || R("toast.fileDeleteFailed"), "error");
return;
}
- if (e?.id) {
- let t = qr(n, [String(e.id)]);
- i && Array.isArray(t?.selectedIds) && (i.selectedAssetIds = t.selectedIds, i.activeAssetId = t.selectedIds[0] || "");
- } else Ys(n);
- s(r("toast.fileDeletedSuccess"), "success");
+ if (t?.id) {
+ let e = Jr(r, [String(t.id)]);
+ a && Array.isArray(e?.selectedIds) && (a.selectedAssetIds = e.selectedIds, a.activeAssetId = e.selectedIds[0] || "");
+ } else Zs(r);
+ m(R("toast.fileDeletedSuccess"), "success");
} catch (e) {
- s(r("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error");
+ m(R("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error");
}
- }, { disabled: !(e?.id || Ls(e)) })), p;
+ }, { disabled: !(t?.id || zs(t)) })), h;
}
-function ac(e, t, n, r) {
- n && Co({
+function sc(e, t, n, r) {
+ n && To({
x: e,
y: t,
asset: n,
onChanged: r
});
}
-function oc({ gridContainer: e, getState: t = () => ({}) } = {}) {
+function cc({ gridContainer: e, getState: t = () => ({}) } = {}) {
if (!e) return;
if (e._mjrGridContextMenuBound && typeof e._mjrGridContextMenuUnbind == "function") return e._mjrGridContextMenuUnbind;
let n = async (n) => {
@@ -10954,13 +10955,13 @@ function oc({ gridContainer: e, getState: t = () => ({}) } = {}) {
}
})(), i = Qt(n.target, ".mjr-asset-card");
if (!i) {
- if (!Qs(r)) return;
+ if (!ec(r)) return;
let t = String(e?.dataset?.mjrSubfolder || "").trim();
if (!t) return;
- n.preventDefault(), n.stopPropagation(), yo({
+ n.preventDefault(), n.stopPropagation(), xo({
x: n.clientX,
y: n.clientY,
- items: nc({
+ items: ic({
currentPath: t,
gridContainer: e
})
@@ -10970,11 +10971,11 @@ function oc({ gridContainer: e, getState: t = () => ({}) } = {}) {
n.preventDefault(), n.stopPropagation();
let a = i._mjrAsset;
if (!a) return;
- let o = ec(e), s = $s(a) ? rc({
+ let o = nc(e), s = tc(a) ? ac({
asset: a,
gridContainer: e,
panelState: r
- }) : ic({
+ }) : oc({
asset: a,
card: i,
gridContainer: e,
@@ -10983,7 +10984,7 @@ function oc({ gridContainer: e, getState: t = () => ({}) } = {}) {
pointerY: n.clientY,
selection: o
});
- yo({
+ xo({
x: n.clientX,
y: n.clientY,
items: s
@@ -11012,12 +11013,12 @@ function oc({ gridContainer: e, getState: t = () => ({}) } = {}) {
console.debug?.(e);
}
try {
- pi();
+ mi();
} catch (e) {
console.debug?.(e);
}
try {
- To();
+ Do();
} catch (e) {
console.debug?.(e);
}
@@ -11026,8 +11027,8 @@ function oc({ gridContainer: e, getState: t = () => ({}) } = {}) {
}
//#endregion
//#region ui/features/panel/controllers/ratingHotkeysController.ts
-var sc = qt;
-function cc(e) {
+var lc = Zt;
+function uc(e) {
let t = String(e ?? "");
try {
if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t);
@@ -11036,7 +11037,7 @@ function cc(e) {
}
return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1");
}
-function lc(e, t = null) {
+function dc(e, t = null) {
if (!e) return [];
try {
let t = Array.from(e.querySelectorAll(".mjr-asset-card.is-selected"));
@@ -11052,7 +11053,7 @@ function lc(e, t = null) {
}
return [];
}
-function uc(e, t, n) {
+function fc(e, t, n) {
if (!e) return;
let r = e._mjrAsset;
r && (r.rating = n);
@@ -11065,7 +11066,7 @@ function uc(e, t, n) {
console.debug?.(e);
}
}
-async function dc(e, t, n = 5) {
+async function pc(e, t, n = 5) {
let r = Math.max(1, Number(n) || 1), i = 0, a = [], o = async () => {
for (; i < e.length;) {
let n = i;
@@ -11080,53 +11081,53 @@ async function dc(e, t, n = 5) {
for (let t = 0; t < Math.min(r, e.length); t += 1) a.push(o());
await Promise.all(a);
}
-function fc({ gridContainer: e, createRatingBadge: t } = {}) {
- let n = !1, i = null, a = null, o = async (e, n) => {
- let i = e?._mjrAsset?.id;
- if (i != null) {
+function mc({ gridContainer: e, createRatingBadge: t } = {}) {
+ let n = !1, r = null, i = null, a = async (e, n) => {
+ let r = e?._mjrAsset?.id;
+ if (r != null) {
try {
- let e = await we(i, n);
+ let e = await O(r, n);
if (!e?.ok) {
- s(e?.error || r("toast.ratingUpdateFailed"), "error");
+ m(e?.error || R("toast.ratingUpdateFailed"), "error");
return;
}
- s(r("toast.ratingSetN", { n }), "success", 1500);
+ m(R("toast.ratingSetN", { n }), "success", 1500);
} catch {
- s(r("toast.ratingUpdateError"), "error");
+ m(R("toast.ratingUpdateError"), "error");
return;
}
- uc(e, t, n);
+ fc(e, t, n);
}
};
return {
bind: () => {
if (!(n || !e)) {
- n = !0, Ge(!0), i = async (t) => {
- if (L() || We().scope === "viewer" || t.defaultPrevented) return;
+ n = !0, B(!0), r = async (t) => {
+ if (Ze() || Ke().scope === "viewer" || t.defaultPrevented) return;
let n = String(t.key || "");
if (n !== "0" && n !== "1" && n !== "2" && n !== "3" && n !== "4" && n !== "5") return;
let r = document.querySelector(".mjr-viewer-overlay");
if (r && r.style.display !== "none" || !(e.contains(t.target) || e === t.target)) return;
let i = n === "0" ? 0 : Number(n);
if (!Number.isFinite(i)) return;
- let a = lc(e, t.target);
- a.length && (a.length > 0 && (t.preventDefault(), t.stopPropagation(), t.stopImmediatePropagation?.()), await dc(a, (e) => o(e, i), 5));
- }, a = (n) => {
+ let o = dc(e, t.target);
+ o.length && (o.length > 0 && (t.preventDefault(), t.stopPropagation(), t.stopImmediatePropagation?.()), await pc(o, (e) => a(e, i), 5));
+ }, i = (n) => {
let r = n?.detail || {}, i = r.assetId ?? r.id ?? null, a = Number(r.rating);
if (!(!i || !Number.isFinite(a))) try {
- let n = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${cc(i)}"]`);
- n && uc(n, t, a);
+ let n = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${uc(i)}"]`);
+ n && fc(n, t, a);
} catch (e) {
console.debug?.(e);
}
};
try {
- window.addEventListener("keydown", i, { capture: !0 });
+ window.addEventListener("keydown", r, { capture: !0 });
} catch (e) {
console.debug?.(e);
}
try {
- window.addEventListener(sc, a);
+ window.addEventListener(lc, i);
} catch (e) {
console.debug?.(e);
}
@@ -11134,25 +11135,25 @@ function fc({ gridContainer: e, createRatingBadge: t } = {}) {
},
dispose: () => {
if (n) {
- n = !1, Ge(!1);
+ n = !1, B(!1);
try {
- window.removeEventListener("keydown", i, { capture: !0 });
+ window.removeEventListener("keydown", r, { capture: !0 });
} catch (e) {
console.debug?.(e);
}
try {
- window.removeEventListener(sc, a);
+ window.removeEventListener(lc, i);
} catch (e) {
console.debug?.(e);
}
- i = null, a = null;
+ r = null, i = null;
}
}
};
}
//#endregion
//#region ui/features/grid/StackGroupCards.ts
-function pc(e) {
+function hc(e) {
if (!e || e.dataset?.mjrOverlayButtonBound === "1") return e;
try {
e.dataset.mjrOverlayButtonBound = "1";
@@ -11171,7 +11172,7 @@ function pc(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 mc(e, t, n = null, r = "mjr-stack-group-button-count") {
+function gc(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) {
@@ -11179,24 +11180,24 @@ function mc(e, t, n = null, r = "mjr-stack-group-button-count") {
t.className = r, t.textContent = String(n), e.appendChild(t);
}
}
-function hc(e) {
+function _c(e) {
return String(e?.dataset?.mjrGroupStacks || "") === "1";
}
-function gc(e) {
+function vc(e) {
let t = String(e?.stack_id || "").trim();
return t ? `stack:${t}` : "";
}
-function _c(e, t, n) {
- return hc(e) && gc(t) || n;
+function yc(e, t, n) {
+ return _c(e) && vc(t) || n;
}
-function vc(e) {
+function bc(e) {
try {
e._mjrStackMembersCache?.clear?.();
} catch (e) {
console.debug?.(e);
}
}
-function yc(e, t, n) {
+function xc(e, t, n) {
if (!t || !n || t._mjrIsVue) return;
let r = !!n._mjrDupStack, i = Number(n._mjrDupCount || 0) || 0;
if (!r || i < 2) {
@@ -11206,13 +11207,13 @@ function yc(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"), pc(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"), hc(a), a.addEventListener("click", (e) => {
e.preventDefault(), e.stopPropagation();
try {
let e = a?._mjrGridContainer, t = a?._mjrAsset;
if (!e || !t) return;
let n = Array.isArray(t._mjrDupMembers) ? t._mjrDupMembers : [t], r = n.length;
- e.dispatchEvent(new CustomEvent(B.OPEN_STACK_GROUP, {
+ e.dispatchEvent(new CustomEvent(H.OPEN_STACK_GROUP, {
bubbles: !0,
detail: {
asset: t,
@@ -11226,22 +11227,22 @@ function yc(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`, mc(a, "pi pi-copy", i, "mjr-dup-stack-count");
+ a.title = `${o} - click to compare all copies`, gc(a, "pi pi-copy", i, "mjr-dup-stack-count");
}
//#endregion
//#region ui/features/dnd/utils/log.ts
-var bc = () => {
+var Sc = () => {
try {
return !!window?.MJR_DND_DEBUG;
} catch {
return !1;
}
-}, xc = (...e) => {
- bc() && console.debug("[Majoor.DnD]", ...e);
-}, Sc = (e, { buildCustomViewURL: t, buildViewURL: n }) => {
+}, Cc = (...e) => {
+ Sc() && console.debug("[Majoor.DnD]", ...e);
+}, wc = (e, { buildCustomViewURL: t, buildViewURL: n }) => {
let r = String(e?.type || "output").toLowerCase();
return r === "custom" ? t(e?.filename || "", e?.subfolder || "", Oe(e)) : r === "input" ? n(e?.filename || "", e?.subfolder || "", "input") : r === "temp" ? n(e?.filename || "", e?.subfolder || "", "temp") : n(e?.filename || "", e?.subfolder || "", "output");
-}, Cc = (e) => {
+}, Tc = (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;
@@ -11253,42 +11254,42 @@ var bc = () => {
root_id: a || void 0,
kind: o || void 0
};
-}, wc = Cc, Tc = (e, t) => {
+}, Ec = Tc, Dc = (e, t) => {
let n = e?.dataTransfer?.getData?.(t);
if (!n) return null;
try {
- return Cc(JSON.parse(n));
+ return Tc(JSON.parse(n));
} catch {
return null;
}
-}, Ec = /* @__PURE__ */ new WeakMap(), Dc = !1;
-function Oc(e) {
- return e && Ec.get(e) || null;
-}
-function kc(e, t) {
- return e ? typeof t == "function" ? (Ec.set(e, t), t) : (Ec.delete(e), null) : null;
-}
+}, Oc = /* @__PURE__ */ new WeakMap(), kc = !1;
function Ac(e) {
- e && Ec.delete(e);
+ return e && Oc.get(e) || null;
}
-function jc() {
- Dc = !0;
+function jc(e, t) {
+ return e ? typeof t == "function" ? (Oc.set(e, t), t) : (Oc.delete(e), null) : null;
}
-function Mc() {
- return Dc ? (Dc = !1, !0) : !1;
+function Mc(e) {
+ e && Oc.delete(e);
}
function Nc() {
- Dc = !1;
+ kc = !0;
+}
+function Pc() {
+ return kc ? (kc = !1, !0) : !1;
+}
+function Fc() {
+ kc = !1;
}
//#endregion
//#region ui/features/dnd/out/DragOut.ts
-var Pc = (e) => {
+var Ic = (e) => {
try {
return new URL(String(e || ""), window.location.href).href;
} catch {
return String(e || "");
}
-}, Fc = () => Ee("mjr_", 24), Ic = (e) => {
+}, Lc = () => De("mjr_", 24), Rc = (e) => {
let t = e && typeof e == "object" ? e : null;
if (!t) return null;
let n = t.filename || t.name;
@@ -11298,7 +11299,7 @@ var Pc = (e) => {
type: String(t.type || "output").toLowerCase(),
root_id: Oe(t) || void 0
} : null;
-}, Lc = (e, t) => {
+}, zc = (e, t) => {
let n = [];
if (!e || !t) return n;
let r = t?.dataset?.mjrAssetId ? String(t.dataset.mjrAssetId) : "";
@@ -11348,25 +11349,25 @@ var Pc = (e) => {
!t || typeof t != "object" || n.push(t);
}
return n;
-}, Rc = (e) => {
+}, Bc = (e) => {
if (!e || typeof e != "object") return "";
let t = e.filepath || e.path || e?.file_info?.filepath || "";
return t ? String(t) : "";
-}, zc = ({ dt: e, asset: t, containerEl: n, card: r, viewUrl: i, stripMetadata: a = !1 }) => {
+}, Vc = ({ dt: e, asset: t, containerEl: n, card: r, viewUrl: i, stripMetadata: a = !1 }) => {
if (!e || !t) return;
- let o = Lc(n, r);
+ let o = zc(n, r);
if (Array.isArray(o) && o.length > 1) {
- let t = o.map(Ic).filter(Boolean);
+ let t = o.map(Rc).filter(Boolean);
if (t.length > 1) {
let n = "";
try {
- n = Fc();
+ n = Lc();
} catch (e) {
console.warn("[DragOut] failed to create secure batch token", e);
}
if (n) {
try {
- ye(Le.BATCH_ZIP_CREATE, {
+ y(L.BATCH_ZIP_CREATE, {
token: n,
items: t,
strip_metadata: !!a
@@ -11374,7 +11375,7 @@ var Pc = (e) => {
} catch (e) {
console.debug?.(e);
}
- let r = Pc(Fe(n)), i = a ? `Majoor_Clean_Batch_${t.length}.zip` : `Majoor_Batch_${t.length}.zip`;
+ let r = Ic(he(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 = "copy";
} catch (e) {
@@ -11386,38 +11387,38 @@ var Pc = (e) => {
}
let s = t.filename || t.name;
if (!s) return;
- let c = a ? Rc(t) : "", l = Pc((c ? Re(c) : "") || i), u = Uo(s);
+ let c = a ? Bc(t) : "", l = Ic((c ? Te(c) : "") || i), u = Go(s);
try {
e.setData("text/uri-list", l), e.setData("DownloadURL", `${u}:${s}:${l}`), e.effectAllowed = "copy";
} catch (e) {
console.debug?.(e);
}
-}, Bc = (e, { asset: t, containerEl: n, card: r }) => {
+}, Hc = (e, { asset: t, containerEl: n, card: r }) => {
if (!(!e || !t)) try {
let t = e?.dataTransfer?.dropEffect;
- !t || t === "none" || Mc();
+ !t || t === "none" || Pc();
return;
} catch (e) {
console.debug?.(e);
}
-}, Vc = () => {
- let e = fe();
+}, Uc = () => {
+ let e = be();
return e && typeof e == "object" ? e : null;
-}, Hc = (e) => Sc(e, {
- buildCustomViewURL: ke,
- buildViewURL: Pe
-}), Uc = !1, Wc = !1, Gc = (e) => {
+}, Wc = (e) => wc(e, {
+ buildCustomViewURL: we,
+ buildViewURL: Ne
+}), Gc = !1, Kc = !1, qc = (e) => {
try {
return !!e?.closest?.("input, textarea, select, [contenteditable='true']");
} catch {
return !1;
}
-}, Kc = () => Uc === !0, qc = () => Wc === !0, Jc = (e) => [
+}, Jc = () => Gc === !0, Yc = () => Kc === !0, Xc = (e) => [
String(e?.type || "output"),
String(e?.filename || ""),
String(e?.subfolder || ""),
String(Oe(e) || "")
-].join("\n"), Yc = (e, t) => {
+].join("\n"), Zc = (e, t) => {
if (String(e?.type || e?.file_info?.type || "").toLowerCase() === "custom") return null;
let n = Me(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "")).trim();
if (!n || !t) return null;
@@ -11447,11 +11448,11 @@ var Pc = (e) => {
};
}
return null;
-}, Xc = (e) => {
+}, Qc = (e) => {
if (!e || typeof e != "object") return null;
let t = String(e.filename || "").trim();
if (!t) return null;
- let n = Yc(e, t);
+ let n = Zc(e, t);
return {
filename: t,
subfolder: n?.subfolder ?? e.subfolder ?? "",
@@ -11459,7 +11460,7 @@ var Pc = (e) => {
root_id: Oe(e) || void 0,
kind: String(e.kind || "").toLowerCase()
};
-}, Zc = (e, t, n) => {
+}, $c = (e, t, n) => {
if (!e || !t || n == null) return !1;
let r = String(n);
try {
@@ -11473,10 +11474,10 @@ var Pc = (e) => {
console.debug?.(e);
}
return !1;
-}, Qc = ({ dt: e, asset: t, payload: n, viewUrl: r }) => {
+}, el = ({ 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 ? Jc(n) : String(t.id),
+ id: t.id == null ? Xc(n) : String(t.id),
name: t.filename || n.filename,
display_name: t.filename || n.filename,
filename: n.filename,
@@ -11492,46 +11493,46 @@ var Pc = (e) => {
},
tags: Array.isArray(t.tags) ? t.tags : []
};
- Zc(e, Oo, JSON.stringify(a)), r && Zc(e, "text/uri-list", r);
-}, $c = (e) => {
+ $c(e, Ao, JSON.stringify(a)), r && $c(e, "text/uri-list", r);
+}, tl = (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(Xc).filter(Vo), r = Jc(t);
- if (e.some((e) => Jc(e) === r)) return e;
+ let e = n.map(Qc).filter(Uo), r = Xc(t);
+ if (e.some((e) => Xc(e) === r)) return e;
}
} catch (e) {
console.debug?.(e);
}
return [t];
-}, el = (e, t) => {
+}, nl = (e, t) => {
try {
let n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : [];
if (!Array.isArray(n) || n.length <= 1) return [];
- let r = n.map(Xc).filter(Vo), i = Jc(t);
- return r.some((e) => Jc(e) === i) ? r : [];
+ let r = n.map(Qc).filter(Uo), i = Xc(t);
+ return r.some((e) => Xc(e) === i) ? r : [];
} catch (e) {
return console.debug?.(e), [];
}
-}, tl = (e, t) => {
+}, rl = (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(wc).filter(Vo);
+ let e = JSON.parse(t), n = (Array.isArray(e?.items) ? e.items : Array.isArray(e) ? e : []).map(Ec).filter(Uo);
if (n.length) return n;
}
} catch (e) {
console.debug?.(e);
}
- return $c(t);
-}, nl = async (e) => {
+ return tl(t);
+}, il = async (e) => {
let t = Array.isArray(e) ? e.filter(Boolean) : [];
return t.length ? (await Promise.all(t.map(async (e) => {
- let t = (await As({
- post: ye,
- endpoint: Le.STAGE_TO_INPUT,
+ let t = (await Ms({
+ post: y,
+ endpoint: L.STAGE_TO_INPUT,
payload: e,
index: !1
}))?.relativePath;
@@ -11541,43 +11542,43 @@ var Pc = (e) => {
droppedExt: String(e?.filename || "").split(".").pop() || ""
} : null;
}))).filter(Boolean) : [];
-}, rl = /* @__PURE__ */ new Map(), il = 6e4, al = 20, ol = 5 * 1024 * 1024, sl = 5e3, cl = 2e4, ll = 256, ul = 8192, dl = /[\u0000-\u001f\u007f]/, fl = /\u0000/, pl = (e) => dl.test(String(e || "")), ml = (e) => fl.test(String(e || "")), hl = (e) => {
+}, al = /* @__PURE__ */ new Map(), ol = 6e4, sl = 20, cl = 5 * 1024 * 1024, ll = 5e3, ul = 2e4, dl = 256, fl = 8192, pl = /[\u0000-\u001f\u007f]/, ml = /\u0000/, hl = (e) => pl.test(String(e || "")), gl = (e) => ml.test(String(e || "")), _l = (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 > ll || pl(n))) return !1;
+ if (n && (n.length > dl || hl(n))) return !1;
let r = e.widgets_values;
if (Array.isArray(r)) {
- for (let e of r) if (typeof e == "string" && (e.length > ul || ml(e))) return !1;
+ for (let e of r) if (typeof e == "string" && (e.length > fl || gl(e))) return !1;
}
return !0;
-}, gl = (e) => {
+}, vl = (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;
-}, _l = (e) => {
- if (!e || typeof e != "object" || !Array.isArray(e.nodes) || !Array.isArray(e.links) || e.nodes.length > sl || e.links.length > cl || !e.nodes.every(hl) || !e.links.every(gl)) return !1;
+}, yl = (e) => {
+ if (!e || typeof e != "object" || !Array.isArray(e.nodes) || !Array.isArray(e.links) || e.nodes.length > ll || e.links.length > ul || !e.nodes.every(_l) || !e.links.every(vl)) return !1;
try {
let t = JSON.stringify(e).length;
- if (!Number.isFinite(t) || t <= 0 || t > ol) return !1;
+ if (!Number.isFinite(t) || t <= 0 || t > cl) return !1;
} catch {
return !1;
}
return !0;
-}, vl = () => {
+}, bl = () => {
let e = Date.now();
- for (let [t, n] of rl.entries()) e - (n?.at || 0) > il && rl.delete(t);
- rl.size > al && Array.from(rl.entries()).sort((e, t) => (e[1]?.at || 0) - (t[1]?.at || 0)).slice(0, rl.size - al).forEach(([e]) => rl.delete(e));
-}, yl = async (e, t = null) => {
- let n = e && typeof e == "object" ? e : null, r = Oe(n), i = Vc(), a = n?.filename ? `${n.type || "output"}:${n.filename}:${n.subfolder || ""}:${r}` : t ? `path:${t}` : null;
+ for (let [t, n] of al.entries()) e - (n?.at || 0) > ol && al.delete(t);
+ al.size > sl && Array.from(al.entries()).sort((e, t) => (e[1]?.at || 0) - (t[1]?.at || 0)).slice(0, al.size - sl).forEach(([e]) => al.delete(e));
+}, xl = async (e, t = null) => {
+ let n = e && typeof e == "object" ? e : null, r = Oe(n), i = Uc(), a = n?.filename ? `${n.type || "output"}:${n.filename}:${n.subfolder || ""}:${r}` : t ? `path:${t}` : null;
if (a) {
- let e = rl.get(a);
- if (e && Date.now() - (e.at || 0) < il) {
- if (e.workflow && _l(e.workflow)) try {
+ let e = al.get(a);
+ if (e && Date.now() - (e.at || 0) < ol) {
+ if (e.workflow && yl(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);
@@ -11598,19 +11599,19 @@ var Pc = (e) => {
try {
let e = null, o = null;
if (n?.filename) {
- let t = await P(`${Le.WORKFLOW_QUICK}?type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}` + (r ? `&root_id=${encodeURIComponent(r)}` : ""));
- t?.ok && t.workflow && (o = t.workflow), o || (e = `${Le.METADATA}?workflow_only=1&type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}&root_id=${encodeURIComponent(r)}`);
- } else t && (e = `${Le.METADATA}?workflow_only=1&path=${encodeURIComponent(String(t))}`);
+ let t = await ne(`${L.WORKFLOW_QUICK}?type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}` + (r ? `&root_id=${encodeURIComponent(r)}` : ""));
+ t?.ok && t.workflow && (o = t.workflow), o || (e = `${L.METADATA}?workflow_only=1&type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}&root_id=${encodeURIComponent(r)}`);
+ } else t && (e = `${L.METADATA}?workflow_only=1&path=${encodeURIComponent(String(t))}`);
if (!o && e) {
- let t = await P(e);
+ let t = await ne(e);
if (!t?.ok || !t.data) return !1;
o = t.data?.workflow;
}
- if (!_l(o)) return !1;
- if (a && (rl.set(a, {
+ if (!yl(o)) return !1;
+ if (a && (al.set(a, {
workflow: o,
at: Date.now()
- }), vl()), typeof i?.loadGraphData == "function") return i.loadGraphData(o), !0;
+ }), bl()), typeof i?.loadGraphData == "function") return i.loadGraphData(o), !0;
if (typeof i?.canvas?.graph?.configure == "function") {
i.canvas.graph.configure(o);
try {
@@ -11626,7 +11627,7 @@ var Pc = (e) => {
}
return !1;
};
-function bl(e) {
+function Sl(e) {
return (t) => {
let n = t?.dataTransfer;
if (!n) return;
@@ -11634,7 +11635,7 @@ function bl(e) {
if (!r) return;
let i = r._mjrAsset;
if (!i || typeof i != "object") return;
- let a = String(i?.kind || "").toLowerCase(), o = Yc(i, String(i.filename || "")), s = o?.type ?? String(i?.type || "output").toLowerCase(), c = {
+ let a = String(i?.kind || "").toLowerCase(), o = Zc(i, String(i.filename || "")), s = o?.type ?? String(i?.type || "output").toLowerCase(), c = {
filename: i.filename,
subfolder: o?.subfolder ?? i.subfolder ?? "",
type: s,
@@ -11642,17 +11643,17 @@ function bl(e) {
kind: a
};
try {
- let t = Kc();
- Zc(n, Eo, JSON.stringify(c));
- let a = el(e, c);
- a.length > 1 && Zc(n, Do, JSON.stringify({ items: a })), Zc(n, "text/plain", String(i.filename || ""));
- let o = Hc(c);
- Qc({
+ let t = Jc();
+ $c(n, Oo, JSON.stringify(c));
+ let a = nl(e, c);
+ a.length > 1 && $c(n, ko, JSON.stringify({ items: a })), $c(n, "text/plain", String(i.filename || ""));
+ let o = Wc(c);
+ el({
dt: n,
asset: i,
payload: c,
viewUrl: o
- }), zc({
+ }), Vc({
dt: n,
asset: i,
containerEl: e,
@@ -11665,7 +11666,7 @@ function bl(e) {
}
try {
r.addEventListener("dragend", (t) => {
- Bc(t, {
+ Hc(t, {
asset: i,
containerEl: e,
card: r
@@ -11682,30 +11683,30 @@ function bl(e) {
}
};
}
-var xl = (e) => {
+var Cl = (e) => {
if (!e) return () => {};
- let t = Oc(e);
+ let t = Ac(e);
if (typeof t == "function") return t;
- let n = bl(e);
- return e.addEventListener("dragstart", n, !0), kc(e, () => {
+ let n = Sl(e);
+ return e.addEventListener("dragstart", n, !0), jc(e, () => {
try {
e.removeEventListener("dragstart", n, !0);
} catch (e) {
console.debug?.(e);
}
- Ac(e);
+ Mc(e);
});
-}, Sl = null, Cl = 0;
-function wl() {
+}, wl = null, Tl = 0;
+function El() {
let e = (e) => {
- if (Gc(e?.target)) return;
+ if (qc(e?.target)) return;
let t = String(e?.key || "").toLowerCase();
- t === "s" ? Uc = !0 : t === "l" && (Wc = !0);
+ t === "s" ? Gc = !0 : t === "l" && (Kc = !0);
}, t = (e) => {
let t = String(e?.key || "").toLowerCase();
- t === "s" ? Uc = !1 : t === "l" && (Wc = !1);
+ t === "s" ? Gc = !1 : t === "l" && (Kc = !1);
}, n = () => {
- Uc = !1, Wc = !1;
+ Gc = !1, Kc = !1;
}, r = new Set([
"mp3",
"wav",
@@ -11721,94 +11722,94 @@ function wl() {
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 a = String(n || "").toLowerCase(), o = r.has(a), c = await As({
- post: ye,
- endpoint: Le.STAGE_TO_INPUT,
+ let a = String(n || "").toLowerCase(), o = r.has(a), s = await Ms({
+ post: y,
+ endpoint: L.STAGE_TO_INPUT,
payload: t,
index: !1
});
- if (!c?.name) {
- s(`Failed to stage: "${t?.filename}"`, "error");
+ if (!s?.name) {
+ m(`Failed to stage: "${t?.filename}"`, "error");
return;
}
- let { name: l, subfolder: u = "" } = c, d = u ? `${u}/${l}` : l, f = `/view?filename=${encodeURIComponent(l)}&type=input&subfolder=${encodeURIComponent(u)}`;
+ let { name: c, subfolder: l = "" } = s, u = l ? `${l}/${c}` : c, d = `/view?filename=${encodeURIComponent(c)}&type=input&subfolder=${encodeURIComponent(l)}`;
if (o) {
try {
- let t = await fetch(f);
+ let t = await fetch(d);
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)), c = r.getChannelData(0), u = Math.max(1, Math.floor(c.length / 200)), p = [];
+ 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), l = Math.max(1, Math.floor(s.length / 200)), f = [];
for (let e = 0; e < 200; e++) {
let t = 0;
- for (let n = 0; n < u; n++) {
- let r = Math.abs(c[e * u + n] || 0);
+ for (let n = 0; n < l; n++) {
+ let r = Math.abs(s[e * l + n] || 0);
r > t && (t = r);
}
- p.push(t);
+ f.push(t);
}
- let m = i ?? 0;
+ let p = i ?? 0;
if (i === null) {
let t = Array.isArray(e.timeline?.audioSegments) ? [...e.timeline.audioSegments] : [];
t.sort((e, t) => e.start - t.start);
for (let e of t) {
- if (m + o <= e.start) break;
- m = Math.max(m, e.start + e.length);
+ if (p + o <= e.start) break;
+ p = Math.max(p, e.start + e.length);
}
}
let h = Date.now().toString(36) + Math.random().toString(36).slice(2, 7), g = {
id: h,
type: "audio",
- start: m,
+ start: p,
length: o,
trimStart: 0,
audioDurationFrames: o,
- audioFile: d,
- fileName: l,
- waveformPeaks: p
+ audioFile: u,
+ fileName: c,
+ waveformPeaks: f
};
if (!e.timeline?.audioSegments) {
- xc("ltxdirector inject: no audioSegments", {});
+ Cc("ltxdirector inject: no audioSegments", {});
return;
}
- e.timeline.audioSegments.push(g), e.timeline.audioSegments.sort((e, t) => e.start - t.start), e.selectionType = "audio", e.selectedIndex = e.timeline.audioSegments.findIndex((e) => e.id === h), e.updateUIFromSelection?.(), e.commitChanges?.(!0), e.render?.(), s(`Added audio to LTX Director: ${l}`, "success", 3e3), xc("drop ltxdirector inject audio", {
- file: l,
- start: m
+ e.timeline.audioSegments.push(g), e.timeline.audioSegments.sort((e, t) => e.start - t.start), e.selectionType = "audio", e.selectedIndex = e.timeline.audioSegments.findIndex((e) => e.id === h), e.updateUIFromSelection?.(), e.commitChanges?.(!0), e.render?.(), m(`Added audio to LTX Director: ${c}`, "success", 3e3), Cc("drop ltxdirector inject audio", {
+ file: c,
+ start: p
});
} catch (e) {
- console.error("[Majoor] LTX Director audio inject failed", e), s(`Audio decode failed for: ${l}`, "error");
+ console.error("[Majoor] LTX Director audio inject failed", e), m(`Audio decode failed for: ${c}`, "error");
}
return;
}
- let p = typeof e.getFrameRate == "function" ? e.getFrameRate() : 25, m = i ?? 0;
+ let f = typeof e.getFrameRate == "function" ? e.getFrameRate() : 25, p = 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 (m + p <= e.start) break;
- m = Math.max(m, e.start + e.length);
+ if (p + f <= e.start) break;
+ p = Math.max(p, e.start + e.length);
}
}
let h = Date.now().toString(36) + Math.random().toString(36).slice(2, 7), g = {
id: h,
- start: m,
- length: p,
+ start: p,
+ length: f,
prompt: "",
type: "image",
- imageFile: d,
- imageB64: f
+ imageFile: u,
+ imageB64: d
};
if (!e.timeline?.segments) {
- xc("ltxdirector inject: no timeline", {});
+ Cc("ltxdirector inject: no timeline", {});
return;
}
e.timeline.segments.push(g), e.timeline.segments.sort((e, t) => e.start - t.start);
let _ = new Image();
_.onload = () => {
g.imgObj = _, e.render?.();
- }, _.src = f;
+ }, _.src = d;
let v = e.timeline.segments.findIndex((e) => e.id === h);
- v >= 0 && (e.selectionType = "image", e.selectedIndex = v, e.updateUIFromSelection?.()), e.commitChanges?.(!0), e.render?.(), s(`Added to LTX Director: ${l}`, "success", 3e3), xc("drop ltxdirector inject", {
- file: l,
- start: m,
+ v >= 0 && (e.selectionType = "image", e.selectedIndex = v, e.updateUIFromSelection?.()), e.commitChanges?.(!0), e.render?.(), m(`Added to LTX Director: ${c}`, "success", 3e3), Cc("drop ltxdirector inject", {
+ file: c,
+ start: p,
ext: a
});
};
@@ -11817,171 +11818,171 @@ function wl() {
onKeyUp: t,
onWindowBlur: n,
onDragOver: (e) => {
- let t = Vc();
+ let t = Uc();
if (!Array.from(e?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return;
- let n = Tc(e, Eo);
- if (!Vo(n)) return;
- let r = ts(t, e.clientX, e.clientY), i = r ? hs(t, r, e.clientX, e.clientY) : null, a = String(n?.filename || "").split(".").pop() || "", o = r && !i ? ms(r, n, a) : null, s = r && !i && !o && !!r._timelineEditor;
+ let n = Dc(e, Oo);
+ if (!Uo(n)) return;
+ let r = rs(t, e.clientX, e.clientY), i = r ? _s(t, r, e.clientX, e.clientY) : null, a = String(n?.filename || "").split(".").pop() || "", o = r && !i ? gs(r, n, a) : null, s = r && !i && !o && !!r._timelineEditor;
if (r && (i || o || s)) {
- e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), ns(t, r, vs), e.dataTransfer.dropEffect = "copy", i ? xc("dragover slot", {
+ e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), is(t, r, bs), e.dataTransfer.dropEffect = "copy", i ? Cc("dragover slot", {
node: r?.title,
slot: i.input?.name
- }) : s ? xc("dragover ltxdirector", { node: r?.title }) : xc("dragover widget", {
+ }) : s ? Cc("dragover ltxdirector", { node: r?.title }) : Cc("dragover widget", {
node: r?.title,
widget: o?.name
});
return;
}
- rs(t, vs), _s(t, e) && (e.preventDefault(), e.dataTransfer.dropEffect = "copy");
+ as(t, bs), ys(t, e) && (e.preventDefault(), e.dataTransfer.dropEffect = "copy");
},
onDrop: async (e) => {
- let t = Vc();
+ let t = Uc();
if (!Array.from(e?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return;
- let n = Tc(e, Eo);
- if (!Vo(n) || !_s(t, e)) return;
- jc();
- let r = qc(), a = r ? tl(e, n) : [n], o = ts(t, e.clientX, e.clientY), c = o ? hs(t, o, e.clientX, e.clientY) : null, l = String(n?.filename || "").split(".").pop() || "", u = o && !c ? ms(o, n, l) : null;
- if (o && c) {
- e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), rs(t, vs);
- let r = await js({
- post: ye,
- endpoint: Le.STAGE_TO_INPUT,
+ let n = Dc(e, Oo);
+ if (!Uo(n) || !ys(t, e)) return;
+ Nc();
+ let r = Yc(), a = r ? rl(e, n) : [n], o = rs(t, e.clientX, e.clientY), s = o ? _s(t, o, e.clientX, e.clientY) : null, c = String(n?.filename || "").split(".").pop() || "", l = o && !s ? gs(o, n, c) : null;
+ if (o && s) {
+ e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), as(t, bs);
+ let r = await Ns({
+ post: y,
+ endpoint: L.STAGE_TO_INPUT,
payload: n,
index: !1
});
if (!r) return;
- if (Os({
+ if (As({
app: t,
payload: n,
relativePath: r,
targetNode: o,
- inputSlotIndex: c.index,
+ inputSlotIndex: s.index,
event: e
})) {
- xc("drop slot created and connected loader", {
+ Cc("drop slot created and connected loader", {
node: o?.title,
- slot: c.input?.name,
+ slot: s.input?.name,
value: r
});
return;
}
- s(`Staged to input: ${r}`, "success", 4e3);
+ m(`Staged to input: ${r}`, "success", 4e3);
return;
}
- if (o && !c && !u && o._timelineEditor && !r) {
- e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), rs(t, vs), await i(o._timelineEditor, n, l);
+ if (o && !s && !l && o._timelineEditor && !r) {
+ e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), as(t, bs), await i(o._timelineEditor, n, c);
return;
}
- if (!o || !u) {
- if (rs(t, vs), e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), r) {
- let r = Es({
+ if (!o || !l) {
+ if (as(t, bs), e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), r) {
+ let r = Os({
app: t,
- items: await nl(a),
+ items: await il(a),
event: e
});
if (r > 0) {
- xc("drop canvas created loaders", { count: r });
+ Cc("drop canvas created loaders", { count: r });
return;
}
- s(`Failed to load file: "${n?.filename}". Staging failed.`, "error");
+ m(`Failed to load file: "${n?.filename}". Staging failed.`, "error");
return;
}
- let i = !o && !r, c = As({
- post: ye,
- endpoint: Le.STAGE_TO_INPUT,
+ let i = !o && !r, s = Ms({
+ post: y,
+ endpoint: L.STAGE_TO_INPUT,
payload: n,
index: !1
- }), u = i ? yl(n) : Promise.resolve(!1), [d, f] = await Promise.all([u, c]);
- if (d) {
- xc("drop canvas loaded workflow", { file: n?.filename });
+ }), l = i ? xl(n) : Promise.resolve(!1), [u, d] = await Promise.all([l, s]);
+ if (u) {
+ Cc("drop canvas loaded workflow", { file: n?.filename });
return;
}
- let p = f?.relativePath;
- if (!p) {
- xc("drop canvas stage failed"), s(`Failed to load file: "${n?.filename}". Staging failed.`, "error");
+ let f = d?.relativePath;
+ if (!f) {
+ Cc("drop canvas stage failed"), m(`Failed to load file: "${n?.filename}". Staging failed.`, "error");
return;
}
- if (xc("drop canvas staged", { value: p }), Es({
+ if (Cc("drop canvas staged", { value: f }), Os({
app: t,
items: [{
payload: n,
- relativePath: p,
- droppedExt: l
+ relativePath: f,
+ droppedExt: c
}],
event: e
})) {
- xc("drop canvas created loader", { value: p });
+ Cc("drop canvas created loader", { value: f });
return;
}
- s(`Staged to input: ${p}`, "success", 4e3);
+ m(`Staged to input: ${f}`, "success", 4e3);
return;
}
- e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), rs(t, vs);
- let d = await js({
- post: ye,
- endpoint: Le.STAGE_TO_INPUT,
+ e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), as(t, bs);
+ let u = await Ns({
+ post: y,
+ endpoint: L.STAGE_TO_INPUT,
payload: n,
index: !1
});
- d && (Ds(u, d), vs(t), xc("drop inject", {
+ u && (ks(l, u), bs(t), Cc("drop inject", {
node: o?.title,
- widget: u?.name,
- value: d
+ widget: l?.name,
+ value: u
}));
},
onDragLeave: () => {
- rs(Vc(), vs), xc("dragleave");
+ as(Uc(), bs), Cc("dragleave");
}
};
}
-function Tl() {
+function Dl() {
if (typeof window > "u" || !window?.addEventListener) return { dispose() {} };
- let { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: r, onDrop: i, onDragLeave: a } = wl();
+ let { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: r, onDrop: i, onDragLeave: a } = El();
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);
}
- Uc = !1, Wc = !1;
+ Gc = !1, Kc = !1;
try {
- rs(Vc(), vs);
+ as(Uc(), bs);
} catch (e) {
console.debug?.(e);
}
} };
}
-function El() {
- Sl || (Sl = Tl(), Cl = 0), Cl += 1;
+function Ol() {
+ wl || (wl = Dl(), Tl = 0), Tl += 1;
let e = !1;
return ({ force: t = !1 } = {}) => {
- e || (e = !0, Dl({ force: t }));
+ e || (e = !0, kl({ force: t }));
};
}
-function Dl({ force: e = !1 } = {}) {
- if (!Sl) {
- Cl = 0, Nc();
+function kl({ force: e = !1 } = {}) {
+ if (!wl) {
+ Tl = 0, Fc();
return;
}
- if (!e && Cl > 1) {
- --Cl;
+ if (!e && Tl > 1) {
+ --Tl;
return;
}
- Cl = 0;
+ Tl = 0;
try {
- Sl.dispose?.();
+ wl.dispose?.();
} catch (e) {
console.debug?.(e);
}
- Sl = null, Nc();
+ wl = null, Fc();
}
//#endregion
//#region ui/features/grid/MediaBlobCache.ts
-var Ol = "__MJR_MEDIA_BLOB_CACHE__", kl = 2e3, Al = 1440 * 60 * 1e3, jl = 600 * 1e3, Ml = 6;
-function Nl() {
+var Al = "__MJR_MEDIA_BLOB_CACHE__", jl = 2e3, Ml = 1440 * 60 * 1e3, Nl = 600 * 1e3, Pl = 6;
+function Fl() {
let e = /* @__PURE__ */ new Map(), t = null, n = 0, r = [];
async function i(e) {
- n >= Ml && await new Promise((e) => r.push(e)), n += 1;
+ n >= Pl && await new Promise((e) => r.push(e)), n += 1;
try {
return await e();
} finally {
@@ -11991,7 +11992,7 @@ function Nl() {
}
}
function a() {
- t ||= setInterval(o, jl);
+ t ||= setInterval(o, Nl);
}
function o() {
try {
@@ -12014,7 +12015,7 @@ function Nl() {
t && (s(e.get(t)), e.delete(t));
}
function l(e) {
- e.expiresAt = Date.now() + Al;
+ e.expiresAt = Date.now() + Ml;
}
function u(e) {
try {
@@ -12028,10 +12029,10 @@ function Nl() {
let n = u(t);
if (!n) return;
let r = e.get(n);
- r ? (r.hasError = !0, l(r)) : (e.size >= kl && c(), e.set(n, {
+ r ? (r.hasError = !0, l(r)) : (e.size >= jl && c(), e.set(n, {
blobUrl: null,
refcount: 0,
- expiresAt: Date.now() + Al,
+ expiresAt: Date.now() + Ml,
hasError: !0
}), a());
} catch (e) {
@@ -12062,10 +12063,10 @@ function Nl() {
if (!f) return null;
if (!f.ok) return d(t), null;
let p = await f.blob(), m = URL.createObjectURL(p);
- return e.size >= kl && c(), e.set(r, {
+ return e.size >= jl && c(), e.set(r, {
blobUrl: m,
refcount: 1,
- expiresAt: Date.now() + Al,
+ expiresAt: Date.now() + Ml,
hasError: !1
}), a(), m;
} catch (e) {
@@ -12104,30 +12105,30 @@ function Nl() {
dispose: h
};
}
-function Pl() {
+function Il() {
try {
- if (window[Ol]) return window[Ol];
+ if (window[Al]) return window[Al];
} catch (e) {
console.debug?.(e);
}
try {
- window[Ol]?.dispose?.();
+ window[Al]?.dispose?.();
} catch (e) {
console.debug?.(e);
}
- let e = Nl();
+ let e = Fl();
try {
- window[Ol] = e;
+ window[Al] = e;
} catch (e) {
console.debug?.(e);
}
return e;
}
-var Fl = Pl(), Il = (e, t) => {
+var Ll = Il(), Rl = (e, t) => {
let n = e.__vccOpts || e;
for (let [e, r] of t) n[e] = r;
return n;
-}, Ll = ["title"], Rl = /* @__PURE__ */ Il({
+}, zl = ["title"], Bl = /* @__PURE__ */ Rl({
__name: "RatingBadge",
props: { rating: {
type: [Number, String],
@@ -12138,27 +12139,27 @@ var Fl = Pl(), Il = (e, t) => {
}
} },
setup(e) {
- let t = e, n = X(() => Math.max(0, Math.min(5, Number(t.rating) || 0))), i = X(() => n.value > 0), a = X(() => r("rating.title", "Rating: {n} star{n, plural, one {} other {s}}", { n: n.value }));
- return (e, t) => i.value ? (H(), G("div", {
+ let t = e, n = Z(() => Math.max(0, Math.min(5, Number(t.rating) || 0))), r = Z(() => n.value > 0), i = Z(() => R("rating.title", "Rating: {n} star{n, plural, one {} other {s}}", { n: n.value }));
+ return (e, t) => r.value ? (W(), q("div", {
key: 0,
class: "mjr-rating-badge",
- title: a.value
- }, [(H(!0), G(In, null, vn(n.value, (e) => (H(), G("span", {
+ title: i.value
+ }, [(W(!0), q(Ln, null, vn(n.value, (e) => (W(), q("span", {
key: e,
style: An({
color: "var(--mjr-rating-color, var(--mjr-star-active, #FFD45A))",
marginRight: e < n.value ? "2px" : "0"
})
- }, " ★ ", 4))), 128))], 8, Ll)) : Y("", !0);
+ }, " ★ ", 4))), 128))], 8, zl)) : In("", !0);
}
-}, [["__scopeId", "data-v-730159ba"]]), zl = ["title"], Bl = /* @__PURE__ */ Il({
+}, [["__scopeId", "data-v-730159ba"]]), Vl = ["title"], Hl = /* @__PURE__ */ Rl({
__name: "TagsBadge",
props: { tags: {
type: [Array, String],
default: () => []
} },
setup(e) {
- let t = e, n = X(() => {
+ let t = e, n = Z(() => {
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();
@@ -12171,40 +12172,40 @@ var Fl = Pl(), Il = (e, t) => {
}
}
return [];
- }), i = X(() => n.value.length > 0), a = X(() => r("tags.title", "Tags: {tags}", { tags: n.value.join(", ") })), o = X(() => {
+ }), r = Z(() => n.value.length > 0), i = Z(() => R("tags.title", "Tags: {tags}", { tags: n.value.join(", ") })), a = Z(() => {
let e = n.value;
return e.length <= 5 ? e.join(", ") : e.slice(0, 5).join(", ") + ` +${e.length - 5}`;
});
- return (e, t) => i.value ? (H(), G("div", {
+ return (e, t) => r.value ? (W(), q("div", {
key: 0,
class: "mjr-tags-badge",
- title: a.value,
+ title: i.value,
style: { color: "var(--mjr-tag-color, #90CAF9)" }
- }, q(o.value), 9, zl)) : Y("", !0);
+ }, Y(a.value), 9, Vl)) : In("", !0);
}
-}, [["__scopeId", "data-v-2b45d539"]]), Vl = ["title"], Hl = /* @__PURE__ */ Il({
+}, [["__scopeId", "data-v-2b45d539"]]), Ul = ["title"], Wl = /* @__PURE__ */ Rl({
__name: "GenTimeBadge",
props: { genTimeMs: {
type: [Number, String],
default: 0
} },
setup(e) {
- let t = e, n = X(() => ot(t.genTimeMs)), r = X(() => n.value > 0), i = X(() => bt(n.value)), a = X(() => Nt(n.value));
- return (e, t) => r.value ? (H(), G("div", {
+ let t = e, n = Z(() => Ft(t.genTimeMs)), r = Z(() => n.value > 0), i = Z(() => It(n.value)), a = Z(() => ct(n.value));
+ return (e, t) => r.value ? (W(), q("div", {
key: 0,
class: "mjr-gentime-badge",
title: i.value.title,
style: An({ color: a.value })
- }, q(i.value.text), 13, Vl)) : Y("", !0);
+ }, Y(i.value.text), 13, Ul)) : In("", !0);
}
-}, [["__scopeId", "data-v-e8aef14a"]]), Ul = {
+}, [["__scopeId", "data-v-e8aef14a"]]), Gl = {
key: 0,
class: "mjr-live-placeholder-wash",
"aria-hidden": "true"
-}, Wl = ["alt", "src"], Gl = {
+}, Kl = ["alt", "src"], ql = {
key: 1,
class: "mjr-media-error-placeholder"
-}, Kl = ["data-src", "poster"], ql = ["src"], Jl = {
+}, Jl = ["data-src", "poster"], Yl = ["src"], Xl = {
class: "mjr-audio-waveform-overlay",
style: {
position: "absolute",
@@ -12215,7 +12216,7 @@ var Fl = Pl(), Il = (e, t) => {
"pointer-events": "none",
color: "white"
}
-}, Yl = {
+}, Zl = {
viewBox: "0 0 64 32",
preserveAspectRatio: "xMidYMid meet",
fill: "currentColor",
@@ -12226,12 +12227,12 @@ var Fl = Pl(), Il = (e, t) => {
height: "auto",
filter: "drop-shadow(0 2px 6px rgba(0,0,0,0.5))"
}
-}, Xl = [
+}, Ql = [
"x",
"y",
"width",
"height"
-], Zl = ["src", "alt"], Ql = {
+], $l = ["src", "alt"], eu = {
key: 1,
class: "mjr-model3d-thumb-icon",
style: {
@@ -12242,27 +12243,27 @@ var Fl = Pl(), Il = (e, t) => {
"justify-content": "center",
color: "rgba(255,255,255,0.7)"
}
-}, $l = [
+}, tu = [
"data-mjr-ext",
"data-mjr-badge-bg",
"title"
-], eu = ["title"], tu = {
+], nu = ["title"], ru = {
key: 6,
class: "mjr-card-hover-info"
-}, nu = {
+}, iu = {
key: 0,
class: "mjr-hover-prompt"
-}, ru = {
+}, au = {
key: 1,
class: "mjr-hover-gentime"
-}, iu = {
+}, ou = {
class: "mjr-card-info mjr-card-meta",
style: {
position: "relative",
padding: "6px 8px",
"min-width": "0"
}
-}, au = ["title"], ou = {
+}, su = ["title"], cu = {
class: "mjr-card-meta-row",
style: {
"font-size": "0.85em",
@@ -12273,7 +12274,7 @@ var Fl = Pl(), Il = (e, t) => {
"text-overflow": "ellipsis",
"padding-right": "16px"
}
-}, su = {
+}, lu = {
key: 0,
class: "mjr-meta-separator",
"aria-hidden": "true",
@@ -12281,7 +12282,7 @@ var Fl = Pl(), Il = (e, t) => {
opacity: "0.55",
margin: "0 3px"
}
-}, cu = ["title"], lu = { class: "mjr-stack-group-button-count" }, uu = { class: "mjr-dup-stack-count" }, du = {
+}, uu = ["title"], du = { class: "mjr-stack-group-button-count" }, fu = { class: "mjr-dup-stack-count" }, pu = {
__name: "AssetCardInner",
props: { asset: {
type: Object,
@@ -12353,7 +12354,7 @@ var Fl = Pl(), Il = (e, t) => {
async function n(e, t = {}) {
if (!e) return null;
try {
- return Fl.hasError(e) ? null : await Fl.acquireUrl(e, t) || null;
+ return Ll.hasError(e) ? null : await Ll.acquireUrl(e, t) || null;
} catch {
return null;
}
@@ -12366,13 +12367,13 @@ var Fl = Pl(), Il = (e, t) => {
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, Fl.hasError(t)) {
+ if (e._mjrVideoLoadRequestId = n, Ll.hasError(t)) {
e.src = t, e._mjrSourceKey = t;
return;
}
- let r = await Fl.acquireUrl(t);
+ let r = await Ll.acquireUrl(t);
if (e._mjrVideoLoadRequestId !== n || !e.isConnected) {
- r && Fl.releaseUrl(t);
+ r && Ll.releaseUrl(t);
return;
}
r ? (e.src = r, e._mjrCachedSrc = t, e._mjrSourceKey = t) : (e.src = t, e._mjrSourceKey = t), e.load?.();
@@ -12393,7 +12394,7 @@ var Fl = Pl(), Il = (e, t) => {
}
try {
let t = String(e._mjrCachedSrc || "").trim();
- t && Fl.releaseUrl(t), e._mjrCachedSrc = "", e._mjrSourceKey = "";
+ t && Ll.releaseUrl(t), e._mjrCachedSrc = "", e._mjrSourceKey = "";
} catch (e) {
console.debug?.(e);
}
@@ -12464,42 +12465,42 @@ var Fl = Pl(), Il = (e, t) => {
function u(e) {
e && (c(e), a(e));
}
- let d = e, f = X(() => String(d.asset.kind || "image").toLowerCase()), p = X(() => f.value === "image"), m = X(() => f.value === "video"), h = X(() => f.value === "audio"), g = X(() => f.value === "model3d"), _ = X(() => De(d.asset) || ""), v = X(() => String(d.asset.thumbnail_url || d.asset.thumb_url || d.asset.poster || "").trim()), y = X(() => String(d.asset.preview_url || d.asset.previewUrl || d.asset.url || "").trim()), b = X(() => v.value || y.value || _.value), x = X(() => y.value || _.value), S = X(() => v.value), C = X(() => String(d.asset.filename || "")), w = X(() => String(d.asset.display_name || d.asset.displayName || d.asset.name || C.value || "").trim()), T = X(() => {
+ let d = e, f = Z(() => String(d.asset.kind || "image").toLowerCase()), p = Z(() => f.value === "image"), m = Z(() => f.value === "video"), h = Z(() => f.value === "audio"), g = Z(() => f.value === "model3d"), _ = Z(() => Fe(d.asset) || ""), v = Z(() => String(d.asset.thumbnail_url || d.asset.thumb_url || d.asset.poster || "").trim()), y = Z(() => String(d.asset.preview_url || d.asset.previewUrl || d.asset.url || "").trim()), b = Z(() => v.value || y.value || _.value), x = Z(() => y.value || _.value), S = Z(() => v.value), C = Z(() => String(d.asset.filename || "")), w = Z(() => String(d.asset.display_name || d.asset.displayName || d.asset.name || C.value || "").trim()), T = Z(() => {
let e = C.value;
return e.includes(".") ? e.split(".").pop().toUpperCase() : "";
- }), E = X(() => {
+ }), E = Z(() => {
let e = w.value || C.value;
return e.includes(".") ? e.slice(0, e.lastIndexOf(".")) : e;
- }), D = X(() => {
+ }), D = Z(() => {
let e = [C.value || w.value], t = String(d.asset.subfolder || d.asset.file_info?.subfolder || "").trim(), n = String(d.asset.type || d.asset.source || d.asset.file_info?.type || "").trim();
return t && e.push(`Subfolder: ${t}`), n && e.push(`Type: ${n}`), e.filter(Boolean).join("\n");
- }), O = X(() => Number(d.asset.rating) || 0), k = X(() => d.asset.tags || []), A = X(() => ot(d.asset.generation_time_ms ?? d.asset.metadata?.generation_time_ms ?? 0)), j = X(() => A.value > 0), M = X(() => bt(A.value)), N = X(() => Nt(A.value)), P = X(() => String(d.asset.positive_prompt || "").trim()), F = X(() => d.asset?._mjrLivePlaceholder === !0 || d.asset?.is_live_placeholder === !0 || String(d.asset?.id || "").trim().toLowerCase().startsWith("live:")), ee = X(() => String(d.asset?._mjrLiveLabel || "In progress").trim() || "In progress"), te = X(() => `${ee.value}: waiting for indexed asset data`), ne = X(() => {
+ }), O = Z(() => Number(d.asset.rating) || 0), k = Z(() => d.asset.tags || []), A = Z(() => Ft(d.asset.generation_time_ms ?? d.asset.metadata?.generation_time_ms ?? 0)), j = Z(() => A.value > 0), M = Z(() => It(A.value)), N = Z(() => ct(A.value)), P = Z(() => String(d.asset.positive_prompt || "").trim()), F = Z(() => d.asset?._mjrLivePlaceholder === !0 || d.asset?.is_live_placeholder === !0 || String(d.asset?.id || "").trim().toLowerCase().startsWith("live:")), I = Z(() => String(d.asset?._mjrLiveLabel || "In progress").trim() || "In progress"), ee = Z(() => `${I.value}: waiting for indexed asset data`), te = Z(() => {
let { width: e, height: t } = d.asset;
return e && t ? `${e}x${t}` : "";
- }), re = X(() => d.asset.duration ? kt(d.asset.duration) : ""), ie = X(() => d.asset.generation_time || d.asset.file_creation_time || d.asset.mtime || d.asset.created_at), ae = X(() => ie.value ? Bt(ie.value) : ""), oe = X(() => ie.value ? At(ie.value) : ""), se = X(() => [
- ne.value ? {
+ }), ne = Z(() => d.asset.duration ? Mt(d.asset.duration) : ""), re = Z(() => d.asset.generation_time || d.asset.file_creation_time || d.asset.mtime || d.asset.created_at), ie = Z(() => re.value ? jt(re.value) : ""), ae = Z(() => re.value ? zt(re.value) : ""), oe = Z(() => [
+ te.value ? {
key: "resolution",
className: "mjr-meta-res",
- title: `Resolution: ${ne.value}`,
- text: ne.value
+ title: `Resolution: ${te.value}`,
+ text: te.value
} : null,
- re.value ? {
+ ne.value ? {
key: "duration",
className: "mjr-meta-duration",
- title: `Duration: ${re.value}`,
- text: re.value
+ title: `Duration: ${ne.value}`,
+ text: ne.value
} : null,
- ae.value ? {
+ ie.value ? {
key: "date",
className: "mjr-meta-date",
- title: `Date: ${ae.value}`,
- text: ae.value
+ title: `Date: ${ie.value}`,
+ text: ie.value
} : null,
- oe.value ? {
+ ae.value ? {
key: "time",
className: "mjr-meta-date mjr-meta-time-val",
- title: `Time: ${oe.value}`,
- text: oe.value
+ title: `Time: ${ae.value}`,
+ text: ae.value
} : null,
j.value ? {
key: "gentime",
@@ -12511,94 +12512,94 @@ var Fl = Pl(), Il = (e, t) => {
fontWeight: "500"
}
} : null
- ].filter(Boolean)), ce = X(() => !!d.asset._mjrNameCollision && !d.asset._mjrDupStack), le = X(() => ce.value ? "var(--mjr-badge-duplicate-alert, #ff1744)" : {
+ ].filter(Boolean)), se = Z(() => !!d.asset._mjrNameCollision && !d.asset._mjrDupStack), ce = Z(() => se.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)"
- }[f.value] || "var(--mjr-badge-image, #888)"), ue = pn("mjrStackService", null), de = X(() => !ue || !String(d.asset.stack_id || "").trim() ? !1 : Number(d.asset.stack_asset_count || d.asset._mjrFeedGroupCount || 0) > 1), fe = X(() => Number(d.asset.stack_asset_count || d.asset._mjrFeedGroupCount || 0) || 0), pe = X(() => !!d.asset._mjrDupStack && Number(d.asset._mjrDupCount || 0) >= 2), me = X(() => Number(d.asset._mjrDupCount || 0) || 0);
- async function he(e) {
+ }[f.value] || "var(--mjr-badge-image, #888)"), le = pn("mjrStackService", null), ue = Z(() => !le || !String(d.asset.stack_id || "").trim() ? !1 : Number(d.asset.stack_asset_count || d.asset._mjrFeedGroupCount || 0) > 1), de = Z(() => Number(d.asset.stack_asset_count || d.asset._mjrFeedGroupCount || 0) || 0), fe = Z(() => !!d.asset._mjrDupStack && Number(d.asset._mjrDupCount || 0) >= 2), pe = Z(() => Number(d.asset._mjrDupCount || 0) || 0);
+ async function L(e) {
e.preventDefault(), e.stopPropagation();
try {
- await ue?.openStackGroup?.(d.asset);
+ await le?.openStackGroup?.(d.asset);
} catch (e) {
console.debug?.(e);
}
}
- function ge(e) {
+ function me(e) {
e.preventDefault(), e.stopPropagation();
try {
- ue?.openDupGroup?.(d.asset);
+ le?.openDupGroup?.(d.asset);
} catch (e) {
console.debug?.(e);
}
}
- let _e = K(null), ve = K(null), ye = K(null), be = K(null), xe = K(!1), Se = K(!1), Ce = K(""), we = 0, Te = "";
- function Ee() {
+ let he = J(null), ge = J(null), _e = J(null), ve = J(null), ye = J(!1), be = J(!1), xe = J(""), Se = 0, Ce = "";
+ function we() {
try {
- Te && Fl.releaseUrl(Te);
+ Ce && Ll.releaseUrl(Ce);
} catch (e) {
console.debug?.(e);
}
- Te = "";
+ Ce = "";
}
- mn(() => [ye.value, b.value], async ([e, t], i, a) => {
- if (!e || !t || xe.value) return;
- let o = we += 1, s = new AbortController(), c = !1;
+ mn(() => [_e.value, b.value], async ([e, t], i, a) => {
+ if (!e || !t || ye.value) return;
+ let o = Se += 1, s = new AbortController(), c = !1;
a(() => {
c = !0, s.abort();
- }), Ee(), Ce.value = "";
+ }), we(), xe.value = "";
try {
- if (await r(), c || o !== we || !e.isConnected) return;
+ if (await r(), c || o !== Se || !e.isConnected) return;
let i = await n(t, { signal: s.signal });
- if (c || o !== we || !e.isConnected) {
- i && i !== t && Fl.releaseUrl(t);
+ if (c || o !== Se || !e.isConnected) {
+ i && i !== t && Ll.releaseUrl(t);
return;
}
- i && i !== Ce.value && (Ce.value = i, Te = i === t ? "" : t);
+ i && i !== xe.value && (xe.value = i, Ce = i === t ? "" : t);
} catch {}
}, { immediate: !0 });
- let Oe = K(I.GRID_VIDEO_AUTOPLAY_MODE || "hover");
- function ke() {
- Oe.value = I.GRID_VIDEO_AUTOPLAY_MODE || "hover";
+ let Te = J(z.GRID_VIDEO_AUTOPLAY_MODE || "hover");
+ function Ee() {
+ Te.value = z.GRID_VIDEO_AUTOPLAY_MODE || "hover";
}
bn(() => {
- window.addEventListener("mjr-settings-changed", ke);
- }), mn(ve, (e, t) => {
+ window.addEventListener("mjr-settings-changed", Ee);
+ }), mn(ge, (e, t) => {
if (t) try {
u(t);
} catch {}
- if (e && _e.value) try {
- l(_e.value, e, Oe.value);
+ if (e && he.value) try {
+ l(he.value, e, Te.value);
} catch {}
- }), mn(Oe, (e) => {
- let t = ve.value, n = _e.value;
+ }), mn(Te, (e) => {
+ let t = ge.value, n = he.value;
t && n && l(n, t, e);
}), Sn(() => {
- window.removeEventListener("mjr-settings-changed", ke), we += 1, Ee();
- let e = ve.value;
+ window.removeEventListener("mjr-settings-changed", Ee), Se += 1, we();
+ let e = ge.value;
if (e) try {
u(e);
} catch {}
}), En(() => {
- let e = be.value;
+ let e = ve.value;
if (!e) return;
let t = d.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 = lt(t);
+ let n = xt(t);
n && e.appendChild(n);
} catch {}
});
- function Ae(e) {
- xe.value = !0;
+ function De(e) {
+ ye.value = !0;
try {
- Fl.markError(b.value);
+ Ll.markError(b.value);
} catch {}
}
- function je(e) {
- if (!ce.value) return;
+ function Oe(e) {
+ if (!se.value) return;
e.preventDefault(), e.stopPropagation();
let t = e.target?.closest?.(".mjr-asset-card");
t && t.dispatchEvent(new CustomEvent("mjr:badge-duplicates-focus", {
@@ -12612,27 +12613,27 @@ var Fl = Pl(), Il = (e, t) => {
}));
}
return (n, r) => {
- let i = Ln("MButton");
- return H(), G(In, null, [
- W("div", {
+ let i = Rn("MButton");
+ return W(), q(Ln, null, [
+ K("div", {
class: "mjr-thumb",
ref_key: "thumbRef",
- ref: _e
+ ref: he
}, [
- F.value ? (H(), G("div", Ul)) : Y("", !0),
- p.value ? (H(), G(In, { key: 1 }, [xe.value ? Y("", !0) : (H(), G("img", {
+ F.value ? (W(), q("div", Gl)) : In("", !0),
+ p.value ? (W(), q(Ln, { key: 1 }, [ye.value ? In("", !0) : (W(), q("img", {
key: 0,
ref_key: "imgRef",
- ref: ye,
+ ref: _e,
class: "mjr-thumb-media",
alt: C.value,
decoding: "async",
loading: "lazy",
- src: Ce.value || b.value || void 0,
- onError: Ae
- }, null, 40, Wl)), xe.value ? (H(), G("div", Gl, [...r[13] ||= [W("i", { class: "pi pi-image" }, null, -1)]])) : Y("", !0)], 64)) : m.value ? (H(), G(In, { key: 2 }, [W("video", {
+ src: xe.value || b.value || void 0,
+ onError: De
+ }, null, 40, Kl)), ye.value ? (W(), q("div", ql, [...r[13] ||= [K("i", { class: "pi pi-image" }, null, -1)]])) : In("", !0)], 64)) : m.value ? (W(), q(Ln, { key: 2 }, [K("video", {
ref_key: "videoRef",
- ref: ve,
+ ref: ge,
class: "mjr-thumb-media",
"data-src": x.value,
poster: S.value || void 0,
@@ -12644,72 +12645,72 @@ var Fl = Pl(), Il = (e, t) => {
draggable: !1,
tabindex: -1,
style: { "pointer-events": "none" }
- }, null, 8, Kl), r[14] ||= W("div", { class: "mjr-thumb-play" }, [W("i", { class: "pi pi-play" })], -1)], 64)) : h.value ? (H(), G(In, { key: 3 }, [S.value ? (H(), G("img", {
+ }, null, 8, Jl), r[14] ||= K("div", { class: "mjr-thumb-play" }, [K("i", { class: "pi pi-play" })], -1)], 64)) : h.value ? (W(), q(Ln, { key: 3 }, [S.value ? (W(), q("img", {
key: 0,
class: "mjr-thumb-media",
src: S.value,
draggable: !1,
alt: ""
- }, null, 8, ql)) : Y("", !0), W("div", Jl, [(H(), G("svg", Yl, [(H(), G(In, null, vn(t, ([e, t, n, r], i) => W("rect", {
+ }, null, 8, Yl)) : In("", !0), K("div", Xl, [(W(), q("svg", Zl, [(W(), q(Ln, null, vn(t, ([e, t, n, r], i) => K("rect", {
key: i,
x: e,
y: t,
width: n,
height: r,
rx: "1.5"
- }, null, 8, Xl)), 64))]))])], 64)) : g.value ? (H(), G(In, { key: 4 }, [S.value && !Se.value ? (H(), G("img", {
+ }, null, 8, Ql)), 64))]))])], 64)) : g.value ? (W(), q(Ln, { key: 4 }, [S.value && !be.value ? (W(), q("img", {
key: 0,
class: "mjr-thumb-media",
src: S.value,
draggable: !1,
alt: C.value,
- onError: r[0] ||= (e) => Se.value = !0
- }, null, 40, Zl)) : (H(), G("div", Ql, [...r[15] ||= [W("i", {
+ onError: r[0] ||= (e) => be.value = !0
+ }, null, 40, $l)) : (W(), q("div", eu, [...r[15] ||= [K("i", {
class: "pi pi-box",
style: { "font-size": "2.5rem" }
- }, null, -1)]]))], 64)) : Y("", !0),
- W("div", {
+ }, null, -1)]]))], 64)) : In("", !0),
+ K("div", {
class: "mjr-file-badge mjr-badge-ext",
"data-mjr-ext": T.value,
- "data-mjr-badge-bg": le.value,
+ "data-mjr-badge-bg": ce.value,
style: An({
position: "absolute",
top: "6px",
left: "6px",
zIndex: 10,
- background: le.value,
+ background: ce.value,
color: "#fff",
padding: "2px 5px",
borderRadius: "4px",
fontSize: "10px",
fontWeight: "700",
- pointerEvents: ce.value ? "auto" : "none",
- cursor: ce.value ? "pointer" : "default"
+ pointerEvents: se.value ? "auto" : "none",
+ cursor: se.value ? "pointer" : "default"
}),
- title: ce.value ? `${T.value} — duplicate filename (${e.asset._mjrNameCollisionCount || 2} files)` : `${T.value} file`,
- onClick: je
- }, q(T.value) + q(ce.value ? "+" : ""), 13, $l),
- V(Rl, {
+ title: se.value ? `${T.value} — duplicate filename (${e.asset._mjrNameCollisionCount || 2} files)` : `${T.value} file`,
+ onClick: Oe
+ }, Y(T.value) + Y(se.value ? "+" : ""), 13, tu),
+ U(Bl, {
rating: O.value,
class: "mjr-badge-rating"
}, null, 8, ["rating"]),
- V(Bl, {
+ U(Hl, {
tags: k.value,
class: "mjr-badge-tags"
}, null, 8, ["tags"]),
- V(Hl, { "gen-time-ms": A.value }, null, 8, ["gen-time-ms"]),
- F.value ? (H(), G("div", {
+ U(Wl, { "gen-time-ms": A.value }, null, 8, ["gen-time-ms"]),
+ F.value ? (W(), q("div", {
key: 5,
class: "mjr-live-pill",
- title: te.value
- }, [r[16] ||= W("span", {
+ title: ee.value
+ }, [r[16] ||= K("span", {
class: "mjr-live-pill-dot",
"aria-hidden": "true"
- }, null, -1), W("span", null, q(ee.value), 1)], 8, eu)) : Y("", !0),
- P.value || j.value ? (H(), G("div", tu, [P.value ? (H(), G("div", nu, q(P.value), 1)) : Y("", !0), j.value ? (H(), G("div", ru, "⏱ " + q(M.value.text), 1)) : Y("", !0)])) : Y("", !0)
+ }, null, -1), K("span", null, Y(I.value), 1)], 8, nu)) : In("", !0),
+ P.value || j.value ? (W(), q("div", ru, [P.value ? (W(), q("div", iu, Y(P.value), 1)) : In("", !0), j.value ? (W(), q("div", au, "⏱ " + Y(M.value.text), 1)) : In("", !0)])) : In("", !0)
], 512),
- W("div", iu, [
- W("div", {
+ K("div", ou, [
+ K("div", {
class: "mjr-card-filename",
title: D.value,
style: {
@@ -12719,15 +12720,15 @@ var Fl = Pl(), Il = (e, t) => {
"margin-bottom": "4px",
"padding-right": "12px"
}
- }, q(E.value), 9, au),
- W("div", ou, [(H(!0), G(In, null, vn(se.value, (e, t) => (H(), G(In, { key: e.key }, [t > 0 ? (H(), G("span", su, "/")) : Y("", !0), W("span", {
+ }, Y(E.value), 9, su),
+ K("div", cu, [(W(!0), q(Ln, null, vn(oe.value, (e, t) => (W(), q(Ln, { key: e.key }, [t > 0 ? (W(), q("span", lu, "/")) : In("", !0), K("span", {
class: Mn(e.className),
style: An(e.style || null),
title: e.title
- }, q(e.text), 15, cu)], 64))), 128))]),
- W("div", {
+ }, Y(e.text), 15, uu)], 64))), 128))]),
+ K("div", {
ref_key: "dotWrapperRef",
- ref: be,
+ ref: ve,
class: "mjr-card-dot-wrapper",
style: {
position: "absolute",
@@ -12737,16 +12738,16 @@ var Fl = Pl(), Il = (e, t) => {
}
}, null, 512)
]),
- de.value ? (H(), hn(i, {
+ ue.value ? (W(), hn(i, {
key: 0,
type: "button",
class: "mjr-stack-group-button",
severity: "secondary",
text: "",
rounded: "",
- "aria-label": `Open generation group in grid (${fe.value} assets)`,
- title: `Open generation group in grid (${fe.value} assets)`,
- onClick: he,
+ "aria-label": `Open generation group in grid (${de.value} assets)`,
+ title: `Open generation group in grid (${de.value} assets)`,
+ onClick: L,
onPointerdown: r[1] ||= Fn(() => {}, ["stop"]),
onMousedown: r[2] ||= Fn(() => {}, ["stop", "prevent"]),
onTouchstartPassive: r[3] ||= Fn(() => {}, ["stop"]),
@@ -12754,19 +12755,19 @@ var Fl = Pl(), Il = (e, t) => {
onKeydown: r[5] ||= Fn(() => {}, ["stop"]),
onDragstart: r[6] ||= Fn(() => {}, ["stop", "prevent"])
}, {
- default: U(() => [r[17] ||= W("span", { class: "pi pi-clone" }, null, -1), W("span", lu, q(fe.value), 1)]),
+ default: G(() => [r[17] ||= K("span", { class: "pi pi-clone" }, null, -1), K("span", du, Y(de.value), 1)]),
_: 1
- }, 8, ["aria-label", "title"])) : Y("", !0),
- pe.value ? (H(), hn(i, {
+ }, 8, ["aria-label", "title"])) : In("", !0),
+ fe.value ? (W(), hn(i, {
key: 1,
type: "button",
class: "mjr-dup-stack-button",
severity: "secondary",
text: "",
rounded: "",
- "aria-label": `${me.value} duplicate${me.value > 1 ? "s" : ""} - click to compare all copies`,
- title: `${me.value} duplicate${me.value > 1 ? "s" : ""} - click to compare all copies`,
- onClick: ge,
+ "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: me,
onPointerdown: r[7] ||= Fn(() => {}, ["stop"]),
onMousedown: r[8] ||= Fn(() => {}, ["stop", "prevent"]),
onTouchstartPassive: r[9] ||= Fn(() => {}, ["stop"]),
@@ -12774,25 +12775,25 @@ var Fl = Pl(), Il = (e, t) => {
onKeydown: r[11] ||= Fn(() => {}, ["stop"]),
onDragstart: r[12] ||= Fn(() => {}, ["stop", "prevent"])
}, {
- default: U(() => [r[18] ||= W("span", { class: "pi pi-copy" }, null, -1), W("span", uu, q(me.value), 1)]),
+ default: G(() => [r[18] ||= K("span", { class: "pi pi-copy" }, null, -1), K("span", fu, Y(pe.value), 1)]),
_: 1
- }, 8, ["aria-label", "title"])) : Y("", !0)
+ }, 8, ["aria-label", "title"])) : In("", !0)
], 64);
};
}
-}, fu = [
+}, mu = [
"data-mjr-asset-id",
"data-mjr-filename-key",
"data-mjr-stem",
"aria-label",
"aria-selected"
-], pu = {
+], hu = {
class: "mjr-card-info mjr-card-meta",
style: {
padding: "6px 8px",
"min-width": "0"
}
-}, mu = ["title"], hu = {
+}, gu = ["title"], _u = {
__name: "FolderCard",
props: {
asset: {
@@ -12805,7 +12806,7 @@ var Fl = Pl(), Il = (e, t) => {
}
},
setup(e) {
- return (t, n) => (H(), G("div", {
+ return (t, n) => (W(), q("div", {
class: Mn(["mjr-asset-card mjr-card mjr-folder-card", { "is-selected": e.selected }]),
role: "button",
tabindex: 0,
@@ -12817,25 +12818,25 @@ var Fl = Pl(), Il = (e, t) => {
"data-mjr-kind": "folder",
"aria-label": `Folder ${e.asset.filename}`,
"aria-selected": e.selected ? "true" : "false"
- }, [n[1] ||= W("div", {
+ }, [n[1] ||= K("div", {
class: "mjr-thumb",
style: {
display: "flex",
"align-items": "center",
"justify-content": "center"
}
- }, [W("svg", {
+ }, [K("svg", {
width: "64",
height: "64",
viewBox: "0 0 24 24",
"aria-hidden": "true"
- }, [W("path", {
+ }, [K("path", {
fill: "#F4C74A",
d: "M10 4H4c-1.1 0-2 .9-2 2v1h20V8c0-1.1-.9-2-2-2h-8l-2-2z"
- }), W("path", {
+ }), K("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), W("div", pu, [W("div", {
+ })])], -1), K("div", hu, [K("div", {
class: "mjr-card-filename",
title: e.asset.filename,
style: {
@@ -12844,15 +12845,15 @@ var Fl = Pl(), Il = (e, t) => {
"white-space": "nowrap",
"margin-bottom": "4px"
}
- }, q(e.asset.filename), 9, mu), n[0] ||= W("div", { class: "mjr-card-meta-row" }, null, -1)])], 10, fu));
+ }, Y(e.asset.filename), 9, gu), n[0] ||= K("div", { class: "mjr-card-meta-row" }, null, -1)])], 10, mu));
}
};
//#endregion
//#region ui/vue/composables/useGridState.ts
-function gu(e) {
+function vu(e) {
return Array.from(e || []).map((e) => String(e || "").trim()).filter(Boolean);
}
-function _u() {
+function yu() {
let e = Cn({
query: "*",
offset: 0,
@@ -12882,7 +12883,7 @@ function _u() {
e.virtualGrid = { setItems(t) {
e.assets = Array.isArray(t) ? t.slice() : [];
} };
- let t = X(() => new Set(gu(e.selectedIds)));
+ let t = Z(() => new Set(vu(e.selectedIds)));
function n(t = "", { error: n = !1 } = {}) {
e.statusMessage = String(t || ""), e.statusError = !!n;
}
@@ -12902,14 +12903,14 @@ function _u() {
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(gu(t))), a = String(n || i[0] || "").trim();
+ let i = Array.from(new Set(vu(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(gu(t)), i = gu(e.selectedIds).filter((e) => r.has(e)), a = String(n || e.activeId || i[0] || "").trim();
+ let r = new Set(vu(t)), i = vu(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() {
@@ -12941,14 +12942,14 @@ function _u() {
}
//#endregion
//#region ui/vue/composables/gridVisibility.ts
-function vu(e) {
+function bu(e) {
try {
return typeof e?.getClientRects == "function" ? e.getClientRects().length > 0 : !0;
} catch (e) {
return console.debug?.(e), !1;
}
}
-function yu(e, { requireClientRect: t = !0 } = {}) {
+function xu(e, { requireClientRect: t = !0 } = {}) {
if (!e || typeof e != "object") return !1;
try {
if (typeof document < "u" && document.hidden) return !1;
@@ -12973,14 +12974,14 @@ function yu(e, { requireClientRect: t = !0 } = {}) {
} catch (e) {
console.debug?.(e);
}
- return t ? vu(e) : !0;
+ return t ? bu(e) : !0;
}
-function bu(e) {
- return yu(e, { requireClientRect: !0 });
+function Su(e) {
+ return xu(e, { requireClientRect: !0 });
}
-function xu(e, t = null) {
+function Cu(e, t = null) {
let n = t || e;
- if (!bu(n) || e && e !== n && !yu(e, { requireClientRect: !1 })) return !1;
+ if (!Su(n) || e && e !== n && !xu(e, { requireClientRect: !1 })) return !1;
try {
let e = Number(n?.clientWidth || 0) || 0, t = Number(n?.clientHeight || 0) || 0;
return e > 0 && t > 0;
@@ -12990,46 +12991,47 @@ function xu(e, t = null) {
}
//#endregion
//#region ui/vue/grid/useGridQuery.ts
-function Su(e, t = "") {
+function wu(e, t = "") {
return String(e ?? t).trim() || String(t);
}
-function Cu(e, t = 0) {
+function Tu(e, t = 0) {
let n = Number(e);
return Number.isFinite(n) ? n : t;
}
-function wu(e) {
+function Eu(e) {
return e === !0 || e === 1 || String(e || "") === "1";
}
-function Tu(e = {}) {
- let t = Su(e.q ?? e.query, "*") || "*", n = Object.prototype.hasOwnProperty.call(e, "resolutionCompare") ? String(e.resolutionCompare ?? "").trim().toLowerCase() : "gte", r = n === "lte" ? "lte" : n ? "gte" : "";
+function Du(e = {}) {
+ let t = wu(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: Su(e.scope, "output").toLowerCase(),
+ scope: wu(e.scope, "output").toLowerCase(),
q: t,
query: t,
- customRootId: Su(e.customRootId),
- subfolder: Su(e.subfolder),
- collectionId: Su(e.collectionId),
- viewScope: Su(e.viewScope),
- kind: Su(e.kind).toLowerCase(),
- workflowOnly: wu(e.workflowOnly),
- minRating: Cu(e.minRating, 0),
- minSizeMB: Cu(e.minSizeMB, 0),
- maxSizeMB: Cu(e.maxSizeMB, 0),
+ customRootId: wu(e.customRootId),
+ subfolder: wu(e.subfolder),
+ collectionId: wu(e.collectionId),
+ viewScope: wu(e.viewScope),
+ kind: wu(e.kind).toLowerCase(),
+ workflowOnly: Eu(e.workflowOnly),
+ minRating: Tu(e.minRating, 0),
+ minSizeMB: Tu(e.minSizeMB, 0),
+ maxSizeMB: Tu(e.maxSizeMB, 0),
resolutionCompare: r,
- minWidth: Cu(e.minWidth, 0),
- minHeight: Cu(e.minHeight, 0),
- maxWidth: Cu(e.maxWidth, 0),
- maxHeight: Cu(e.maxHeight, 0),
- workflowType: Su(e.workflowType).toUpperCase(),
- dateRange: Su(e.dateRange).toLowerCase(),
- dateExact: Su(e.dateExact),
- sort: Su(e.sort, "mtime_desc").toLowerCase(),
- semanticMode: e.semanticMode === void 0 || e.semanticMode === null ? void 0 : wu(e.semanticMode),
- groupStacks: e.groupStacks === void 0 || e.groupStacks === null ? void 0 : wu(e.groupStacks)
+ minWidth: Tu(e.minWidth, 0),
+ minHeight: Tu(e.minHeight, 0),
+ maxWidth: Tu(e.maxWidth, 0),
+ maxHeight: Tu(e.maxHeight, 0),
+ workflowType: wu(e.workflowType).toUpperCase(),
+ workflowId: wu(e.workflowId),
+ dateRange: wu(e.dateRange).toLowerCase(),
+ dateExact: wu(e.dateExact),
+ sort: wu(e.sort, "mtime_desc").toLowerCase(),
+ semanticMode: e.semanticMode === void 0 || e.semanticMode === null ? void 0 : Eu(e.semanticMode),
+ groupStacks: e.groupStacks === void 0 || e.groupStacks === null ? void 0 : Eu(e.groupStacks)
});
}
-function Eu(e = {}, t = {}) {
- return Tu({
+function Ou(e = {}, t = {}) {
+ return Du({
scope: e.mjrScope,
q: e.mjrQuery,
customRootId: e.mjrCustomRootId,
@@ -13047,6 +13049,7 @@ function Eu(e = {}, t = {}) {
maxWidth: e.mjrFilterMaxWidth,
maxHeight: e.mjrFilterMaxHeight,
workflowType: e.mjrFilterWorkflowType,
+ workflowId: e.mjrFilterWorkflowId,
dateRange: e.mjrFilterDateRange,
dateExact: e.mjrFilterDateExact,
sort: e.mjrSort,
@@ -13055,16 +13058,16 @@ function Eu(e = {}, t = {}) {
...t
});
}
-function Du(e = null, t = "*") {
+function ku(e = null, t = "*") {
let n = e?.dataset || {};
- return Eu(n, { q: n.mjrQuery ?? t }).q;
+ return Ou(n, { q: n.mjrQuery ?? t }).q;
}
-function Ou(e = null, t = "mtime_desc") {
+function Au(e = null, t = "mtime_desc") {
let n = e?.dataset || {};
- return Eu(n, { sort: n.mjrSort ?? t }).sort;
+ return Ou(n, { sort: n.mjrSort ?? t }).sort;
}
-function ku(e = {}) {
- let t = Tu(e);
+function ju(e = {}) {
+ let t = Du(e);
return [
t.scope,
t.q,
@@ -13083,192 +13086,194 @@ function ku(e = {}) {
t.maxWidth || "",
t.maxHeight || "",
t.workflowType,
+ t.workflowId,
t.dateRange,
t.dateExact
].join("|");
}
-function Au(e = {}) {
- let t = Tu(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.dateRange || t.dateExact);
+function Mu(e = {}) {
+ let t = Du(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.dateRange || t.dateExact);
}
-function ju(e = {}) {
- let t = Tu(e);
- return t.scope === "output" && t.q === "*" && t.sort === "mtime_desc" && !Au(t);
+function Nu(e = {}) {
+ let t = Du(e);
+ return t.scope === "output" && t.q === "*" && t.sort === "mtime_desc" && !Mu(t);
}
//#endregion
//#region ui/vue/grid/useGridSnapshotCache.ts
-var Mu = /* @__PURE__ */ new Map(), Nu = !1, Pu = 8, Fu = 200, Iu = "mjr_grid_snapshot_cache_v2", Lu = 1800 * 1e3, Ru = 1500, zu = !1, Bu = null, Vu = !1;
-function Hu() {
- return Nu;
+var Pu = /* @__PURE__ */ new Map(), Fu = !1, Iu = 8, Lu = 200, Ru = "mjr_grid_snapshot_cache_v2", zu = 1800 * 1e3, Bu = 1500, Vu = !1, Hu = null, Uu = !1;
+function Wu() {
+ return Fu;
}
-function Uu() {
+function Gu() {
try {
- Mu.clear(), Yu()?.removeItem?.(Iu), globalThis?.sessionStorage?.removeItem?.(Iu);
+ Pu.clear(), Zu()?.removeItem?.(Ru), globalThis?.sessionStorage?.removeItem?.(Ru);
} catch (e) {
console.debug?.(e);
}
}
-var Wu = /* @__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.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 Gu(e, t = "") {
+var Ku = /* @__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 qu(e, t = "") {
try {
return String(e ?? t).trim();
} catch {
return String(t);
}
}
-function Ku(e = {}) {
+function Ju(e = {}) {
return JSON.stringify({
- scope: Gu(e.scope || "output", "output"),
- query: Gu(e.query || e.q || "*", "*"),
- customRootId: Gu(e.customRootId || ""),
- subfolder: Gu(e.subfolder || ""),
- collectionId: Gu(e.collectionId || ""),
- viewScope: Gu(e.viewScope || ""),
- kind: Gu(e.kind || ""),
- workflowOnly: Gu(e.workflowOnly ? "1" : ""),
- minRating: Gu(e.minRating || ""),
- minSizeMB: Gu(e.minSizeMB || ""),
- maxSizeMB: Gu(e.maxSizeMB || ""),
- resolutionCompare: Gu(e.resolutionCompare || ""),
- minWidth: Gu(e.minWidth || ""),
- minHeight: Gu(e.minHeight || ""),
- maxWidth: Gu(e.maxWidth || ""),
- maxHeight: Gu(e.maxHeight || ""),
- workflowType: Gu(e.workflowType || "").toUpperCase(),
- dateRange: Gu(e.dateRange || ""),
- dateExact: Gu(e.dateExact || ""),
- sort: Gu(e.sort || "mtime_desc", "mtime_desc"),
- semanticMode: Gu(e.semanticMode ? "1" : "")
+ scope: qu(e.scope || "output", "output"),
+ query: qu(e.query || e.q || "*", "*"),
+ customRootId: qu(e.customRootId || ""),
+ subfolder: qu(e.subfolder || ""),
+ collectionId: qu(e.collectionId || ""),
+ viewScope: qu(e.viewScope || ""),
+ kind: qu(e.kind || ""),
+ workflowOnly: qu(e.workflowOnly ? "1" : ""),
+ minRating: qu(e.minRating || ""),
+ minSizeMB: qu(e.minSizeMB || ""),
+ maxSizeMB: qu(e.maxSizeMB || ""),
+ resolutionCompare: qu(e.resolutionCompare || ""),
+ minWidth: qu(e.minWidth || ""),
+ minHeight: qu(e.minHeight || ""),
+ maxWidth: qu(e.maxWidth || ""),
+ maxHeight: qu(e.maxHeight || ""),
+ workflowType: qu(e.workflowType || "").toUpperCase(),
+ workflowId: qu(e.workflowId || ""),
+ dateRange: qu(e.dateRange || ""),
+ dateExact: qu(e.dateExact || ""),
+ sort: qu(e.sort || "mtime_desc", "mtime_desc"),
+ semanticMode: qu(e.semanticMode ? "1" : "")
});
}
-function qu(e) {
+function Yu(e) {
if (!e || typeof e != "object") return null;
let t = {};
- for (let n of Wu) e[n] !== void 0 && (t[n] = e[n]);
+ for (let n of Ku) 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 Ju(e) {
+function Xu(e) {
if (!e || typeof e != "object") return null;
let t = Number(e.at || 0) || 0;
- if (!t || Date.now() - t > Lu) return null;
- let n = Array.isArray(e.assets) ? e.assets.map(qu).filter(Boolean) : [];
+ if (!t || Date.now() - t > zu) return null;
+ let n = Array.isArray(e.assets) ? e.assets.map(Yu).filter(Boolean) : [];
if (!n.length) return null;
let r = Number(e.total ?? n.length), i = Number(e.offset ?? n.length);
return {
assets: n,
- title: Gu(e.title || "Cached", "Cached"),
+ title: qu(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: Gu(e.query || "*", "*")
+ query: qu(e.query || "*", "*")
};
}
-function Yu() {
+function Zu() {
try {
return globalThis?.localStorage || null;
} catch {
return null;
}
}
-Hu() || Uu();
-function Xu(e) {
+Wu() || Gu();
+function Qu(e) {
try {
let t = globalThis?.sessionStorage;
if (!t || !e) return;
- let n = t.getItem?.(Iu);
+ let n = t.getItem?.(Ru);
if (!n) return;
- e.getItem?.(Iu) || e.setItem(Iu, n), t.removeItem(Iu);
+ e.getItem?.(Ru) || e.setItem(Ru, n), t.removeItem(Ru);
} catch (e) {
console.debug?.(e);
}
}
-function Zu() {
+function $u() {
let e = Date.now();
- for (let [t, n] of Mu.entries()) {
+ for (let [t, n] of Pu.entries()) {
let r = Number(n?.at || 0) || 0;
- (!r || e - r > Lu) && Mu.delete(t);
+ (!r || e - r > zu) && Pu.delete(t);
}
- for (; Mu.size > Pu;) {
- let e = Mu.keys().next().value;
+ for (; Pu.size > Iu;) {
+ let e = Pu.keys().next().value;
if (!e) break;
- Mu.delete(e);
+ Pu.delete(e);
}
}
-function Qu() {
- if (!Hu()) {
- zu = !0, Uu();
+function ed() {
+ if (!Wu()) {
+ Vu = !0, Gu();
return;
}
- if (!zu) {
- zu = !0;
+ if (!Vu) {
+ Vu = !0;
try {
- let e = Yu();
- Xu(e);
- let t = e?.getItem?.(Iu);
+ let e = Zu();
+ Qu(e);
+ let t = e?.getItem?.(Ru);
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 = Ju(e[1]);
- t && n && Mu.set(t, n);
+ let t = String(e[0] || ""), n = Xu(e[1]);
+ t && n && Pu.set(t, n);
}
- Zu();
+ $u();
} catch (e) {
console.debug?.(e);
}
}
}
-function $u() {
- if (!Hu()) {
- Uu();
+function td() {
+ if (!Wu()) {
+ Gu();
return;
}
try {
- Zu();
- let e = Yu();
+ $u();
+ let e = Zu();
if (!e) return;
- let t = Array.from(Mu.entries()).map(([e, t]) => [e, {
+ let t = Array.from(Pu.entries()).map(([e, t]) => [e, {
...t,
- assets: Array.isArray(t?.assets) ? t.assets.slice(0, Fu) : []
+ assets: Array.isArray(t?.assets) ? t.assets.slice(0, Lu) : []
}]);
- e.setItem(Iu, JSON.stringify({ entries: t }));
+ e.setItem(Ru, JSON.stringify({ entries: t }));
} catch (e) {
console.debug?.(e);
}
}
-function ed() {
- if (!Hu()) {
- Uu(), Vu = !1;
+function nd() {
+ if (!Wu()) {
+ Gu(), Uu = !1;
return;
}
- Vu = !0, !Bu && (Bu = setTimeout(() => {
- Bu = null, Vu && (Vu = !1, $u());
- }, Ru));
+ Uu = !0, !Hu && (Hu = setTimeout(() => {
+ Hu = null, Uu && (Uu = !1, td());
+ }, Bu));
}
-function td() {
- Bu &&= (clearTimeout(Bu), null), Vu && (Vu = !1, $u());
+function rd() {
+ Hu &&= (clearTimeout(Hu), null), Uu && (Uu = !1, td());
}
-function nd(e) {
- if (!Hu()) return null;
- Qu();
- let t = Ju(Mu.get(e));
- return t ? (Mu.delete(e), Mu.set(e, t), ed(), t) : (Mu.delete(e), ed(), null);
+function id(e) {
+ if (!Wu()) return null;
+ ed();
+ let t = Xu(Pu.get(e));
+ return t ? (Pu.delete(e), Pu.set(e, t), nd(), t) : (Pu.delete(e), nd(), null);
}
-function rd(e) {
- return Hu() ? (Qu(), !!Ju(Mu.get(e))) : !1;
+function ad(e) {
+ return Wu() ? (ed(), !!Xu(Pu.get(e))) : !1;
}
-function id(e, t) {
- if (!Hu() || !e || !t || typeof t != "object") return !1;
- let n = Ju({
+function od(e, t) {
+ if (!Wu() || !e || !t || typeof t != "object") return !1;
+ let n = Xu({
...t,
at: t.at || Date.now()
});
- return n ? (Mu.delete(e), Mu.set(e, n), ed(), !0) : !1;
+ return n ? (Pu.delete(e), Pu.set(e, n), nd(), !0) : !1;
}
//#endregion
//#region ui/vue/grid/useAssetCollection.ts
-function ad(e) {
+function sd(e) {
return !e || typeof e != "object" ? "" : [
e.source || e.type || "output",
e.root_id || e.custom_root_id || "",
@@ -13276,7 +13281,7 @@ function ad(e) {
e.filename || e.filepath || e.path || e.fullpath || e.full_path || ""
].join("|").trim().toLowerCase();
}
-function od(e = [], { assetKey: t = ad } = {}) {
+function cd(e = [], { assetKey: t = sd } = {}) {
let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
for (let i of Array.isArray(e) ? e : []) {
if (!i || typeof i != "object") continue;
@@ -13288,12 +13293,12 @@ function od(e = [], { assetKey: t = ad } = {}) {
byKey: r
};
}
-function sd(e, { assetKey: t = ad } = {}) {
+function ld(e, { assetKey: t = sd } = {}) {
if (!e || typeof e != "object") return e;
- let n = od(Array.isArray(e.assets) ? e.assets : [], { assetKey: t });
+ let n = cd(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 cd(e, t = [], { assetKey: n = ad } = {}) {
+function ud(e, t = [], { assetKey: n = sd } = {}) {
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;
@@ -13301,11 +13306,11 @@ function cd(e, t = [], { assetKey: n = ad } = {}) {
return e.assets = (Array.isArray(e.assets) ? e.assets : []).filter((e) => {
let t = e?.id == null ? "" : String(e.id);
return !t || !r.has(t) ? !0 : (i += 1, !1);
- }), i > 0 && sd(e, { assetKey: n }), i;
+ }), i > 0 && ld(e, { assetKey: n }), i;
}
//#endregion
//#region ui/vue/grid/usePagedAssets.ts
-function ld({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, total: i = null } = {}) {
+function dd({ 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);
@@ -13314,7 +13319,7 @@ function ld({ 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 ud({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = null, beforeApplyPage: i = null, onEmptyPage: a = null, maxEmptyPages: o = 6 } = {}) {
+async function fd({ 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")
@@ -13370,7 +13375,7 @@ async function ud({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = nu
lastResult: l
};
}
-function dd({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) {
+function pd({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) {
let a = Dn({
offset: 0,
cursor: null,
@@ -13379,7 +13384,7 @@ function dd({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi
error: null,
done: !1,
requestId: 0
- }), o = X(() => t?.items?.value || []), s = X(() => !a.loading && !a.done);
+ }), o = Z(() => t?.items?.value || []), s = Z(() => !a.loading && !a.done);
function c() {
return e && typeof e == "object" && "value" in e ? e.value : e;
}
@@ -13401,7 +13406,7 @@ function dd({ 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 = ld({
+ let r = Array.isArray(e?.assets) ? e.assets : [], i = e?.total == null ? null : Number(e.total) || 0, o = dd({
assets: r,
count: e?.count,
limit: Number(e?.limit || n) || n,
@@ -13466,7 +13471,7 @@ function dd({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi
let u = a.requestId;
a.loading = !0, a.error = null;
try {
- let n = await ud({
+ let n = await fd({
maxEmptyPages: o,
canContinue: t,
getLimit: e,
@@ -13527,12 +13532,12 @@ function dd({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi
}
//#endregion
//#region ui/vue/composables/useVirtualGrid.ts
-function fd(e, t) {
+function md(e, t) {
if (!t || typeof t != "object") return !1;
- let n = Eu(e?.dataset || {}), r = n.scope, i = n.subfolder.toLowerCase(), a = n.kind, o = n.workflowOnly, s = n.minRating, c = n.workflowType.toLowerCase(), l = n.dateExact, u = String(t?.subfolder || "").trim().toLowerCase(), d = String(t?.type || t?.source || "output").trim().toLowerCase(), f = String(t?.kind || "").trim().toLowerCase(), p = String(t?.workflow_type || t?.workflowType || "").trim().toLowerCase(), m = String(t?.date_exact || t?.date || "").trim(), h = t?.has_workflow ?? t?.hasWorkflow ?? null;
- return !(r && r !== "all" && d && d !== r || i && u !== i || a && f && f !== a || o && h !== null && !h || s > 0 && (Number(t?.rating || 0) || 0) < s || c && p !== c || l && m && m !== l);
+ let n = Ou(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 pd(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s = null } = {}) {
+async function hd(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") {
@@ -13540,13 +13545,13 @@ async function pd(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 = Eu(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, dateRange: w, dateExact: T } = l, E = l.sort || "mtime_desc", D = c(t).trim() || "*", O = /^\[object\s+HTML.*Element\]$/i.test(D) ? "*" : D, k = i.sanitizeQuery(O) || O;
+ }, l = Ou(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, dateRange: T, dateExact: E } = l, D = l.sort || "mtime_desc", O = c(t).trim() || "*", k = /^\[object\s+HTML.*Element\]$/i.test(O) ? "*" : O, A = i.sanitizeQuery(k) || k;
try {
- let t = String(u || "").toLowerCase() === "output", c = Au({
+ let t = String(u || "").toLowerCase() === "output", c = Mu({
...l,
- q: k
- }), D = t && Number(r ?? 0) === 0 && k === "*" && !c && String(E || "mtime_desc").toLowerCase() === "mtime_desc", O = !(t && (Number(r ?? 0) > 0 || D)), A = !!l.groupStacks, j = Number(r ?? 0) > 0 ? null : s || null, M = i.buildListURL({
- q: k,
+ q: A
+ }), O = t && Number(r ?? 0) === 0 && A === "*" && !c && String(D || "mtime_desc").toLowerCase() === "mtime_desc", k = !(t && (Number(r ?? 0) > 0 || O)), j = !!l.groupStacks, M = Number(r ?? 0) > 0 ? null : s || null, N = i.buildListURL({
+ q: A,
limit: n,
offset: r,
scope: u,
@@ -13563,13 +13568,14 @@ async function pd(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s
maxWidth: x > 0 ? x : null,
maxHeight: S > 0 ? S : null,
workflowType: C || null,
- dateRange: w || null,
- dateExact: T || null,
- sort: E,
- cursor: j,
- includeTotal: O,
- groupStacks: A
- }), N = await i.get(M, {
+ workflowId: w || null,
+ dateRange: T || null,
+ dateExact: E || null,
+ sort: D,
+ cursor: M,
+ includeTotal: k,
+ groupStacks: j
+ }), P = await i.get(N, {
timeoutMs: 12e4,
...o ? { signal: o } : {}
});
@@ -13583,23 +13589,23 @@ async function pd(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s
} catch (e) {
console.debug?.(e);
}
- if (N.ok) {
- let e = N.data?.assets || [], t = Array.isArray(e) ? e.length : 0, n = N.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(N.data?.limit) || 0),
- offset: Math.max(0, Number(N.data?.offset) || 0),
- nextCursor: N.data?.next_cursor || N.data?.nextCursor || null,
- hasMore: typeof N.data?.has_more == "boolean" ? N.data.has_more : null,
- sortKey: E,
- safeQuery: k
+ 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: D,
+ safeQuery: A
};
}
try {
- if (String(N?.code || "") === "ABORTED") return {
+ if (String(P?.code || "") === "ABORTED") return {
ok: !1,
aborted: !0,
error: "Aborted"
@@ -13609,7 +13615,7 @@ async function pd(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s
}
return {
ok: !1,
- error: N.error
+ error: P.error
};
} catch (e) {
try {
@@ -13627,7 +13633,7 @@ async function pd(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s
};
}
}
-function md(e, t) {
+function gd(e, t) {
switch (t) {
case "mtime_desc": return -(Number(e?.mtime) || 0);
case "mtime_asc": return Number(e?.mtime) || 0;
@@ -13636,23 +13642,23 @@ function md(e, t) {
default: return -(Number(e?.mtime) || 0);
}
}
-function hd(e, t, n) {
+function _d(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 = md(e, n), i = md(t, n);
+ let r = gd(e, n), i = gd(t, n);
return r < i ? -1 : +(r > i);
}
-function gd(e, t, n) {
+function vd(e, t, n) {
return n === "name_asc" ? String(e) < String(t) : n === "name_desc" ? String(e) > String(t) : Number(e) < Number(t);
}
-function _d(e, t, n) {
- let r = md(t, n);
- for (let t = 0; t < e.length; t++) if (gd(r, md(e[t], n), n)) return t;
+function yd(e, t, n) {
+ let r = gd(t, n);
+ for (let t = 0; t < e.length; t++) if (vd(r, gd(e[t], n), n)) return t;
return e.length;
}
-function vd(e, t) {
+function bd(e, t) {
let n = t.get(e);
return n || (n = {
pending: /* @__PURE__ */ new Map(),
@@ -13660,13 +13666,13 @@ function vd(e, t) {
flushing: !1
}, t.set(e, n)), n;
}
-function yd(e) {
+function xd(e) {
return String(e ?? "").trim().toLowerCase();
}
-function bd(e) {
+function Sd(e) {
return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:");
}
-function xd(e) {
+function Cd(e) {
if (!e || typeof e != "object") return e;
try {
delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder;
@@ -13675,24 +13681,24 @@ function xd(e) {
}
return e;
}
-function Sd(e) {
+function wd(e) {
if (!e || typeof e != "object") return "";
- let t = yd(e?.type || e?.source || "output"), n = yd(e?.root_id || e?.custom_root_id || ""), r = yd(e?.subfolder || ""), i = yd(e?.filename || "");
+ let t = xd(e?.type || e?.source || "output"), n = xd(e?.root_id || e?.custom_root_id || ""), r = xd(e?.subfolder || ""), i = xd(e?.filename || "");
if (i) return `${t}|${n}|${r}|${i}`;
- let a = yd(e?.filepath || e?.path || e?.fullpath || e?.full_path || "");
+ let a = xd(e?.filepath || e?.path || e?.fullpath || e?.full_path || "");
return a ? `${t}|${n}|path|${a}` : "";
}
-function Cd(e, t, n) {
+function Td(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 = Sd(n);
- return i ? r.findIndex((e) => Sd(e) === i) : -1;
+ let i = wd(n);
+ return i ? r.findIndex((e) => wd(e) === i) : -1;
}
-function wd(e, t) {
- return !t || typeof t != "object" || !e || typeof e != "object" ? !1 : bd(t) ? !0 : ![
+function Ed(e, t) {
+ return !t || typeof t != "object" || !e || typeof e != "object" ? !1 : Sd(t) ? !0 : ![
"filename",
"filepath",
"path",
@@ -13711,10 +13717,10 @@ function wd(e, t) {
"date"
].some((t) => Object.prototype.hasOwnProperty.call(e, t));
}
-function Td(e, t) {
+function Dd(e, t) {
let n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Map(), a = [];
for (let o of Array.isArray(e?.assets) ? e.assets : []) {
- let e = o?.id == null ? "" : String(o.id), s = t.assetKey(o), c = yt(o?.filename);
+ let e = o?.id == null ? "" : String(o.id), s = t.assetKey(o), c = St(o?.filename);
if (!(e && n.has(e)) && !(s && r.has(s))) {
if (c) {
let e = i.get(c);
@@ -13727,9 +13733,9 @@ function Td(e, t) {
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);
}
}
- e.assets = a, sd(e, { assetKey: t.assetKey });
+ e.assets = a, ld(e, { assetKey: t.assetKey });
}
-function Ed(e, t) {
+function Od(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);
@@ -13739,14 +13745,14 @@ function Ed(e, t) {
try {
let n = !1;
for (let [a, o] of r.entries()) {
- let r = bd(o);
+ let r = Sd(o);
i.assetKeyFn = t.assetKey;
- let s = mt(o, i, t.loadMajoorSettings);
+ let s = vt(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 || _t(i, t, i), n;
+ return n || Ct(i, t, i), n;
});
try {
i.hiddenPngSiblings = (Number(i.hiddenPngSiblings || 0) || 0) + s.removed.length;
@@ -13766,33 +13772,33 @@ function Ed(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 : Cd(i, a, u), f = d > -1 ? i.assets[d] : null, p = f ? {
+ } : o, d = c > -1 ? c : Td(i, a, u), f = d > -1 ? i.assets[d] : null, p = f ? {
...f,
...o
} : u, m = t.assetKey(u);
- if (!fd(e, p)) {
+ if (!md(e, p)) {
if (d > -1) {
- if (wd(o, f)) {
- Object.assign(f, o), r || xd(f), i.assets[d] = { ...f }, n = !0;
+ if (Ed(o, f)) {
+ Object.assign(f, o), r || Cd(f), i.assets[d] = { ...f }, n = !0;
continue;
}
let [e] = i.assets.splice(d, 1);
- _t(i, e, i), n = !0;
+ Ct(i, e, i), n = !0;
}
continue;
}
if (d > -1) {
let e = t.assetKey(f);
- Object.assign(f, o), r || xd(f);
+ Object.assign(f, o), r || Cd(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 = Eu(e?.dataset || {}).sort || "mtime_desc", s = r ? u : xd({ ...u }), c = _d(i.assets, s, t);
+ let t = Ou(e?.dataset || {}).sort || "mtime_desc", s = r ? u : Cd({ ...u }), c = yd(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) {
- Td(i, t);
+ Dd(i, t);
try {
e.dataset.mjrHiddenPngSiblings = String(Number(i.hiddenPngSiblings || 0) || 0);
} catch (e) {
@@ -13804,23 +13810,23 @@ function Ed(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, Ed(e, t);
+ n.timer = null, Od(e, t);
}, r);
}
}
}
-function Dd(e, t, n) {
+function kd(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 = vd(e, n.upsertState);
- return a.pending.set(i, t), a.pending.size >= n.maxBatchSize ? Ed(e, n) : !a.timer && !a.flushing && (a.timer = setTimeout(() => {
- a.timer = null, Ed(e, n);
+ let a = bd(e, n.upsertState);
+ return a.pending.set(i, t), a.pending.size >= n.maxBatchSize ? Od(e, n) : !a.timer && !a.flushing && (a.timer = setTimeout(() => {
+ a.timer = null, Od(e, n);
}, n.debounceMs)), !0;
}
//#endregion
//#region ui/vue/components/grid/gridDomBridge.ts
-function Od(e) {
+function Ad(e) {
let t = String(e ?? "");
try {
if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t);
@@ -13829,7 +13835,7 @@ function Od(e) {
}
return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1");
}
-function kd(e) {
+function jd(e) {
if (!e) return [];
try {
return Array.from(e.querySelectorAll?.(".mjr-asset-card") || []);
@@ -13837,7 +13843,7 @@ function kd(e) {
return console.debug?.(e), [];
}
}
-function Ad(e) {
+function Md(e) {
if (!e) return null;
try {
return e.querySelector?.(".mjr-asset-card.is-selected") || null;
@@ -13845,34 +13851,34 @@ function Ad(e) {
return console.debug?.(e), null;
}
}
-function jd(e, t) {
+function Nd(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="${Od(n)}"]`) || null;
+ return e.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Ad(n)}"]`) || null;
} catch (e) {
return console.debug?.(e), null;
}
}
-function Md(e, t = 0) {
+function Pd(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);
}
//#endregion
//#region ui/vue/composables/useGridLoader.ts
-var Nd = 200, Pd = 50, Fd = /* @__PURE__ */ new WeakMap(), Id = new Set([
+var Fd = 200, Id = 50, Ld = /* @__PURE__ */ new WeakMap(), Rd = new Set([
"collection",
"filter",
"initial",
"scope",
"search",
"sort"
-]), Ld = 0;
-function Rd(e) {
+]), zd = 0;
+function Bd(e) {
return new Promise((t) => setTimeout(t, Math.max(0, Number(e) || 0)));
}
-function zd(e) {
+function Vd(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(Oe(e) || "").trim().toLowerCase(), r = String(e?.subfolder || "").trim().toLowerCase(), i = String(e?.filename || "").trim().toLowerCase();
@@ -13880,12 +13886,12 @@ function zd(e) {
let a = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim().toLowerCase();
return a ? `${t}|${n}|path|${a}` : "";
}
-function Bd(e) {
+function Hd(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 Vd(e) {
+function Ud(e) {
if (typeof e == "string") return e;
if (e && typeof e == "object") {
if (typeof e.value == "string") return e.value;
@@ -13901,13 +13907,13 @@ function Vd(e) {
}
return String(e || "");
}
-function Hd(e) {
+function Wd(e) {
return e ? typeof e == "object" && "value" in e ? e.value || null : e : null;
}
-async function Ud() {
+async function Gd() {
await Nn();
}
-function Wd(e, t) {
+function Kd(e, t) {
let n = String(e || "Failed to load");
try {
let e = String(t?.message || t || "").trim(), r = e.toLowerCase();
@@ -13916,16 +13922,16 @@ function Wd(e, t) {
return n;
}
}
-function Gd(e, t) {
- let n = Math.max(1, Math.min(I.MAX_PAGE_SIZE, Number(e) || 1)), r = Math.max(0, Number(t) || 0);
+function qd(e, t) {
+ let n = Math.max(1, Math.min(z.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(I.MAX_PAGE_SIZE, n * i));
+ return Math.max(1, Math.min(z.MAX_PAGE_SIZE, n * i));
}
-function Kd(e) {
+function Jd(e) {
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 = 0;
}
-function qd({ 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 Yd({ 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,
@@ -13952,7 +13958,7 @@ function qd({ 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 Hd(e);
+ return Wd(e);
}
function b() {
return C();
@@ -13988,7 +13994,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
...e,
counts: {
loaded: e.assets.length,
- visible: Md(y(), e.assets.length),
+ visible: Pd(y(), e.assets.length),
total: e.pagination.total
},
metrics: { ...g }
@@ -13996,8 +14002,8 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
}
function C() {
let e = y();
- return Eu(e?.dataset || {}, {
- q: Du(e, t.query || "*"),
+ return Ou(e?.dataset || {}, {
+ q: ku(e, t.query || "*"),
resolutionCompare: e?.dataset?.mjrFilterResolutionCompare || ""
});
}
@@ -14021,6 +14027,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
"maxWidth",
"maxHeight",
"workflowType",
+ "workflowId",
"dateRange",
"dateExact",
"semanticMode"
@@ -14034,7 +14041,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
};
}
function D(e) {
- return Id.has(String(e || "").toLowerCase());
+ return Rd.has(String(e || "").toLowerCase());
}
function O(e = null) {
try {
@@ -14052,10 +14059,10 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
} catch (e) {
console.debug?.(e);
}
- return xu(y(), l());
+ return Cu(y(), l());
}
function j() {
- if (!I.DEFER_GRID_FETCH_DURING_EXECUTION) return !1;
+ if (!z.DEFER_GRID_FETCH_DURING_EXECUTION) return !1;
try {
if (!Array.isArray(t.assets) || t.assets.length === 0) return !1;
} catch (e) {
@@ -14074,7 +14081,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
console.debug?.(e);
}
try {
- m?.listener && window.removeEventListener(B.RUNTIME_STATUS, m.listener);
+ m?.listener && window.removeEventListener(H.RUNTIME_STATUS, m.listener);
} catch (e) {
console.debug?.(e);
}
@@ -14088,21 +14095,21 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
}
h = null;
}
- function F(e, n = I.PREFETCH_NEXT_PAGE_DELAY_MS) {
- if (!I.PREFETCH_NEXT_PAGE) return;
+ function P(e, n = z.PREFETCH_NEXT_PAGE_DELAY_MS) {
+ if (!z.PREFETCH_NEXT_PAGE) return;
N();
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 ee(e, t = {}) {
+ function F(e, t = {}) {
M();
let n = (() => {
try {
- return Ku(C());
+ return Ju(C());
} catch (e) {
return console.debug?.(e), null;
}
@@ -14123,17 +14130,17 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
if (n) {
let e = null;
try {
- e = Ku(C());
+ e = Ju(C());
} catch (e) {
console.debug?.(e);
}
if (e && e !== n) {
- it("[Grid] Deferred execution reload skipped - scope/filter changed during execution");
+ ot("[Grid] Deferred execution reload skipped - scope/filter changed during execution");
return;
}
}
- let a = Du(i, e);
- Promise.resolve().then(() => ve(a, {
+ let a = ku(i, e);
+ Promise.resolve().then(() => _e(a, {
...t || {},
reset: !0,
preserveVisibleUntilReady: !0
@@ -14146,32 +14153,32 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
timer: setTimeout(r, 1250)
};
try {
- window.addEventListener(B.RUNTIME_STATUS, i);
+ window.addEventListener(H.RUNTIME_STATUS, i);
} catch (e) {
console.debug?.(e);
}
}
- function te(e, t = null) {
+ function I(e, t = null) {
if (!e || typeof e != "object") return "";
let n = e.id == null ? `${e.type || ""}|${Oe(e)}|${e.filepath || ""}|${e.subfolder || ""}|${e.filename || ""}` : `id:${e.id}`;
try {
- return _c(t || y() || globalThis?.__MJR_LAST_ASSETKEY_GRID__, e, n);
+ return yc(t || y() || globalThis?.__MJR_LAST_ASSETKEY_GRID__, e, n);
} catch (e) {
return console.debug?.(e), n;
}
}
- function ne(e = "") {
+ function ee(e = "") {
try {
let n = y(), r = Array.isArray(t.assets) ? t.assets : [];
if (!n || !r.length) return;
- let i = r.map(qu).filter(Boolean);
+ let i = r.map(Yu).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 = Eu(n.dataset || {}, {
- q: Du(n, t.query || "*"),
+ let a = i.length < r.length, o = Number(t.offset || i.length) || i.length, s = Number(t.total ?? i.length), c = Ou(n.dataset || {}, {
+ q: ku(n, t.query || "*"),
resolutionCompare: n.dataset?.mjrFilterResolutionCompare || ""
- }), l = Ku(c);
+ }), l = Ju(c);
if (!l) return;
- id(l, {
+ od(l, {
assets: i,
title: String(e || "").trim(),
query: String(t.query || c.query || "*").trim() || "*",
@@ -14183,56 +14190,56 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
console.debug?.(e);
}
}
- function re() {
+ function te() {
let e = y();
if (e) try {
- let t = Fd.get(e);
+ let t = Ld.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 = vt(e, n, t, {
- loadMajoorSettings: Et,
+ function re(e, n) {
+ let r = _(), i = Array.isArray(n) ? n.length : 0, o = bt(e, n, t, {
+ loadMajoorSettings: pt,
clearGridMessage: () => {
a();
},
ensureVirtualGrid: () => t.virtualGrid,
- setFileBadgeCollision: Mt,
- assetKey: (t) => te(t, e),
- ensureDupStackCard: (e, t, n) => yc(e, t, n)
+ setFileBadgeCollision: yt,
+ assetKey: (t) => I(t, e),
+ ensureDupStackCard: (e, t, n) => xc(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 ku(Eu(e?.dataset || {}, { q: n }));
+ return ju(Ou(e?.dataset || {}, { q: n }));
}
- function oe(e) {
- let t = C(), n = Bd(Vd(e).trim() || "*") || "*";
- return ju({
+ function ae(e) {
+ let t = C(), n = Hd(Ud(e).trim() || "*") || "*";
+ return Nu({
...t,
q: n
});
}
- function se(e, { query: t = "*", limit: n = 0, offset: r = 0 } = {}) {
- if (!e?.ok || e.total == null || !oe(t)) return e;
+ function oe(e, { query: t = "*", limit: n = 0, offset: r = 0 } = {}) {
+ 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,
total: null
} : e;
}
- async function ce(e, n, r, { requestId: i = 0, signal: a = null } = {}) {
+ async function se(e, n, r, { requestId: i = 0, signal: a = null } = {}) {
let o = y();
if (!o) return {
ok: !1,
error: "Grid unavailable"
};
if (r === 0) {
- let s = ae(o, e), c = Xn();
+ let s = ie(o, e), c = Xn();
if (c && c === s) {
let o = Yn(s);
if (o) try {
@@ -14249,9 +14256,9 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
};
let c = s?.data?.assets;
if (s?.ok && Array.isArray(c)) {
- it("[Grid] Using early-fetched data:", c.length, "assets");
+ ot("[Grid] Using early-fetched data:", c.length, "assets");
let t = s.data?.total ?? s.meta?.total ?? null;
- return se({
+ return oe({
ok: !0,
assets: c,
total: t == null ? null : Number(t) || 0,
@@ -14266,14 +14273,14 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
});
}
} catch (e) {
- it("[Grid] Early fetch failed, falling back to normal fetch", e);
+ ot("[Grid] Early fetch failed, falling back to normal fetch", e);
}
}
}
- return se(await pd(o, e, n, r, {
- sanitizeQuery: Bd,
- buildListURL: Ae,
- get: P,
+ return oe(await hd(o, e, n, r, {
+ sanitizeQuery: Hd,
+ buildListURL: de,
+ get: ne,
getGridState: () => t
}, {
requestId: i,
@@ -14285,7 +14292,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
offset: r
});
}
- let le = dd({
+ let ce = pd({
query: {
get value() {
return t.query || "*";
@@ -14297,23 +14304,23 @@ function qd({ 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(re(t, e) || 0) || 0;
},
reset() {}
},
fetchPage: async ({ query: e, limit: n, offset: r, requestId: i }) => {
let a = _();
g.pagesRequested += 1;
- let o = await ce(e, n, r, {
+ let o = await se(e, n, r, {
requestId: i,
signal: t.abortController?.signal || null
});
return g.apiTimeMs += Math.max(0, _() - a), o;
},
- pageSize: I.DEFAULT_PAGE_SIZE
+ pageSize: z.DEFAULT_PAGE_SIZE
});
- function ue() {
- le.setPageState({
+ function le() {
+ ce.setPageState({
offset: t.offset,
cursor: t.cursor,
total: t.total,
@@ -14323,22 +14330,22 @@ function qd({ 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 fe() {
- de(le.getPageState(), { syncPaged: !1 });
+ ue(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(), ne(e || t.query)) : n && (!t.statusMessage || !t.statusError) && i("No assets found");
+ function L({ title: e = "", showEmptyMessage: n = !0 } = {}) {
+ r(), Array.isArray(t.assets) && t.assets.length ? (a(), ee(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,
@@ -14356,7 +14363,7 @@ function qd({ 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 && I.PREFETCH_NEXT_PAGE && F(t.requestId, 400), {
+ if (v("appendNextPage", { appendReason: "pagination" }), !A()) return !t.assets.length && !t.loading && z.PREFETCH_NEXT_PAGE && P(t.requestId, 400), {
ok: !0,
skipped: !0,
hidden: !0
@@ -14366,7 +14373,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
skipped: !0,
busy: !0
};
- let h = Math.max(1, Math.min(I.MAX_PAGE_SIZE, I.DEFAULT_PAGE_SIZE)), _ = Date.now();
+ let h = Math.max(1, Math.min(z.MAX_PAGE_SIZE, z.DEFAULT_PAGE_SIZE)), _ = Date.now();
t.loading = !0, a();
try {
if (!t.done) {
@@ -14375,11 +14382,11 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
skipped: !0,
hidden: !0
};
- p || pe(), ue();
- let n = t.requestId, r = await le.loadUntilVisible({
+ p || pe(), le();
+ let n = t.requestId, r = await ce.loadUntilVisible({
maxEmptyPages: 6,
canContinue: () => A(),
- getLimit: (e) => Gd(h, e),
+ getLimit: (e) => qd(h, e),
beforeApplyPage: (e) => {
if (t.requestId !== n) return {
ok: !1,
@@ -14392,12 +14399,12 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
query: t.query || "*",
total: null,
done: !1
- }), de({
+ }), ue({
offset: 0,
cursor: null,
total: null,
done: !1
- }), Kd(t), g.resetCount += 1, p = !1, null) : Array.isArray(t.assets) && t.assets.length ? (it("[Grid LoadPage] empty response with cached visible assets - preserving cached view", {
+ }), Jd(t), g.resetCount += 1, p = !1, null) : Array.isArray(t.assets) && t.assets.length ? (ot("[Grid LoadPage] empty response with cached visible assets - preserving cached view", {
offset: t.offset,
query: t.query
}), {
@@ -14408,18 +14415,18 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
}) : null;
},
onEmptyPage: (e) => {
- e.emptyPageIndex <= 0 || it(`[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 || ot(`[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 ? r : (de({ done: !0 }), i(Wd("Failed to load assets", r?.error || "Unknown error"), { error: !0 }), r);
+ if (fe(), pe(), !r.ok) return r.aborted || r.stale ? r : (ue({ done: !0 }), i(Kd("Failed to load assets", r?.error || "Unknown error"), { error: !0 }), r);
if (r.preservedCached) return r;
- if (t.done || r.added > 0) return ne(t.query || Du(e, "*")), {
+ if (t.done || r.added > 0) return ee(t.query || ku(e, "*")), {
ok: !0,
count: r.count,
total: t.total
};
let a = r.lastResult || r.firstResult || r;
- return it(`[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 && I.PREFETCH_NEXT_PAGE && F(Number(t.requestId ?? 0) || 0, Math.min(I.PREFETCH_NEXT_PAGE_DELAY_MS ?? 700, 250)), {
+ return ot(`[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 && z.PREFETCH_NEXT_PAGE && P(Number(t.requestId ?? 0) || 0, Math.min(z.PREFETCH_NEXT_PAGE_DELAY_MS ?? 700, 250)), {
ok: !0,
count: r.count,
total: t.total,
@@ -14441,7 +14448,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
} catch (e) {
console.debug?.(e);
}
- return i(Wd("Failed to load assets", e), { error: !0 }), {
+ return i(Kd("Failed to load assets", e), { error: !0 }), {
ok: !1,
error: e?.message || String(e)
};
@@ -14463,44 +14470,44 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
}
try {
let e = Date.now() - _;
- e < Ld && await Rd(Ld - e);
+ e < zd && await Bd(zd - 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 = Ku(C());
+ r = Ju(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) || j() || !y()) return;
if (r) {
let e = null;
try {
- e = Ku(C());
+ e = Ju(C());
} catch (e) {
console.debug?.(e);
}
if (e && e !== r) {
- it("[Grid] Snapshot head refresh skipped - context changed");
+ ot("[Grid] Snapshot head refresh skipped - context changed");
return;
}
}
- let e = Math.max(1, Math.min(I.MAX_PAGE_SIZE, I.DEFAULT_PAGE_SIZE));
+ let e = Math.max(1, Math.min(z.MAX_PAGE_SIZE, z.DEFAULT_PAGE_SIZE));
try {
- let i = await ce(t.query || "*", e, 0, {
+ let i = await se(t.query || "*", e, 0, {
requestId: n,
signal: t.abortController?.signal || null
});
@@ -14508,27 +14515,27 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
if (r) {
let e = null;
try {
- e = Ku(C());
+ e = Ju(C());
} catch (e) {
console.debug?.(e);
}
if (e && e !== r) {
- it("[Grid] Snapshot head refresh discarded - context changed mid-fetch");
+ ot("[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 && De(e) && (o += 1);
- o > 0 && (ne(t.query || "*"), it("[Grid] Snapshot head refresh: inserted", o, "new asset(s)"));
+ for (let e of a) e && e.id != null && Ee(e) && (o += 1);
+ o > 0 && (ee(t.query || "*"), ot("[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,
@@ -14543,7 +14550,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
} catch (e) {
console.debug?.(e);
}
- let d = Vd(e).trim() || "*", f = /^\[object\s+HTML.*Element\]$/i.test(d) ? "*" : d, m = Bd(f) || f;
+ let d = Ud(e).trim() || "*", f = /^\[object\s+HTML.*Element\]$/i.test(d) ? "*" : d, m = Hd(f) || f;
t.query = m;
let h = c ? E(m, i) : {
reason: "append",
@@ -14553,14 +14560,14 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
let e = !1;
try {
let n = C();
- if (n.query = m, rd(Ku(n)) && (e = await Te(n, { allowReplaceExisting: !0 }), t.requestId > s + +!!e)) return console.debug?.("[Grid] loadAssets aborted during deferral due to scope switch"), {
+ if (n.query = m, ad(Ju(n)) && (e = await we(n, { allowReplaceExisting: !0 }), t.requestId > s + +!!e)) return console.debug?.("[Grid] loadAssets aborted during deferral due to scope switch"), {
ok: !1,
aborted: !0
};
} catch (e) {
console.debug?.(e);
}
- return e ? (r(), t.loading = !1) : n("Grid refresh deferred while ComfyUI is generating..."), ee(m, i || {}), {
+ return e ? (r(), t.loading = !1) : n("Grid refresh deferred while ComfyUI is generating..."), F(m, i || {}), {
ok: !0,
deferred: !0,
cached: e,
@@ -14587,24 +14594,24 @@ function qd({ 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, N(), te(), a(), p ? (t.query = m, ue({
offset: 0,
cursor: null,
total: null,
done: !1
- }), Kd(t)) : (o({
+ }), Jd(t)) : (o({
query: m,
total: null,
done: !1
- }), de({
+ }), ue({
offset: 0,
cursor: null,
total: null,
done: !1
- }), Kd(t), g.resetCount += 1), n(m === "*" ? "Loading assets..." : `Searching for "${m}"...`);
+ }), Jd(t), g.resetCount += 1), n(m === "*" ? "Loading assets..." : `Searching for "${m}"...`);
}
- let _ = await he();
- return pe(), I.PREFETCH_NEXT_PAGE && _?.ok && !_?.skipped && !t.done && !_?.aborted && F(t.requestId), c && (me({
+ let _ = await me();
+ return pe(), z.PREFETCH_NEXT_PAGE && _?.ok && !_?.skipped && !t.done && !_?.aborted && P(t.requestId), c && (L({
title: m,
showEmptyMessage: !(_?.skipped || _?.hidden || _?.aborted || _?.stale || _?.preservedCached || _?.busy)
}), O(h.nextContext)), {
@@ -14615,7 +14622,7 @@ function qd({ 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();
@@ -14639,7 +14646,7 @@ function qd({ 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, te(), a(), h ? (t.query = String(c || "Collection"), ue({
offset: 0,
cursor: null,
total: p.length,
@@ -14648,48 +14655,48 @@ function qd({ 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
- }), Kd(t), g.resetCount += 1), u ? (n(p.length ? `Loading ${c}...` : `${c} is empty`), t.loading = !0) : (r(), t.loading = !1);
+ }), Jd(t), g.resetCount += 1), u ? (n(p.length ? `Loading ${c}...` : `${c} is empty`), t.loading = !0) : (r(), t.loading = !1);
}
try {
- let e = Ou(f, "mtime_desc"), n = p.sort((t, n) => hd(t, n, e));
+ let e = Au(f, "mtime_desc"), n = p.sort((t, n) => _d(t, n, e));
return l && h && (o({
query: String(c || "Collection"),
total: p.length,
done: !0
- }), Kd(t), g.resetCount += 1), ie(f, n), de({
+ }), Jd(t), g.resetCount += 1), re(f, n), ue({
offset: n.length,
cursor: null,
total: n.length,
done: !0
- }), me({ title: c }), O(w(String(c || "Collection"))), {
+ }), L({ title: c }), O(w(String(c || "Collection"))), {
ok: !0,
count: n.length,
total: n.length
};
} catch (e) {
- return i(Wd("Failed to load collection", e), { error: !0 }), {
+ return i(Kd("Failed to load collection", e), { error: !0 }), {
ok: !1,
error: e?.message || String(e)
};
} finally {
if (u) try {
let e = Date.now() - m;
- e < Ld && await Rd(Ld - e);
+ e < zd && await Bd(zd - e);
} catch (e) {
console.debug?.(e);
}
t.loading = !1, u && r();
}
}
- function be() {
+ function ye() {
v("reload", { reloadReason: "scopeSwitch" });
try {
- vc(y());
+ bc(y());
} catch (e) {
console.debug?.(e);
}
@@ -14698,19 +14705,19 @@ function qd({ 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([], "");
+ }), N(), te(), r(), a(), p = !0, s([], "");
}
- function xe() {
+ function be() {
t.virtualGrid?.setItems?.(t.assets || []);
}
- function Se(e, { updateSelection: n = !0 } = {}) {
- let r = cd(t, e, { assetKey: (e) => te(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"), {
+ function xe(e, { updateSelection: n = !0 } = {}) {
+ let r = ud(t, e, { assetKey: (e) => I(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()
@@ -14720,7 +14727,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
selectedIds: t.selectedIds.slice()
};
}
- function Ce() {
+ function Se() {
let e = y(), t = l();
if (!e || !t) return null;
let n = (e) => {
@@ -14731,7 +14738,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
} catch {
return !1;
}
- }, r = Ad(e), i = u(), a = i.find((e) => n(e)) || i[0] || null, o = n(r) ? r : a;
+ }, r = Md(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();
@@ -14744,17 +14751,17 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
return console.debug?.(e), null;
}
}
- async function we(e) {
+ async function Ce(e) {
let t = y(), n = l();
if (!t || !n || !e) return;
- await Ud();
+ await Gd();
let r = String(e.id || "").trim();
if (!r) {
n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1;
return;
}
- d(r, { align: "start" }), await Ud();
- let i = jd(t, r);
+ d(r, { align: "start" }), await Gd();
+ let i = Nd(t, r);
if (!i) {
n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1;
return;
@@ -14766,10 +14773,10 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
console.debug?.(t), n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1;
}
}
- async function Te(e = {}, n = {}) {
+ async function we(e = {}, n = {}) {
let i = y();
if (!i) return !1;
- let s = Ku(e), c = nd(s);
+ let s = Ju(e), c = id(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 {
@@ -14782,11 +14789,11 @@ function qd({ 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, N(), te(), o({
query: c.query || n.title || "Cached",
total: Number(c.total ?? c.assets.length) || c.assets.length,
done: !!c.done
- }), Kd(t), g.resetCount += 1, a(), r(), t.loading = !1, ie(i, c.assets), de({
+ }), Jd(t), g.resetCount += 1, a(), r(), t.loading = !1, re(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,
@@ -14794,40 +14801,40 @@ function qd({ 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, L({ title: c.title || n.title || "Cached" }), !0;
}
- function Ee(e) {
+ function Te(e) {
return {
getOrCreateState: () => t,
ensureVirtualGrid: () => t.virtualGrid,
- upsertState: Fd,
- maxBatchSize: Pd,
- debounceMs: Nd,
- assetKey: (t) => zd(t) || te(t, e),
- loadMajoorSettings: Et
+ upsertState: Ld,
+ maxBatchSize: Id,
+ debounceMs: Fd,
+ assetKey: (t) => Vd(t) || I(t, e),
+ loadMajoorSettings: pt
};
}
- function De(e) {
+ function Ee(e) {
v("upsertRealtime", { appendReason: "realtime" });
let t = y();
- return !t || !e || !e.id ? !1 : Dd(t, e, Ee(t));
+ return !t || !e || !e.id ? !1 : kd(t, e, Te(t));
}
- let ke = !1;
- function je(e) {
+ let De = !1;
+ function ke(e) {
v("upsertRealtime", { appendReason: "realtimeImmediate" });
let t = y();
if (!t || !e || !e.id) return !1;
- let n = Dd(t, e, Ee(t));
- return n && !ke && (ke = !0, queueMicrotask(() => {
- ke = !1;
+ let n = kd(t, e, Te(t));
+ return n && !De && (De = !0, queueMicrotask(() => {
+ De = !1;
let e = y();
- e && Ed(e, Ee(e));
+ e && Od(e, Te(e));
})), n;
}
- function Me() {
- ne(t.query || "Cached");
+ function Ae() {
+ ee(t.query || "Cached");
try {
- td();
+ rd();
} catch (e) {
console.debug?.(e);
}
@@ -14839,41 +14846,41 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM
}
let e = y();
if (e) try {
- let t = vd(e, Fd);
+ let t = bd(e, Ld);
t?.timer && (clearTimeout(t.timer), t.timer = null), t?.pending?.clear?.();
} catch (e) {
console.debug?.(e);
}
}
try {
- window.addEventListener("pagehide", Me, { once: !0 });
+ window.addEventListener("pagehide", Ae, { once: !0 });
} catch (e) {
console.debug?.(e);
}
return {
- reload: ve,
- appendNextPage: he,
- refreshHead: _e,
- upsertRealtime: je,
- loadAssets: ve,
- loadAssetsFromList: ye,
- loadNextPage: he,
- prepareGridForScopeSwitch: be,
- refreshGrid: xe,
- removeAssets: Se,
- captureAnchor: Ce,
- restoreAnchor: we,
- hydrateFromSnapshot: Te,
- upsertAsset: De,
- upsertAssetNow: je,
+ reload: _e,
+ appendNextPage: me,
+ refreshHead: ge,
+ upsertRealtime: ke,
+ loadAssets: _e,
+ loadAssetsFromList: ve,
+ loadNextPage: me,
+ prepareGridForScopeSwitch: ye,
+ refreshGrid: be,
+ removeAssets: xe,
+ captureAnchor: Se,
+ restoreAnchor: Ce,
+ hydrateFromSnapshot: we,
+ upsertAsset: Ee,
+ upsertAssetNow: ke,
getCanonicalState: x,
getDebugSnapshot: S,
- dispose: Me
+ dispose: Ae
};
}
//#endregion
//#region node_modules/@tanstack/virtual-core/dist/esm/utils.js
-function Jd(e, t, n) {
+function Xd(e, t, n) {
let r = n.initialDeps ?? [], i, a = !0;
function o() {
let o;
@@ -14898,26 +14905,26 @@ function Jd(e, t, n) {
r = e;
}, o;
}
-function Yd(e, t) {
+function Zd(e, t) {
if (e === void 0) throw Error(`Unexpected undefined${t ? `: ${t}` : ""}`);
return e;
}
-var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
+var Qd = (e, t) => Math.abs(e - t) < 1.01, $d = (e, t, n) => {
let r;
return function(...i) {
e.clearTimeout(r), r = e.setTimeout(() => t.apply(this, i), n);
};
-}, Qd = (e) => {
+}, ef = (e) => {
let { offsetWidth: t, offsetHeight: n } = e;
return {
width: t,
height: n
};
-}, $d = (e) => e, ef = (e) => {
+}, tf = (e) => e, nf = (e) => {
let t = Math.max(e.startIndex - e.overscan, 0), n = Math.min(e.endIndex + e.overscan, e.count - 1), r = [];
for (let e = t; e <= n; e++) r.push(e);
return r;
-}, tf = (e, t) => {
+}, rf = (e, t) => {
let n = e.scrollElement;
if (!n) return;
let r = e.targetWindow;
@@ -14929,7 +14936,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
height: Math.round(r)
});
};
- if (i(Qd(n)), !r.ResizeObserver) return () => {};
+ if (i(ef(n)), !r.ResizeObserver) return () => {};
let a = new r.ResizeObserver((t) => {
let r = () => {
let e = t[0];
@@ -14943,43 +14950,43 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
return;
}
}
- i(Qd(n));
+ i(ef(n));
};
e.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(r) : r();
});
return a.observe(n, { box: "border-box" }), () => {
a.unobserve(n);
};
-}, nf = { passive: !0 }, rf = typeof window > "u" ? !0 : "onscrollend" in window, af = (e, t) => {
+}, af = { passive: !0 }, of = typeof window > "u" ? !0 : "onscrollend" in window, sf = (e, t) => {
let n = e.scrollElement;
if (!n) return;
let r = e.targetWindow;
if (!r) return;
- let i = 0, a = e.options.useScrollendEvent && rf ? () => void 0 : Zd(r, () => {
+ let i = 0, a = e.options.useScrollendEvent && of ? () => void 0 : $d(r, () => {
t(i, !1);
}, e.options.isScrollingResetDelay), o = (r) => () => {
let { horizontal: o, isRtl: s } = e.options;
i = o ? n.scrollLeft * (s && -1 || 1) : n.scrollTop, a(), t(i, r);
}, s = o(!0), c = o(!1);
- n.addEventListener("scroll", s, nf);
- let l = e.options.useScrollendEvent && rf;
- return l && n.addEventListener("scrollend", c, nf), () => {
+ n.addEventListener("scroll", s, af);
+ let l = e.options.useScrollendEvent && of;
+ return l && n.addEventListener("scrollend", c, af), () => {
n.removeEventListener("scroll", s), l && n.removeEventListener("scrollend", c);
};
-}, of = (e, t, n) => {
+}, cf = (e, t, n) => {
if (t?.borderBoxSize) {
let e = t.borderBoxSize[0];
if (e) return Math.round(e[n.options.horizontal ? "inlineSize" : "blockSize"]);
}
return e[n.options.horizontal ? "offsetWidth" : "offsetHeight"];
-}, sf = (e, { adjustments: t = 0, behavior: n }, r) => {
+}, lf = (e, { adjustments: t = 0, behavior: n }, r) => {
var i, a;
let o = e + t;
(a = (i = r.scrollElement)?.scrollTo) == null || a.call(i, {
[r.options.horizontal ? "left" : "top"]: o,
behavior: n
});
-}, cf = class {
+}, uf = class {
constructor(e) {
this.unsubs = [], this.scrollElement = null, this.targetWindow = null, this.isScrolling = !1, this.scrollState = null, this.measurementsCache = [], this.itemSizeCache = /* @__PURE__ */ new Map(), this.laneAssignments = /* @__PURE__ */ new Map(), this.pendingMeasuredCacheIndexes = [], this.prevLanes = void 0, this.lanesChangedFlag = !1, this.lanesSettling = !1, this.scrollRect = null, this.scrollOffset = null, this.scrollDirection = null, this.scrollAdjustments = 0, this.elementsCache = /* @__PURE__ */ new Map(), this.now = () => {
var e;
@@ -15018,10 +15025,10 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
scrollPaddingStart: 0,
scrollPaddingEnd: 0,
horizontal: !1,
- getItemKey: $d,
- rangeExtractor: ef,
+ getItemKey: tf,
+ rangeExtractor: nf,
onChange: () => {},
- measureElement: of,
+ measureElement: cf,
initialRect: {
width: 0,
height: 0
@@ -15042,7 +15049,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
}, this.notify = (e) => {
var t, n;
(n = (t = this.options).onChange) == null || n.call(t, this, e);
- }, this.maybeNotify = Jd(() => (this.calculateRange(), [
+ }, this.maybeNotify = Xd(() => (this.calculateRange(), [
this.isScrolling,
this.range ? this.range.startIndex : null,
this.range ? this.range.endIndex : null
@@ -15087,7 +15094,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
if (a == null || t.end > a.end ? r.set(t.lane, t) : t.end < a.end && n.set(t.lane, !0), n.size === this.options.lanes) break;
}
return r.size === this.options.lanes ? Array.from(r.values()).sort((e, t) => e.end === t.end ? e.index - t.index : e.end - t.end)[0] : void 0;
- }, this.getMeasurementOptions = Jd(() => [
+ }, this.getMeasurementOptions = Xd(() => [
this.options.count,
this.options.paddingStart,
this.options.scrollMargin,
@@ -15103,7 +15110,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
enabled: i,
lanes: a,
laneAssignmentMode: o
- }), { key: !1 }), this.getMeasurements = Jd(() => [this.getMeasurementOptions(), this.itemSizeCache], ({ count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o }, s) => {
+ }), { key: !1 }), this.getMeasurements = Xd(() => [this.getMeasurementOptions(), this.itemSizeCache], ({ count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o }, s) => {
if (!i) return this.measurementsCache = [], this.itemSizeCache.clear(), this.laneAssignments.clear(), [];
if (this.laneAssignments.size > e) for (let t of this.laneAssignments.keys()) t >= e && this.laneAssignments.delete(t);
this.lanesChangedFlag && (this.lanesChangedFlag = !1, this.lanesSettling = !0, this.measurementsCache = [], this.itemSizeCache.clear(), this.laneAssignments.clear(), this.pendingMeasuredCacheIndexes = []), this.measurementsCache.length === 0 && !this.lanesSettling && (this.measurementsCache = this.options.initialMeasurementsCache, this.measurementsCache.forEach((e) => {
@@ -15140,12 +15147,12 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
}, {
key: !1,
debug: () => this.options.debug
- }), this.calculateRange = Jd(() => [
+ }), this.calculateRange = Xd(() => [
this.getMeasurements(),
this.getSize(),
this.getScrollOffset(),
this.options.lanes
- ], (e, t, n, r) => this.range = e.length > 0 && t > 0 ? uf({
+ ], (e, t, n, r) => this.range = e.length > 0 && t > 0 ? ff({
measurements: e,
outerSize: t,
scrollOffset: n,
@@ -15153,7 +15160,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
}) : null, {
key: !1,
debug: () => this.options.debug
- }), this.getVirtualIndexes = Jd(() => {
+ }), this.getVirtualIndexes = Xd(() => {
let e = null, t = null, n = this.calculateRange();
return n && (e = n.startIndex, t = n.endIndex), this.maybeNotify.updateDeps([
this.isScrolling,
@@ -15202,7 +15209,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
adjustments: this.scrollAdjustments += r,
behavior: void 0
}), this.pendingMeasuredCacheIndexes.push(n.index), this.itemSizeCache = new Map(this.itemSizeCache.set(n.key, t)), this.notify(!1));
- }, this.getVirtualItems = Jd(() => [this.getVirtualIndexes(), this.getMeasurements()], (e, t) => {
+ }, this.getVirtualItems = Xd(() => [this.getVirtualIndexes(), this.getMeasurements()], (e, t) => {
let n = [];
for (let r = 0, i = e.length; r < i; r++) {
let i = t[e[r]];
@@ -15214,7 +15221,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
debug: () => this.options.debug
}), this.getVirtualItemForOffset = (e) => {
let t = this.getMeasurements();
- if (t.length !== 0) return Yd(t[lf(0, t.length - 1, (e) => Yd(t[e]).start, e)]);
+ if (t.length !== 0) return Zd(t[df(0, t.length - 1, (e) => Zd(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;
@@ -15318,7 +15325,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
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 && Xd(t, this.getScrollOffset())) {
+ if (!n && Qd(t, this.getScrollOffset())) {
if (this.scrollState.stableFrames++, this.scrollState.stableFrames >= 1) {
this.scrollState = null;
return;
@@ -15329,7 +15336,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
}));
this.scheduleScrollReconcile();
}
-}, lf = (e, t, n, r) => {
+}, df = (e, t, n, r) => {
for (; e <= t;) {
let i = (e + t) / 2 | 0, a = n(i);
if (a < r) e = i + 1;
@@ -15338,13 +15345,13 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => {
}
return e > 0 ? e - 1 : 0;
};
-function uf({ measurements: e, outerSize: t, scrollOffset: n, lanes: r }) {
+function ff({ measurements: e, outerSize: t, scrollOffset: n, lanes: r }) {
let i = e.length - 1, a = (t) => e[t].start;
if (e.length <= r) return {
startIndex: 0,
endIndex: i
};
- let o = lf(0, i, a, n), s = o;
+ let o = df(0, i, a, n), s = o;
if (r === 1) for (; s < i && e[s].end < n + t;) s++;
else if (r > 1) {
let a = Array(r).fill(0);
@@ -15366,11 +15373,11 @@ function uf({ measurements: e, outerSize: t, scrollOffset: n, lanes: r }) {
}
//#endregion
//#region node_modules/@tanstack/vue-virtual/dist/esm/index.js
-function df(e) {
- let t = new cf(J(e)), n = fn(t), r = t._didMount();
- return mn(() => J(e).getScrollElement(), (e) => {
+function pf(e) {
+ let t = new uf(X(e)), n = fn(t), r = t._didMount();
+ return mn(() => X(e).getScrollElement(), (e) => {
e && t._willUpdate();
- }, { immediate: !0 }), mn(() => J(e), (e) => {
+ }, { immediate: !0 }), mn(() => X(e), (e) => {
t.setOptions({
...e,
onChange: (t, r) => {
@@ -15380,21 +15387,21 @@ function df(e) {
}), t._willUpdate(), Pn(n);
}, { immediate: !0 }), On(r), n;
}
-function ff(e) {
- return df(X(() => ({
- observeElementRect: tf,
- observeElementOffset: af,
- scrollToFn: sf,
- ...J(e)
+function mf(e) {
+ return pf(Z(() => ({
+ observeElementRect: rf,
+ observeElementOffset: sf,
+ scrollToFn: lf,
+ ...X(e)
})));
}
//#endregion
//#region ui/vue/grid/useGridVirtualRows.ts
-function pf(e, t = 0) {
- let n = Number(J(e));
+function hf(e, t = 0) {
+ let n = Number(X(e));
return Number.isFinite(n) ? n : t;
}
-function mf(e = [], t = 1) {
+function gf(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),
@@ -15402,46 +15409,46 @@ function mf(e = [], t = 1) {
});
return i;
}
-function hf(e = [], t = 0, n = 1) {
+function _f(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 gf({ scrollRef: e, items: t, columnCount: n, estimateRowHeight: r, overscan: i = 8, enabled: a = !0, measure: o = of } = {}) {
- let s = X(() => {
- if (!J(a)) return 0;
- let e = J(t) || [], r = Math.max(1, pf(n, 1));
+function vf({ scrollRef: e, items: t, columnCount: n, estimateRowHeight: r, overscan: i = 8, enabled: a = !0, measure: o = cf } = {}) {
+ let s = Z(() => {
+ if (!X(a)) return 0;
+ let e = X(t) || [], r = Math.max(1, hf(n, 1));
return Math.ceil((Array.isArray(e) ? e.length : 0) / r);
- }), c = ff(X(() => ({
+ }), c = mf(Z(() => ({
count: s.value,
- getScrollElement: () => J(e) || null,
- estimateSize: () => Math.max(1, pf(r, 120)),
- overscan: Math.max(0, pf(i, 8)),
+ getScrollElement: () => X(e) || null,
+ estimateSize: () => Math.max(1, hf(r, 120)),
+ overscan: Math.max(0, hf(i, 8)),
measureElement: o
})));
return {
rowCount: s,
virtualizer: c,
- virtualRows: X(() => {
- let e = J(t) || [], r = Math.max(1, pf(n, 1));
+ virtualRows: Z(() => {
+ let e = X(t) || [], r = Math.max(1, hf(n, 1));
return c.value.getVirtualItems().map((t) => ({
key: t.key,
index: t.index,
virtual: t,
- items: hf(e, t.index, r)
+ items: _f(e, t.index, r)
}));
}),
- totalSize: X(() => c.value.getTotalSize()),
- getRowItems: (e) => hf(J(t) || [], e, pf(n, 1))
+ totalSize: Z(() => c.value.getTotalSize()),
+ getRowItems: (e) => _f(X(t) || [], e, hf(n, 1))
};
}
//#endregion
//#region ui/vue/grid/useInfiniteTrigger.ts
-function _f(e, t = !0) {
- let n = J(e);
+function yf(e, t = !0) {
+ let n = X(e);
return n == null ? t : !!n;
}
-function vf({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMargin: i = "900px", threshold: a = .01 } = {}) {
- let o = K(null), s = null, c = !1;
+function bf({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMargin: i = "900px", threshold: a = .01 } = {}) {
+ let o = J(null), s = null, c = !1;
function l() {
try {
s?.disconnect?.();
@@ -15451,7 +15458,7 @@ function vf({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar
s = null;
}
async function u() {
- if (!c && !(!_f(t, !0) || !_f(n, !0)) && typeof r == "function") {
+ if (!c && !(!yf(t, !0) || !yf(n, !0)) && typeof r == "function") {
c = !0;
try {
await r();
@@ -15466,12 +15473,12 @@ function vf({ 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: J(e) || null,
+ root: X(e) || null,
rootMargin: i,
threshold: a
}), s.observe(t));
}
- return xn() && (bn(d), yn(l), mn(() => [J(e), o.value], () => d(), { flush: "post" })), {
+ return xn() && (bn(d), yn(l), mn(() => [X(e), o.value], () => d(), { flush: "post" })), {
sentinelRef: o,
connect: d,
disconnect: l,
@@ -15480,18 +15487,18 @@ function vf({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar
}
//#endregion
//#region ui/vue/grid/useGridDisplayAssets.ts
-function yf(e) {
- let t = yt(e?.filename);
+function xf(e) {
+ let t = St(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 bf(e) {
+function Sf(e) {
return !!e;
}
-function xf(e) {
+function Cf(e) {
let t = Array.isArray(e) ? e : [], n = /* @__PURE__ */ new Map(), r = [];
for (let e of t) {
if (!e) continue;
- let t = yf(e);
+ let t = xf(e);
if (!t) {
e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, e._mjrDupStack = !1, e._mjrDupMembers = null, e._mjrDupCount = 0, r.push(e);
continue;
@@ -15510,7 +15517,7 @@ function xf(e) {
}
//#endregion
//#region ui/vue/components/grid/VirtualAssetGridHost.vue
-var Sf = {
+var wf = {
key: 0,
class: "mjr-grid-loading-overlay",
style: {
@@ -15525,12 +15532,12 @@ var Sf = {
background: "rgba(20,22,28,0.55)",
"backdrop-filter": "blur(2px)"
}
-}, Cf = { style: { width: "100%" } }, wf = { class: "mjr-grid-skeleton-layout" }, Tf = { style: {
+}, Tf = { style: { width: "100%" } }, Ef = { class: "mjr-grid-skeleton-layout" }, Df = { style: {
"margin-top": "10px",
"font-size": "12px",
opacity: "0.68",
"text-align": "center"
-} }, Ef = ["data-index"], Df = [
+} }, Of = ["data-index"], kf = [
"data-mjr-asset-id",
"data-mjr-filename-key",
"data-mjr-ext",
@@ -15546,14 +15553,14 @@ var Sf = {
"onMousedown",
"onClick",
"onDblclick"
-], Of = {
+], Af = {
key: 3,
style: {
display: "flex",
"flex-direction": "column",
width: "100%"
}
-}, kf = [
+}, jf = [
"data-mjr-asset-id",
"data-mjr-filename-key",
"data-mjr-ext",
@@ -15569,7 +15576,7 @@ var Sf = {
"onMousedown",
"onClick",
"onDblclick"
-], Af = /* @__PURE__ */ Il({
+], Mf = /* @__PURE__ */ Rl({
__name: "VirtualAssetGridHost",
props: {
scrollElement: {
@@ -15598,9 +15605,9 @@ var Sf = {
}
},
setup(e, { expose: t }) {
- let n = e, r = K(null), i = K(1024);
- K(!0);
- let a = K(0), o = K(0), s = /* @__PURE__ */ new WeakMap(), c = 0, l = 0, u = 0;
+ let n = e, r = J(null), i = J(1024);
+ J(!0);
+ let a = J(0), o = J(0), s = /* @__PURE__ */ new WeakMap(), c = 0, l = 0, u = 0;
function d(e) {
return (Array.isArray(e) ? e : []).slice().sort((e, t) => {
let n = Number(e?.mtime || e?.created_at || 0) || 0;
@@ -15617,12 +15624,12 @@ var Sf = {
t._mjrStackMembersCache ||= /* @__PURE__ */ new Map();
let a = t._mjrStackMembersCache.get(i);
if (!Array.isArray(a)) {
- let e = await P(Ie(n), { timeoutMs: 3e4 });
+ let e = await ne(Le(n), { timeoutMs: 3e4 });
if (e?.ok && Array.isArray(e?.data)) a = e.data, t._mjrStackMembersCache.set(i, a);
else return;
}
let o = d(a);
- t.dispatchEvent(new CustomEvent(B.OPEN_STACK_GROUP, {
+ t.dispatchEvent(new CustomEvent(H.OPEN_STACK_GROUP, {
bubbles: !0,
detail: {
asset: e,
@@ -15636,7 +15643,7 @@ var Sf = {
let t = r.value;
if (!t || !e) return;
let n = Array.isArray(e._mjrDupMembers) ? e._mjrDupMembers : [e];
- t.dispatchEvent(new CustomEvent(B.OPEN_STACK_GROUP, {
+ t.dispatchEvent(new CustomEvent(H.OPEN_STACK_GROUP, {
bubbles: !0,
detail: {
asset: e,
@@ -15647,23 +15654,23 @@ var Sf = {
}));
}
});
- let { state: f, selectedIdSet: p, setLoadingMessage: m, clearLoadingMessage: h, setStatusMessage: g, clearStatusMessage: _, resetAssets: v, setSelection: y, reconcileSelection: b, getSelectedAssets: x, getActiveAsset: S } = _u();
+ let { state: f, selectedIdSet: p, setLoadingMessage: m, clearLoadingMessage: h, setStatusMessage: g, clearStatusMessage: _, resetAssets: v, setSelection: y, reconcileSelection: b, getSelectedAssets: x, getActiveAsset: S } = yu();
function C(e) {
return e ? typeof e == "object" && "value" in e ? e.value || null : e : null;
}
- let w = X(() => C(n.scrollElement));
+ let w = Z(() => C(n.scrollElement));
function T() {
- return kd(r.value);
+ return jd(r.value);
}
function E(e, { align: t = "auto" } = {}) {
let r = String(e || "").trim();
if (!r) return;
- let i = (Array.isArray(ie.value) ? ie.value : []).findIndex((e) => String(e?.id || "") === r);
+ let i = (Array.isArray(re.value) ? re.value : []).findIndex((e) => String(e?.id || "") === r);
if (!(i < 0)) {
if (n.virtualize) {
- let e = Math.floor(i / Math.max(1, ue.value));
+ let e = Math.floor(i / Math.max(1, le.value));
try {
- ye.value.scrollToIndex(e, { align: t });
+ _e.value.scrollToIndex(e, { align: t });
} catch (e) {
console.debug?.(e);
}
@@ -15680,9 +15687,9 @@ var Sf = {
}
}
function D() {
- return xu(r.value, w.value);
+ return Cu(r.value, w.value);
}
- let O = qd({
+ let O = Yd({
gridContainerRef: r,
state: f,
setLoadingMessage: m,
@@ -15696,10 +15703,10 @@ var Sf = {
readRenderedCards: T,
scrollToAssetId: E,
canLoadMore: D
- }), { sentinelRef: k } = vf({
+ }), { sentinelRef: k } = bf({
rootRef: w,
enabled: !0,
- canLoad: X(() => !f.loading && !f.done && D()),
+ canLoad: Z(() => !f.loading && !f.done && D()),
loadMore: () => O.loadNextPage(),
rootMargin: "900px"
});
@@ -15717,30 +15724,30 @@ var Sf = {
function N(e) {
return String(e?.kind || "").toLowerCase() === "folder";
}
- function F(e) {
+ function P(e) {
let t = r.value;
return !t || String(t.dataset?.mjrGroupStacks || "") !== "1" ? !1 : !!String(e?.stack_id || "").trim() && Number(e?.stack_asset_count || 0) > 1;
}
- function ee(e) {
+ function F(e) {
return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:");
}
- function te() {
+ function I() {
let e = r.value;
if (!e) return;
let t = new Set((Array.isArray(f.selectedIds) ? f.selectedIds : []).map((e) => String(e || "").trim()).filter(Boolean));
- $e(e, t, f.activeId || "");
+ tt(e, t, f.activeId || "");
try {
t.size ? e.dataset.mjrSelectedAssetId = String(f.activeId || Array.from(t)[0] || "") : delete e.dataset.mjrSelectedAssetId;
} catch (e) {
console.debug?.(e);
}
}
- function ne() {
+ function ee() {
let e = r.value;
if (!e) return;
let t = Array.isArray(f.selectedIds) ? f.selectedIds.slice() : [], i = String(f.activeId || ""), a = `${t.join("|")}::${i}`;
- if (a === ne._lastSelectionKey) return;
- ne._lastSelectionKey = a;
+ if (a === ee._lastSelectionKey) return;
+ ee._lastSelectionKey = a;
let o = {
selectedIds: t,
activeId: i,
@@ -15757,13 +15764,13 @@ var Sf = {
console.debug?.(e);
}
}
- ne._lastSelectionKey = "";
- let re = X(() => xf(f.assets)), ie = X(() => (Array.isArray(re.value) ? re.value : []).filter((e) => bf(e)));
- function ae() {
+ ee._lastSelectionKey = "";
+ let te = Z(() => Cf(f.assets)), re = Z(() => (Array.isArray(te.value) ? te.value : []).filter((e) => Sf(e)));
+ function ie() {
let e = r.value;
if (!e) return;
let t = {
- count: Array.isArray(ie.value) ? ie.value.length : 0,
+ count: Array.isArray(re.value) ? re.value.length : 0,
total: Number(f.total || 0) || 0
};
try {
@@ -15777,7 +15784,7 @@ var Sf = {
console.debug?.(e);
}
}
- function oe(e) {
+ function ae(e) {
if (!e?.id) return;
let t = (Array.isArray(f.assets) ? f.assets : []).find((t) => String(t?.id || "") === String(e.id));
if (t) try {
@@ -15786,14 +15793,14 @@ var Sf = {
console.debug?.(e);
}
}
- function se() {
+ function oe() {
try {
window.dispatchEvent(new CustomEvent("mjr:open-sidebar", { detail: { tab: "details" } }));
} catch (e) {
console.debug?.(e);
}
}
- function ce(e) {
+ function se(e) {
if (!e) return;
e._mjrSelectionManagedByVue = !0;
try {
@@ -15802,28 +15809,28 @@ var Sf = {
console.debug?.(e);
}
try {
- Le?.();
+ Ne?.();
} catch (e) {
console.debug?.(e);
}
- Lr(e, { applySettingsClasses: n.applyDefaultSettingsClasses });
+ Rr(e, { applySettingsClasses: n.applyDefaultSettingsClasses });
try {
- Le = xl(e);
+ Ne = Cl(e);
} catch (e) {
- console.debug?.(e), Le = null;
+ console.debug?.(e), Ne = null;
}
- e._mjrPrimaryPointerSelectionUnbind = () => {}, e._mjrGetAssets = () => Array.isArray(ie.value) ? ie.value : [], e._mjrSetSelection = (e, t = "") => {
+ e._mjrPrimaryPointerSelectionUnbind = () => {}, e._mjrGetAssets = () => Array.isArray(re.value) ? re.value : [], e._mjrSetSelection = (e, t = "") => {
let n = y(e, t);
- return te(), ne(), n.selectedIds;
+ return I(), ee(), n.selectedIds;
};
let t = (e, t = {}) => {
let n = O.removeAssets(e, t);
- return ae(), n;
+ return ie(), n;
};
e._mjrRemoveAssets = t, e._mjrGetRenderedCards = () => T(), e._mjrScrollToAssetId = (e, t = {}) => {
E(e, t);
- }, e._mjrHasAssetId = (e) => (Array.isArray(f.assets) ? f.assets : []).some((t) => String(t?.id || "") === String(e || "")), e._mjrGetGridState = () => f, e._mjrGetSelectedAssets = () => x(), e._mjrGetActiveAsset = () => S(), e._mjrOnKeyboardAssetChanged = (e) => oe(e), e._mjrOpenKeyboardDetails = () => se();
- let r = () => (n.applyDefaultSettingsClasses && (Ir(e), a.value += 1), O.refreshGrid()), i = () => {
+ }, e._mjrHasAssetId = (e) => (Array.isArray(f.assets) ? f.assets : []).some((t) => String(t?.id || "") === String(e || "")), e._mjrGetGridState = () => f, e._mjrGetSelectedAssets = () => x(), e._mjrGetActiveAsset = () => S(), e._mjrOnKeyboardAssetChanged = (e) => ae(e), e._mjrOpenKeyboardDetails = () => oe();
+ let r = () => (n.applyDefaultSettingsClasses && (Lr(e), a.value += 1), O.refreshGrid()), i = () => {
O.prepareGridForScopeSwitch(), O.dispose(), f.cardElements.clear(), e._mjrGridApi = null;
};
e._mjrGridApi = {
@@ -15845,75 +15852,75 @@ var Sf = {
}, e._mjrLoadAssets = (...e) => O.loadAssets(...e), e._mjrLoadAssetsFromList = (...e) => O.loadAssetsFromList(...e), e._mjrPrepareForScopeSwitch = () => O.prepareGridForScopeSwitch(), e._mjrRefreshGrid = r, e._mjrCaptureAnchor = () => O.captureAnchor(), e._mjrRestoreAnchor = (e) => O.restoreAnchor(e), e._mjrHydrateFromSnapshot = (...e) => O.hydrateFromSnapshot(...e), e._mjrUpsertAsset = (e) => O.upsertAsset(e), e._mjrUpsertAssetNow = (e) => O.upsertAssetNow(e), e._mjrGetCanonicalState = () => O.getCanonicalState(), e._mjrGetDebugSnapshot = () => O.getDebugSnapshot(), e._mjrDispose = i;
}
mn(r, (e) => {
- e && (ce(e), te(), ae());
+ e && (se(e), I(), ie());
}, { immediate: !0 }), mn(() => `${(f.selectedIds || []).join("|")}::${String(f.activeId || "")}`, () => {
- r.value && (te(), ne());
- }, { flush: "post" }), mn(() => `${Array.isArray(ie.value) ? ie.value.length : 0}::${Number(f.total || 0)}::${Number(f.hiddenPngSiblings || 0)}`, () => {
- r.value && ae();
+ r.value && (I(), ee());
+ }, { flush: "post" }), mn(() => `${Array.isArray(re.value) ? re.value.length : 0}::${Number(f.total || 0)}::${Number(f.hiddenPngSiblings || 0)}`, () => {
+ r.value && ie();
}, {
flush: "post",
immediate: !0
});
- function le() {
- let e = r.value, t = String(e?.dataset?.mjrBottomFeed || "").toLowerCase() === "true", n = Number(I.GRID_MIN_SIZE || 120) || 120;
- return t ? Math.max(80, Number(I.FEED_GRID_MIN_SIZE || n) || n) : Math.max(80, n);
+ function ce() {
+ let e = r.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) : Math.max(80, n);
}
- let ue = X(() => {
+ let le = Z(() => {
a.value;
- let e = Math.max(0, Number(I.GRID_GAP || 10) || 10), t = le(), n = Number(i.value || 0) || Number(w.value?.clientWidth || 0) || 0;
+ let e = Math.max(0, Number(z.GRID_GAP || 10) || 10), t = ce(), n = Number(i.value || 0) || Number(w.value?.clientWidth || 0) || 0;
return n <= 0 ? 1 : Math.max(1, Math.floor((n + e) / (t + e)));
- }), de = X(() => (Number(i.value || 0) || Number(w.value?.clientWidth || 0) || 0) > 0), fe = X(() => (a.value, Math.max(0, Number(I.GRID_GAP || 10) || 10))), pe = X(() => {
- let e = Math.max(1, ue.value), t = Number(i.value || 0) || Number(w.value?.clientWidth || 0) || 0;
- return t <= 0 ? le() : Math.max(80, Math.floor((t - fe.value * Math.max(0, e - 1)) / e));
- }), me = X(() => {
+ }), ue = Z(() => (Number(i.value || 0) || Number(w.value?.clientWidth || 0) || 0) > 0), de = Z(() => (a.value, Math.max(0, Number(z.GRID_GAP || 10) || 10))), fe = Z(() => {
+ let e = Math.max(1, le.value), t = Number(i.value || 0) || Number(w.value?.clientWidth || 0) || 0;
+ return t <= 0 ? ce() : Math.max(80, Math.floor((t - de.value * Math.max(0, e - 1)) / e));
+ }), pe = Z(() => {
a.value;
- let e = !!I.GRID_SHOW_DETAILS;
- return pe.value + (e ? 82 : 0) + fe.value;
- }), he = X(() => {
- let e = Array.isArray(ie.value) ? ie.value : [];
- return n.virtualize ? [] : mf(e, ue.value);
+ let e = !!z.GRID_SHOW_DETAILS;
+ return fe.value + (e ? 82 : 0) + de.value;
+ }), L = Z(() => {
+ let e = Array.isArray(re.value) ? re.value : [];
+ return n.virtualize ? [] : gf(e, le.value);
});
- function ge(e) {
+ function me(e) {
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(u || t)), i = Math.abs(n - Number(l || n)) / Math.max(1, me.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(u || t)), i = Math.abs(n - Number(l || n)) / Math.max(1, pe.value) * (16 / r);
o.value = Math.max(0, Math.min(20, i)), l = n, u = t;
} catch (e) {
console.debug?.(e);
}
}
- let _e = gf({
+ let he = vf({
scrollRef: w,
- items: ie,
- columnCount: ue,
- estimateRowHeight: me,
- overscan: X(() => {
- let e = Math.max(1, me.value), t = w.value?.clientHeight || 0;
+ items: re,
+ columnCount: le,
+ estimateRowHeight: pe,
+ overscan: Z(() => {
+ let e = Math.max(1, pe.value), t = w.value?.clientHeight || 0;
if (t <= 0) return 6;
let n = Math.ceil(t / e), r = Math.ceil(o.value * 3);
return Math.max(3, Math.min(30, n + r));
}),
- enabled: X(() => n.virtualize)
- }), ve = _e.rowCount, ye = _e.virtualizer, be = _e.virtualRows, xe = _e.totalSize, Se = X(() => {
+ enabled: Z(() => n.virtualize)
+ }), ge = he.rowCount, _e = he.virtualizer, ve = he.virtualRows, ye = he.totalSize, be = Z(() => {
let e = /* @__PURE__ */ new Map();
- for (let t of be.value) e.set(t.index, t.virtual || t);
+ for (let t of ve.value) e.set(t.index, t.virtual || t);
return e;
- }), Ce = X(() => (a.value, !!I.GRID_SHOW_DETAILS)), we = X(() => {
- let e = Math.max(1, Number(ue.value || 1));
+ }), xe = Z(() => (a.value, !!z.GRID_SHOW_DETAILS)), Se = Z(() => {
+ let e = Math.max(1, Number(le.value || 1));
return Math.max(12, Math.min(36, e * 4));
- }), Te = X(() => Array.from({ length: Number(we.value || 12) }, (e, t) => t)), Ee = X(() => {
- let e = Math.max(1, Number(ue.value || 1)), t = Te.value, n = [];
+ }), Ce = Z(() => Array.from({ length: Number(Se.value || 12) }, (e, t) => t)), we = Z(() => {
+ let e = Math.max(1, Number(le.value || 1)), t = Ce.value, n = [];
for (let r = 0; r < t.length; r += e) n.push(t.slice(r, r + e));
return n;
- }), De = X(() => {
- let e = Math.max(80, Number(me.value || 0) - Number(fe.value || 0)), t = Math.max(80, Number(pe.value || 0));
+ }), Te = Z(() => {
+ let e = Math.max(80, Number(pe.value || 0) - Number(de.value || 0)), t = Math.max(80, Number(fe.value || 0));
return Math.max(0, e - t);
- }), Oe = X(() => ({
+ }), Ee = Z(() => ({
display: "flex",
- gap: `${fe.value}px`,
- paddingBottom: `${fe.value}px`,
+ gap: `${de.value}px`,
+ paddingBottom: `${de.value}px`,
boxSizing: "border-box"
- })), ke = X(() => {
- let e = Math.max(80, Number(pe.value || 0)), t = Math.max(80, Number(me.value || 0) - Number(fe.value || 0));
+ })), De = Z(() => {
+ let e = Math.max(80, Number(fe.value || 0)), t = Math.max(80, Number(pe.value || 0) - Number(de.value || 0));
return {
width: `${e}px`,
flex: `0 0 ${e}px`,
@@ -15926,13 +15933,13 @@ var Sf = {
boxShadow: "0 6px 18px rgba(0,0,0,0.24)",
boxSizing: "border-box"
};
- }), Ae = X(() => ({
+ }), Oe = Z(() => ({
width: "100%",
- height: `${Math.max(80, Number(pe.value || 0))}px`,
+ height: `${Math.max(80, Number(fe.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"
- })), je = X(() => ({
+ })), ke = Z(() => ({
height: "10px",
margin: "10px 10px 6px",
borderRadius: "8px",
@@ -15940,7 +15947,7 @@ var Sf = {
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"
- })), Me = X(() => ({
+ })), Ae = Z(() => ({
height: "10px",
margin: "0 10px 10px",
borderRadius: "8px",
@@ -15948,19 +15955,19 @@ var Sf = {
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"
- })), Ne = X(() => ({
- display: Ce.value ? "block" : "none",
- minHeight: `${Math.max(0, Number(De.value || 0))}px`
+ })), je = Z(() => ({
+ display: xe.value ? "block" : "none",
+ minHeight: `${Math.max(0, Number(Te.value || 0))}px`
}));
- function Pe() {
+ function Me() {
let e = Number(w.value?.clientWidth || 0) || Number(r.value?.clientWidth || 0) || 0;
e > 0 && (i.value = e);
}
- let Fe = null, Le = null, Re = !1;
- function ze() {
- nt();
+ let R = null, Ne = null, Pe = !1;
+ function Fe() {
+ Qe();
let e = () => {
- nt(), st();
+ Qe(), it();
};
try {
requestAnimationFrame(() => {
@@ -15976,33 +15983,33 @@ var Sf = {
]) setTimeout(e, t);
}
bn(() => {
- ze();
+ Fe();
}), mn(w, (e, t) => {
try {
- Fe?.disconnect?.();
+ R?.disconnect?.();
} catch (e) {
console.debug?.(e);
}
if (e) {
- Pe();
+ Me();
try {
- Fe = new ResizeObserver(() => {
- Pe();
- }), Fe.observe(e);
+ R = new ResizeObserver(() => {
+ Me();
+ }), R.observe(e);
} catch (e) {
- console.debug?.(e), Fe = null;
+ console.debug?.(e), R = null;
}
}
- }, { immediate: !0 }), mn(() => ve.value, async () => {
- de.value && (await Nn(), Ue(), rt());
+ }, { immediate: !0 }), mn(() => ge.value, async () => {
+ ue.value && (await Nn(), Be(), $e());
}), mn(() => f.assets, async (e) => {
if (!Array.isArray(e) || e.length === 0) {
let e = r.value;
e?._mjrStackMembersCache && e._mjrStackMembersCache.clear();
}
- await Nn(), Ue();
+ await Nn(), Be();
});
- function Be(e, t) {
+ function Ie(e, t) {
let n = String(t?.filename || "").trim().toLowerCase(), r = s.get(e);
if (r && r !== n) {
let t = f.renderedFilenameMap.get(r);
@@ -16015,23 +16022,23 @@ var Sf = {
let i = f.renderedFilenameMap.get(n);
i || (i = /* @__PURE__ */ new Set(), f.renderedFilenameMap.set(n, i)), i.add(e), s.set(e, n);
}
- function Ve(e) {
+ function Re(e) {
if (!e) return;
let t = s.get(e);
if (!t) return;
let n = f.renderedFilenameMap.get(t);
n && (n.delete(e), n.size || f.renderedFilenameMap.delete(t)), s.delete(e);
}
- function He(e) {
+ function ze(e) {
let t = String(e || "").trim().toLowerCase();
if (!t) return;
let n = f.renderedFilenameMap.get(t), r = Array.from(n || []);
if (!r.length) return;
- let i = (Array.isArray(f.assets) ? f.assets : []).filter((e) => String(e?.filename || "").trim().toLowerCase() === t), a = Math.max(Number(f.filenameCounts?.get?.(t) || 0) || 0, i.length), o = dt(i), s = r.find((e) => {
+ let i = (Array.isArray(f.assets) ? f.assets : []).filter((e) => String(e?.filename || "").trim().toLowerCase() === t), a = Math.max(Number(f.filenameCounts?.get?.(t) || 0) || 0, i.length), o = ht(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;
- xt(c, i);
+ ft(c, i);
for (let e of r) {
delete e.dataset.mjrDupHidden;
let t = e._mjrAsset;
@@ -16043,20 +16050,20 @@ var Sf = {
}
c._mjrDupStack = !0, c._mjrDupMembers = i.length ? i : [c], c._mjrDupCount = c._mjrDupMembers.length, c._mjrNameCollision = !1;
}
- function Ue() {
- for (let e of f.renderedFilenameMap.keys()) He(e);
+ function Be() {
+ for (let e of f.renderedFilenameMap.keys()) ze(e);
}
- function We(e, t) {
+ function Ve(e, t) {
let i = String(e?.id || "").trim();
if (!i) return;
if (!t) {
let e = f.cardElements.get(i), t = e ? s.get(e) : "";
- Ve(e), f.cardElements.delete(i), He(t);
+ Re(e), f.cardElements.delete(i), ze(t);
return;
}
let a = t?.$el ?? t;
if (a instanceof HTMLElement) {
- f.cardElements.set(i, a), a._mjrIsVue = !0, a._mjrAsset = e, a._mjrReactiveAsset = e, a.dataset.mjrKind = String(e?.kind || ""), Be(a, e), He(String(e?.filename || "").trim().toLowerCase());
+ f.cardElements.set(i, a), a._mjrIsVue = !0, a._mjrAsset = e, a._mjrReactiveAsset = e, a.dataset.mjrKind = String(e?.kind || ""), Ie(a, e), ze(String(e?.filename || "").trim().toLowerCase());
try {
n.onCardRendered?.(a, e, r.value);
} catch (e) {
@@ -16064,10 +16071,10 @@ var Sf = {
}
}
}
- function Ge(e) {
- return (t) => We(e, t);
+ function He(e) {
+ return (t) => Ve(e, t);
}
- function Ke(e, t) {
+ function Ue(e, t) {
try {
let n = e?.closest?.("a, button, input, textarea, select, label");
return !!(n && t?.contains?.(n));
@@ -16075,21 +16082,21 @@ var Sf = {
return !1;
}
}
- let qe = {
+ let We = {
assetId: "",
at: 0
};
- function Je(e, t) {
+ function Ge(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(qe.at || 0);
- if (qe.assetId === n && e >= 0 && e < 500) {
- qe.assetId = "", qe.at = 0;
+ let e = Date.now() - Number(We.at || 0);
+ if (We.assetId === n && e >= 0 && e < 500) {
+ We.assetId = "", We.at = 0;
return;
}
}
- if (Ke(e?.target, e?.currentTarget)) return;
+ if (Ue(e?.target, e?.currentTarget)) return;
let r = Array.isArray(f.assets) ? f.assets : [], i = r.findIndex((e) => String(e?.id || "") === n), a = Array.isArray(f.selectedIds) ? f.selectedIds.slice() : [];
if (e?.shiftKey && i >= 0) {
let e = String(f.selectionAnchorId || f.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);
@@ -16110,25 +16117,25 @@ var Sf = {
console.debug?.(e);
}
}
- function Ye(e, t) {
+ function Ke(e, t) {
if (Number(e?.button ?? 0) !== 0) return;
let n = String(t?.id || "").trim();
if (!n) return;
let r = Array.isArray(f.selectedIds) ? f.selectedIds.map(String).filter(Boolean) : [];
if (r.includes(n) && r.length > 1 && !e?.ctrlKey && !e?.metaKey && !e?.shiftKey) {
- qe.assetId = n, qe.at = Date.now();
+ We.assetId = n, We.at = Date.now();
return;
}
- qe.assetId = n, qe.at = Date.now(), Je(e, t);
+ We.assetId = n, We.at = Date.now(), Ge(e, t);
}
- function L(e) {
+ function B(e) {
let t = (Array.isArray(f.assets) ? f.assets : []).filter((e) => !N(e)), n = t.findIndex((t) => String(t?.id || "") === String(e?.id || ""));
- !t.length || n < 0 || to({
+ !t.length || n < 0 || ro({
assets: t,
index: n
});
}
- function Xe(e) {
+ function qe(e) {
try {
if (typeof n.onCardDblclick == "function") {
n.onCardDblclick({
@@ -16152,23 +16159,23 @@ var Sf = {
}
return;
}
- L(e);
+ B(e);
}
- let Ze = null, Qe = null, et = 0, tt = "";
- function nt() {
- Pe();
+ let Je = null, Ye = null, Xe = 0, Ze = "";
+ function Qe() {
+ Me();
try {
- ye.value?.measure?.();
+ _e.value?.measure?.();
} catch (e) {
console.debug?.(e);
}
}
- function rt() {
+ function $e() {
if (!c) try {
c = requestAnimationFrame(() => {
c = 0;
try {
- ye.value?.measure?.();
+ _e.value?.measure?.();
} catch (e) {
console.debug?.(e);
}
@@ -16176,34 +16183,34 @@ var Sf = {
} catch (e) {
console.debug?.(e), c = 0;
try {
- ye.value?.measure?.();
+ _e.value?.measure?.();
} catch (e) {
console.debug?.(e);
}
}
}
- function it() {
- nt(), requestAnimationFrame(() => {
+ function et() {
+ Qe(), requestAnimationFrame(() => {
requestAnimationFrame(() => {
- nt(), st();
+ Qe(), it();
});
}), setTimeout(() => {
- nt(), st();
+ Qe(), it();
}, 150);
}
- function at(e) {
+ function nt(e) {
if (!e || !n.virtualize) return () => {};
let t = () => {
- ge(e);
+ me(e);
};
e.addEventListener("scroll", t, { passive: !0 });
try {
requestAnimationFrame(() => {
- t(), st();
+ t(), it();
});
} catch {
setTimeout(() => {
- t(), st();
+ t(), it();
}, 0);
}
return () => {
@@ -16216,13 +16223,13 @@ var Sf = {
}
mn(w, (e) => {
try {
- Ze?.();
+ Je?.();
} catch (e) {
console.debug?.(e);
}
- Ze = at(e);
+ Je = nt(e);
}, { immediate: !0 });
- function ot(e) {
+ function rt(e) {
let t = Number(e?.clientHeight || 0) || 0;
if (t > 0) return t;
let n = Number(r.value?.clientHeight || 0) || 0;
@@ -16233,43 +16240,43 @@ var Sf = {
return 0;
}
}
- async function st() {
- if (!n.virtualize || !de.value || f.loading || f.done) return;
+ async function it() {
+ if (!n.virtualize || !ue.value || f.loading || f.done) return;
let e = w.value;
if (!e) return;
- let t = Array.isArray(f.assets) ? f.assets.length : 0, r = `${t}::${ue.value}`;
- if (!Qe && !(r === tt && Date.now() - et < 500) && (await Nn(), (Number(e.scrollHeight || 0) || 0) <= ot(e) + 40)) {
+ let t = Array.isArray(f.assets) ? f.assets.length : 0, r = `${t}::${le.value}`;
+ if (!Ye && !(r === Ze && Date.now() - Xe < 500) && (await Nn(), (Number(e.scrollHeight || 0) || 0) <= rt(e) + 40)) {
let e = t;
- Qe = Promise.resolve(O.loadNextPage()).catch((e) => console.debug?.(e)).finally(() => {
+ Ye = Promise.resolve(O.loadNextPage()).catch((e) => console.debug?.(e)).finally(() => {
let t = Array.isArray(f.assets) ? f.assets.length : 0;
- et = Date.now(), tt = t === e ? r : "", Qe = null, setTimeout(() => {
- st();
+ Xe = Date.now(), Ze = t === e ? r : "", Ye = null, setTimeout(() => {
+ it();
}, 0);
});
}
}
- mn(() => `${Array.isArray(f.assets) ? f.assets.length : 0}::${ue.value}::${f.loading}::${f.done}`, () => {
- st();
+ mn(() => `${Array.isArray(f.assets) ? f.assets.length : 0}::${le.value}::${f.loading}::${f.done}`, () => {
+ it();
}, { flush: "post" });
- function ct(e) {
+ function at(e) {
if (!(!e || !n.virtualize)) try {
- ye.value.measureElement(e);
+ _e.value.measureElement(e);
} catch (e) {
console.debug?.(e);
}
}
- function lt() {
+ function ot() {
return {
- width: `${pe.value}px`,
- flex: `0 0 ${pe.value}px`,
- minWidth: `${pe.value}px`
+ width: `${fe.value}px`,
+ flex: `0 0 ${fe.value}px`,
+ minWidth: `${fe.value}px`
};
}
- function ut(e) {
- return Se.value.get(e) || null;
+ function st(e) {
+ return be.value.get(e) || null;
}
- function ft(e) {
- let t = ut(e);
+ function ct(e) {
+ let t = st(e);
return {
position: "absolute",
left: "0",
@@ -16277,24 +16284,24 @@ var Sf = {
transform: `translateY(${Number(t?.start || 0)}px)`,
width: "100%",
display: "flex",
- gap: `${fe.value}px`,
- paddingBottom: `${fe.value}px`,
+ gap: `${de.value}px`,
+ paddingBottom: `${de.value}px`,
boxSizing: "border-box"
};
}
- function pt() {
+ function lt() {
return {
display: "flex",
- gap: `${fe.value}px`,
- paddingBottom: `${fe.value}px`,
+ gap: `${de.value}px`,
+ paddingBottom: `${de.value}px`,
boxSizing: "border-box"
};
}
- function mt() {
- a.value += 1, n.applyDefaultSettingsClasses && r.value && Ir(r.value);
+ function V() {
+ a.value += 1, n.applyDefaultSettingsClasses && r.value && Lr(r.value);
}
return mn(() => n.applyDefaultSettingsClasses, () => {
- r.value && n.applyDefaultSettingsClasses && Ir(r.value);
+ r.value && n.applyDefaultSettingsClasses && Lr(r.value);
}, { immediate: !0 }), yn(() => {
try {
r.value?._mjrPrimaryPointerSelectionUnbind?.();
@@ -16307,12 +16314,12 @@ var Sf = {
console.debug?.(e);
}
try {
- Fe?.disconnect?.();
+ R?.disconnect?.();
} catch (e) {
console.debug?.(e);
}
try {
- Ze?.();
+ Je?.();
} catch (e) {
console.debug?.(e);
}
@@ -16328,23 +16335,23 @@ var Sf = {
console.debug?.(e);
}
try {
- Le?.();
+ Ne?.();
} catch (e) {
console.debug?.(e);
}
- Le = null;
+ Ne = null;
try {
- window.removeEventListener("mjr-settings-changed", mt), Re = !1;
+ window.removeEventListener("mjr-settings-changed", V), Pe = !1;
} catch (e) {
console.debug?.(e);
}
try {
- window.removeEventListener("mjr:keepalive-attached", it);
+ window.removeEventListener("mjr:keepalive-attached", et);
} catch (e) {
console.debug?.(e);
}
}), mn(r, (e) => {
- e && (Re ||= (window.addEventListener("mjr-settings-changed", mt), window.addEventListener("mjr:keepalive-attached", it), !0));
+ e && (Pe ||= (window.addEventListener("mjr-settings-changed", V), window.addEventListener("mjr:keepalive-attached", et), !0));
}, { immediate: !0 }), t({
get gridContainer() {
return r.value;
@@ -16400,7 +16407,7 @@ var Sf = {
dispose() {
return O.dispose();
}
- }), (t, n) => (H(), G("div", {
+ }), (t, n) => (W(), q("div", {
ref_key: "gridContainerRef",
ref: r,
class: "mjr-grid",
@@ -16411,24 +16418,24 @@ var Sf = {
"min-height": "100%"
}
}, [
- J(f).loading && !J(f).assets.length ? (H(), G("div", Sf, [W("div", Cf, [W("div", wf, [(H(!0), G(In, null, vn(Ee.value, (e, t) => (H(), G("div", {
+ X(f).loading && !X(f).assets.length ? (W(), q("div", wf, [K("div", Tf, [K("div", Ef, [(W(!0), q(Ln, null, vn(we.value, (e, t) => (W(), q("div", {
key: `skr-${t}`,
- style: An(Oe.value)
- }, [(H(!0), G(In, null, vn(e, (e) => (H(), G("div", {
+ style: An(Ee.value)
+ }, [(W(!0), q(Ln, null, vn(e, (e) => (W(), q("div", {
key: `sk-${e}`,
class: "mjr-grid-skeleton-card",
- style: An(ke.value)
- }, [W("div", {
+ style: An(De.value)
+ }, [K("div", {
class: "mjr-grid-skeleton-thumb mjr-grid-skeleton-shimmer",
- style: An(Ae.value)
- }, null, 4), W("div", { style: An(Ne.value) }, [W("div", {
+ style: An(Oe.value)
+ }, null, 4), K("div", { style: An(je.value) }, [K("div", {
class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--title mjr-grid-skeleton-shimmer",
- style: An(je.value)
- }, null, 4), W("div", {
+ style: An(ke.value)
+ }, null, 4), K("div", {
class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--meta mjr-grid-skeleton-shimmer",
- style: An(Me.value)
- }, null, 4)], 4)], 4))), 128))], 4))), 128))]), W("div", Tf, q(J(f).loadingMessage || "Loading assets..."), 1)])])) : Y("", !0),
- J(f).statusMessage && !J(f).assets.length && !J(f).loading ? (H(), G("div", {
+ style: An(Ae.value)
+ }, null, 4)], 4)], 4))), 128))], 4))), 128))]), K("div", Df, Y(X(f).loadingMessage || "Loading assets..."), 1)])])) : In("", !0),
+ X(f).statusMessage && !X(f).assets.length && !X(f).loading ? (W(), q("div", {
key: 1,
class: "mjr-grid-message",
style: An({
@@ -16443,34 +16450,34 @@ var Sf = {
pointerEvents: "none",
fontSize: "14px",
lineHeight: "1.4",
- color: J(f).statusError ? "var(--error-text, #f44336)" : "var(--muted-text, #bdbdbd)",
+ color: X(f).statusError ? "var(--error-text, #f44336)" : "var(--muted-text, #bdbdbd)",
background: "rgba(0, 0, 0, 0.35)"
})
- }, q(J(f).statusMessage), 5)) : Y("", !0),
- e.virtualize ? (H(), G("div", {
+ }, Y(X(f).statusMessage), 5)) : In("", !0),
+ e.virtualize ? (W(), q("div", {
key: 2,
style: An({
- height: `${J(xe)}px`,
+ height: `${X(ye)}px`,
position: "relative",
width: "100%",
gridColumn: "1 / -1"
})
- }, [(H(!0), G(In, null, vn(J(be), (e) => (H(), G("div", {
+ }, [(W(!0), q(Ln, null, vn(X(ve), (e) => (W(), q("div", {
key: e.key,
ref_for: !0,
- ref: ct,
+ ref: at,
"data-index": e.index,
- style: An(ft(e.index))
- }, [e.items.length ? (H(!0), G(In, { key: 0 }, vn(e.items, (e) => (H(), G(In, { key: String(e.id) }, [N(e) ? (H(), hn(hu, {
+ style: An(ct(e.index))
+ }, [e.items.length ? (W(!0), q(Ln, { key: 0 }, vn(e.items, (e) => (W(), q(Ln, { key: String(e.id) }, [N(e) ? (W(), hn(_u, {
key: 0,
ref_for: !0,
- ref: Ge(e),
+ ref: He(e),
asset: e,
selected: M(e),
- style: An(lt()),
- onMousedown: Fn((t) => Ye(t, e), ["left"]),
- onClick: (t) => Je(t, e),
- onDblclick: Fn((t) => Xe(e), ["stop"])
+ style: An(ot()),
+ onMousedown: Fn((t) => Ke(t, e), ["left"]),
+ onClick: (t) => Ge(t, e),
+ onDblclick: Fn((t) => qe(e), ["stop"])
}, null, 8, [
"asset",
"selected",
@@ -16478,46 +16485,46 @@ var Sf = {
"onMousedown",
"onClick",
"onDblclick"
- ])) : (H(), G("div", {
+ ])) : (W(), q("div", {
key: 1,
ref_for: !0,
- ref: Ge(e),
+ ref: He(e),
class: Mn(["mjr-asset-card mjr-card", {
"is-selected": M(e),
- "mjr-live-placeholder": ee(e)
+ "mjr-live-placeholder": F(e)
}]),
role: "button",
tabindex: "0",
draggable: "true",
- style: An(lt()),
+ style: An(ot()),
"data-mjr-asset-id": String(e.id ?? ""),
"data-mjr-filename-key": String(e.filename || "").toLowerCase(),
"data-mjr-ext": A(e),
"data-mjr-stem": j(e),
"data-mjr-kind": String(e.kind || ""),
- "data-mjr-live-placeholder": ee(e) ? "true" : void 0,
- "data-mjr-stacked": F(e) ? "true" : void 0,
- "data-mjr-stack-count": F(e) ? String(e.stack_asset_count || 0) : void 0,
+ "data-mjr-live-placeholder": F(e) ? "true" : void 0,
+ "data-mjr-stacked": P(e) ? "true" : void 0,
+ "data-mjr-stack-count": P(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": M(e) ? "true" : "false",
- onMousedown: Fn((t) => Ye(t, e), ["left"]),
- onClick: (t) => Je(t, e),
- onDblclick: Fn((t) => Xe(e), ["stop"])
- }, [V(du, { asset: e }, null, 8, ["asset"])], 46, Df))], 64))), 128)) : Y("", !0)], 12, Ef))), 128))], 4)) : (H(), G("div", Of, [(H(!0), G(In, null, vn(he.value, (e) => (H(), G("div", {
+ onMousedown: Fn((t) => Ke(t, e), ["left"]),
+ onClick: (t) => Ge(t, e),
+ onDblclick: Fn((t) => qe(e), ["stop"])
+ }, [U(pu, { asset: e }, null, 8, ["asset"])], 46, kf))], 64))), 128)) : In("", !0)], 12, Of))), 128))], 4)) : (W(), q("div", Af, [(W(!0), q(Ln, null, vn(L.value, (e) => (W(), q("div", {
key: e.index,
- style: An(pt())
- }, [(H(!0), G(In, null, vn(e.items, (e) => (H(), G(In, { key: String(e.id) }, [N(e) ? (H(), hn(hu, {
+ style: An(lt())
+ }, [(W(!0), q(Ln, null, vn(e.items, (e) => (W(), q(Ln, { key: String(e.id) }, [N(e) ? (W(), hn(_u, {
key: 0,
ref_for: !0,
- ref: Ge(e),
+ ref: He(e),
asset: e,
selected: M(e),
- style: An(lt()),
- onMousedown: Fn((t) => Ye(t, e), ["left"]),
- onClick: (t) => Je(t, e),
- onDblclick: Fn((t) => Xe(e), ["stop"])
+ style: An(ot()),
+ onMousedown: Fn((t) => Ke(t, e), ["left"]),
+ onClick: (t) => Ge(t, e),
+ onDblclick: Fn((t) => qe(e), ["stop"])
}, null, 8, [
"asset",
"selected",
@@ -16525,35 +16532,35 @@ var Sf = {
"onMousedown",
"onClick",
"onDblclick"
- ])) : (H(), G("div", {
+ ])) : (W(), q("div", {
key: 1,
ref_for: !0,
- ref: Ge(e),
+ ref: He(e),
class: Mn(["mjr-asset-card mjr-card", {
"is-selected": M(e),
- "mjr-live-placeholder": ee(e)
+ "mjr-live-placeholder": F(e)
}]),
role: "button",
tabindex: "0",
draggable: "true",
- style: An(lt()),
+ style: An(ot()),
"data-mjr-asset-id": String(e.id ?? ""),
"data-mjr-filename-key": String(e.filename || "").toLowerCase(),
"data-mjr-ext": A(e),
"data-mjr-stem": j(e),
"data-mjr-kind": String(e.kind || ""),
- "data-mjr-live-placeholder": ee(e) ? "true" : void 0,
- "data-mjr-stacked": F(e) ? "true" : void 0,
- "data-mjr-stack-count": F(e) ? String(e.stack_asset_count || 0) : void 0,
+ "data-mjr-live-placeholder": F(e) ? "true" : void 0,
+ "data-mjr-stacked": P(e) ? "true" : void 0,
+ "data-mjr-stack-count": P(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": M(e) ? "true" : "false",
- onMousedown: Fn((t) => Ye(t, e), ["left"]),
- onClick: (t) => Je(t, e),
- onDblclick: Fn((t) => Xe(e), ["stop"])
- }, [V(du, { asset: e }, null, 8, ["asset"])], 46, kf))], 64))), 128))], 4))), 128))])),
- W("div", {
+ onMousedown: Fn((t) => Ke(t, e), ["left"]),
+ onClick: (t) => Ge(t, e),
+ onDblclick: Fn((t) => qe(e), ["stop"])
+ }, [U(pu, { asset: e }, null, 8, ["asset"])], 46, jf))], 64))), 128))], 4))), 128))])),
+ K("div", {
ref_key: "infiniteSentinelRef",
ref: k,
"aria-hidden": "true",
@@ -16566,8 +16573,8 @@ var Sf = {
}, null, 512)
], 512));
}
-}, [["__scopeId", "data-v-ddf2bbab"]]), jf = 240, Mf = 120, Nf = 80;
-function Pf(e) {
+}, [["__scopeId", "data-v-ddf2bbab"]]), Nf = 240, Pf = 120, Ff = 80;
+function If(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 {
@@ -16578,7 +16585,7 @@ function Pf(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 Ff(e) {
+function Lf(e) {
try {
if (typeof e?._mjrGetRenderedCards == "function") {
let t = e._mjrGetRenderedCards();
@@ -16593,11 +16600,11 @@ function Ff(e) {
return console.debug?.(e), [];
}
}
-function If(e, t, n = "") {
+function Rf(e, t, n = "") {
let r = Array.isArray(t) ? t.map(String).filter(Boolean) : [];
- return Xe(e, r, { activeId: n || r[0] || "" }, Ff);
+ return Qe(e, r, { activeId: n || r[0] || "" }, Lf);
}
-function Lf(e) {
+function zf(e) {
let t = e?.grid;
if (!t) return;
let n = (e) => {
@@ -16613,19 +16620,19 @@ function Lf(e) {
} catch (e) {
console.debug?.(e);
}
- let a = Ff(t), o = a.indexOf(n), s = Ke(t);
+ let a = Lf(t), o = a.indexOf(n), s = qe(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);
- If(t, a.slice(r, s + 1).map((e) => String(e?.dataset?.mjrAssetId || "").trim()).filter(Boolean), i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation();
+ Rf(t, a.slice(r, s + 1).map((e) => String(e?.dataset?.mjrAssetId || "").trim()).filter(Boolean), i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation();
return;
}
if (e.ctrlKey || e.metaKey) {
s.has(i) ? s.delete(i) : s.add(i);
let n = Array.from(s);
- If(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation();
+ Rf(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation();
return;
}
- If(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o);
+ Rf(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o);
try {
n.focus?.({ preventScroll: !0 });
} catch (e) {
@@ -16641,23 +16648,23 @@ function Lf(e) {
}
};
}
-var Rf = {
+var Bf = {
hosts: /* @__PURE__ */ new Set(),
pendingAssets: /* @__PURE__ */ new Map()
};
-function zf(e) {
- if (!I.EXECUTION_GROUPING_ENABLED) return ep(e);
+function Vf(e) {
+ if (!z.EXECUTION_GROUPING_ENABLED) return np(e);
let t = String(e?.stack_id || "").trim();
if (t) return `stack:${t}`;
let n = String(e?.job_id || "").trim();
- return n ? `job:${n}` : ep(e);
+ return n ? `job:${n}` : np(e);
}
-function Bf(e) {
+function Hf(e) {
let t = /* @__PURE__ */ new Map();
for (let n of Array.isArray(e) ? e : []) {
- let e = np(n);
+ let e = ip(n);
if (!e) continue;
- let r = zf(e), i = t.get(r);
+ let r = Vf(e), i = t.get(r);
i || (i = {
key: r,
members: []
@@ -16682,16 +16689,16 @@ function Bf(e) {
return (Number(t?.mtime || t?.created_at || 0) || 0) - n;
}), n;
}
-function Vf(e) {
+function Uf(e) {
return Array.from(e?.assetsByKey?.values?.() || []);
}
-function Hf(e) {
+function Wf(e) {
return String(e ?? "").trim().toLowerCase();
}
-function Uf(e) {
+function Gf(e) {
return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:");
}
-function Wf(e) {
+function Kf(e) {
if (!e || typeof e != "object") return e;
try {
delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder;
@@ -16700,19 +16707,19 @@ function Wf(e) {
}
return e;
}
-function Gf(e) {
+function qf(e) {
if (!e || typeof e != "object") return "";
- let t = Hf(e?.type || e?.source || "output"), n = Hf(e?.root_id || e?.custom_root_id || ""), r = Hf(e?.subfolder || ""), i = Hf(e?.filename || "");
+ let t = Wf(e?.type || e?.source || "output"), n = Wf(e?.root_id || e?.custom_root_id || ""), r = Wf(e?.subfolder || ""), i = Wf(e?.filename || "");
if (i) return `${t}|${n}|${r}|${i}`;
- let a = Hf(e?.filepath || e?.path || e?.fullpath || e?.full_path || "");
+ let a = Wf(e?.filepath || e?.path || e?.fullpath || e?.full_path || "");
return a ? `${t}|${n}|path|${a}` : "";
}
-function Kf(e, t) {
- let n = np(t);
+function Jf(e, t) {
+ let n = ip(t);
if (!e || typeof e.set != "function" || !n) return null;
- let r = ep(n), i = Gf(n), a = "";
+ let r = np(n), i = qf(n), a = "";
if (i) {
- for (let [t, n] of e.entries()) if (Gf(n) === i) {
+ for (let [t, n] of e.entries()) if (qf(n) === i) {
a = t;
break;
}
@@ -16721,17 +16728,17 @@ function Kf(e, t) {
...o,
...n
} : n;
- return Uf(n) || Wf(s), a && a !== r && e.delete(a), e.set(r, s), s;
+ return Gf(n) || Kf(s), a && a !== r && e.delete(a), e.set(r, s), s;
}
-function qf(e, t) {
- return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), Kf(e.assetsByKey, t)) : null;
+function Yf(e, t) {
+ return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), Jf(e.assetsByKey, t)) : null;
}
-function Jf(e) {
+function Xf(e) {
!e?.grid || !e.loaded || (e._renderTimer ||= setTimeout(() => {
- e._renderTimer = null, $f(e);
- }, Nf));
+ e._renderTimer = null, tp(e);
+ }, Ff));
}
-function Yf(e, t, n = 0) {
+function Zf(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();
@@ -16741,52 +16748,52 @@ function Yf(e, t, n = 0) {
} catch (e) {
console.debug?.(e);
}
- If(e.grid, [o], o);
+ Rf(e.grid, [o], o);
}
- to({
+ ro({
assets: r,
index: i
});
}
-function Xf(e, t) {
+function Qf(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);
let i = document.createElement("div");
- i.className = "mjr-feed-group-popover-title", i.textContent = r("bottomFeed.groupTitle", "Generation group"), i.style.cssText = "font-size:12px; font-weight:700; opacity:0.92; margin-bottom:8px;", n.appendChild(i);
- let a = document.createElement("div");
- a.className = "mjr-feed-group-popover-grid", a.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 o = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets : [];
- for (let r = 0; r < o.length; r += 1) {
- let i = o[r], s = Pf(i);
+ 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 = If(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), Yf(e, t, r);
- }), a.appendChild(s);
+ i.preventDefault(), i.stopPropagation(), e.popoverManager?.close?.(n), Zf(e, t, r);
+ }), i.appendChild(s);
}
- return n.appendChild(a), e.root.appendChild(n), n;
+ return n.appendChild(i), e.root.appendChild(n), n;
}
-function Zf(e, t, n) {
+function $f(e, t, n) {
if (!t || !n) return;
- let i = Number(n?._mjrFeedGroupCount || 0) || 0;
- if (i <= 1 || (t.dataset.mjrFeedGrouped = "true", t.dataset.mjrFeedGroupCount = String(i), t.dataset.mjrStacked = "true", t.dataset.mjrStackCount = String(i), t.querySelector(".mjr-feed-group-button"))) return;
- let a = document.createElement("button");
- a.type = "button", a.className = "mjr-feed-group-button", a.title = r("bottomFeed.groupOpen", "Show other assets from this generation"), a.setAttribute("aria-label", `${i} assets`);
+ 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`);
+ 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-icon pi pi-clone", a.appendChild(o);
- let s = document.createElement("span");
- s.className = "mjr-feed-group-button-count", s.textContent = String(i), a.appendChild(s), a.style.cssText = "position:absolute; top:34px; right:6px; z-index:11;", pc(a);
- let c = Xf(e, n);
- a.addEventListener("click", (t) => {
- t.preventDefault(), t.stopPropagation(), e.popoverManager?.toggle?.(c, a);
- }), t.appendChild(a);
+ 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;", hc(i);
+ let s = Qf(e, n);
+ i.addEventListener("click", (t) => {
+ t.preventDefault(), t.stopPropagation(), e.popoverManager?.toggle?.(s, i);
+ }), t.appendChild(i);
}
-function Qf(e, t) {
+function ep(e, t) {
let n = new Map((Array.isArray(t) ? t : []).map((e) => [String(e?.id || "").trim(), e]).filter(([e]) => !!e));
- for (let t of Ff(e?.grid)) {
+ for (let t of Lf(e?.grid)) {
let r = String(t?.dataset?.mjrAssetId || "").trim(), i = n.get(r);
- i && Zf(e, t, i);
+ i && $f(e, t, i);
}
}
-async function $f(e) {
+async function tp(e) {
if (!e?.grid) return;
try {
e.popoverManager?.closeAll?.();
@@ -16799,19 +16806,19 @@ async function $f(e) {
} catch (e) {
console.debug?.(e);
}
- let t = Bf(Vf(e)), n = await Vr(e.grid, t, {
- title: r("bottomFeed.title", "Generated Feed"),
+ let t = Hf(Uf(e)), n = await Hr(e.grid, t, {
+ title: R("bottomFeed.title", "Generated Feed"),
reset: !0
});
- Qf(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";
+ ep(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";
}
-function ep(e) {
+function np(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 tp(e) {
+function rp(e) {
let t = String(e || "").split(".").pop()?.toUpperCase() ?? "", n = new Set([
"MP4",
"WEBM",
@@ -16838,41 +16845,41 @@ function tp(e) {
]);
return n.has(t) ? "video" : r.has(t) ? "audio" : i.has(t) ? "model3d" : "image";
}
-function np(e) {
+function ip(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 ||= tp(t.ext || t.filename || ""), t;
+ return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= rp(t.ext || t.filename || ""), t;
}
-function rp(e) {
- let t = np(e);
+function ap(e) {
+ let t = ip(e);
if (!t) return null;
- let n = ep(t);
+ let n = np(t);
if (!n) return null;
- let r = Gf(t), i = null;
- if (r) for (let [e, t] of Rf.pendingAssets.entries()) e !== n && Gf(t) === r && (i = t, Rf.pendingAssets.delete(e));
- let a = Rf.pendingAssets.get(n) || i || null, o = a ? {
+ let r = qf(t), i = null;
+ if (r) for (let [e, t] of Bf.pendingAssets.entries()) e !== n && qf(t) === r && (i = t, Bf.pendingAssets.delete(e));
+ let a = Bf.pendingAssets.get(n) || i || null, o = a ? {
...a,
...t
} : t;
- if (Uf(t) || Wf(o), Rf.pendingAssets.set(n, o), Rf.pendingAssets.size > 64) {
- let e = Rf.pendingAssets.keys().next().value;
- e && Rf.pendingAssets.delete(e);
+ if (Gf(t) || Kf(o), Bf.pendingAssets.set(n, o), Bf.pendingAssets.size > 64) {
+ let e = Bf.pendingAssets.keys().next().value;
+ e && Bf.pendingAssets.delete(e);
}
return o;
}
-function ip() {
- return Array.from(Rf.pendingAssets.values());
+function op() {
+ return Array.from(Bf.pendingAssets.values());
}
-async function ap(e) {
+async function sp(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 = R("bottomFeed.loading", "Loading recent assets...");
try {
e.assetsByKey = /* @__PURE__ */ new Map();
let t = [], n = 0;
- for (; n < jf;) {
- let r = await P(Ae({
+ for (; n < Nf;) {
+ let r = await ne(de({
q: "*",
- limit: Math.min(Mf, jf - n),
+ limit: Math.min(Pf, Nf - n),
offset: n,
scope: "output",
sort: "mtime_desc",
@@ -16882,41 +16889,41 @@ async function ap(e) {
let i = Array.isArray(r?.data?.assets) ? r.data.assets : [];
if (!i.length) break;
for (let n of i) {
- let r = qf(e, n);
+ let r = Yf(e, n);
r && t.push(r);
}
- if (i.length < Mf) break;
+ if (i.length < Pf) break;
n += i.length;
}
- for (let t of ip()) qf(e, t);
- Rf.pendingAssets.clear();
- let i = Bf(Vf(e)), a = await Vr(e.grid, i, {
- title: r("bottomFeed.title", "Generated Feed"),
+ for (let t of op()) Yf(e, t);
+ Bf.pendingAssets.clear();
+ let r = Hf(Uf(e)), i = await Hr(e.grid, r, {
+ title: R("bottomFeed.title", "Generated Feed"),
reset: !0
});
- Qf(e, i), Number(a?.count || 0) <= 0 ? (e.empty.textContent = r("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none";
+ ep(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";
} 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 = R("bottomFeed.loadFailed", "Failed to load generated assets."), e.empty.style.display = "";
} finally {
e.loaded = !0;
}
}
}
-async function op() {
- for (let e of Array.from(Rf.hosts)) try {
- await ap(e);
+async function cp() {
+ for (let e of Array.from(Bf.hosts)) try {
+ await sp(e);
} catch (e) {
console.debug?.(e);
}
}
-function sp() {
- op();
+function lp() {
+ cp();
}
-function cp(e) {
+function up(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 = 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;
}
-function lp(e) {
+function dp(e) {
if (!e) return;
let t = [
e,
@@ -16934,14 +16941,14 @@ function lp(e) {
console.debug?.(e);
}
}
-function up(e) {
+function fp(e) {
if (!e) return;
let t = (t, n) => {
n ? e.classList.add(t) : e.classList.remove(t);
};
- t("mjr-feed-show-info", I.FEED_SHOW_INFO), t("mjr-feed-show-filename", I.FEED_SHOW_FILENAME), t("mjr-feed-show-dimensions", I.FEED_SHOW_DIMENSIONS), t("mjr-feed-show-date", I.FEED_SHOW_DATE), t("mjr-feed-show-gentime", I.FEED_SHOW_GENTIME), t("mjr-show-hover-info", I.GRID_SHOW_HOVER_INFO), t("mjr-feed-show-dot", I.FEED_SHOW_WORKFLOW_DOT), t("mjr-feed-show-badges-ext", I.FEED_SHOW_BADGES_EXTENSION), t("mjr-feed-show-badges-rating", I.FEED_SHOW_BADGES_RATING), t("mjr-feed-show-badges-tags", I.FEED_SHOW_BADGES_TAGS);
+ 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);
}
-function dp(e, t = null) {
+function pp(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 = () => {
@@ -16953,20 +16960,20 @@ function dp(e, t = null) {
}, i = () => {
r();
try {
- window.dispatchEvent(new Event(B.MFV_OPEN));
+ window.dispatchEvent(new Event(H.MFV_OPEN));
} catch (e) {
console.debug?.(e);
}
}, a = document.createElement("div");
n.appendChild(a), e.root.appendChild(n);
- let { app: o } = It(Af, {
+ let { app: o } = Rt(Mf, {
scrollElement: n,
virtualize: !1,
applyDefaultSettingsClasses: !1,
emitWindowSelectionEvents: !0,
onCardRendered: (t, n) => {
try {
- Zf(e, t, n);
+ $f(e, t, n);
} catch (e) {
console.debug?.(e);
}
@@ -16977,7 +16984,7 @@ function dp(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(I.FEED_GRID_MIN_SIZE || I.GRID_MIN_SIZE || 120);
+ let l = Number(z.FEED_GRID_MIN_SIZE || z.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)) {
@@ -16988,7 +16995,7 @@ function dp(e, t = null) {
if (t === "c") {
e.preventDefault?.(), e.stopPropagation?.(), r();
try {
- nt.open().then(() => nt.toggleCompareAB());
+ it.open().then(() => it.toggleCompareAB());
} catch (e) {
console.debug?.(e);
}
@@ -17007,19 +17014,19 @@ function dp(e, t = null) {
}
};
}
-function fp(e) {
+function mp(e) {
let t = e?.grid;
if (!t) return [];
- let n = Ke(t);
- return n.size ? Vf(e).filter((e) => n.has(String(e?.id || ""))) : [];
+ let n = qe(t);
+ return n.size ? Uf(e).filter((e) => n.has(String(e?.id || ""))) : [];
}
-function pp(e) {
+function hp(e) {
let t = e?.grid;
if (!t) return null;
let n = String(t.dataset?.mjrSelectedAssetId || "").trim();
- return n ? Vf(e).find((e) => String(e?.id || "") === n) || null : fp(e)[0] || null;
+ return n ? Uf(e).find((e) => String(e?.id || "") === n) || null : mp(e)[0] || null;
}
-function mp(e) {
+function gp(e) {
let t = String(e ?? "");
try {
if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t);
@@ -17028,48 +17035,48 @@ function mp(e) {
}
return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1");
}
-function hp(e) {
+function _p(e) {
let t = e?.grid;
if (!t) return;
let n = () => {
try {
- Jf(e);
+ Xf(e);
} catch (e) {
console.debug?.(e);
}
};
- e.keyboard = lo({
+ e.keyboard = fo({
gridContainer: t,
- getState: () => ({ assets: Bf(Vf(e)) }),
- getSelectedAssets: () => fp(e),
- getActiveAsset: () => pp(e),
+ getState: () => ({ assets: Hf(Uf(e)) }),
+ getSelectedAssets: () => mp(e),
+ getActiveAsset: () => hp(e),
onOpenTagsEditor: (e) => {
- let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${mp(e?.id || "")}"]`) || null, i = null;
+ let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${gp(e?.id || "")}"]`) || null, i = null;
try {
i = r?.getBoundingClientRect?.() || t.getBoundingClientRect();
} catch (e) {
console.debug?.(e);
}
- ac(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);
+ sc(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 = fc({
+ }), e.keyboard.bind(), e.ratingHotkeys = mc({
gridContainer: t,
- createRatingBadge: Ct
+ createRatingBadge: dt
}), e.ratingHotkeys.bind();
}
-var gp = 60, _p = 600, vp = 10;
-function yp(e, t) {
- let n = Math.max(gp, Math.min(_p, Math.round(Number(t) / vp) * vp));
+var vp = 60, yp = 600, bp = 10;
+function xp(e, t) {
+ let n = Math.max(vp, Math.min(yp, Math.round(Number(t) / bp) * bp));
if (e?.grid) try {
e.grid.style.setProperty("--mjr-grid-min-size", `${n}px`);
} catch (e) {
console.debug?.(e);
}
- I.FEED_GRID_MIN_SIZE = n;
+ z.FEED_GRID_MIN_SIZE = n;
try {
- let e = Et();
- e.feed.minSize = n, ft(e), wt(e);
+ let e = pt();
+ e.feed.minSize = n, _t(e), Ot(e);
} catch (e) {
console.debug?.(e);
}
@@ -17086,27 +17093,27 @@ function yp(e, t) {
}
return n;
}
-function bp(e) {
- let t = Math.max(gp, Number(I.FEED_GRID_MIN_SIZE || 120) || 120), n = document.createElement("div");
+function Sp(e) {
+ let t = Math.max(vp, Number(z.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 i = document.createElement("span");
- i.textContent = r("bottomFeed.cardSize", "Cards:"), i.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; flex-shrink:0;", n.appendChild(i);
- let a = document.createElement("button");
- a.type = "button", a.className = "mjr-feed-size-btn", a.textContent = "-", a.title = r("bottomFeed.cardSizeDecrease", "Decrease card size"), a.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(a);
- let o = document.createElement("input");
- o.type = "range", o.className = "mjr-feed-size-slider", o.min = String(gp), o.max = String(_p), o.step = String(vp), o.value = String(t), o.title = r("bottomFeed.cardSizeSlider", "Card size"), o.style.cssText = "flex:1 1 auto; min-width:40px; max-width:180px; height:4px; cursor:pointer; accent-color:var(--mjr-accent,#64b5f6);", n.appendChild(o);
- let s = document.createElement("button");
- s.type = "button", s.className = "mjr-feed-size-btn", s.textContent = "+", s.title = r("bottomFeed.cardSizeIncrease", "Increase card size"), s.style.cssText = a.style.cssText, n.appendChild(s);
- let c = document.createElement("span");
- c.className = "mjr-feed-size-display", c.textContent = `${t}px`, c.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(c), a.addEventListener("click", () => {
- yp(e, Number(o.value) - vp);
- }), s.addEventListener("click", () => {
- yp(e, Number(o.value) + vp);
- }), o.addEventListener("input", () => {
- yp(e, Number(o.value));
+ 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);
+ 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);
+ let a = document.createElement("input");
+ a.type = "range", a.className = "mjr-feed-size-slider", a.min = String(vp), a.max = String(yp), a.step = String(bp), 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);
+ 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);
+ 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", () => {
+ xp(e, Number(a.value) - bp);
+ }), o.addEventListener("click", () => {
+ xp(e, Number(a.value) + bp);
+ }), a.addEventListener("input", () => {
+ xp(e, Number(a.value));
}), e.root.appendChild(n), e._sizeToolbar = n;
}
-function xp(e, t = {}) {
+function Cp(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 = {
@@ -17118,13 +17125,13 @@ function xp(e, t = {}) {
assetsByKey: /* @__PURE__ */ new Map(),
popoverManager: null
};
- bp(r), cp(r), dp(r, t.gridWrapper ?? null), Lf(r), r.popoverManager = ro(n), r._disposeContextMenu = oc({
+ Sp(r), up(r), pp(r, t.gridWrapper ?? null), zf(r), r.popoverManager = ao(n), r._disposeContextMenu = cc({
gridContainer: r.grid,
getState: () => ({ scope: "output" })
- }), hp(r), up(r.grid);
+ }), _p(r), fp(r.grid);
let i = () => {
try {
- up(r.grid);
+ fp(r.grid);
} catch (e) {
console.debug?.(e);
}
@@ -17137,26 +17144,26 @@ function xp(e, t = {}) {
}
}, r;
}
-function Sp(e) {
- let t = rp(e);
- if (t) for (let e of Array.from(Rf.hosts)) try {
- if (!e?.grid || (qf(e, t), !e.loaded)) continue;
- e.empty.style.display = "none", Jf(e);
+function wp(e) {
+ let t = ap(e);
+ if (t) for (let e of Array.from(Bf.hosts)) try {
+ if (!e?.grid || (Yf(e, t), !e.loaded)) continue;
+ e.empty.style.display = "none", Xf(e);
} catch (e) {
console.debug?.(e);
}
}
-function Cp(e, t = {}) {
- lp(e);
- let n = xp(e, t);
+function Tp(e, t = {}) {
+ dp(e);
+ let n = Cp(e, t);
try {
e._mjrGeneratedFeedHost = n;
} catch (e) {
console.debug?.(e);
}
- return Rf.hosts.add(n), ap(n), n;
+ return Bf.hosts.add(n), sp(n), n;
}
-function wp(e) {
+function Ep(e) {
let t = e?._mjrGeneratedFeedHost || e || null;
if (!t) return;
let n = t.container || null;
@@ -17170,7 +17177,7 @@ function wp(e) {
}
console.debug?.(e);
}
- Rf.hosts.delete(t);
+ Bf.hosts.delete(t);
try {
t._disposeSelection?.();
} catch (e) {
@@ -17217,7 +17224,7 @@ function wp(e) {
console.debug?.(e);
}
try {
- Ur(t.grid);
+ Wr(t.grid);
} catch (e) {
console.debug?.(e);
}
@@ -17229,24 +17236,24 @@ function wp(e) {
}
//#endregion
//#region ui/features/stacks/executionAssetBuffer.ts
-function Tp(e) {
+function Dp(e) {
return String(e || "").trim();
}
-function Ep(e) {
+function Op(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 Dp() {
+function kp() {
let e = /* @__PURE__ */ new Map();
function t(t, n) {
- let r = Tp(t);
+ let r = Dp(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 = Ep(e);
+ let t = Op(e);
t && a.set(t, {
...a.get(t) || {},
...e || {}
@@ -17255,13 +17262,13 @@ function Dp() {
return Array.from(a.values());
}
function n(t) {
- let n = Tp(t);
+ let n = Dp(t);
if (!n) return [];
let r = e.get(n);
return e.delete(n), Array.from(r?.values?.() || []);
}
function r(t) {
- let n = Tp(t);
+ let n = Dp(t);
n && e.delete(n);
}
return {
@@ -17273,7 +17280,7 @@ function Dp() {
}
//#endregion
//#region ui/features/stacks/finalizeQueue.ts
-function Op({ defaultDelayMs: e = 900, postJob: t } = {}) {
+function Ap({ defaultDelayMs: e = 900, postJob: t } = {}) {
let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), i = !1;
async function a() {
if (!i) {
@@ -17311,27 +17318,27 @@ function Op({ defaultDelayMs: e = 900, postJob: t } = {}) {
}
//#endregion
//#region ui/features/stacks/liveAssetGate.ts
-function kp(e) {
+function jp(e) {
return String(e || "").trim();
}
-function Ap(e) {
+function Mp(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 jp(e, t) {
+function Np(e, t) {
return !t || String(e?.job_id || "").trim() === t ? e : {
...e || {},
job_id: t
};
}
-function Mp() {
+function Pp() {
let e = /* @__PURE__ */ new Map();
function t(t, { files: n = [], expectedCount: r = null } = {}) {
- let i = kp(t);
+ let i = jp(t);
if (!i) return;
let a = /* @__PURE__ */ new Set();
for (let e of Array.isArray(n) ? n : []) {
- let t = Ap(e);
+ let t = Mp(e);
t && a.add(t);
}
e.set(i, {
@@ -17341,13 +17348,13 @@ function Mp() {
});
}
function n(t) {
- let n = kp(t);
+ let n = jp(t);
n && e.delete(n);
}
function r(t) {
- let n = kp(t?.job_id);
+ let n = jp(t?.job_id);
if (n) return n;
- let r = Ap(t);
+ let r = Mp(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);
@@ -17360,7 +17367,7 @@ function Mp() {
jobId: "",
defer: !1
};
- let i = jp(t, n), a = e.get(n);
+ let i = Np(t, n), a = e.get(n);
if (!a) return {
detail: i,
jobId: n,
@@ -17383,20 +17390,20 @@ function Mp() {
}
//#endregion
//#region ui/features/stacks/executionRuntimeController.ts
-var Np = 2e3, Pp = 2e3, Fp = new Set([
+var Fp = 2e3, Ip = 2e3, Lp = new Set([
"DB_MAINTENANCE",
"TIMEOUT",
"NETWORK_ERROR",
"SERVICE_UNAVAILABLE"
-]), Ip = 8, Lp = 1200, Rp = 15e3, zp = 600 * 1e3, Bp = 500, Vp = 6, Hp = 3e4, Up = 500;
-function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) {
- let c = y({
- ttlMs: Np,
- maxSize: Pp
- }), l = y({
- ttlMs: zp,
- maxSize: Bp
- }), u = Math.max(0, Number(I.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = Dp(), p = Mp(), m = "", h = 0, g = null;
+]), Rp = 8, zp = 1200, Bp = 15e3, Vp = 600 * 1e3, Hp = 500, Up = 6, Wp = 3e4, Gp = 500;
+function Kp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) {
+ let c = oe({
+ ttlMs: Fp,
+ maxSize: Ip
+ }), l = oe({
+ ttlMs: Vp,
+ maxSize: Hp
+ }), u = Math.max(0, Number(z.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = kp(), p = Pp(), m = "", h = 0, g = null;
function _() {
try {
return typeof window > "u" ? !1 : window.__MJR_DEBUG_JOB_TRACKING__ === !0 ? !0 : String(window.localStorage?.getItem("mjr.debug.jobTracking") || "").trim() === "1";
@@ -17411,11 +17418,11 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
console.debug?.(e);
}
}
- function b() {
- return !!I.EXECUTION_GROUPING_ENABLED;
+ function y() {
+ return !!z.EXECUTION_GROUPING_ENABLED;
}
- function x() {
- let e = b();
+ function b() {
+ let e = y();
return {
groupingEnabled: e,
useExecutionBuffer: e,
@@ -17423,7 +17430,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
allowLiveStackFinalize: e
};
}
- function S(e = {}) {
+ function x(e = {}) {
v("stacks-updated", {
targeted_job_id: String(e?.targeted_job_id || ""),
stacks: Array.isArray(e?.stacks) ? e.stacks.map((e) => ({
@@ -17468,7 +17475,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
console.debug?.(e);
}
}
- let C = Op({
+ let S = Ap({
defaultDelayMs: 900,
async postJob(r) {
v("auto-stack:start", { job_id: r });
@@ -17484,18 +17491,18 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
v("auto-stack:done", {
job_id: r,
stacks: Array.isArray(i?.data?.stacks) ? i.data.stacks.length : 0
- }), S(i?.data || { targeted_job_id: r });
+ }), x(i?.data || { targeted_job_id: r });
} catch (e) {
n(e, "executionRuntime.execution_end.auto_stack");
}
}
});
- function w(e, t) {
+ function C(e, t) {
if (!e) return;
let n = Number(t) || Date.now();
l.set(String(e), n, { at: n }), l.prune();
}
- function T(e) {
+ function w(e) {
c.prune();
let t = [];
for (let n of e) {
@@ -17504,16 +17511,16 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
}
return t;
}
- function E(e) {
+ function T(e) {
let t = Math.max(1, Number(e) || 1), n = Math.min(6, t - 1);
- return Math.min(Rp, Lp * 2 ** n);
+ return Math.min(Bp, zp * 2 ** n);
}
- function D() {
+ function E() {
g &&= (clearTimeout(g), null);
}
- function O(e, t = u) {
+ function D(e, t = u) {
let r = Math.max(0, Number(t) || 0);
- D(), g = setTimeout(() => {
+ E(), g = setTimeout(() => {
g = null;
try {
e?.();
@@ -17522,11 +17529,11 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
}
}, r);
}
- function k(e) {
+ function O(e) {
let t = String(e?.code || "").trim().toUpperCase();
- return Fp.has(t);
+ return Lp.has(t);
}
- function A(r, i = 1, a = {}) {
+ function k(r, i = 1, a = {}) {
let o = Array.isArray(r) ? r : [];
if (!o.length) return;
let s = {
@@ -17539,9 +17546,9 @@ function Wp({ 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 (k(e) && i < Ip) {
- let e = E(i);
- setTimeout(() => A(o, i + 1, a), e);
+ if (O(e) && i < Rp) {
+ let e = T(i);
+ setTimeout(() => k(o, i + 1, a), e);
return;
}
try {
@@ -17553,7 +17560,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
}
}).catch((e) => n(e, "executionRuntime.executed.index"));
}
- function j(e = {}) {
+ function A(e = {}) {
let t = String(e?.prompt_id || e?.promptId || "").trim();
if (t) return t;
try {
@@ -17562,26 +17569,26 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
return console.debug?.(e), "";
}
}
- function M(e) {
+ function j(e) {
return !Array.isArray(e) || !e.length ? "" : e.map((e) => String(e?.filepath || e?.filename || "")).filter(Boolean).sort().join("|");
}
- function N(e, t = {}, n = 1) {
+ function M(e, t = {}, n = 1) {
let r = Array.isArray(e) ? e : [];
if (!r.length) return;
- let i = M(r);
+ let i = j(r);
if (!i) {
- A(r, 1, t);
+ k(r, 1, t);
return;
}
let a = d.get(i);
a?.timer && clearTimeout(a.timer);
let o = a?.firstAttemptAt ?? Date.now();
- if (Date.now() - o >= Hp) {
- A(r, 1, t);
+ if (Date.now() - o >= Wp) {
+ k(r, 1, t);
return;
}
let s = Math.max(1, Number(n) || 1), c = Math.min(2e3, 250 * s), l = setTimeout(() => {
- d.delete(i), ee(r, t, s + 1);
+ d.delete(i), F(r, t, s + 1);
}, c);
d.set(i, {
files: r,
@@ -17591,7 +17598,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
firstAttemptAt: o
});
}
- function P(e) {
+ function N(e) {
let t = String(e || "").trim();
if (!(!t || d.size <= 0)) for (let [e, n] of Array.from(d.entries())) {
try {
@@ -17602,7 +17609,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
d.delete(e), f.add(t, n?.files || []);
}
}
- function F() {
+ function P() {
for (let [e, t] of Array.from(d.entries())) {
try {
t?.timer && clearTimeout(t.timer);
@@ -17612,8 +17619,8 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
d.delete(e);
}
}
- function ee(e, t = {}, n = 1) {
- let r = j(t);
+ function F(e, t = {}, n = 1) {
+ let r = A(t);
if (v("buffer:add", {
prompt_id: r,
explicit_prompt_id: String(t?.prompt_id || t?.promptId || ""),
@@ -17621,23 +17628,23 @@ function Wp({ 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 < Vp) {
- N(e, t, n);
+ if (n < Up) {
+ M(e, t, n);
return;
}
- A(e, 1, t);
+ k(e, 1, t);
return;
}
f.add(r, e);
}
- function te(e, t = 900) {
- b() && (v("finalize:schedule", {
+ function I(e, t = 900) {
+ y() && (v("finalize:schedule", {
job_id: String(e || ""),
delay_ms: t
- }), C.schedule(e, t));
+ }), S.schedule(e, t));
}
- function ne(r) {
- let i = x(), a = String(r || "").trim();
+ function ee(r) {
+ let i = b(), a = String(r || "").trim();
if (!a) return;
let o = f.take(a);
if (v("buffer:flush", {
@@ -17648,7 +17655,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
files: o,
expectedCount: o.length
}), !o.length) {
- i.allowLiveStackFinalize && te(a);
+ i.allowLiveStackFinalize && I(a);
return;
}
e(t.INDEX_FILES, {
@@ -17663,12 +17670,12 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
v("index:flush:done", {
prompt_id: a,
file_count: o.length
- }), i.allowLiveStackFinalize && te(a, 1800);
+ }), i.allowLiveStackFinalize && I(a, 1800);
}).catch((e) => {
i.allowLiveStackFinalize && p.clearPendingJob(a), n(e, "executionRuntime.executed.index");
});
}
- function re(e) {
+ function te(e) {
let t = String(e || "").trim();
if (!t) return !1;
try {
@@ -17678,8 +17685,8 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
return console.debug?.(e), !1;
}
}
- function ie(e) {
- if (!b()) return {
+ function ne(e) {
+ if (!y()) return {
detail: e,
jobId: "",
defer: !1
@@ -17694,18 +17701,18 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
};
}
}
- function ae(e) {
+ function re(e) {
let t = String(e?.kind || "").trim(), n = String(e?.filename || "").trim(), r = String(e?.filepath || "").trim();
return !!t && (!!n || !!r);
}
- function oe(e, { appRef: t }) {
- if (!x().useExecutionBuffer) return;
- let n = T(r(e?.detail?.output));
+ 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 = Xt(Jt(t), a);
+ let e = He(Be(t), a);
e && (c = String(e.type || e.comfyClass || "").trim());
}
} catch (e) {
@@ -17725,7 +17732,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
files: u.map((e) => String(e?.filename || e?.filepath || ""))
});
try {
- window.dispatchEvent(new CustomEvent(B.NEW_GENERATION_OUTPUT, { detail: {
+ window.dispatchEvent(new CustomEvent(H.NEW_GENERATION_OUTPUT, { detail: {
files: u,
prompt_id: String(i || ""),
promptId: String(i || "")
@@ -17734,23 +17741,23 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu
console.debug?.(e);
}
let d = u.length > 0 ? [u[0]] : [], f = u.length > 1 ? u.slice(1) : [];
- d.length > 0 && A(d, 1, { prompt_id: i }), f.length > 0 && ee(f, { prompt_id: i });
+ d.length > 0 && k(d, 1, { prompt_id: i }), f.length > 0 && F(f, { prompt_id: i });
}
- function se(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 || ""),
timestamp: Number(r) || null
- }), w(n, r), D(), t?.(n || null), a({
+ }), C(n, r), E(), t?.(n || null), a({
active_prompt_id: n || null,
cached_nodes: [],
progress_node: null,
progress_value: null,
progress_max: null
- }), n && P(n);
+ }), n && N(n);
}
- function ce(e, { setCurrentJobId: t }) {
- let n = x(), r = e?.detail?.prompt_id || e?.detail?.promptId;
+ function se(e, { setCurrentJobId: t }) {
+ let n = b(), r = e?.detail?.prompt_id || e?.detail?.promptId;
v("execution:end", {
type: String(e?.type || ""),
prompt_id: String(r || "")
@@ -17763,35 +17770,35 @@ function Wp({ 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 || "")
- }), D(), f.clear(r), n.allowLiveStackFinalize && p.clearPendingJob(r), F()), String(e?.type || "") === "execution_success" && O(() => {
- r && P(r), ne(r);
- }, re(r) ? Math.min(u, Up) : u);
+ }), E(), f.clear(r), n.allowLiveStackFinalize && p.clearPendingJob(r), P()), String(e?.type || "") === "execution_success" && D(() => {
+ r && N(r), ee(r);
+ }, te(r) ? Math.min(u, Gp) : u);
}
- function le(e) {
- if (!b()) return;
+ function ce(e) {
+ if (!y()) return;
let t = [];
for (let [, n] of e instanceof Map ? e.entries() : []) {
let e = r(n);
if (e?.length) for (let n of e) t.push(n);
}
- !t.length || !b() || (v("node-outputs:updated", {
- prompt_id: j(),
+ !t.length || !y() || (v("node-outputs:updated", {
+ prompt_id: A(),
file_count: t.length
- }), ee(t, { prompt_id: j() }));
+ }), F(t, { prompt_id: A() }));
}
return {
- notifyStacksUpdated: S,
- prepareLiveAssetEvent: ie,
- isRenderableLiveAsset: ae,
- handleExecutedEvent: oe,
- handleExecutionStart: se,
- handleExecutionEnd: ce,
- handleNodeOutputsUpdated: le
+ notifyStacksUpdated: x,
+ prepareLiveAssetEvent: ne,
+ isRenderableLiveAsset: re,
+ handleExecutedEvent: ie,
+ handleExecutionStart: ae,
+ handleExecutionEnd: se,
+ handleNodeOutputsUpdated: ce
};
}
//#endregion
//#region ui/utils/extractOutputFiles.ts
-function Gp(e) {
+function qp(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;
@@ -17877,15 +17884,15 @@ function Gp(e) {
}
//#endregion
//#region ui/features/runtime/sidebarAssetBadge.ts
-var Kp = "mjr-sidebar-asset-badge", qp = "mjr-sidebar-tab-has-badge", Jp = "mjr-sidebar-asset-badge-style", Yp = 99, Xp = 0, Zp = "majoor-assets", Qp = /* @__PURE__ */ new Set();
-function $p() {
- if (typeof document > "u" || document.getElementById(Jp)) return;
+var Jp = "mjr-sidebar-asset-badge", Yp = "mjr-sidebar-tab-has-badge", Xp = "mjr-sidebar-asset-badge-style", Zp = 99, Qp = 0, $p = "majoor-assets", em = /* @__PURE__ */ new Set();
+function tm() {
+ if (typeof document > "u" || document.getElementById(Xp)) return;
let e = document.createElement("style");
- e.id = Jp, e.textContent = `
- .${qp} {
+ e.id = Xp, e.textContent = `
+ .${Yp} {
position: relative !important;
}
- .${Kp} {
+ .${Jp} {
position: absolute;
top: 3px;
right: 3px;
@@ -17909,7 +17916,7 @@ function $p() {
}
`, document.head?.appendChild(e);
}
-function em(e) {
+function nm(e) {
let t = String(e || "").trim();
if (!t) return [];
let n = (() => {
@@ -17928,69 +17935,69 @@ function em(e) {
`[href="#${n}"]`
];
}
-function tm(e) {
+function rm(e) {
let t = `${e?.textContent || ""} ${e?.title || ""} ${e?.getAttribute?.("aria-label") || ""}`;
return /assets\s*manager|majoor/i.test(t);
}
-function nm(e) {
+function im(e) {
return !e || typeof e != "object" ? !1 : typeof HTMLElement < "u" ? e instanceof HTMLElement : typeof e.querySelector == "function" && typeof e.appendChild == "function";
}
-function rm() {
+function am() {
if (typeof document > "u") return null;
- for (let e of em(Zp)) {
+ for (let e of nm($p)) {
let t = document.querySelector(e);
- if (nm(t)) return t;
+ if (im(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 (nm(e) && tm(e)) return e;
+ if (im(e) && rm(e)) return e;
}
- return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => nm(e) && tm(e)) || null;
+ return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => im(e) && rm(e)) || null;
}
-function im() {
- $p();
- let e = rm();
+function om() {
+ tm();
+ let e = am();
if (!e) return !1;
- let t = e.querySelector(`:scope > .${Kp}`);
- return Xp <= 0 ? (t?.remove(), e.classList.remove(qp), !0) : (t || (t = document.createElement("span"), t.className = Kp, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(qp), t.textContent = Xp > Yp ? `${Yp}+` : String(Xp), !0);
+ let t = e.querySelector(`:scope > .${Jp}`);
+ return Qp <= 0 ? (t?.remove(), e.classList.remove(Yp), !0) : (t || (t = document.createElement("span"), t.className = Jp, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(Yp), t.textContent = Qp > Zp ? `${Zp}+` : String(Qp), !0);
}
-function am() {
- im(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => im()), setTimeout(() => im(), 250), setTimeout(() => im(), 1e3);
+function sm() {
+ om(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => om()), setTimeout(() => om(), 250), setTimeout(() => om(), 1e3);
}
-function om({ sidebarTabId: e } = {}) {
+function cm({ sidebarTabId: e } = {}) {
let t = String(e || "").trim();
- t && (Zp = t), am();
+ t && ($p = t), sm();
}
-function sm(e = null) {
+function lm(e = null) {
let t = String(e?.id || e?.asset_id || "").trim();
if (t) {
- if (Qp.has(t)) return;
- if (Qp.add(t), Qp.size > 1e3) {
- let e = Array.from(Qp).slice(-500);
- Qp.clear();
- for (let t of e) Qp.add(t);
+ if (em.has(t)) return;
+ if (em.add(t), em.size > 1e3) {
+ let e = Array.from(em).slice(-500);
+ em.clear();
+ for (let t of e) em.add(t);
}
}
- Xp += 1, am();
+ Qp += 1, sm();
}
-function cm() {
- Xp = 0, Qp.clear(), am();
+function um() {
+ Qp = 0, em.clear(), sm();
}
//#endregion
//#region ui/features/runtime/pendingGeneratedAssets.ts
-var lm = 0;
-function um(e = 1) {
+var dm = 0;
+function fm(e = 1) {
let t = Math.max(1, Number(e) || 1);
- lm += t;
+ dm += t;
try {
- window.__mjrPendingGeneratedAssetCount = lm;
+ window.__mjrPendingGeneratedAssetCount = dm;
} catch {}
- return lm;
+ return dm;
}
-function dm() {
- let e = lm;
- lm = 0;
+function pm() {
+ let e = dm;
+ dm = 0;
try {
window.__mjrPendingGeneratedAssetCount = 0;
} catch {}
@@ -17998,11 +18005,11 @@ function dm() {
}
//#endregion
//#region ui/features/runtime/registerRealtimeListeners.ts
-var fm = 3e4, pm = /* @__PURE__ */ new Map(), mm = "live";
-function hm(e) {
+var mm = 3e4, hm = /* @__PURE__ */ new Map(), gm = "live";
+function _m(e) {
return e === !0 || e === 1 || e === "1" ? !0 : e === !1 || e === 0 || e === "0" ? !1 : null;
}
-function gm(e) {
+function vm(e) {
let t = [
e?.has_ai_vector,
e?.hasAiVector,
@@ -18012,25 +18019,25 @@ function gm(e) {
e?.vectorIndexed
];
for (let e of t) {
- let t = hm(e);
+ let t = _m(e);
if (t !== null) return t;
}
return !1;
}
-function _m(e) {
- let t = Date.now(), n = Number(pm.get(e) || 0);
- if (n > 0 && t - n < fm) return !0;
- if (pm.set(e, t), pm.size > 500) {
- let e = t - 5 * fm;
- for (let [t, n] of pm.entries()) Number(n) < e && pm.delete(t);
+function ym(e) {
+ let t = Date.now(), n = Number(hm.get(e) || 0);
+ if (n > 0 && t - n < mm) return !0;
+ if (hm.set(e, t), hm.size > 500) {
+ let e = t - 5 * mm;
+ for (let [t, n] of hm.entries()) Number(n) < e && hm.delete(t);
}
return !1;
}
-function vm(e) {
+function bm(e) {
let t = String(e?.id || "").trim();
- t && (gm(e) || _m(t) || b(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e)));
+ t && (vm(e) || ym(t) || S(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e)));
}
-function ym(e) {
+function xm(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?.() || "";
@@ -18070,8 +18077,8 @@ function ym(e) {
"spz"
].includes(r) ? "model3d" : "unknown" : "";
}
-function bm(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 = ym(e);
+function Sm(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 = xm(e);
if (!s || !n && !r) return null;
let c = n || r.split(/[/\\]/).filter(Boolean).pop() || "";
if (!c) return null;
@@ -18082,7 +18089,7 @@ function bm(e, { jobId: t = "" } = {}) {
c
].map((e) => String(e || "").trim().toLowerCase()).join("|"), d = Date.now() / 1e3, f = String(e?.job_id || t || "").trim();
return {
- id: `${mm}:${u || l.toLowerCase()}`,
+ id: `${gm}:${u || l.toLowerCase()}`,
filename: c,
filepath: l,
path: l,
@@ -18105,7 +18112,7 @@ function bm(e, { jobId: t = "" } = {}) {
_mjrLiveLabel: "In progress"
};
}
-function xm(e) {
+function Cm(e) {
let t = String(e || "");
try {
if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t);
@@ -18114,11 +18121,11 @@ function xm(e) {
}
return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1");
}
-function Sm(e, t) {
+function wm(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 Cm(e, t) {
+function Tm(e, t) {
let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(), i = {
delete_db: [
"started",
@@ -18152,16 +18159,16 @@ function Cm(e, t) {
label: r.replace(/[_-]+/g, " ")
};
}
-async function wm({ 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: v, syncExecutionBackendState: y }) {
+async function Em({ 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 }) {
e._mjrExecutedHandler = (e) => {
try {
n.handleExecutedEvent(e, { appRef: r });
} catch (e) {
g(e, "entry.executed");
}
- }, v(t, e, "executed", e._mjrExecutedHandler), e._mjrExecutionStartHandler = (e) => {
+ }, _(t, e, "executed", e._mjrExecutedHandler), e._mjrExecutionStartHandler = (e) => {
try {
- n.handleExecutionStart(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), y?.({
+ n.handleExecutionStart(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), v?.({
active: !0,
promptId: e?.detail?.prompt_id || e?.detail?.promptId || ""
});
@@ -18170,7 +18177,7 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre
}
}, e._mjrExecutionEndHandler = (e) => {
try {
- n.handleExecutionEnd(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), y?.({
+ n.handleExecutionEnd(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), v?.({
active: !1,
promptId: e?.detail?.prompt_id || e?.detail?.promptId || ""
});
@@ -18205,18 +18212,18 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre
} catch (e) {
g(e, "entry.execution_cached");
}
- }, 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() {
+ }, _(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, H.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), _(t, e, "execution_cached", e._mjrExecutionCachedHandler);
+ function y() {
try {
window.__mjrLastAssetUpsert = Date.now(), window.__mjrLastAssetUpsertCount = (Number(window.__mjrLastAssetUpsertCount || 0) || 0) + 1;
} catch (e) {
console.debug?.(e);
}
}
- function x(e, t, { immediate: n = !1, force: r = !1 } = {}) {
+ function b(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="${xm(i)}"]`);
+ d = typeof e?._mjrHasAssetId == "function" ? !!e._mjrHasAssetId(i) : !!e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Cm(i)}"]`);
} catch (e) {
console.debug?.(e);
}
@@ -18235,7 +18242,7 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre
});
}
let m = f ? !!(n && typeof u == "function" ? u : l)(e, p) : !1;
- return m && b(), m;
+ return m && y(), m;
}
e._mjrNewGenerationOutputHandler = (e) => {
try {
@@ -18245,8 +18252,8 @@ async function wm({ 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 = bm(e, { jobId: i });
- n && x(t, n, {
+ let n = Sm(e, { jobId: i });
+ n && b(t, n, {
immediate: !0,
force: !0
});
@@ -18254,29 +18261,29 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre
} catch (e) {
g(e, "entry.new_generation_output");
}
- }, v(t, window, B.NEW_GENERATION_OUTPUT, e._mjrNewGenerationOutputHandler), e._mjrAssetAddedHandler = (e) => {
+ }, _(t, window, H.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), sm(r)), vm(r);
+ i && (c(r), lm(r)), bm(r);
let a = s();
if (!a) {
- i && um();
+ i && fm();
return;
}
let o = a.dataset?.mjrScope || "output";
if (o !== "output" && o !== "all") {
- i && um();
+ i && fm();
return;
}
let l = a.dataset?.mjrQuery || "*";
- String(l).trim() === "*" && i ? x(a, r, { immediate: !0 }) || um() : i && um();
+ String(l).trim() === "*" && i ? b(a, r, { immediate: !0 }) || fm() : i && fm();
} catch (e) {
g(e, "entry.asset_added");
}
- }, v(t, e, "mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler = (e) => {
+ }, _(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;
@@ -18284,30 +18291,30 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre
n.isRenderableLiveAsset(r) && c(r);
let i = s();
if (!i) return;
- x(i, r, { immediate: !0 });
+ b(i, r, { immediate: !0 });
} catch (e) {
g(e, "entry.asset_updated");
}
- }, v(t, e, "mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler = (e) => {
+ }, _(t, e, "mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler = (e) => {
try {
let t = e?.detail || {};
- window.dispatchEvent(new CustomEvent(B.STRUCTURED_EVENT, { detail: t }));
+ window.dispatchEvent(new CustomEvent(H.STRUCTURED_EVENT, { detail: t }));
} catch (e) {
console.debug?.(e);
}
- }, v(t, e, B.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler = (e) => {
+ }, _(t, e, H.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(H.SCAN_COMPLETE, { detail: t }));
} catch (e) {
console.debug?.(e);
}
- }, v(t, e, B.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrCoreExecutionAssetsReadyHandler = (e) => {
+ }, _(t, e, H.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrCoreExecutionAssetsReadyHandler = (e) => {
try {
let t = e?.detail || {};
- window.dispatchEvent(new CustomEvent(B.CORE_EXECUTION_ASSETS_READY, { detail: t }));
+ window.dispatchEvent(new CustomEvent(H.CORE_EXECUTION_ASSETS_READY, { detail: t }));
let n = Number(t?.indexed || 0);
- Number.isFinite(n) && n > 0 && window.dispatchEvent(new CustomEvent(B.RELOAD_GRID, { detail: {
+ Number.isFinite(n) && n > 0 && window.dispatchEvent(new CustomEvent(H.RELOAD_GRID, { detail: {
reason: "core-execution-assets-ready",
prompt_id: t?.prompt_id || t?.promptId || "",
indexed: n
@@ -18315,47 +18322,47 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre
} catch (e) {
console.debug?.(e);
}
- }, v(t, e, B.CORE_EXECUTION_ASSETS_READY, e._mjrCoreExecutionAssetsReadyHandler), e._mjrScanProgressHandler = (e) => {
+ }, _(t, e, H.CORE_EXECUTION_ASSETS_READY, e._mjrCoreExecutionAssetsReadyHandler), e._mjrScanProgressHandler = (e) => {
try {
let t = e?.detail || {};
- window.dispatchEvent(new CustomEvent(B.SCAN_PROGRESS, { detail: t }));
+ window.dispatchEvent(new CustomEvent(H.SCAN_PROGRESS, { detail: t }));
} catch (e) {
console.debug?.(e);
}
- }, v(t, e, B.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler = (e) => {
+ }, _(t, e, H.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler = (e) => {
try {
let t = e?.detail || {};
- window.dispatchEvent(new CustomEvent(B.ASSET_INDEXING, { detail: t }));
+ window.dispatchEvent(new CustomEvent(H.ASSET_INDEXING, { detail: t }));
} catch (e) {
console.debug?.(e);
}
- }, v(t, e, B.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler = (e) => {
+ }, _(t, e, H.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler = (e) => {
try {
let t = e?.detail || {};
- if (window.dispatchEvent(new CustomEvent(B.ASSET_INDEXED, { detail: t })), !t) return;
+ if (window.dispatchEvent(new CustomEvent(H.ASSET_INDEXED, { detail: t })), !t) return;
let r = n.prepareLiveAssetEvent(t), i = r?.detail || t;
if (r?.defer) return;
- n.isRenderableLiveAsset(i) && c(i), vm(i);
+ n.isRenderableLiveAsset(i) && c(i), bm(i);
let a = s();
if (!a) return;
- x(a, i, {
+ b(a, i, {
immediate: !0,
force: !0
});
} catch (e) {
console.debug?.(e);
}
- }, v(t, e, B.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrEnrichmentStatusHandler = (e) => {
+ }, _(t, e, H.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);
+ p(a, i), window.dispatchEvent(new CustomEvent(H.ENRICHMENT_STATUS, { detail: t })), o && !a && m(h("toast.enrichmentComplete", "Metadata enrichment complete"), "success", 2600);
} catch (e) {
console.debug?.(e);
}
- }, v(t, e, B.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler = (e) => {
+ }, _(t, e, H.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 }));
+ window.dispatchEvent(new CustomEvent(H.DB_RESTORE_STATUS, { detail: t }));
let a = i === "delete_db", o = i === "reset_index", s = {
started: a ? h("toast.dbDeleteTriggered", "Deleting database and rebuilding...") : o ? h("toast.resetTriggered", "Reset triggered: Reindexing all files...") : h("toast.dbRestoreStarted", "DB restore started"),
stopping_workers: h("toast.dbRestoreStopping", "Stopping running workers"),
@@ -18370,11 +18377,11 @@ async function wm({ 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: Sm(i, h),
+ title: wm(i, h),
detail: s,
status: n,
operation: String(i || "db_restore").trim().toLowerCase(),
- progress: Cm(i, n),
+ progress: Tm(i, n),
source: String(t?.name || "").trim() || "maintenance",
forceStore: !0
} };
@@ -18383,15 +18390,15 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre
"done",
"failed"
].includes(n)) {
- _(s, c, 0, l);
+ ae(s, c, 0, l);
return;
}
m(s, c, n === "done" || n === "failed" ? 2800 : 1800, l);
} catch (e) {
console.debug?.(e);
}
- }, v(t, e, B.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler);
- let S = (e) => {
+ }, _(t, e, H.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler);
+ let x = (e) => {
try {
let t = Array.isArray(e?.detail?.ids) ? e.detail.ids.map((e) => String(e || "")).filter(Boolean) : [];
if (!t.length) return;
@@ -18401,11 +18408,11 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre
console.debug?.(e);
}
};
- v(t, window, B.ASSETS_DELETED, S), t && typeof t == "object" && (t.api = e, t.assetsDeletedHandler = S), console.debug("[Majoor] Real-time listener registered");
+ _(t, window, H.ASSETS_DELETED, x), t && typeof t == "object" && (t.api = e, t.assetsDeletedHandler = x), console.debug("[Majoor] Real-time listener registered");
}
//#endregion
//#region ui/features/runtime/entryDebugApi.ts
-function Tm({ resolveNodeStreamModule: e }) {
+function Dm({ resolveNodeStreamModule: e }) {
typeof window > "u" || (window.MajoorDebug = {
exportMetrics: () => window.MajoorMetrics?.exportMetrics?.(),
getMetrics: () => window.MajoorMetrics?.getMetricsReport?.(),
@@ -18421,16 +18428,16 @@ function Tm({ resolveNodeStreamModule: e }) {
}
//#endregion
//#region ui/features/runtime/benignConsoleNoise.ts
-var Em = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"];
-function Dm(e) {
+var Om = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"];
+function km(e) {
try {
let t = String(e?.message || e || "");
- return Em.some((e) => t.includes(e));
+ return Om.some((e) => t.includes(e));
} catch {
return !1;
}
}
-function Om() {
+function Am() {
if (typeof window > "u") return null;
try {
window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__?.abort?.();
@@ -18445,7 +18452,7 @@ function Om() {
}
let t = (e) => {
try {
- if (!Dm(e?.message || e?.error)) return;
+ if (!km(e?.message || e?.error)) return;
e.preventDefault?.(), e.stopImmediatePropagation?.();
} catch (e) {
console.debug?.(e);
@@ -18471,7 +18478,7 @@ function Om() {
}
//#endregion
//#region ui/features/geninfo/genInfoOverridePicker.ts
-var km = "Majoor.GenInfoOverridePicker", Am = "MajoorGenInfoOverride", jm = "Auto fill from workflow", Mm = "Pick", Nm = {
+var jm = "Majoor.GenInfoOverridePicker", Mm = "MajoorGenInfoOverride", Nm = R("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"), Pm = R("genInfoOverride.pick", "Pick"), Fm = {
positive_prompt: [
"positive_prompt",
"prompt",
@@ -18494,7 +18501,7 @@ var km = "Majoor.GenInfoOverridePicker", Am = "MajoorGenInfoOverride", jm = "Aut
],
vae: ["vae", "vae_name"],
clip: ["clip", "clip_name"]
-}, Pm = [
+}, Im = [
{
field: "positive_prompt",
label: "prompt"
@@ -18539,14 +18546,14 @@ var km = "Majoor.GenInfoOverridePicker", Am = "MajoorGenInfoOverride", jm = "Aut
field: "denoise",
label: "denoise"
}
-], Fm = 0x10000000000000000, Im = !1, Lm = !1;
-function Rm(e, t) {
+], Lm = 0x10000000000000000, Rm = !1, zm = !1;
+function Bm(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 zm(e, t, n, r, i) {
+function Vm(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({
@@ -18556,42 +18563,42 @@ function zm(e, t, n, r, i) {
source: i
}));
}
-function Bm(e, t, n) {
+function Hm(e, t, n) {
let r = t.toLowerCase();
- return !!((Nm[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 !!((Fm[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 Vm(e, t = null) {
+function Um(e, t = null) {
let n = [], r = /* @__PURE__ */ new Set();
- for (let { graph: i, label: a } of Zt(e)) for (let e of Yt(i)) {
- if (String(e?.comfyClass || e?.type || "") === Am) continue;
+ for (let { graph: i, label: a } of Ue(e)) for (let e of Ve(i)) {
+ if (String(e?.comfyClass || e?.type || "") === Mm) 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(Nm)) for (let a of i) zm(n, r, t, Rm(e, a), o);
+ for (let [t, i] of Object.entries(Fm)) for (let a of i) Vm(n, r, t, Bm(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") ? zm(n, r, "positive_prompt", l, o) : s.includes("negative") && zm(n, r, "negative_prompt", l, o), t && Bm(t, s, i) && zm(n, r, t, l, `${o} / ${e?.name || `widget ${a + 1}`}`);
+ s.includes("positive") || s === "text" && String(i).toLowerCase().includes("positive") ? Vm(n, r, "positive_prompt", l, o) : s.includes("negative") && Vm(n, r, "negative_prompt", l, o), t && Hm(t, s, i) && Vm(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 Hm(e, t) {
+function Wm(e, t) {
return (e.widgets ?? []).find((e) => e?.name === t);
}
-function Um(e) {
- let t = Hm(e, "seed");
+function Gm(e) {
+ let t = Wm(e, "seed");
t && (t.options = {
...t.options ?? {},
min: -1,
- max: Fm,
+ max: Lm,
control_after_generate: !1
});
}
-function Wm(e, t) {
+function Km(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 Gm(e, t) {
+function qm(e, t) {
if (!e || !t || typeof t != "object") return 0;
- Um(e);
+ Gm(e);
let n = 0;
for (let r of [
"positive_prompt",
@@ -18609,14 +18616,14 @@ function Gm(e, t) {
"workflow_notes",
"custom_info_json"
]) {
- let i = Wm(t, r);
+ let i = Km(t, r);
if (i == null) continue;
- let a = Hm(e, r);
- a && (Km(a, i, e, r), qm(a, i), n += 1);
+ let a = Wm(e, r);
+ a && (Jm(a, i, e, r), Ym(a, i), n += 1);
}
return n;
}
-function Km(e, t, n, r) {
+function Jm(e, t, n, r) {
if (r !== "seed") {
sn(e, t, n);
return;
@@ -18626,15 +18633,15 @@ function Km(e, t, n, r) {
e.options = {
...e.options ?? {},
min: -1,
- max: Fm,
+ max: Lm,
control_after_generate: !1
}, e.value = Math.trunc(i);
try {
- e.callback?.(e.value, fe()?.canvas ?? null, n, null, e);
+ e.callback?.(e.value, be()?.canvas ?? null, n, null, e);
} catch {}
}
}
-function qm(e, t) {
+function Ym(e, t) {
let n = String(t ?? ""), r = [
e?.inputEl,
e?.element,
@@ -18647,26 +18654,26 @@ function qm(e, t) {
e.value = n;
} catch {}
}
-function Jm(e, t, n) {
- let r = $m({ detail: { output: t } });
- if (r && Gm(e, r)) try {
+function Xm(e, t, n) {
+ let r = th({ detail: { output: t } });
+ if (r && qm(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 Ym(e, t, n = null) {
- let r = n || t.field, i = Hm(e, r);
- i && (Km(i, t.value, e, r), qm(i, t.value));
+function Zm(e, t, n = null) {
+ let r = n || t.field, i = Wm(e, r);
+ i && (Jm(i, t.value, e, r), Ym(i, t.value));
}
-function Xm(e) {
+function Qm(e) {
return !e || e.value === void 0 || e.value === null || String(e.value).trim() === "";
}
-function Zm(e, t) {
- let n = Vm(t), r = 0;
- for (let t of Object.keys(Nm)) {
- let i = Hm(e, t);
- if (!i || !Xm(i)) continue;
+function $m(e, t) {
+ let n = Um(t), r = 0;
+ for (let t of Object.keys(Fm)) {
+ let i = Wm(e, t);
+ if (!i || !Qm(i)) continue;
let a = n.find((e) => e.field === t);
- a && (Km(i, a.value, e, t), qm(i, a.value), r += 1);
+ a && (Jm(i, a.value, e, t), Ym(i, a.value), r += 1);
}
return t?.graph?.setDirtyCanvas?.(!0, !0), t?.graph?.change?.(), t?.extensionManager?.toast?.add?.({
severity: r ? "success" : "warn",
@@ -18675,34 +18682,34 @@ function Zm(e, t) {
life: 3e3
}), r;
}
-function Qm(e, t) {
- if (!(!e || String(e?.comfyClass || e?.type || "") !== Am) && (Um(e), !(e.widgets ?? []).some((e) => e?.name === jm) && typeof e.addWidget == "function")) {
- e.addWidget("button", jm, null, () => Zm(e, t));
- for (let n of Pm) {
- let r = `${Mm} ${n.label}`;
- (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => th(e, t, n.field));
+function eh(e, t) {
+ if (!(!e || String(e?.comfyClass || e?.type || "") !== Mm) && (Gm(e), !(e.widgets ?? []).some((e) => e?.name === Nm) && typeof e.addWidget == "function")) {
+ e.addWidget("button", Nm, null, () => $m(e, t));
+ for (let n of Im) {
+ let r = `${Pm} ${n.label}`;
+ (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => rh(e, t, n.field));
}
try {
e.setSize?.(e.computeSize?.()), t?.graph?.setDirtyCanvas?.(!0, !0);
} catch {}
}
}
-function $m(e) {
+function th(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 eh(e) {
- if (Lm) return;
+function nh(e) {
+ if (zm) return;
let t = e?.api;
- !t || typeof t.addEventListener != "function" || (Lm = !0, t.addEventListener("executed", (t) => {
- let n = t?.detail?.node ?? t?.detail?.display_node, r = $m(t);
- if (!n || !r) return;
- let i = Xt(e, n);
- !i || String(i?.comfyClass || i?.type || "") !== Am || Gm(i, r) && (e?.graph?.setDirtyCanvas?.(!0, !0), e?.graph?.change?.());
+ !t || typeof t.addEventListener != "function" || (zm = !0, t.addEventListener("executed", (t) => {
+ let n = t?.detail?.node ?? t?.detail?.display_node;
+ if (!n) return;
+ let r = He(e, n);
+ !r || String(r?.comfyClass || r?.type || "") !== Mm || Xm(r, t?.detail?.output, e);
}));
}
-function th(e, t, n = null) {
- let r = Vm(t, n);
+function rh(e, t, n = null) {
+ let r = Um(t, n);
if (!r.length) {
t?.extensionManager?.toast?.add?.({
severity: "warn",
@@ -18716,75 +18723,67 @@ function th(e, t, n = null) {
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 ? `Pick ${n.replace(/_/g, " ")}` : "Pick Gen Info from workflow";
- a.innerHTML = "
= {}, stableQuery = "
!(Number(state.maxWidth || 0) > 0) &&
!(Number(state.maxHeight || 0) > 0) &&
!String(state.workflowType || "").trim() &&
+ !String(state.workflowId || "").trim() &&
!state.dateRangeFilter &&
!state.dateExactFilter
);
diff --git a/ui/vue/composables/useGridLoader.ts b/ui/vue/composables/useGridLoader.ts
index 819f153a..3ff3ed88 100644
--- a/ui/vue/composables/useGridLoader.ts
+++ b/ui/vue/composables/useGridLoader.ts
@@ -322,6 +322,7 @@ export function useGridLoader({
"maxWidth",
"maxHeight",
"workflowType",
+ "workflowId",
"dateRange",
"dateExact",
"semanticMode",
diff --git a/ui/vue/composables/useVirtualGrid.ts b/ui/vue/composables/useVirtualGrid.ts
index 252477f2..162960f8 100644
--- a/ui/vue/composables/useVirtualGrid.ts
+++ b/ui/vue/composables/useVirtualGrid.ts
@@ -291,6 +291,7 @@ function _assetMatchesActiveFilters(gridContainer: any, asset: any) {
const workflowOnly = query.workflowOnly;
const minRating = query.minRating;
const workflowType = query.workflowType.toLowerCase();
+ const workflowId = String(query.workflowId || "").trim();
const dateExact = query.dateExact;
const assetSubfolder = String(asset?.subfolder || "").trim().toLowerCase();
const assetType = String(asset?.type || asset?.source || "output")
@@ -300,6 +301,13 @@ function _assetMatchesActiveFilters(gridContainer: any, asset: any) {
const assetWorkflowType = String(asset?.workflow_type || asset?.workflowType || "")
.trim()
.toLowerCase();
+ const assetWorkflowId = String(
+ asset?.workflow_id ||
+ asset?.workflowId ||
+ asset?.metadata?.workflow_id ||
+ asset?.metadata?.workflow?.id ||
+ "",
+ ).trim();
const assetDate = String(asset?.date_exact || asset?.date || "").trim();
const hasWorkflow = asset?.has_workflow ?? asset?.hasWorkflow ?? null;
@@ -312,6 +320,7 @@ function _assetMatchesActiveFilters(gridContainer: any, asset: any) {
if (workflowOnly && hasWorkflow !== null && !hasWorkflow) return false;
if (minRating > 0 && (Number(asset?.rating || 0) || 0) < minRating) return false;
if (workflowType && assetWorkflowType !== workflowType) return false;
+ if (workflowId && assetWorkflowId && assetWorkflowId !== workflowId) return false;
if (dateExact && assetDate && assetDate !== dateExact) return false;
return true;
@@ -350,6 +359,7 @@ export async function fetchPage(
maxWidth,
maxHeight,
workflowType,
+ workflowId,
dateRange,
dateExact,
} = queryState;
@@ -393,6 +403,7 @@ export async function fetchPage(
maxWidth: maxWidth > 0 ? maxWidth : null,
maxHeight: maxHeight > 0 ? maxHeight : null,
workflowType: workflowType || null,
+ workflowId: workflowId || null,
dateRange: dateRange || null,
dateExact: dateExact || null,
sort: sortKey,
diff --git a/ui/vue/grid/useGridQuery.ts b/ui/vue/grid/useGridQuery.ts
index 4fd46246..c69436d8 100644
--- a/ui/vue/grid/useGridQuery.ts
+++ b/ui/vue/grid/useGridQuery.ts
@@ -43,6 +43,7 @@ export function createGridQuery(input: Record = {}) {
maxWidth: numberValue(input.maxWidth, 0),
maxHeight: numberValue(input.maxHeight, 0),
workflowType: stringValue(input.workflowType).toUpperCase(),
+ workflowId: stringValue(input.workflowId),
dateRange: stringValue(input.dateRange).toLowerCase(),
dateExact: stringValue(input.dateExact),
sort: stringValue(input.sort, "mtime_desc").toLowerCase(),
@@ -76,6 +77,7 @@ export function readGridQueryFromDataset(dataset: Record = {}, over
maxWidth: dataset.mjrFilterMaxWidth,
maxHeight: dataset.mjrFilterMaxHeight,
workflowType: dataset.mjrFilterWorkflowType,
+ workflowId: dataset.mjrFilterWorkflowId,
dateRange: dataset.mjrFilterDateRange,
dateExact: dataset.mjrFilterDateExact,
sort: dataset.mjrSort,
@@ -124,6 +126,7 @@ export function gridQueryKey(query: Record = {}): string {
normalized.maxWidth || "",
normalized.maxHeight || "",
normalized.workflowType,
+ normalized.workflowId,
normalized.dateRange,
normalized.dateExact,
normalized.semanticMode === undefined ? "" : normalized.semanticMode ? "1" : "0",
@@ -151,6 +154,7 @@ export function gridListQueryKey(query: Record = {}): string {
normalized.maxWidth || "",
normalized.maxHeight || "",
normalized.workflowType,
+ normalized.workflowId,
normalized.dateRange,
normalized.dateExact,
].join("|");
@@ -176,6 +180,7 @@ export function gridQueryHasActiveFilters(query: Record = {}): bool
normalized.maxWidth > 0 ||
normalized.maxHeight > 0 ||
normalized.workflowType ||
+ normalized.workflowId ||
normalized.dateRange ||
normalized.dateExact
);
diff --git a/ui/vue/grid/useGridSnapshotCache.ts b/ui/vue/grid/useGridSnapshotCache.ts
index 7b2dd79a..945690bd 100644
--- a/ui/vue/grid/useGridSnapshotCache.ts
+++ b/ui/vue/grid/useGridSnapshotCache.ts
@@ -65,6 +65,8 @@ const GRID_SNAPSHOT_ASSET_FIELDS = [
"hasGenerationData",
"workflow_type",
"workflowType",
+ "workflow_id",
+ "workflowId",
"generation_time_ms",
"positive_prompt",
"enhanced_caption",
@@ -108,6 +110,7 @@ export function buildGridSnapshotKey(parts: Record = {}): string {
maxWidth: normalizeSnapshotPart(parts.maxWidth || ""),
maxHeight: normalizeSnapshotPart(parts.maxHeight || ""),
workflowType: normalizeSnapshotPart(parts.workflowType || "").toUpperCase(),
+ workflowId: normalizeSnapshotPart(parts.workflowId || ""),
dateRange: normalizeSnapshotPart(parts.dateRange || ""),
dateExact: normalizeSnapshotPart(parts.dateExact || ""),
sort: normalizeSnapshotPart(parts.sort || "mtime_desc", "mtime_desc"),