selfstore 1.8.5 → 1.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/widgets/icons.ts","../src/widgets/base.ts","../src/widgets/connect.ts","../src/widgets/share.ts","../src/widgets/join.ts","../src/widgets/status.ts","../src/widgets/backups.ts","../src/widgets/gate.ts","../src/widgets/destination.ts","../src/entries/widgets.ts"],"names":["EN","FR","isOff","label"],"mappings":"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","file":"widgets.js","sourcesContent":["// The destination glyphs the connect cards fall back to when a host passes\n// none. A card with no icon reads as unfinished, and every consuming app was\n// solving that the same way: two image files of its own, copied from app to\n// app, drifting in size and color.\n//\n// Deliberately NEUTRAL drawings, not brand marks. A provider logo is a\n// trademark, and redistributing one inside a public package is a different\n// question from an application displaying it to name an integration it\n// actually offers. Shipping a cloud rather than a company's mark keeps every\n// consumer clean by default; a host that has cleared the right to a real logo\n// passes it through `icons` and wins.\n//\n// Inlined as data URIs: a library that promises the data stays put cannot\n// fetch an image from a third party to draw its own screen.\n\nimport type { ConnectKind } from '../flows/connect';\n\n/** One neutral gray that stays legible on a light and on a dark surface;\n * an <img> cannot inherit the host's currentColor. */\nconst INK = '#8a8f98';\n\nconst svg = (body: string): string =>\n\t`data:image/svg+xml,${encodeURIComponent(\n\t\t`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${INK}\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${body}</svg>`\n\t)}`;\n\n/** A glyph per destination kind: a cloud for a hosted drive, a document for a\n * file on the device, a server for WebDAV, a bucket for object storage. */\nexport const defaultIcons: Record<ConnectKind, string> = {\n\tdrive: svg('<path d=\"M7 18h10a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.2 9.2 3.9 3.9 0 0 0 7 18Z\"/>'),\n\tfile: svg(\n\t\t'<path d=\"M14 3H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V7Z\"/><path d=\"M14 3v4h4\"/>'\n\t),\n\twebdav: svg(\n\t\t'<rect x=\"3\" y=\"4\" width=\"18\" height=\"7\" rx=\"2\"/><rect x=\"3\" y=\"13\" width=\"18\" height=\"7\" rx=\"2\"/><path d=\"M7 7.5h.01M7 16.5h.01\"/>'\n\t),\n\ts3: svg(\n\t\t'<path d=\"M4.5 6h15l-1.4 13a2 2 0 0 1-2 1.8H7.9a2 2 0 0 1-2-1.8Z\"/><path d=\"M4.5 6c0-1.1 3.4-2 7.5-2s7.5.9 7.5 2\"/>'\n\t)\n};\n","// Shared foundation for the widgets: zero-dependency custom elements over\n// the headless flows. Look and words stay the host's business through three\n// layers - --selfstore-* custom properties (fonts and text colors inherit),\n// part=\"...\" on every significant node, and a flat `labels` map merged over\n// the EN defaults (also the localization story). Elements are inert until\n// wired: assign the properties, the widget builds its flow and renders; they\n// clean up on disconnect and expose the flow for programmatic control.\n\nimport type { FlowHost, StoreLike } from '../flows/connect';\n\n/** Flat key -> string map; widgets merge a partial override over EN defaults. */\nexport type WidgetLabels = Record<string, string>;\n\n/** The ports behind whatever a caller passed as \"the store\": the simple facade\n * carries them on `flowHost`, a hand-built host IS them. Every widget that\n * reads the engine needs this line, so it lives once. */\nexport function hostOf(store: StoreLike | null | undefined): FlowHost | null {\n\tif (!store) return null;\n\treturn 'flowHost' in store ? store.flowHost : store;\n}\n\n/** Structural theme, applied inside every widget's shadow root. Neutral by\n * design: it borrows the host font and text color, and every visual decision\n * routes through a --selfstore-* custom property a host page can set. */\nexport const baseStyles = `\n:host {\n\tdisplay: block;\n\tfont: inherit;\n\tcolor: inherit;\n\t--_accent: var(--selfstore-accent, #2563eb);\n\t--_accent-ink: var(--selfstore-accent-contrast, #ffffff);\n\t--_ink-dim: var(--selfstore-muted, color-mix(in srgb, currentColor 55%, transparent));\n\t--_border: var(--selfstore-border, color-mix(in srgb, currentColor 16%, transparent));\n\t--_radius: var(--selfstore-radius, 12px);\n\t--_gap: var(--selfstore-gap, 0.6rem);\n\t--_danger: var(--selfstore-danger, #dc2626);\n\t--_ok: var(--selfstore-ok, #16a34a);\n\t--_warn: var(--selfstore-warn, #d97706);\n}\n/* Status severity, as a text color the dot inherits (background: currentColor). */\n[part~='sev-ok'] { color: var(--_ok); }\n[part~='sev-info'] { color: var(--_accent); }\n[part~='sev-warn'] { color: var(--_warn); }\n[part~='sev-danger'] { color: var(--_danger); }\nspan[part~='status-dot'] {\n\tdisplay: inline-block;\n\twidth: 0.6em;\n\theight: 0.6em;\n\tborder-radius: 50%;\n\tbackground: currentColor;\n\tflex-shrink: 0;\n}\nbutton[part~='dot-button'] {\n\tbackground: none;\n\tborder: none;\n\tpadding: 0.2em;\n\tcursor: pointer;\n\tline-height: 0;\n}\n[part~='status-row'] [part~='status-action'] { margin-left: auto; }\n[part~='card'] {\n\tborder: 1px solid var(--_border);\n\tborder-radius: var(--_radius);\n\tpadding: 0.8rem 0.9rem;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--_gap);\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tbackground: transparent;\n\ttext-align: left;\n}\nbutton[part~='card'] { cursor: pointer; font: inherit; color: inherit; }\nbutton[part~='card']:hover { border-color: var(--_accent); }\nimg[part~='icon'] {\n\twidth: var(--selfstore-icon-size, 2.1em);\n\theight: var(--selfstore-icon-size, 2.1em);\n\tobject-fit: contain;\n\tflex-shrink: 0;\n}\n[part~='stack'] { display: flex; flex-direction: column; gap: var(--_gap); container-type: inline-size; }\n[part~='row'] { display: flex; align-items: center; gap: var(--_gap); flex-wrap: wrap; }\n[part~='title'] { font-weight: 600; }\n[part~='sub'], [part~='hint'] { color: var(--_ink-dim); font-size: 0.9em; }\n[part~='tag'] {\n\tdisplay: inline-block;\n\tfont-size: 0.72em;\n\tfont-weight: 600;\n\tline-height: 1.5;\n\tpadding: 0 0.55em;\n\tmargin-left: 0.5em;\n\tborder-radius: 999px;\n\tbackground: var(--_accent);\n\tcolor: var(--_accent-ink);\n\tvertical-align: middle;\n}\n[part~='status'] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--_gap);\n\tpadding: 0.7rem 0.9rem;\n\tborder-radius: var(--_radius);\n\tbackground: color-mix(in srgb, var(--_accent) 10%, transparent);\n}\n[part~='status-ok'] { background: color-mix(in srgb, var(--_ok) 12%, transparent); }\n[part~='status-error'] { background: color-mix(in srgb, var(--_danger) 12%, transparent); }\n[part='spinner'] {\n\twidth: 0.7em; height: 0.7em; flex-shrink: 0;\n\tborder-radius: 50%;\n\tborder: 2px solid var(--_accent);\n\tborder-top-color: transparent;\n\tanimation: ss-spin 0.8s linear infinite;\n}\n@keyframes ss-spin { to { transform: rotate(360deg); } }\nbutton[part~='button'] {\n\tfont: inherit;\n\tpadding: 0.45rem 0.9rem;\n\tborder-radius: calc(var(--_radius) * 0.75);\n\tborder: 1px solid var(--_border);\n\tbackground: transparent;\n\tcolor: inherit;\n\tcursor: pointer;\n}\nbutton[part~='button']:disabled { opacity: 0.55; cursor: default; }\nbutton[part~='button-primary'] {\n\tbackground: var(--_accent);\n\tborder-color: var(--_accent);\n\tcolor: var(--_accent-ink);\n}\nbutton[part~='button-danger'] { color: var(--_danger); }\nbutton[part~='link'] {\n\tfont: inherit;\n\tbackground: none;\n\tborder: none;\n\tpadding: 0;\n\tcolor: var(--_ink-dim);\n\ttext-decoration: underline;\n\tcursor: pointer;\n}\nbutton[part~='link']:disabled { opacity: 0.55; cursor: default; }\nbutton[part~='link-danger'] { color: var(--_danger); }\nbutton[part~='advanced-link'] {\n\twidth: fit-content;\n\tfont-size: 0.85em;\n\tmargin-top: 0.1rem;\n}\n[part~='card'] [part~='row'] { margin-top: 0.45rem; }\n/* A card carrying its own action row is tall; centering then floated the icon\n somewhere in the middle of the text, next to no line in particular. It\n belongs on the title's line. */\n[part~='card']:has([part~='row']) { align-items: flex-start; }\ninput[part~='input'] {\n\tfont: inherit;\n\tcolor: inherit;\n\tbackground: transparent;\n\tborder: 1px solid var(--_border);\n\tborder-radius: calc(var(--_radius) * 0.75);\n\tpadding: 0.45rem 0.6rem;\n\twidth: 100%;\n\tbox-sizing: border-box;\n}\ninput[part~='input']:focus { outline: 2px solid var(--_accent); outline-offset: 1px; }\n/* A field that keeps its name visible above the box, placeholders being hints\n and not labels. */\nlabel[part~='labelled'] { display: flex; flex-direction: column; gap: 0.2rem; width: 100%; }\nlabel[part~='labelled'] [part~='label'] { font-size: 0.85em; color: var(--_ink-dim); }\n/* A text input with a trailing button (the password eye) tucked inside it. */\n[part~='field'] { position: relative; display: flex; align-items: center; width: 100%; }\n[part~='field'] input[part~='input'] { padding-right: 2.4rem; }\nbutton[part~='eye'] {\n\tposition: absolute;\n\tright: 0.25rem;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 2rem;\n\theight: 2rem;\n\tbackground: none;\n\tborder: none;\n\tpadding: 0;\n\tcursor: pointer;\n\tcolor: var(--_ink-dim);\n}\nbutton[part~='eye']:hover { color: inherit; }\nbutton[part~='eye'] svg { width: 1.15em; height: 1.15em; display: block; }\n[part~='warn-note'] { color: var(--_warn); }\nbutton[part~='forgot-link'] { width: fit-content; font-size: 0.85em; margin-top: 0.15rem; }\n[part~='error-note'] { color: var(--_danger); font-size: 0.9em; }\n/* WebDAV/S3 segmented control: a rail with the inactive segments quiet and the\n active one lifted onto the surface. Full-width segments, equal share. */\n[part~='tabs'] {\n\tdisplay: flex;\n\tgap: 0.2rem;\n\tpadding: 0.25rem;\n\tborder-radius: calc(var(--_radius) * 0.7);\n\tbackground: color-mix(in srgb, currentColor 8%, transparent);\n}\nbutton[part~='tab'] {\n\tflex: 1 1 0;\n\tfont: inherit;\n\tfont-weight: 600;\n\tpadding: 0.4rem 0.7rem;\n\tborder: none;\n\tborder-radius: calc(var(--_radius) * 0.5);\n\tbackground: transparent;\n\tcolor: var(--_ink-dim);\n\tcursor: pointer;\n}\nbutton[part~='tab']:hover { color: inherit; }\nbutton[part~='tab-on'] {\n\tbackground: Canvas;\n\tcolor: inherit;\n\tbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n/* WebDAV provider quick-pick chips. */\n[part~='presets'] { display: flex; flex-wrap: wrap; gap: 0.4rem; }\nbutton[part~='preset'] {\n\tfont: inherit;\n\tfont-size: 0.85em;\n\tpadding: 0.3rem 0.75rem;\n\tborder: 1px solid var(--_border);\n\tborder-radius: 999px;\n\tbackground: transparent;\n\tcolor: inherit;\n\tcursor: pointer;\n}\nbutton[part~='preset']:hover { border-color: var(--_accent); }\nbutton[part~='preset-on'] {\n\tborder-color: var(--_accent);\n\tbackground: color-mix(in srgb, var(--_accent) 12%, transparent);\n}\nul[part~='list'] { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--_gap); }\nimg[part~='qr'] {\n\twidth: var(--selfstore-qr-size, 6.5em);\n\theight: var(--selfstore-qr-size, 6.5em);\n\tborder-radius: calc(var(--_radius) * 0.5);\n\tbackground: #ffffff;\n\tflex-shrink: 0;\n}\n/* Overflow menu. The trigger is a quiet in-card button; the open menu is a\n dropdown over the trigger's corner on wide screens and a bottom sheet on\n phones. The backdrop catches every outside click or tap (the standard\n dismiss), sitting above the sibling cards but under the panel. */\nbutton[part~='menu-button'] {\n\tborder: none;\n\tbackground: none;\n\tpadding: 0.25rem 0.6rem;\n\tfont-size: 1.1em;\n\tline-height: 1.3;\n\tborder-radius: calc(var(--_radius) * 0.5);\n\tcolor: var(--_ink-dim);\n\tcursor: pointer;\n}\nbutton[part~='menu-button']:hover,\nbutton[part~='menu-button'][aria-expanded='true'] {\n\tbackground: color-mix(in srgb, currentColor 10%, transparent);\n\tcolor: inherit;\n}\n[part~='card'] > button[part~='menu-button'] { align-self: flex-start; }\n[part~='menu-layer'] { display: contents; }\n[part~='menu-backdrop'] { position: fixed; inset: 0; z-index: 29; background: transparent; }\n[part~='menu'] {\n\tposition: absolute;\n\tright: 0.4rem;\n\ttop: 0.4rem;\n\tz-index: 30;\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 11rem;\n\tpadding: 0.3rem 0;\n\tborder: 1px solid var(--_border);\n\tborder-radius: calc(var(--_radius) * 0.75);\n\tbackground: Canvas;\n\tcolor: CanvasText;\n\tbox-shadow: 0 10px 30px rgba(0, 0, 0, 0.16);\n\toutline: none;\n}\nbutton[part~='menu-item'] {\n\tfont: inherit;\n\ttext-align: left;\n\tpadding: 0.55rem 0.95rem;\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tcursor: pointer;\n\twhite-space: nowrap;\n}\nbutton[part~='menu-item']:hover,\nbutton[part~='menu-item']:focus-visible {\n\tbackground: color-mix(in srgb, var(--_accent) 10%, transparent);\n}\nbutton[part~='menu-item-danger'] { color: var(--_danger); }\n@media (pointer: coarse) {\n\tbutton[part~='menu-item'] { padding: 0.8rem 1rem; }\n}\n@media (max-width: 500px) {\n\t[part~='menu-backdrop'] { background: rgba(0, 0, 0, 0.35); }\n\t[part~='menu'] {\n\t\tposition: fixed;\n\t\tinset: auto 0 0 0;\n\t\tborder-radius: var(--_radius) var(--_radius) 0 0;\n\t\tborder-bottom: none;\n\t\tmin-width: 0;\n\t\tpadding: 0.4rem 0 max(0.5rem, env(safe-area-inset-bottom));\n\t\tbox-shadow: 0 -12px 34px rgba(0, 0, 0, 0.28);\n\t}\n\tbutton[part~='menu-item'] { padding: 0.95rem 1.2rem; }\n}\n/* Responsive by default. The stack div above is the query container, so a\n widget reacts to ITS OWN width (a narrow column on a wide screen counts),\n and the host element's own sizing stays untouched. When the widget is\n narrow, a list card's row (QR + url + copy + revoke) would squeeze the\n text into a sliver: stack the card and centre the QR instead. */\n@container (max-width: 480px) {\n\tli[part~='card'] {\n\t\tflex-direction: column;\n\t\talign-items: stretch;\n\t}\n\tli[part~='card'] img[part~='qr'] { align-self: center; }\n\t/* Stacked cards must not push the overflow trigger below the body: it\n\t stays a top-right kebab (the card is position:relative already). */\n\tli[part~='card']:has(> button[part~='menu-button']) { padding-right: 2.4rem; }\n\tli[part~='card'] > button[part~='menu-button'] {\n\t\tposition: absolute;\n\t\ttop: 0.4rem;\n\t\tright: 0.4rem;\n\t}\n}\n`;\n\ntype Child = Node | string | null | undefined;\n\n/** Append children to an element, skipping null/undefined (conditional bits). */\nexport function put(el: HTMLElement, ...children: Child[]): void {\n\tfor (const c of children) {\n\t\tif (c == null) continue;\n\t\tel.append(typeof c === 'string' ? document.createTextNode(c) : c);\n\t}\n}\n\n/** Tiny DOM builder: h('button', { part: 'button', onclick }, label). */\nexport function h<K extends keyof HTMLElementTagNameMap>(\n\ttag: K,\n\tattrs: Record<string, unknown> = {},\n\t...children: Child[]\n): HTMLElementTagNameMap[K] {\n\tconst el = document.createElement(tag);\n\tfor (const [k, v] of Object.entries(attrs)) {\n\t\tif (v == null || v === false) continue;\n\t\tif (k.startsWith('on') && typeof v === 'function') {\n\t\t\tel.addEventListener(k.slice(2), v as EventListener);\n\t\t} else if (v === true) {\n\t\t\tel.setAttribute(k, '');\n\t\t} else {\n\t\t\tel.setAttribute(k, String(v));\n\t\t}\n\t}\n\tfor (const c of children) {\n\t\tif (c == null) continue;\n\t\tel.append(typeof c === 'string' ? document.createTextNode(c) : c);\n\t}\n\treturn el;\n}\n\n/** The common shell: shadow root + styles, label merging, focus-preserving\n * re-render, event emission, subscription cleanup. */\n/**\n * Hand back the properties a host set BEFORE the element's class existed.\n *\n * `el.store = handle` on a not-yet-defined element writes an OWN property on\n * the instance. Once the class is defined, that own property shadows the\n * accessor for good: the setter never runs, the widget never learns it has a\n * store, and it sits there - shut, or open and empty - without a word in the\n * console. Every host that loads `defineSelfstoreWidgets()` lazily hits this\n * (a dynamic import, a framework effect, a script at the end of the body),\n * and the symptom points nowhere near the cause.\n *\n * So on connect: delete each own property that a prototype accessor was meant\n * to answer, and set it again through the accessor. Only those - the widget's\n * own fields are not on the prototype, so they are left alone.\n *\n * Deliberately a plain function, not a method: happy-dom calls\n * connectedCallback without swapping the prototype, so `this` may not carry\n * the class's methods there. As a function it is a harmless no-op in that\n * case instead of a crash, and does the real work in a browser.\n *\n * Deliberately called from connectedCallback rather than the constructor: on\n * an upgrade the base constructor runs BEFORE the subclass field\n * initializers, which would wipe whatever the setter had just stored.\n */\nexport function upgradeOwnProperties(el: HTMLElement): void {\n\tconst proto = Object.getPrototypeOf(el) as object;\n\tconst bag = el as unknown as Record<string, unknown>;\n\tfor (const name of Object.getOwnPropertyNames(el)) {\n\t\tif (!(name in proto)) continue;\n\t\tconst value = bag[name];\n\t\tdelete bag[name];\n\t\tbag[name] = value;\n\t}\n}\n\nexport abstract class FlowWidget extends HTMLElement {\n\tprotected root: ShadowRoot;\n\tprivate styleEl: HTMLStyleElement;\n\tprivate body: HTMLDivElement;\n\tprivate overrides: WidgetLabels = {};\n\tprotected unsub: (() => void) | null = null;\n\n\t/** The widget's EN default strings; subclasses provide theirs. */\n\tprotected abstract defaults(): WidgetLabels;\n\t/** Translations shipped with the widget, by language subtag ('fr'). A widget\n\t * without any stays English until the host passes `labels`. */\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn {};\n\t}\n\t/** Build the current view into the given container. */\n\tprotected abstract view(into: HTMLElement): void;\n\n\t/** Follow an engine: rerender on every notification, replacing any previous\n\t * subscription. A no-op before connection and on a null host, so a host may\n\t * assign the store from a reactive effect that runs more than once. */\n\tprotected follow(host: FlowHost | null): void {\n\t\tthis.unsub?.();\n\t\tthis.unsub = null;\n\t\tif (!this.isConnected || !host) return;\n\t\tthis.unsub = host.engine.subscribe(() => this.rerender());\n\t\tthis.rerender();\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.root = this.attachShadow({ mode: 'open' });\n\t\tthis.styleEl = document.createElement('style');\n\t\tthis.styleEl.textContent = baseStyles;\n\t\tthis.body = document.createElement('div');\n\t\tthis.body.setAttribute('part', 'stack');\n\t\tthis.root.append(this.styleEl, this.body);\n\t}\n\n\t/** Partial override map, merged over the EN defaults (also the i18n hook). */\n\tget labels(): WidgetLabels {\n\t\treturn this.overrides;\n\t}\n\tset labels(map: WidgetLabels) {\n\t\tthis.overrides = map ?? {};\n\t\tthis.rerender();\n\t}\n\n\t/** The shipped translation for the page's language, if the widget has one.\n\t * An explicit `lang` on the element (or on any ancestor) wins over the\n\t * document's, which wins over the browser's, so a host that already sets\n\t * `<html lang>` gets translated copy without writing a single label. */\n\tprivate localized(): WidgetLabels {\n\t\tconst tag =\n\t\t\tthis.closest('[lang]')?.getAttribute('lang') ||\n\t\t\tdocument.documentElement.lang ||\n\t\t\tnavigator.language ||\n\t\t\t'';\n\t\treturn this.packs()[tag.slice(0, 2).toLowerCase()] ?? {};\n\t}\n\n\t/**\n\t * The copy for a key, with `{placeholders}` filled in.\n\t *\n\t * A status that cannot name WHERE it saved has to be read twice: once for the\n\t * state, once for the destination on another line. Interpolation lets a pack\n\t * write one sentence instead - and lets each language put the place where its\n\t * own grammar wants it, which a fixed \"state, then label\" layout cannot.\n\t * A placeholder with no value is left as written rather than blanked, so a\n\t * missing variable shows up instead of producing a sentence with a hole.\n\t */\n\tprotected t(key: string, vars?: Record<string, string | null | undefined>): string {\n\t\tconst copy = this.overrides[key] ?? this.localized()[key] ?? this.defaults()[key] ?? key;\n\t\tif (!vars) return copy;\n\t\treturn copy.replace(/\\{(\\w+)\\}/g, (whole, name: string) => vars[name] ?? whole);\n\t}\n\n\t/** A heading an empty-string label removes: labels = { 'share.title': '' }\n\t * hides that heading (the host page already says it) without a fork.\n\t * Append through put(), which skips the null. */\n\tprotected heading(part: string, key: string): HTMLElement | null {\n\t\tconst text = this.t(key);\n\t\treturn text ? h('div', { part }, text) : null;\n\t}\n\n\t/** Map a flow error to copy: labels can override per labelKey\n\t * ('error.targetUnavailable', ...), with a generic fallback. */\n\tprotected errorText(labelKey: string | undefined): string {\n\t\tif (labelKey) {\n\t\t\tconst specific =\n\t\t\t\tthis.overrides[labelKey] ?? this.localized()[labelKey] ?? this.defaults()[labelKey];\n\t\t\tif (specific) return specific;\n\t\t}\n\t\treturn this.t('error.generic');\n\t}\n\n\t/** Hands back whatever the host set before this class existed, then the\n\t * subclass reads its attributes and wires itself. Subclasses override this\n\t * and call `super.connectedCallback()` FIRST, for that reason. */\n\tconnectedCallback(): void {\n\t\tupgradeOwnProperties(this);\n\t}\n\n\tprotected emit(name: string, detail?: unknown): void {\n\t\tthis.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n\t}\n\n\t/** Rebuild the body, keeping the focused input's value and focus across the\n\t * rebuild (inputs carry data-keep so typing survives a snapshot change). */\n\tprotected rerender(): void {\n\t\t// happy-dom's ShadowRoot.activeElement throws once the focused node was\n\t\t// replaced by an earlier rebuild; browsers just report null/body.\n\t\tlet active: HTMLInputElement | null;\n\t\ttry {\n\t\t\tactive = this.root.activeElement as HTMLInputElement | null;\n\t\t} catch {\n\t\t\tactive = null;\n\t\t}\n\t\tconst keep = active?.getAttribute?.('data-keep') ?? null;\n\t\tconst value = active?.value;\n\t\tthis.body.replaceChildren();\n\t\tthis.view(this.body);\n\t\tif (keep != null) {\n\t\t\tconst again = this.body.querySelector<HTMLInputElement>(`[data-keep=\"${keep}\"]`);\n\t\t\tif (again) {\n\t\t\t\tif (value != null) again.value = value;\n\t\t\t\tagain.focus();\n\t\t\t}\n\t\t}\n\t}\n\n\tdisconnectedCallback(): void {\n\t\tthis.unsub?.();\n\t\tthis.unsub = null;\n\t}\n}\n","import { defaultIcons } from './icons';\n/**\n * <selfstore-connect>: the \"where does my data live\" journey, ready to drop\n * in. A thin skin over connectFlow - every ordering and failure rule lives in\n * the flow (and its tests); this element only renders the snapshot and calls\n * the actions. Theme it with --selfstore-* custom properties and ::part()\n * selectors; reword or localize it through the `labels` property.\n *\n * import { defineSelfstoreWidgets } from 'selfstore/widgets';\n * defineSelfstoreWidgets();\n *\n * const el = document.querySelector('selfstore-connect');\n * el.store = store; // simple store (or a FlowHost)\n * el.targets = { drive: gisDriveAuth({ clientId }), file: true };\n * el.addEventListener('selfstore-connected', (e) => ...e.detail.outcome...);\n */\n\nimport type { WebdavConfig } from '../persistence/targets/webdav';\nimport type { S3Config } from '../persistence/targets/s3';\nimport { isOpenSupported } from '../persistence/targets/file';\nimport {\n\tconnectFlow,\n\ttype ConnectFlow,\n\ttype ConnectFlowOptions,\n\ttype ConnectKind,\n\ttype ConnectSnapshot,\n\ttype ConnectTargets,\n\ttype StoreLike\n} from '../flows/connect';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\n/** A named WebDAV provider offered in the connect form's quick-pick row, so a\n * user can start from their host instead of a blank URL field. selfstore ships\n * no list - the app supplies whichever providers it wants to surface (its own\n * server, a sovereign host, ...); the widget just renders them and pre-fills the\n * URL field on pick. Pure UI sugar over the same WebDAV form. */\nexport interface WebdavPreset {\n\t/** Stable id (also the `data-preset` attribute, for theming/tests). */\n\tid: string;\n\t/** Button text: the provider or host name. */\n\tlabel: string;\n\t/** Base server URL that pre-fills the WebDAV URL field when picked. Omit for a\n\t * label-only entry (the user then types the full URL themselves). */\n\turl?: string;\n\t/** Optional guidance, shown as a line under the form once this preset is\n\t * picked (e.g. where to find the app password for this host) and as the\n\t * quick-pick button's tooltip. */\n\thelp?: string;\n\t/** Optional link appended to the `help` line (e.g. a how-to page). */\n\thelpUrl?: string;\n\t/** Optional \"create an account\" link shown once this preset is picked, for a\n\t * user who has no account with the host yet. The app owns the URL; selfstore\n\t * hard-codes no provider. */\n\tsignupUrl?: string;\n}\n\nconst EN: WidgetLabels = {\n\t'connect.title': 'Where should we save your data?',\n\t'connect.recommended': 'Recommended',\n\t'connect.drive': 'Google Drive',\n\t'connect.drive.sub': 'Available on all your devices',\n\t'connect.file': 'A file on this device',\n\t'connect.file.sub': 'Offline, you keep the file',\n\t'connect.file.new': 'New backup',\n\t'connect.file.open': 'Load an existing file',\n\t'connect.webdav': 'My own server (WebDAV)',\n\t'connect.webdav.sub': 'Nextcloud, ownCloud, yours',\n\t'connect.s3': 'My own bucket (S3)',\n\t'connect.s3.sub': 'Amazon S3, R2, B2, MinIO',\n\t'connect.server': 'My own server',\n\t'connect.server.sub': 'WebDAV or an S3 bucket you control',\n\t'connect.tab.webdav': 'WebDAV',\n\t'connect.tab.s3': 'S3',\n\t'connect.s3.endpoint': 'Endpoint URL',\n\t'connect.s3.region': 'Region',\n\t'connect.s3.bucket': 'Bucket',\n\t'connect.s3.key': 'Object key (path)',\n\t'connect.s3.accessKeyId': 'Access key ID',\n\t'connect.s3.secret': 'Secret access key',\n\t'connect.s3.submit': 'Connect',\n\t'connect.connecting': 'Connecting...',\n\t'connect.connecting.drive': 'Authorise access in the Google window.',\n\t'connect.cancel': 'Cancel',\n\t'connect.retry': 'Try again',\n\t'connect.password.title': 'This backup is protected',\n\t'connect.password.hint': 'Enter its password to open it.',\n\t'connect.password.placeholder': 'Password',\n\t'connect.password.wrong': 'Wrong password. Try again.',\n\t'connect.password.submit': 'Open',\n\t'connect.password.show': 'Show password',\n\t'connect.password.hide': 'Hide password',\n\t'connect.password.forgot': 'Forgot the password?',\n\t'connect.password.forgot.warn':\n\t\t'Without the password, this backup cannot be opened. You can erase it and start from an empty one. The old backup is lost for good.',\n\t'connect.password.forgot.confirm': 'Overwrite the backup',\n\t'connect.password.forgot.back': 'Back',\n\t'connect.conflict.title': 'This destination already holds a backup',\n\t'connect.conflict.merge': 'Merge both',\n\t'connect.conflict.merge.sub': 'Keep everything from both sides',\n\t'connect.conflict.resume': 'Use the backup',\n\t'connect.conflict.resume.sub': 'This device adopts it',\n\t'connect.conflict.replace': 'Replace the backup',\n\t'connect.conflict.replace.sub': 'This device wins, the backup is overwritten',\n\t'connect.webdav.url': 'Server URL',\n\t'connect.webdav.user': 'Username',\n\t'connect.webdav.password': 'Password',\n\t'connect.webdav.submit': 'Connect',\n\t'connect.webdav.signup': 'Create an account',\n\t'connect.webdav.help.more': 'How?',\n\t'connect.done': 'Connected. Your data is saved.',\n\t'connect.done.manual': 'Download mode: this browser cannot keep the file open.',\n\t'error.generic': 'That did not work. Check the connection and try again.',\n\t'error.targetUnavailable': 'The destination did not answer. Try again in a moment.',\n\t'error.authExpired': 'Access expired: reconnect to continue.',\n\t'error.decryptFailed': 'This backup could not be opened with that password.',\n\t'error.badFormat': 'This file does not look like a readable backup.',\n\t'error.foreignBackup':\n\t\t'This backup belongs to a different app. Open it in the app that created it.'\n};\n\n// The lexicon this pack holds to: the durable destination is \"la sauvegarde\",\n// the live copy is \"cet appareil\" (never a place the user can pick), the\n// portable file is an \"export\". One verb, one meaning. The act that loses\n// nothing opens with \"Tout garder\"; the ones that overwrite open with\n// \"Remplacer\", so the first word alone says whether something is lost.\n// lexicon.test.ts holds every pack to the first rule: stated in a comment, it\n// had already drifted in two strings before anyone noticed.\nconst FR: WidgetLabels = {\n\t'connect.title': 'Où enregistrer vos données ?',\n\t'connect.recommended': 'Recommandé',\n\t'connect.drive': 'Google Drive',\n\t'connect.drive.sub': 'Disponible sur tous vos appareils',\n\t'connect.file': 'Un fichier sur cet appareil',\n\t'connect.file.sub': 'Hors ligne, le fichier reste chez vous',\n\t'connect.file.new': 'Nouvelle sauvegarde',\n\t'connect.file.open': 'Ouvrir un fichier existant',\n\t'connect.webdav': 'Mon serveur (WebDAV)',\n\t'connect.webdav.sub': 'Nextcloud, ownCloud, le vôtre',\n\t'connect.s3': 'Mon bucket (S3)',\n\t'connect.s3.sub': 'Amazon S3, R2, B2, MinIO',\n\t'connect.server': 'Mon serveur',\n\t'connect.server.sub': 'WebDAV ou un bucket S3 que vous contrôlez',\n\t'connect.tab.webdav': 'WebDAV',\n\t'connect.tab.s3': 'S3',\n\t'connect.s3.endpoint': \"URL du point d'accès\",\n\t'connect.s3.region': 'Région',\n\t'connect.s3.bucket': 'Bucket',\n\t'connect.s3.key': 'Chemin du fichier',\n\t'connect.s3.accessKeyId': \"Identifiant de la clé d'accès\",\n\t'connect.s3.secret': 'Clé secrète',\n\t'connect.s3.submit': 'Connecter',\n\t'connect.connecting': 'Connexion en cours...',\n\t'connect.connecting.drive': \"Autorisez l'accès dans la fenêtre Google.\",\n\t'connect.cancel': 'Annuler',\n\t'connect.retry': 'Réessayer',\n\t'connect.password.title': 'Cette sauvegarde est protégée',\n\t'connect.password.hint': \"Entrez son mot de passe pour l'ouvrir.\",\n\t'connect.password.placeholder': 'Mot de passe',\n\t'connect.password.wrong': 'Mot de passe incorrect. Réessayez.',\n\t'connect.password.submit': 'Ouvrir',\n\t'connect.password.show': 'Afficher le mot de passe',\n\t'connect.password.hide': 'Masquer le mot de passe',\n\t'connect.password.forgot': 'Mot de passe oublié ?',\n\t'connect.password.forgot.warn':\n\t\t\"Sans le mot de passe, cette sauvegarde ne peut pas être ouverte. Vous pouvez repartir d'une sauvegarde vide : l'ancienne sera perdue définitivement.\",\n\t'connect.password.forgot.confirm': 'Remplacer la sauvegarde',\n\t'connect.password.forgot.back': 'Retour',\n\t'connect.conflict.title': 'Une sauvegarde existe déjà ici',\n\t'connect.conflict.merge': 'Tout garder',\n\t'connect.conflict.merge.sub': 'Réunir la sauvegarde et les données de cet appareil',\n\t'connect.conflict.resume': 'Utiliser la sauvegarde',\n\t'connect.conflict.resume.sub': 'Cet appareil adopte la sauvegarde existante',\n\t'connect.conflict.replace': 'Remplacer la sauvegarde',\n\t'connect.conflict.replace.sub': 'Les données de cet appareil écrasent la sauvegarde',\n\t'connect.webdav.url': 'URL du serveur',\n\t'connect.webdav.user': 'Identifiant',\n\t'connect.webdav.password': 'Mot de passe',\n\t'connect.webdav.submit': 'Connecter',\n\t'connect.webdav.signup': 'Créer un compte',\n\t'connect.webdav.help.more': 'Comment faire ?',\n\t'connect.done': 'Connecté. Vos données sont enregistrées.',\n\t'connect.done.manual': 'Mode export : ce navigateur ne peut pas garder le fichier ouvert.',\n\t'error.generic': \"Cela n'a pas fonctionné. Vérifiez la connexion et réessayez.\",\n\t'error.targetUnavailable': 'La sauvegarde ne répond pas. Réessayez dans un instant.',\n\t'error.authExpired': 'Accès expiré : reconnectez-vous pour continuer.',\n\t'error.decryptFailed': \"Cette sauvegarde n'a pas pu être ouverte avec ce mot de passe.\",\n\t'error.badFormat': 'Ce fichier ne ressemble pas à une sauvegarde lisible.',\n\t'error.foreignBackup':\n\t\t\"Cette sauvegarde appartient à une autre application. Ouvrez-la dans l'application qui l'a créée.\"\n};\n\n// Two glyphs for the password eye: an open eye when the value is hidden (click\n// to reveal), a struck-through eye when it is shown (click to hide). Plain\n// stroke SVG, currentColor, so they inherit the host's text color like any icon.\nconst EYE_SHOW =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 12s3-8 10-8 10 8 10 8-3 8-10 8-10-8-10-8Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>';\nconst EYE_HIDE =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 10 8 10 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/><path d=\"M6.61 6.61A18.45 18.45 0 0 0 2 12s3 8 10 8a9.12 9.12 0 0 0 5.39-1.61\"/><line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\"/></svg>';\n\n/** Build the eye glyph for the current visibility (shown value -> struck eye). */\nfunction eyeIcon(visible: boolean): SVGElement {\n\tconst span = document.createElement('span');\n\tspan.innerHTML = visible ? EYE_HIDE : EYE_SHOW;\n\treturn span.firstElementChild as SVGElement;\n}\n\nexport class SelfstoreConnectElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['recommended', 'advanced'];\n\t}\n\n\t#store: StoreLike | null = null;\n\t#targets: ConnectTargets | null = null;\n\t#options: ConnectFlowOptions = {};\n\t#flow: ConnectFlow | null = null;\n\t#recommended: ConnectKind | null = null;\n\t#icons: Partial<Record<ConnectKind, string>> = {};\n\t#advanced: ConnectKind[] = [];\n\t#webdavPresets: WebdavPreset[] = [];\n\t#webdavUrl = '';\n\t#webdavUser = '';\n\t#webdavPass = '';\n\t#pickedPreset: WebdavPreset | null = null;\n\t// S3 form fields (kept on the element, like the WebDAV ones, so switching the\n\t// server tab never loses what was typed).\n\t#s3Endpoint = '';\n\t#s3Region = '';\n\t#s3Bucket = '';\n\t#s3Key = '';\n\t#s3AccessKeyId = '';\n\t#s3Secret = '';\n\t// Password-step local UI state (never in the flow: purely how this element\n\t// draws the step). Reset whenever the flow leaves 'password' (see wire()).\n\t#pwVisible = false;\n\t#confirmOverwrite = false;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\t/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */\n\tget store(): StoreLike | null {\n\t\treturn this.#store;\n\t}\n\tset store(v: StoreLike | null) {\n\t\t// Assigning the SAME handle is a no-op, so a host can write\n\t\t// `el.store = app.store` inside a reactive effect and let it run as often\n\t\t// as the framework likes. Without this the setter rebuilt the flow every\n\t\t// time, dropping a journey in progress - which forced every host to invent\n\t\t// a \"wire once\" guard, and a guard keyed on the element (the obvious\n\t\t// shape) then swallowed the real assignment when the store was created\n\t\t// after the widget. The widget owes the host this, not the other way round.\n\t\tif (v === this.#store) return;\n\t\tthis.#store = v;\n\t\tthis.wire();\n\t}\n\n\tget targets(): ConnectTargets | null {\n\t\treturn this.#targets;\n\t}\n\tset targets(v: ConnectTargets | null) {\n\t\tthis.#targets = v;\n\t\tthis.wire();\n\t}\n\n\tget options(): ConnectFlowOptions {\n\t\treturn this.#options;\n\t}\n\tset options(v: ConnectFlowOptions) {\n\t\tthis.#options = v ?? {};\n\t\tthis.wire();\n\t}\n\n\t/** Badge one destination as the one to pick (part=\"tag\", label\n\t * 'connect.recommended'). Purely a highlight: the order still follows the\n\t * targets object. Also the `recommended` attribute. Default: none. */\n\tget recommended(): ConnectKind | null {\n\t\treturn this.#recommended;\n\t}\n\tset recommended(v: ConnectKind | null) {\n\t\tthis.#recommended = v === 'drive' || v === 'file' || v === 'webdav' || v === 's3' ? v : null;\n\t\tthis.rerender();\n\t}\n\n\t/** An optional icon per destination - an image URL or data URI, rendered as\n\t * part=\"icon\" at the head of that card. Purely decorative and per-instance;\n\t * omit a kind for no icon. Size it with --selfstore-icon-size. */\n\tget icons(): Partial<Record<ConnectKind, string>> {\n\t\treturn this.#icons;\n\t}\n\tset icons(v: Partial<Record<ConnectKind, string>> | null) {\n\t\tthis.#icons = v ?? {};\n\t\tthis.rerender();\n\t}\n\n\t/** Destinations to tuck behind a discreet link under the cards instead of a\n\t * full card - for power-user options (say, WebDAV) that must stay reachable\n\t * without weighing the everyday choice. Also the `advanced` attribute\n\t * (comma-separated). The journey after the click is exactly the same. */\n\tget advanced(): ConnectKind[] {\n\t\treturn this.#advanced;\n\t}\n\tset advanced(v: ConnectKind[] | null) {\n\t\tthis.#advanced = (v ?? []).filter(\n\t\t\t(k) => k === 'drive' || k === 'file' || k === 'webdav' || k === 's3'\n\t\t);\n\t\tthis.rerender();\n\t}\n\n\t/** Named WebDAV providers offered as a quick-pick row above the WebDAV form,\n\t * pre-filling the URL field. The app owns the list (its own host, sovereign\n\t * providers, ...); selfstore ships none. Purely additive - the blank form\n\t * still works. */\n\tget webdavPresets(): WebdavPreset[] {\n\t\treturn this.#webdavPresets;\n\t}\n\tset webdavPresets(v: WebdavPreset[] | null) {\n\t\tthis.#webdavPresets = Array.isArray(v) ? v : [];\n\t\tthis.rerender();\n\t}\n\n\t/** The underlying flow, for programmatic control (may be null until wired). */\n\tget flow(): ConnectFlow | null {\n\t\treturn this.#flow;\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'recommended') this.recommended = value as ConnectKind | null;\n\t\tif (name === 'advanced') {\n\t\t\tthis.advanced = (value ?? '').split(',').map((s) => s.trim()) as ConnectKind[];\n\t\t}\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tif (this.#recommended === null && this.hasAttribute('recommended')) {\n\t\t\tthis.recommended = this.getAttribute('recommended') as ConnectKind;\n\t\t}\n\t\tif (this.#advanced.length === 0 && this.hasAttribute('advanced')) {\n\t\t\tthis.advanced = (this.getAttribute('advanced') ?? '')\n\t\t\t\t.split(',')\n\t\t\t\t.map((s) => s.trim()) as ConnectKind[];\n\t\t}\n\t\tthis.wire();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#store || !this.#targets) return;\n\t\tthis.unsub?.();\n\t\tthis.#flow = connectFlow(this.#store, this.#targets, this.#options);\n\t\tlet last: ConnectSnapshot | null = null;\n\t\tthis.unsub = this.#flow.subscribe((snap) => {\n\t\t\tconst was = last;\n\t\t\tlast = snap;\n\t\t\tif (snap.step === 'connected' && was?.step !== 'connected') {\n\t\t\t\tthis.emit('selfstore-connected', { outcome: snap.outcome });\n\t\t\t}\n\t\t\tif (snap.step === 'error' && was?.step !== 'error') {\n\t\t\t\tthis.emit('selfstore-error', { error: snap.error });\n\t\t\t}\n\t\t\t// Leaving the password step clears its local UI state, so a later\n\t\t\t// return starts masked and on the form (not on a stale confirmation).\n\t\t\tif (snap.step !== 'password') {\n\t\t\t\tthis.#pwVisible = false;\n\t\t\t\tthis.#confirmOverwrite = false;\n\t\t\t}\n\t\t\tthis.rerender();\n\t\t});\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst flow = this.#flow;\n\t\tif (!flow) return; // inert until wired\n\t\tconst s = flow.snapshot;\n\n\t\tif (s.step === 'choose') {\n\t\t\tput(into, this.heading('title', 'connect.title'));\n\t\t\t// WebDAV and S3 are both \"your own server\": when both are offered as\n\t\t\t// cards, fold them into one entry that opens the tabbed form, so a new\n\t\t\t// backend never adds another top-level button.\n\t\t\tconst serverKinds = (['webdav', 's3'] as const).filter(\n\t\t\t\t(k) => s.kinds.includes(k) && !this.#advanced.includes(k)\n\t\t\t);\n\t\t\tconst groupServer = serverKinds.length >= 2;\n\t\t\tfor (const kind of s.kinds) {\n\t\t\t\tif (this.#advanced.includes(kind)) continue;\n\t\t\t\tif (groupServer && (kind === 'webdav' || kind === 's3')) {\n\t\t\t\t\tif (kind === serverKinds[0]) into.append(this.serverCard(serverKinds[0]));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tinto.append(this.destCard(kind));\n\t\t\t}\n\t\t\t// The tucked-away destinations: same journey, discreet entry.\n\t\t\tfor (const kind of s.kinds) {\n\t\t\t\tif (this.#advanced.includes(kind)) {\n\t\t\t\t\tinto.append(\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'link advanced-link',\n\t\t\t\t\t\t\t\t'data-kind': kind,\n\t\t\t\t\t\t\t\tonclick: () => this.#flow?.choose(kind)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t(`connect.${kind}`)\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'form') {\n\t\t\tconst kind = s.kind === 's3' ? 's3' : 'webdav';\n\t\t\t// The WebDAV/S3 toggle shows only when both are offered as form kinds\n\t\t\t// (a fixed config skips the form and never reaches here).\n\t\t\tconst tabbed =\n\t\t\t\t(['webdav', 's3'] as const).filter((k) => this.#targets?.[k] === true).length >= 2;\n\t\t\tconst children: HTMLElement[] = [\n\t\t\t\th('div', { part: 'title' }, this.t(tabbed ? 'connect.server' : `connect.${kind}`))\n\t\t\t];\n\t\t\tif (tabbed) children.push(this.serverTabs(kind));\n\t\t\tchildren.push(...(kind === 's3' ? this.s3FormChildren(flow) : this.webdavFormChildren(flow)));\n\t\t\tinto.append(...children);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'authorizing') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status' },\n\t\t\t\t\th('span', { part: 'spinner', 'aria-hidden': 'true' }),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{},\n\t\t\t\t\t\th('div', { part: 'title' }, this.t('connect.connecting')),\n\t\t\t\t\t\ts.kind === 'drive'\n\t\t\t\t\t\t\t? h('div', { part: 'sub' }, this.t('connect.connecting.drive'))\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t),\n\t\t\t\t\th('button', { part: 'button', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'password') {\n\t\t\t// Escape sub-state: the password is forgotten - confirm erasing the\n\t\t\t// protected backup before overwrite() makes it unrecoverable.\n\t\t\tif (this.#confirmOverwrite) {\n\t\t\t\tput(\n\t\t\t\t\tinto,\n\t\t\t\t\th('div', { part: 'title' }, this.t('connect.password.title')),\n\t\t\t\t\th('div', { part: 'hint warn-note' }, this.t('connect.password.forgot.warn')),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'button button-danger', disabled: s.busy, onclick: () => this.doOverwrite() },\n\t\t\t\t\t\t\tthis.t('connect.password.forgot.confirm')\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'button', disabled: s.busy, onclick: () => this.setConfirmOverwrite(false) },\n\t\t\t\t\t\t\tthis.t('connect.password.forgot.back')\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// The password field wears a show/hide eye. The eye toggles the input\n\t\t\t// type in place (never a re-render) so the typed value is never lost.\n\t\t\tconst field = h(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'field' },\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\ttype: this.#pwVisible ? 'text' : 'password',\n\t\t\t\t\tplaceholder: this.t('connect.password.placeholder'),\n\t\t\t\t\t'data-keep': 'password',\n\t\t\t\t\tautocomplete: 'current-password'\n\t\t\t\t}),\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'eye',\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t'aria-label': this.t(\n\t\t\t\t\t\t\tthis.#pwVisible ? 'connect.password.hide' : 'connect.password.show'\n\t\t\t\t\t\t),\n\t\t\t\t\t\t'aria-pressed': this.#pwVisible ? 'true' : 'false',\n\t\t\t\t\t\tonclick: () => this.togglePassword()\n\t\t\t\t\t},\n\t\t\t\t\teyeIcon(this.#pwVisible)\n\t\t\t\t)\n\t\t\t);\n\t\t\tput(\n\t\t\t\tinto,\n\t\t\t\th('div', { part: 'title' }, this.t('connect.password.title')),\n\t\t\t\th('div', { part: 'hint' }, this.t('connect.password.hint')),\n\t\t\t\tfield,\n\t\t\t\ts.passwordError ? h('div', { part: 'error-note' }, this.t('connect.password.wrong')) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\tdisabled: s.busy,\n\t\t\t\t\t\t\tonclick: () => this.submitPassword()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('connect.password.submit')\n\t\t\t\t\t),\n\t\t\t\t\t// Cancel is never disabled, even mid-trial-read: a hung leg must\n\t\t\t\t\t// always have a working way out. The generation counter makes a\n\t\t\t\t\t// late resolution of the abandoned leg a no-op, so leaving is safe.\n\t\t\t\t\th('button', { part: 'button', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t\t),\n\t\t\t\t// The forgotten-password escape: a discreet link into the confirm\n\t\t\t\t// sub-state above (erasing the backup is never one careless click).\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'link forgot-link', onclick: () => this.setConfirmOverwrite(true) },\n\t\t\t\t\tthis.t('connect.password.forgot')\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'conflict') {\n\t\t\tinto.append(h('div', { part: 'title' }, this.t('connect.conflict.title')));\n\t\t\tfor (const how of ['merge', 'resume', 'replace'] as const) {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{ part: 'card', disabled: s.busy, onclick: () => flow.resolveConflict(how) },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{},\n\t\t\t\t\t\t\th('div', { part: 'title' }, this.t(`connect.conflict.${how}`)),\n\t\t\t\t\t\t\th('div', { part: 'sub' }, this.t(`connect.conflict.${how}.sub`))\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tinto.append(\n\t\t\t\th('button', { part: 'link', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'connected') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status status-ok' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\t\tthis.t(s.outcome === 'manual' ? 'connect.done.manual' : 'connect.done')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// error: retry goes back to the choices; cancel is always offered too, so\n\t\t// a failing destination is never a dead end (the host hears\n\t\t// selfstore-cancelled and can dismiss the widget entirely).\n\t\tinto.append(\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'status status-error' },\n\t\t\t\th('div', { part: 'title' }, this.errorText(s.error?.labelKey))\n\t\t\t),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button button-primary', onclick: () => flow.retry() },\n\t\t\t\t\tthis.t('connect.retry')\n\t\t\t\t),\n\t\t\t\th('button', { part: 'button', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t)\n\t\t);\n\t}\n\n\t/**\n\t * A form field that keeps its name once you start typing.\n\t *\n\t * These were placeholders only: the label vanished at the first keystroke, so\n\t * anyone who paused mid-form had to clear a field to remember what it wanted,\n\t * and a screen reader announced three unnamed boxes. A placeholder is a hint,\n\t * never a label.\n\t */\n\tprivate labelled(labelKey: string, input: HTMLElement): HTMLElement {\n\t\treturn h('label', { part: 'labelled' }, h('span', { part: 'label' }, this.t(labelKey)), input);\n\t}\n\n\tprivate destCard(kind: ConnectKind): HTMLElement {\n\t\t// A host icon wins; the shipped glyph only fills a card that would\n\t\t// otherwise render bare.\n\t\tconst icon = this.#icons[kind] ?? defaultIcons[kind];\n\t\tconst head = icon ? h('img', { part: 'icon', src: icon, alt: '' }) : null;\n\t\tconst title = h(\n\t\t\t'div',\n\t\t\t{ part: 'title' },\n\t\t\tthis.t(`connect.${kind}`),\n\t\t\tthis.#recommended === kind ? h('span', { part: 'tag' }, this.t('connect.recommended')) : null\n\t\t);\n\t\tconst sub = h('div', { part: 'sub' }, this.t(`connect.${kind}.sub`));\n\n\t\t// A file target declared with the object form offers TWO gestures on one\n\t\t// card: start a new backup, or adopt an existing file. Buttons cannot\n\t\t// nest, so this card is a div carrying its own action row. The open\n\t\t// gesture needs the browser's open picker; without it only new remains.\n\t\tconst fileSpec = kind === 'file' ? this.#targets?.file : null;\n\t\tif (fileSpec && typeof fileSpec === 'object') {\n\t\t\t// Asked to the target, not to `window`: a browser can ship the picker and\n\t\t\t// refuse to open it, and only the target remembers that refusal. Testing\n\t\t\t// presence here left a button that answered nothing, forever.\n\t\t\tconst openSupported = isOpenSupported();\n\t\t\tconst actions = h('div', { part: 'row' });\n\t\t\tif (fileSpec.create != null) {\n\t\t\t\tactions.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'create',\n\t\t\t\t\t\t\tonclick: () => this.#flow?.choose('file', 'create')\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('connect.file.new')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (fileSpec.open != null && (typeof fileSpec.open === 'function' || openSupported)) {\n\t\t\t\tactions.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t'data-action': 'open',\n\t\t\t\t\t\t\tonclick: () => this.#flow?.choose('file', 'open')\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('connect.file.open')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst body = h('div', {}, title, sub);\n\t\t\tif (actions.childElementCount > 0) body.append(actions);\n\t\t\treturn h('div', { part: 'card', 'data-kind': kind }, head, body);\n\t\t}\n\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{ part: 'card', 'data-kind': kind, onclick: () => this.#flow?.choose(kind) },\n\t\t\thead,\n\t\t\th('div', {}, title, sub)\n\t\t);\n\t}\n\n\t/** The grouped \"your own server\" card shown when both WebDAV and S3 are\n\t * offered: one entry into the tabbed form, opening on the first server kind. */\n\tprivate serverCard(defaultKind: ConnectKind): HTMLElement {\n\t\tconst recommended = this.#recommended === 'webdav' || this.#recommended === 's3';\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{ part: 'card', 'data-kind': 'server', onclick: () => this.#flow?.choose(defaultKind) },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{},\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\tthis.t('connect.server'),\n\t\t\t\t\trecommended ? h('span', { part: 'tag' }, this.t('connect.recommended')) : null\n\t\t\t\t),\n\t\t\t\th('div', { part: 'sub' }, this.t('connect.server.sub'))\n\t\t\t)\n\t\t);\n\t}\n\n\t/** WebDAV/S3 segmented toggle. Switching leaves the form and re-enters it on\n\t * the other kind - no flow surgery - and the typed fields live on the element,\n\t * so nothing the user wrote is lost across the switch. */\n\tprivate serverTabs(active: ConnectKind): HTMLElement {\n\t\tconst tab = (k: 'webdav' | 's3'): HTMLElement =>\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{\n\t\t\t\t\tpart: active === k ? 'tab tab-on' : 'tab',\n\t\t\t\t\ttype: 'button',\n\t\t\t\t\t'data-tab': k,\n\t\t\t\t\t'aria-pressed': active === k ? 'true' : 'false',\n\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\tif (active === k) return;\n\t\t\t\t\t\tthis.#flow?.cancel();\n\t\t\t\t\t\tthis.#flow?.choose(k);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tthis.t(`connect.tab.${k}`)\n\t\t\t);\n\t\treturn h('div', { part: 'tabs' }, tab('webdav'), tab('s3'));\n\t}\n\n\tprivate webdavFormChildren(flow: ConnectFlow): HTMLElement[] {\n\t\tconst picked = this.#pickedPreset;\n\t\tconst out: HTMLElement[] = [];\n\t\t// Optional quick-pick row: the app's WebDAV providers, pre-filling the URL.\n\t\tif (this.#webdavPresets.length > 0) {\n\t\t\tout.push(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'presets' },\n\t\t\t\t\t...this.#webdavPresets.map((p) =>\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: picked?.id === p.id ? 'preset preset-on' : 'preset',\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t'data-preset': p.id,\n\t\t\t\t\t\t\t\t'aria-pressed': picked?.id === p.id ? 'true' : 'false',\n\t\t\t\t\t\t\t\ttitle: p.help ?? '',\n\t\t\t\t\t\t\t\tonclick: () => this.pickWebdavPreset(p)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tp.label\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tout.push(\n\t\t\tthis.labelled(\n\t\t\t\t'connect.webdav.url',\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\ttype: 'url',\n\t\t\t\t\t'data-keep': 'wd-url',\n\t\t\t\t\tvalue: this.#webdavUrl,\n\t\t\t\t\toninput: (e: Event) => (this.#webdavUrl = (e.target as HTMLInputElement).value)\n\t\t\t\t})\n\t\t\t),\n\t\t\tthis.labelled(\n\t\t\t\t'connect.webdav.user',\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\t'data-keep': 'wd-user',\n\t\t\t\t\tvalue: this.#webdavUser,\n\t\t\t\t\toninput: (e: Event) => (this.#webdavUser = (e.target as HTMLInputElement).value)\n\t\t\t\t})\n\t\t\t),\n\t\t\tthis.labelled(\n\t\t\t\t'connect.webdav.password',\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\ttype: 'password',\n\t\t\t\t\t'data-keep': 'wd-pass',\n\t\t\t\t\tvalue: this.#webdavPass,\n\t\t\t\t\toninput: (e: Event) => (this.#webdavPass = (e.target as HTMLInputElement).value)\n\t\t\t\t})\n\t\t\t)\n\t\t);\n\t\t// A picked provider may carry guidance and a sign-up link (no account yet).\n\t\tif (picked?.help) {\n\t\t\tout.push(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'hint webdav-note' },\n\t\t\t\t\tpicked.help,\n\t\t\t\t\tpicked.helpUrl\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'a',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpart: 'link webdav-help',\n\t\t\t\t\t\t\t\t\thref: picked.helpUrl,\n\t\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t\t\trel: 'noopener noreferrer'\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t` ${this.t('connect.webdav.help.more')}`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tout.push(\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button button-primary', onclick: () => this.submitWebdav() },\n\t\t\t\t\tthis.t('connect.webdav.submit')\n\t\t\t\t),\n\t\t\t\th('button', { part: 'button', onclick: () => flow.cancel() }, this.t('connect.cancel'))\n\t\t\t)\n\t\t);\n\t\tif (picked?.signupUrl) {\n\t\t\tout.push(\n\t\t\t\th(\n\t\t\t\t\t'a',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'link webdav-signup',\n\t\t\t\t\t\thref: picked.signupUrl,\n\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\trel: 'noopener noreferrer'\n\t\t\t\t\t},\n\t\t\t\t\tthis.t('connect.webdav.signup')\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate s3FormChildren(flow: ConnectFlow): HTMLElement[] {\n\t\tconst field = (\n\t\t\ttype: string,\n\t\t\tlabel: string,\n\t\t\tkeep: string,\n\t\t\tget: () => string,\n\t\t\tset: (v: string) => void\n\t\t): HTMLElement =>\n\t\t\tthis.labelled(\n\t\t\t\tlabel,\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\ttype,\n\t\t\t\t\t'data-keep': keep,\n\t\t\t\t\tvalue: get(),\n\t\t\t\t\toninput: (e: Event) => set((e.target as HTMLInputElement).value)\n\t\t\t\t})\n\t\t\t);\n\t\treturn [\n\t\t\tfield(\n\t\t\t\t'url',\n\t\t\t\t'connect.s3.endpoint',\n\t\t\t\t's3-endpoint',\n\t\t\t\t() => this.#s3Endpoint,\n\t\t\t\t(v) => (this.#s3Endpoint = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'text',\n\t\t\t\t'connect.s3.region',\n\t\t\t\t's3-region',\n\t\t\t\t() => this.#s3Region,\n\t\t\t\t(v) => (this.#s3Region = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'text',\n\t\t\t\t'connect.s3.bucket',\n\t\t\t\t's3-bucket',\n\t\t\t\t() => this.#s3Bucket,\n\t\t\t\t(v) => (this.#s3Bucket = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'text',\n\t\t\t\t'connect.s3.key',\n\t\t\t\t's3-key',\n\t\t\t\t() => this.#s3Key,\n\t\t\t\t(v) => (this.#s3Key = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'text',\n\t\t\t\t'connect.s3.accessKeyId',\n\t\t\t\t's3-akid',\n\t\t\t\t() => this.#s3AccessKeyId,\n\t\t\t\t(v) => (this.#s3AccessKeyId = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'password',\n\t\t\t\t'connect.s3.secret',\n\t\t\t\t's3-secret',\n\t\t\t\t() => this.#s3Secret,\n\t\t\t\t(v) => (this.#s3Secret = v)\n\t\t\t),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button button-primary', onclick: () => this.submitS3() },\n\t\t\t\t\tthis.t('connect.s3.submit')\n\t\t\t\t),\n\t\t\t\th('button', { part: 'button', onclick: () => flow.cancel() }, this.t('connect.cancel'))\n\t\t\t)\n\t\t];\n\t}\n\n\tprivate submitS3(): void {\n\t\tconst endpoint = this.#s3Endpoint.trim();\n\t\tconst region = this.#s3Region.trim();\n\t\tconst bucket = this.#s3Bucket.trim();\n\t\tconst key = this.#s3Key.trim();\n\t\tif (!endpoint || !region || !bucket || !key) return;\n\t\tconst config: S3Config = {\n\t\t\tendpoint,\n\t\t\tregion,\n\t\t\tbucket,\n\t\t\tkey,\n\t\t\taccessKeyId: this.#s3AccessKeyId.trim(),\n\t\t\tsecretAccessKey: this.#s3Secret\n\t\t};\n\t\tthis.#flow?.submitS3(config);\n\t}\n\n\tprivate cancel(): void {\n\t\tthis.#flow?.cancel();\n\t\tthis.emit('selfstore-cancelled');\n\t}\n\n\tprivate submitPassword(): void {\n\t\tconst input = this.root.querySelector<HTMLInputElement>('[data-keep=\"password\"]');\n\t\tif (input) this.#flow?.submitPassword(input.value);\n\t}\n\n\t/** Flip the password field between hidden and shown IN PLACE - swap the\n\t * input type and the eye glyph without a re-render, so what the user has\n\t * already typed survives the toggle. */\n\tprivate togglePassword(): void {\n\t\tthis.#pwVisible = !this.#pwVisible;\n\t\tconst input = this.root.querySelector<HTMLInputElement>('[data-keep=\"password\"]');\n\t\tif (input) {\n\t\t\tinput.type = this.#pwVisible ? 'text' : 'password';\n\t\t\tinput.focus();\n\t\t}\n\t\tconst eye = this.root.querySelector<HTMLButtonElement>('[part~=\"eye\"]');\n\t\tif (eye) {\n\t\t\teye.setAttribute(\n\t\t\t\t'aria-label',\n\t\t\t\tthis.t(this.#pwVisible ? 'connect.password.hide' : 'connect.password.show')\n\t\t\t);\n\t\t\teye.setAttribute('aria-pressed', this.#pwVisible ? 'true' : 'false');\n\t\t\teye.replaceChildren(eyeIcon(this.#pwVisible));\n\t\t}\n\t}\n\n\t/** Enter or leave the forgotten-password confirmation sub-state. */\n\tprivate setConfirmOverwrite(on: boolean): void {\n\t\tthis.#confirmOverwrite = on;\n\t\tthis.rerender();\n\t}\n\n\t/** Confirmed: abandon the forgotten password and start a fresh backup over\n\t * the protected one (the flow makes this device win). */\n\tprivate doOverwrite(): void {\n\t\tthis.#flow?.overwrite();\n\t}\n\n\t/** Fill the WebDAV URL field from a picked provider preset and move focus on to\n\t * the username, so the pick just seeds the form the user then completes. The\n\t * pick is remembered so its guidance / sign-up link render and its chip flags\n\t * as active; a re-render keeps the already-typed username and password. */\n\tprivate pickWebdavPreset(p: WebdavPreset): void {\n\t\tthis.#pickedPreset = p;\n\t\tthis.#webdavUrl = p.url ?? '';\n\t\tthis.rerender();\n\t\tthis.root.querySelector<HTMLInputElement>('[data-keep=\"wd-user\"]')?.focus();\n\t}\n\n\tprivate submitWebdav(): void {\n\t\tconst url = this.#webdavUrl.trim();\n\t\tif (!url) return;\n\t\tconst config: WebdavConfig = {\n\t\t\turl,\n\t\t\tusername: this.#webdavUser.trim(),\n\t\t\tpassword: this.#webdavPass\n\t\t};\n\t\tthis.#flow?.submitWebdav(config);\n\t}\n}\n","// <selfstore-share>: the share panel over shareFlow, driving an app-provided\n// ShareEngine (how links travel is the app's business).\n//\n// One link per level: each level shows its live link or offers to create it.\n// No second write link next to a first (which one was live?), no name to\n// invent - the level says what it is. Links the engine lists always render,\n// whatever `levels` says: the panel never hides an access that exists.\n//\n// Knobs (all optional): levels, with-create / with-members, confirmAction\n// (host veto over destructive actions), qrProvider (injected, so the element\n// stays zero-dependency). Engines exposing revokeAll get a \"stop sharing\"\n// foot link, rendered only once somebody besides you is in the member list.\n\nimport { shareFlow, type ShareEngine, type ShareFlow, type ShareLevel } from '../flows/share';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'share.title': 'Sharing',\n\t'share.create.read': 'Create a view link',\n\t'share.create.write': 'Create an edit link',\n\t'share.creating': 'Creating...',\n\t'share.level.read': 'Can view',\n\t'share.level.write': 'Can edit',\n\t'share.copy': 'Copy',\n\t'share.copied': 'Copied',\n\t'share.revoke': 'Revoke',\n\t'share.members': 'People with access',\n\t'share.member.you': 'you',\n\t'share.member.owner': 'owner',\n\t'share.remove': 'Remove',\n\t'share.stop': 'Stop sharing',\n\t'share.empty': 'Nobody else has access yet.',\n\t'share.stale': 'Connection hiccup: this view may be behind.',\n\t'error.generic': 'That did not work. Check the connection and try again.',\n\t'error.targetUnavailable': 'The share service did not answer. Try again in a moment.'\n};\n\nconst FR: WidgetLabels = {\n\t'share.title': 'Partage',\n\t'share.create.read': 'Créer un lien de lecture',\n\t'share.create.write': 'Créer un lien de modification',\n\t'share.creating': 'Création...',\n\t'share.level.read': 'Peut consulter',\n\t'share.level.write': 'Peut modifier',\n\t'share.copy': 'Copier',\n\t'share.copied': 'Copié',\n\t'share.revoke': 'Révoquer',\n\t'share.members': 'Personnes ayant accès',\n\t'share.member.you': 'vous',\n\t'share.member.owner': 'propriétaire',\n\t'share.remove': 'Retirer',\n\t'share.stop': 'Arrêter le partage',\n\t'share.empty': \"Personne d'autre n'a accès pour le moment.\",\n\t'share.stale': 'Connexion instable : cette vue est peut-être en retard.',\n\t'error.generic': \"Cela n'a pas fonctionné. Vérifiez la connexion et réessayez.\",\n\t'error.targetUnavailable': 'Le service de partage ne répond pas. Réessayez dans un instant.'\n};\n\n/** A destructive action, offered to confirmAction before it runs: a row's\n * revoke/remove, or 'stop' - ending the whole share. */\nexport type ShareAction = { type: 'revoke' | 'remove'; id: string } | { type: 'stop' };\n\n/** \"off\"-style attribute values; anything else (including empty) reads as on. */\nconst isOff = (v: string | null): boolean =>\n\tv != null && ['off', 'false', 'no', '0'].includes(v.trim().toLowerCase());\n\nexport class SelfstoreShareElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['levels', 'with-create', 'with-members'];\n\t}\n\n\t#engine: ShareEngine | null = null;\n\t#flow: ShareFlow | null = null;\n\t#options: { deadlineMs?: number } = {};\n\t#levels: ShareLevel[] = ['read', 'write'];\n\t#withCreate = true;\n\t#withMembers = true;\n\t#confirmAction: ((action: ShareAction) => boolean | Promise<boolean>) | null = null;\n\t#qrProvider: ((url: string) => Promise<string>) | null = null;\n\t#qr = new Map<string, string>();\n\t#qrPending = new Set<string>();\n\t#copiedId: string | null = null;\n\t#creating: ShareLevel | null = null;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\t/** The app-side transport of links and memberships (see ShareEngine). */\n\tget engine(): ShareEngine | null {\n\t\treturn this.#engine;\n\t}\n\tset engine(v: ShareEngine | null) {\n\t\tthis.#engine = v;\n\t\tthis.wire();\n\t}\n\n\t/** Flow options (deadlineMs), for engines whose legs outgrow the default\n\t * 30s guard (a large first upload, a slow relay). */\n\tget options(): { deadlineMs?: number } {\n\t\treturn this.#options;\n\t}\n\tset options(v: { deadlineMs?: number } | null) {\n\t\tthis.#options = v ?? {};\n\t\tthis.wire();\n\t}\n\n\t/** Which levels the panel OFFERS to create (['read', 'write'] by default) -\n\t * one create button per level without a live link. Also the `levels`\n\t * attribute, comma-separated: levels=\"read\". Links the engine lists\n\t * render whatever this says. */\n\tget levels(): ShareLevel[] {\n\t\treturn [...this.#levels];\n\t}\n\tset levels(v: ShareLevel[]) {\n\t\tconst clean = [...new Set((v ?? []).filter((l) => l === 'read' || l === 'write'))];\n\t\tthis.#levels = clean.length > 0 ? clean : ['read', 'write'];\n\t\tthis.rerender();\n\t}\n\n\t/** Render the create buttons (default). `with-create=\"off\"` hides them: the\n\t * panel becomes list-and-revoke only. */\n\tget withCreate(): boolean {\n\t\treturn this.#withCreate;\n\t}\n\tset withCreate(v: boolean) {\n\t\tthis.#withCreate = v !== false;\n\t\tthis.rerender();\n\t}\n\n\t/** Render the members section (default). `with-members=\"off\"` hides it:\n\t * a links-only panel. */\n\tget withMembers(): boolean {\n\t\treturn this.#withMembers;\n\t}\n\tset withMembers(v: boolean) {\n\t\tthis.#withMembers = v !== false;\n\t\tthis.rerender();\n\t}\n\n\t/** Host veto over the destructive actions: called before revoke, remove or\n\t * stop runs; answer (or resolve) false to keep things as they are -\n\t * window.confirm fits as-is. Default: everything proceeds. */\n\tget confirmAction(): ((action: ShareAction) => boolean | Promise<boolean>) | null {\n\t\treturn this.#confirmAction;\n\t}\n\tset confirmAction(v: ((action: ShareAction) => boolean | Promise<boolean>) | null) {\n\t\tthis.#confirmAction = v ?? null;\n\t}\n\n\t/** Turn a link URL into an image source (a data URL fits): when set, each\n\t * link card renders it as an img part=\"qr\". Injected so the element ships\n\t * no QR dependency. */\n\tget qrProvider(): ((url: string) => Promise<string>) | null {\n\t\treturn this.#qrProvider;\n\t}\n\tset qrProvider(v: ((url: string) => Promise<string>) | null) {\n\t\tthis.#qrProvider = v ?? null;\n\t\tthis.#qr.clear();\n\t\tthis.#qrPending.clear();\n\t\tthis.rerender();\n\t}\n\n\tget flow(): ShareFlow | null {\n\t\treturn this.#flow;\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'levels') {\n\t\t\tthis.levels = (value ?? '').split(',').map((s) => s.trim()) as ShareLevel[];\n\t\t}\n\t\tif (name === 'with-create') this.withCreate = value == null || !isOff(value);\n\t\tif (name === 'with-members') this.withMembers = value == null || !isOff(value);\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tthis.wire();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#engine) return;\n\t\tthis.unsub?.();\n\t\tthis.#flow = shareFlow(this.#engine, this.#options);\n\t\tthis.unsub = this.#flow.subscribe(() => this.rerender());\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst flow = this.#flow;\n\t\tif (!flow) return;\n\t\tconst s = flow.snapshot;\n\n\t\tput(into, this.heading('title', 'share.title'));\n\t\tif (s.stale) into.append(h('div', { part: 'hint' }, this.t('share.stale')));\n\t\tif (s.error && !s.stale) {\n\t\t\tinto.append(h('div', { part: 'error-note' }, this.errorText(s.error.labelKey)));\n\t\t}\n\n\t\t// One link per level: a level with a live link shows it below instead of\n\t\t// offering a second one. One gesture per missing level, nothing to name.\n\t\tif (this.#withCreate) {\n\t\t\tconst missing = this.#levels.filter((l) => !s.links.some((k) => k.level === l));\n\t\t\tif (missing.length > 0) {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\t\t...missing.map((level) =>\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t\t\t'data-action': `create-${level}`,\n\t\t\t\t\t\t\t\t\tdisabled: s.busy !== null,\n\t\t\t\t\t\t\t\t\tonclick: () => this.create(level)\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tthis.t(\n\t\t\t\t\t\t\t\t\ts.busy === 'create' && this.#creating === level\n\t\t\t\t\t\t\t\t\t\t? 'share.creating'\n\t\t\t\t\t\t\t\t\t\t: `share.create.${level}`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (s.links.length > 0) {\n\t\t\tconst list = h('ul', { part: 'list' });\n\t\t\tfor (const link of s.links) {\n\t\t\t\tconst qr = this.qrFor(link.url);\n\t\t\t\tlist.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'li',\n\t\t\t\t\t\t{ part: 'card', 'data-link': link.id },\n\t\t\t\t\t\tqr ? h('img', { part: 'qr', src: qr, alt: '' }) : null,\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\t\t\t\th('div', { part: 'title' }, this.t(`share.level.${link.level}`)),\n\t\t\t\t\t\t\th('div', { part: 'sub', style: 'word-break:break-all' }, link.url)\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t\t'data-action': 'copy',\n\t\t\t\t\t\t\t\tonclick: () => this.copy(link.id, link.url)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t(this.#copiedId === link.id ? 'share.copied' : 'share.copy')\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'button button-danger',\n\t\t\t\t\t\t\t\t'data-action': 'revoke',\n\t\t\t\t\t\t\t\tdisabled: s.busy !== null,\n\t\t\t\t\t\t\t\tonclick: () => this.revoke(link.id)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t('share.revoke')\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tinto.append(list);\n\t\t}\n\n\t\tif (this.#withMembers) {\n\t\t\tput(into, this.heading('sub', 'share.members'));\n\t\t\tif (s.members.length === 0) {\n\t\t\t\tinto.append(h('div', { part: 'hint' }, this.t('share.empty')));\n\t\t\t} else {\n\t\t\t\tconst members = h('ul', { part: 'list' });\n\t\t\t\tfor (const m of s.members) {\n\t\t\t\t\tconst badges: string[] = [];\n\t\t\t\t\tif (m.self) badges.push(this.t('share.member.you'));\n\t\t\t\t\tif (m.owner) badges.push(this.t('share.member.owner'));\n\t\t\t\t\tmembers.append(\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'li',\n\t\t\t\t\t\t\t{ part: 'card', 'data-member': m.id },\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ style: 'flex:1' },\n\t\t\t\t\t\t\t\th('div', { part: 'title' }, m.label || m.id),\n\t\t\t\t\t\t\t\tbadges.length ? h('div', { part: 'sub' }, badges.join(' - ')) : null\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ts.canRemoveMembers && !m.self\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tpart: 'button button-danger',\n\t\t\t\t\t\t\t\t\t\t\t'data-action': 'remove',\n\t\t\t\t\t\t\t\t\t\t\tdisabled: s.busy !== null,\n\t\t\t\t\t\t\t\t\t\t\tonclick: () => this.removeRow(m.id)\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tthis.t('share.remove')\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tinto.append(members);\n\t\t\t}\n\t\t}\n\n\t\t// Ending the whole share: a quiet link at the panel's foot, not a banner.\n\t\t// Rare, destructive, and only real when the engine has such a move and\n\t\t// somebody besides you is in - kicking nobody is noise, and a share\n\t\t// nobody joined yet ends by revoking its link.\n\t\tif (s.canRevokeAll && s.members.some((m) => !m.self)) {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'footer', style: 'text-align:right' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'link link-danger',\n\t\t\t\t\t\t\t'data-action': 'stop',\n\t\t\t\t\t\t\tdisabled: s.busy !== null,\n\t\t\t\t\t\t\tonclick: () => this.stop()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('share.stop')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate create(level: ShareLevel): void {\n\t\tthis.#creating = level;\n\t\tvoid this.#flow?.createLink({ level }).then((link) => {\n\t\t\tthis.#creating = null;\n\t\t\tif (link) this.emit('selfstore-link-created', { link });\n\t\t\tthis.rerender();\n\t\t});\n\t}\n\n\t/** Run a destructive action through the host's veto (default: proceed).\n\t * A throwing hook reads as \"no\": destruction needs a clear yes. */\n\tprivate guarded(action: ShareAction, run: () => void): void {\n\t\tconst gate = this.#confirmAction;\n\t\tif (!gate) {\n\t\t\trun();\n\t\t\treturn;\n\t\t}\n\t\tvoid Promise.resolve()\n\t\t\t.then(() => gate(action))\n\t\t\t.then((ok) => {\n\t\t\t\tif (ok) run();\n\t\t\t})\n\t\t\t.catch(() => undefined);\n\t}\n\n\tprivate revoke(id: string): void {\n\t\tthis.guarded({ type: 'revoke', id }, () => void this.#flow?.revokeLink(id));\n\t}\n\n\tprivate removeRow(id: string): void {\n\t\tthis.guarded({ type: 'remove', id }, () => void this.#flow?.removeMember(id));\n\t}\n\n\tprivate stop(): void {\n\t\tthis.guarded({ type: 'stop' }, () => {\n\t\t\tvoid this.#flow?.revokeAll().then((ok) => {\n\t\t\t\tif (ok) this.emit('selfstore-share-stopped');\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate qrFor(url: string): string | null {\n\t\tconst provider = this.#qrProvider;\n\t\tif (!provider) return null;\n\t\tconst got = this.#qr.get(url);\n\t\tif (got) return got;\n\t\tif (!this.#qrPending.has(url)) {\n\t\t\tthis.#qrPending.add(url);\n\t\t\tvoid provider(url)\n\t\t\t\t.then((src) => {\n\t\t\t\t\tif (this.#qrProvider !== provider) return; // swapped since: stale image\n\t\t\t\t\tthis.#qr.set(url, src);\n\t\t\t\t\tthis.rerender();\n\t\t\t\t})\n\t\t\t\t.catch(() => undefined)\n\t\t\t\t.finally(() => this.#qrPending.delete(url));\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate copy(id: string, url: string): void {\n\t\tthis.#copiedId = id;\n\t\tthis.emit('selfstore-link-copied', { url });\n\t\tvoid navigator.clipboard?.writeText(url).catch(() => undefined);\n\t\tthis.rerender();\n\t\tsetTimeout(() => {\n\t\t\tif (this.#copiedId !== id) return;\n\t\t\tthis.#copiedId = null;\n\t\t\tthis.rerender();\n\t\t}, 1500);\n\t}\n}\n","/**\n * <selfstore-join>: opening an invitation link, ready to drop in. A skin over\n * joinFlow: preview first, join on an explicit yes, named outcomes (already\n * following another share / invite spent) instead of generic errors, and the\n * account switch as part of the journey when the engine offers one.\n *\n * el.link = location.href; // or the link attribute\n * el.engine = myJoinEngine;\n * el.addEventListener('selfstore-joined', () => goHome());\n *\n * variant=\"banner\" collapses the invitation card to a one-line row (label,\n * join, account switch) for pages that render their own preview around it.\n */\n\nimport { joinFlow, type JoinEngine, type JoinFlow } from '../flows/join';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'join.previewing': 'Reading the invitation...',\n\t'join.title': 'You are invited',\n\t'join.from': 'Shared by {from}',\n\t'join.level.read': 'You will be able to view it.',\n\t'join.level.write': 'You will be able to view and edit it.',\n\t'join.accept': 'Join',\n\t'join.joining': 'Joining...',\n\t'join.joined': 'You are in. The shared data now syncs on this device.',\n\t'join.mismatch':\n\t\t'This device already follows another share. Leave it first, or use another profile.',\n\t'join.noInvite': 'This invitation is spent, or meant for another account.',\n\t'join.switchAccount': 'Use another account',\n\t'join.retry': 'Try again',\n\t'error.generic': 'That did not work. Check the connection and try again.',\n\t'error.targetUnavailable': 'The invitation could not be read. Try again in a moment.'\n};\n\nconst FR: WidgetLabels = {\n\t'join.previewing': \"Lecture de l'invitation...\",\n\t'join.title': 'Vous avez reçu une invitation',\n\t'join.from': 'Partagé par {from}',\n\t'join.level.read': 'Vous pourrez consulter.',\n\t'join.level.write': 'Vous pourrez consulter et modifier.',\n\t'join.accept': 'Rejoindre',\n\t'join.joining': 'Connexion en cours...',\n\t'join.joined': \"C'est fait. Les données partagées se synchronisent sur cet appareil.\",\n\t'join.mismatch':\n\t\t\"Cet appareil suit déjà un autre partage. Quittez-le d'abord, ou utilisez un autre profil.\",\n\t'join.noInvite': 'Cette invitation a déjà servi, ou elle vise un autre compte.',\n\t'join.switchAccount': 'Utiliser un autre compte',\n\t'join.retry': 'Réessayer',\n\t'error.generic': \"Cela n'a pas fonctionné. Vérifiez la connexion et réessayez.\",\n\t'error.targetUnavailable': \"L'invitation n'a pas pu être lue. Réessayez dans un instant.\"\n};\n\nexport class SelfstoreJoinElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['link', 'variant'];\n\t}\n\n\t#engine: JoinEngine | null = null;\n\t#link: string | null = null;\n\t#flow: JoinFlow | null = null;\n\t#variant: 'card' | 'banner' = 'card';\n\t#options: { deadlineMs?: number } = {};\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\tget engine(): JoinEngine | null {\n\t\treturn this.#engine;\n\t}\n\tset engine(v: JoinEngine | null) {\n\t\tthis.#engine = v;\n\t\tthis.wire();\n\t}\n\n\t/** The invitation. Also settable as the `link` attribute. */\n\tget link(): string | null {\n\t\treturn this.#link;\n\t}\n\tset link(v: string | null) {\n\t\tthis.#link = v;\n\t\tthis.wire();\n\t}\n\n\t/** Flow options (deadlineMs). Set it when the engine's join opens a popup:\n\t * a generous deadline keeps the network guard without timing out a human\n\t * who is reading an account chooser. */\n\tget options(): { deadlineMs?: number } {\n\t\treturn this.#options;\n\t}\n\tset options(v: { deadlineMs?: number } | null) {\n\t\tthis.#options = v ?? {};\n\t\tthis.wire();\n\t}\n\n\t/** 'card' (default): the full invitation card - who shared, what level.\n\t * 'banner': one line - label, join, account switch - for a host page that\n\t * renders its own preview around the widget. Also the `variant` attribute. */\n\tget variant(): 'card' | 'banner' {\n\t\treturn this.#variant;\n\t}\n\tset variant(v: 'card' | 'banner') {\n\t\tthis.#variant = v === 'banner' ? 'banner' : 'card';\n\t\tthis.rerender();\n\t}\n\n\tget flow(): JoinFlow | null {\n\t\treturn this.#flow;\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'link') this.link = value;\n\t\tif (name === 'variant') this.variant = (value ?? 'card') as 'card' | 'banner';\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tif (!this.#link && this.hasAttribute('link')) this.#link = this.getAttribute('link');\n\t\tif (this.hasAttribute('variant')) {\n\t\t\tthis.#variant = this.getAttribute('variant') === 'banner' ? 'banner' : 'card';\n\t\t}\n\t\tthis.wire();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#engine || !this.#link) return;\n\t\tthis.unsub?.();\n\t\tthis.#flow = joinFlow(this.#link, this.#engine, this.#options);\n\t\tlet lastStep: string | null = null;\n\t\tthis.unsub = this.#flow.subscribe((snap) => {\n\t\t\tif (snap.step !== lastStep) {\n\t\t\t\tif (snap.step === 'joined') this.emit('selfstore-joined', { outcome: 'joined' });\n\t\t\t\tif (snap.step === 'mismatch' || snap.step === 'no-invite') {\n\t\t\t\t\tthis.emit('selfstore-join-refused', { outcome: snap.step });\n\t\t\t\t}\n\t\t\t\tif (snap.step === 'ready' && lastStep === 'joining') {\n\t\t\t\t\t// join() answered null: the user backed out of the engine's popup.\n\t\t\t\t\tthis.emit('selfstore-cancelled');\n\t\t\t\t}\n\t\t\t\tlastStep = snap.step;\n\t\t\t}\n\t\t\tthis.rerender();\n\t\t});\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst flow = this.#flow;\n\t\tif (!flow) return;\n\t\tconst s = flow.snapshot;\n\n\t\tif (s.step === 'previewing' || s.step === 'joining') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status' },\n\t\t\t\t\th('span', { part: 'spinner', 'aria-hidden': 'true' }),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\t\tthis.t(s.step === 'joining' ? 'join.joining' : 'join.previewing')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'ready') {\n\t\t\tconst p = s.preview;\n\t\t\tif (this.#variant === 'banner') {\n\t\t\t\tput(\n\t\t\t\t\tinto,\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row banner' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ part: 'title', style: 'flex:1;min-width:0' },\n\t\t\t\t\t\t\tp?.label || this.t('join.title')\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t\t'data-action': 'accept',\n\t\t\t\t\t\t\t\tonclick: () => flow.accept()\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t('join.accept')\n\t\t\t\t\t\t),\n\t\t\t\t\t\ts.canSwitchAccount\n\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{ part: 'link', 'data-action': 'switch', onclick: () => flow.switchAccount() },\n\t\t\t\t\t\t\t\t\tthis.t('join.switchAccount')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tput(\n\t\t\t\tinto,\n\t\t\t\th('div', { part: 'title' }, p?.label || this.t('join.title')),\n\t\t\t\tp?.from ? h('div', { part: 'sub' }, this.t('join.from').replace('{from}', p.from)) : null,\n\t\t\t\tp?.level ? h('div', { part: 'hint' }, this.t(`join.level.${p.level}`)) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'accept',\n\t\t\t\t\t\t\tonclick: () => flow.accept()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('join.accept')\n\t\t\t\t\t),\n\t\t\t\t\ts.canSwitchAccount\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t{ part: 'link', 'data-action': 'switch', onclick: () => flow.switchAccount() },\n\t\t\t\t\t\t\t\tthis.t('join.switchAccount')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'joined') {\n\t\t\tinto.append(\n\t\t\t\th('div', { part: 'status status-ok' }, h('div', { part: 'title' }, this.t('join.joined')))\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'mismatch' || s.step === 'no-invite') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\t\tthis.t(s.step === 'mismatch' ? 'join.mismatch' : 'join.noInvite')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t\tif (s.step === 'no-invite' && s.canSwitchAccount) {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'button', 'data-action': 'switch', onclick: () => flow.switchAccount() },\n\t\t\t\t\t\t\tthis.t('join.switchAccount')\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// error\n\t\tinto.append(\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'status status-error' },\n\t\t\t\th('div', { part: 'title' }, this.errorText(s.error?.labelKey))\n\t\t\t),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th('button', { part: 'button', onclick: () => flow.retry() }, this.t('join.retry')),\n\t\t\t\ts.canSwitchAccount\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'link', 'data-action': 'switch', onclick: () => flow.switchAccount() },\n\t\t\t\t\t\t\tthis.t('join.switchAccount')\n\t\t\t\t\t\t)\n\t\t\t\t\t: null\n\t\t\t)\n\t\t);\n\t}\n}\n","// <selfstore-status>: the store's save status. Renders the engine's own\n// StatusDescriptor - the widget never invents a state. variant=\"row\" is a\n// severity dot + status line + one action button (settings panel, menu);\n// variant=\"dot\" is just the dot as an aria-labelled button (header corner).\n// An actionable status emits 'selfstore-status-action' with the suggested\n// action; what it means (open settings, run reconnect) is the host's call.\n\nimport type { FlowHost, StoreLike } from '../flows/connect';\nimport { FlowWidget, h, hostOf, put, type WidgetLabels } from './base';\n\n// The browser is never named as the PLACE the data lives. It is not one: it\n// holds a working copy that a cleared profile takes with it. So the state with\n// no destination names what is MISSING - nothing has been saved out - instead\n// of describing the browser as an address, which reads reassuring and is not.\nconst EN: WidgetLabels = {\n\t'status.ephemeral': 'Nothing is saved',\n\t'status.cacheOnly': 'Never saved anywhere yet',\n\t'status.saving': 'Saving...',\n\t'status.saved': 'Saved to {label}, at every change',\n\t'status.needsAttention': 'Reconnect to continue',\n\t'status.locked': 'Locked',\n\t'status.pendingDownload': 'Changes to download',\n\t'status.saved.placeless': 'Saved',\n\t'status.action.choose-destination': 'Choose a destination',\n\t'status.action.download': 'Download',\n\t'status.action.reconnect': 'Reconnect',\n\t'status.action.unlock': 'Unlock'\n};\n\n// A pill states a condition, never a possession: \"Sauvegarde à jour\", not \"Ma\n// sauvegarde\". One verb, one meaning: Exporter is always the portable copy.\nconst FR: WidgetLabels = {\n\t'status.ephemeral': \"Rien n'est enregistré\",\n\t'status.cacheOnly': \"Vos données n'ont jamais été enregistrées ailleurs\",\n\t'status.saving': 'Enregistrement...',\n\t'status.saved': 'Enregistré dans {label}, à chaque changement',\n\t'status.needsAttention': 'Accès à retrouver',\n\t'status.locked': 'Sauvegarde verrouillée',\n\t'status.pendingDownload': 'Modifications à exporter',\n\t'status.saved.placeless': 'Sauvegarde à jour',\n\t'status.action.choose-destination': 'Choisir une sauvegarde',\n\t'status.action.download': 'Exporter',\n\t'status.action.reconnect': \"Retrouver l'accès\",\n\t'status.action.unlock': 'Déverrouiller'\n};\n\nexport class SelfstoreStatusElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['variant'];\n\t}\n\n\t#store: StoreLike | null = null;\n\t#variant: 'row' | 'dot' = 'row';\n\t#icons: Record<string, string> = {};\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\t/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */\n\tget store(): StoreLike | null {\n\t\treturn this.#store;\n\t}\n\tset store(v: StoreLike | null) {\n\t\t// Idempotent, so a host may assign it from a reactive effect: see the\n\t\t// note on <selfstore-connect>.\n\t\tif (v === this.#store) return;\n\t\tthis.#store = v;\n\t\tthis.wire();\n\t}\n\n\t/** 'row' (dot + text + action) or 'dot' (the dot alone). Also the attribute. */\n\tget variant(): 'row' | 'dot' {\n\t\treturn this.#variant;\n\t}\n\tset variant(v: 'row' | 'dot' | null) {\n\t\tthis.#variant = v === 'dot' ? 'dot' : 'row';\n\t\tthis.rerender();\n\t}\n\n\t/** Optional icon per target kind (e.g. { drive: url, file: url }), shown\n\t * before the text in the row variant. Same contract as the connect cards. */\n\tget icons(): Record<string, string> {\n\t\treturn this.#icons;\n\t}\n\tset icons(v: Record<string, string> | null) {\n\t\tthis.#icons = v ?? {};\n\t\tthis.rerender();\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'variant') this.variant = value as 'row' | 'dot' | null;\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tif (this.hasAttribute('variant')) this.variant = this.getAttribute('variant') as 'row' | 'dot';\n\t\tthis.wire();\n\t}\n\n\tprivate host(): FlowHost | null {\n\t\treturn hostOf(this.#store);\n\t}\n\n\tprivate wire(): void {\n\t\tthis.follow(this.host());\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst host = this.host();\n\t\tif (!host) return; // inert until wired\n\t\tconst { status, targetKind, label } = host.engine.state;\n\t\t// The destination's own name is offered to the sentence. A pack that uses\n\t\t// {label} says where in one line; one that does not is unaffected, and the\n\t\t// name still appears on the sub-line below. A target can be attached and\n\t\t// still have no name to give, so a sentence built around the place has a\n\t\t// placeless twin - otherwise it would render the placeholder itself.\n\t\tconst sansLieu = (cle: string): string => {\n\t\t\tconst jumelle = `${cle}.placeless`;\n\t\t\tconst copie = this.t(jumelle);\n\t\t\t// Pas de jumelle declaree: la cle de base ne parle deja pas du lieu.\n\t\t\treturn copie === jumelle ? this.t(cle) : copie;\n\t\t};\n\t\tconst text = label ? this.t(status.labelKey, { label }) : sansLieu(status.labelKey);\n\t\tconst dot = h('span', {\n\t\t\tpart: `status-dot sev-${status.severity}`,\n\t\t\t'aria-hidden': 'true'\n\t\t});\n\n\t\tif (this.#variant === 'dot') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'dot-button',\n\t\t\t\t\t\t'aria-label': text,\n\t\t\t\t\t\ttitle: text,\n\t\t\t\t\t\tonclick: () => this.emit('selfstore-status-action', { action: status.action ?? null })\n\t\t\t\t\t},\n\t\t\t\t\tdot\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst icon = this.#icons[targetKind];\n\t\tconst where = this.t(`status.where.${targetKind}`);\n\t\t// `status.where.<kind>` is a host-provided label; the raw key means \"not\n\t\t// provided\" - fall back to the target's own label (file name, server).\n\t\tconst sub = where !== `status.where.${targetKind}` ? where : (label ?? '');\n\t\tput(\n\t\t\tinto,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row status-row' },\n\t\t\t\tdot,\n\t\t\t\ticon ? h('img', { part: 'icon', src: icon, alt: '' }) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{},\n\t\t\t\t\th('div', { part: 'title' }, text),\n\t\t\t\t\tsub ? h('div', { part: 'sub' }, sub) : null\n\t\t\t\t),\n\t\t\t\tstatus.actionable && status.action\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'button status-action',\n\t\t\t\t\t\t\t\tonclick: () => this.emit('selfstore-status-action', { action: status.action })\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t(`status.action.${status.action}`)\n\t\t\t\t\t\t)\n\t\t\t\t\t: null\n\t\t\t)\n\t\t);\n\t}\n}\n","// <selfstore-backups>: the backups lists over the headless BackupsManager.\n// Two sections. \"My backups\": every file this account owns, the attached one\n// included (badge + outline, never clickable); tapping another row opens it,\n// collecting its passphrase inline when protected; each row carries state\n// pills (omitted while unknown, never guessed) and an overflow menu. \"Shared\n// with me\": files someone else shares with this device, labelled by who -\n// removal is the only gesture, and for the member row it means leaving,\n// which the host performs ('selfstore-backups-leave').\n//\n// The status card, the unlock gate and the encrypt/share sub-views stay the\n// host's - they carry app identity, passkeys, sharing transport. Encrypt and\n// Share menu items only emit; the host opens its own surface. Destructive\n// gestures route through confirmAction (window.confirm fits as-is). The\n// with-* attributes turn sections and menu items off; labels localize.\n\nimport type { BackupRow, BackupsManager } from '../backups/manager';\nimport type { ConnectKind } from '../flows/connect';\nimport type { ReplicaFlow, ReplicaSnapshot } from '../flows/replica';\nimport type { WebdavConfig } from '../persistence/targets/webdav';\nimport type { S3Config } from '../persistence/targets/s3';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'backups.mine.heading': 'My backups',\n\t'backups.mine.personal': 'Main backup',\n\t'backups.active': 'Active',\n\t'backups.pill.encrypted': 'Encrypted',\n\t'backups.pill.plain': 'Not encrypted',\n\t'backups.pill.shared': 'Shared',\n\t'backups.pill.private': 'Not shared',\n\t'backups.modified': 'modified {when}',\n\t'backups.replaceHint': 'Opening replaces the data on this device.',\n\t'backups.loading': 'Opening...',\n\t'backups.menu': 'Backup actions',\n\t'backups.open': 'Open',\n\t'backups.encrypt': 'Encrypt',\n\t'backups.share': 'Share',\n\t'backups.rename': 'Rename',\n\t'backups.delete': 'Delete',\n\t'backups.new': '+ New backup',\n\t'backups.newTitle': 'New backup',\n\t'backups.startsBlank': 'It starts empty.',\n\t'backups.namePh': 'Its name',\n\t'backups.willBe': 'File: {file}',\n\t'backups.taken': 'This name is already taken.',\n\t'backups.create': 'Create',\n\t'backups.renameTitle': 'Rename this backup',\n\t'backups.pwHint': 'This backup is protected: enter its password.',\n\t'backups.pwShow': 'Show the password',\n\t'backups.pwHide': 'Hide the password',\n\t'backups.cancel': 'Cancel',\n\t'backups.shared.heading': 'Shared with me',\n\t'backups.shared.by': 'Shared by {who}',\n\t'backups.shared.leave': 'Leave',\n\t'backups.replica.add': 'Backup copy',\n\t'backups.replica.title': 'Backup copy',\n\t'backups.replica.intro':\n\t\t'The same encrypted file, also written to a second destination. If one fails, the other remains.',\n\t'backups.replica.dest.drive': 'Google Drive',\n\t'backups.replica.dest.file': 'A file on this device',\n\t'backups.replica.dest.webdav': 'A WebDAV server',\n\t'backups.replica.dest.s3': 'An S3 bucket',\n\t'backups.replica.card': 'Backup copy - {label}',\n\t'backups.replica.uptodate': 'Up to date, {when}',\n\t'backups.replica.pending': 'First copy at the next save',\n\t'backups.replica.error': 'Unreachable - will retry at the next save',\n\t'backups.replica.remove': 'Remove',\n\t'backups.replica.save': 'Add the copy',\n\t'backups.replica.webdav.url': 'File URL on the server (https://host:8443/dav/file.zip)',\n\t'backups.replica.webdav.help':\n\t\t'The full URL of the backup file, including a custom port if any. The server must allow this app to reach it (CORS) - some hosted drives do not, and will not connect from a browser.',\n\t'backups.replica.webdav.user': 'Username',\n\t'backups.replica.webdav.password': 'Password',\n\t'backups.replica.s3.endpoint': 'Endpoint URL',\n\t'backups.replica.s3.region': 'Region',\n\t'backups.replica.s3.bucket': 'Bucket',\n\t'backups.replica.s3.key': 'Object key (file name)',\n\t'backups.replica.s3.accessKeyId': 'Access key ID',\n\t'backups.replica.s3.secret': 'Secret access key',\n\t'error.generic': 'That did not work. Check the connection and try again.'\n};\n\nconst FR: WidgetLabels = {\n\t'backups.mine.heading': 'Sauvegardes',\n\t'backups.mine.personal': 'Sauvegarde principale',\n\t'backups.active': 'Active',\n\t'backups.pill.encrypted': 'Chiffrée',\n\t'backups.pill.plain': 'Non chiffrée',\n\t'backups.pill.shared': 'Partagée',\n\t'backups.pill.private': 'Non partagée',\n\t'backups.modified': 'modifiée {when}',\n\t'backups.replaceHint': \"L'ouvrir remplace les données de cet appareil.\",\n\t'backups.loading': 'Ouverture...',\n\t'backups.menu': 'Actions',\n\t'backups.open': 'Ouvrir',\n\t'backups.encrypt': 'Chiffrer',\n\t'backups.share': 'Partager',\n\t'backups.rename': 'Renommer',\n\t'backups.delete': 'Supprimer',\n\t'backups.new': '+ Nouvelle sauvegarde',\n\t'backups.newTitle': 'Nouvelle sauvegarde',\n\t'backups.startsBlank': 'Elle démarre vide.',\n\t'backups.namePh': 'Son nom',\n\t'backups.willBe': 'Fichier : {file}',\n\t'backups.taken': 'Ce nom est déjà pris.',\n\t'backups.create': 'Créer',\n\t'backups.renameTitle': 'Renommer cette sauvegarde',\n\t'backups.pwHint': 'Cette sauvegarde est protégée : entrez son mot de passe.',\n\t'backups.pwShow': 'Afficher le mot de passe',\n\t'backups.pwHide': 'Masquer le mot de passe',\n\t'backups.cancel': 'Annuler',\n\t'backups.shared.heading': 'Partagées avec moi',\n\t'backups.shared.by': 'Partagée par {who}',\n\t'backups.shared.leave': 'Quitter',\n\t'backups.replica.add': 'Seconde sauvegarde',\n\t'backups.replica.title': 'Seconde sauvegarde',\n\t'backups.replica.intro':\n\t\t\"Le même fichier chiffré, écrit aussi à un second endroit. Si l'un tombe, l'autre reste.\",\n\t'backups.replica.dest.drive': 'Google Drive',\n\t'backups.replica.dest.file': 'Un fichier sur cet appareil',\n\t'backups.replica.dest.webdav': 'Un serveur WebDAV',\n\t'backups.replica.dest.s3': 'Un bucket S3',\n\t'backups.replica.card': 'Seconde sauvegarde - {label}',\n\t'backups.replica.uptodate': 'À jour, {when}',\n\t'backups.replica.pending': 'Première copie au prochain enregistrement',\n\t'backups.replica.error': 'Injoignable - nouvel essai au prochain enregistrement',\n\t'backups.replica.remove': 'Retirer',\n\t'backups.replica.save': 'Ajouter la copie',\n\t'backups.replica.webdav.url': 'URL du fichier sur le serveur (https://hote:8443/dav/fichier.zip)',\n\t'backups.replica.webdav.help':\n\t\t\"L'URL complète du fichier de sauvegarde, port personnalisé compris. Le serveur doit autoriser cette application à le joindre (CORS) : certains hébergeurs ne le font pas et ne se connecteront pas depuis un navigateur.\",\n\t'backups.replica.webdav.user': 'Identifiant',\n\t'backups.replica.webdav.password': 'Mot de passe',\n\t'backups.replica.s3.endpoint': \"URL du point d'accès\",\n\t'backups.replica.s3.region': 'Région',\n\t'backups.replica.s3.bucket': 'Bucket',\n\t'backups.replica.s3.key': 'Chemin du fichier',\n\t'backups.replica.s3.accessKeyId': \"Identifiant de la clé d'accès\",\n\t'backups.replica.s3.secret': 'Clé secrète',\n\t'error.generic': \"Cela n'a pas fonctionné. Vérifiez la connexion et réessayez.\"\n};\n\n/** A destructive gesture, offered to confirmAction before it runs. `delete`\n * and `forget` carry the row; `leave` is a membership's removal (fileId =\n * its wallet, null for a legacy unbound one) - the host performs the actual\n * leave on the 'selfstore-backups-leave' event, whose detail repeats it. */\nexport type BackupsAction =\n\t| { type: 'delete'; fileId: string; name: string; active: boolean }\n\t| { type: 'forget'; fileId: string; who: string }\n\t| { type: 'leave'; fileId: string | null; who: string }\n\t| { type: 'replica-remove'; label: string };\n\n/** \"off\"-style attribute values; anything else (including empty) reads as on. */\nconst isOff = (v: string | null): boolean =>\n\tv != null && ['off', 'false', 'no', '0'].includes(v.trim().toLowerCase());\n\nconst EYE_OPEN =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>';\nconst EYE_SHUT =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 3 18 18\"/><path d=\"M10.6 5.1A10.9 10.9 0 0 1 12 5c6.5 0 10 7 10 7a17.4 17.4 0 0 1-3.4 4.4M6.6 6.6A17 17 0 0 0 2 12s3.5 7 10 7a10.7 10.7 0 0 0 5.4-1.4\"/></svg>';\n\nexport class SelfstoreBackupsElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn [\n\t\t\t'with-create',\n\t\t\t'with-rename',\n\t\t\t'with-delete',\n\t\t\t'with-open',\n\t\t\t'with-encrypt',\n\t\t\t'with-share',\n\t\t\t'with-shared'\n\t\t];\n\t}\n\n\t#manager: BackupsManager | null = null;\n\t#rows: BackupRow[] | null = null;\n\t#lastActive: string | null | undefined = undefined;\n\t#listing = false;\n\t#busy = false;\n\t#openBusy: string | null = null;\n\t#menuFor: string | null = null;\n\t#pwFor: string | null = null;\n\t#pw = '';\n\t#pwShown = false;\n\t#renameFor: BackupRow | null = null;\n\t#renameLabel = '';\n\t#createOpen = false;\n\t#createLabel = '';\n\t#members: { by: string; fileId?: string | null }[] = [];\n\t#replicaFlow: ReplicaFlow | null = null;\n\t#replicaSnap: ReplicaSnapshot | null = null;\n\t#repWebdav: WebdavConfig = { url: '', username: '', password: '' };\n\t#repS3: S3Config = {\n\t\tendpoint: '',\n\t\tregion: '',\n\t\tbucket: '',\n\t\tkey: '',\n\t\taccessKeyId: '',\n\t\tsecretAccessKey: ''\n\t};\n\t#activeEncrypted: boolean | null = null;\n\t#activeShared: boolean | null = null;\n\t#confirmAction: ((action: BackupsAction) => boolean | Promise<boolean>) | null = null;\n\t#withCreate = true;\n\t#withRename = true;\n\t#withDelete = true;\n\t#withOpen = true;\n\t#withEncrypt = true;\n\t#withShare = true;\n\t#withShared = true;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\t/** The headless manager this panel drives (see 'selfstore/backups'). */\n\tget manager(): BackupsManager | null {\n\t\treturn this.#manager;\n\t}\n\tset manager(v: BackupsManager | null) {\n\t\tthis.#manager = v;\n\t\tthis.wire();\n\t}\n\n\t/** The households this device is a member of (one entry per share, or a\n\t * single object for one): each renders in \"Shared with me\" labeled by who\n\t * shares it, removal = leaving (host performs it on\n\t * 'selfstore-backups-leave', whose detail names the entry's fileId). With\n\t * `fileId` (the share's dedicated wallet), that registry row IS the\n\t * member row: active it wears the badge, inactive it opens like any\n\t * shared silo - and its one menu action is leaving, never a mere forget. */\n\tget member(): { by: string; fileId?: string | null }[] | null {\n\t\treturn this.#members.length > 0 ? this.#members : null;\n\t}\n\tset member(\n\t\tv: { by: string; fileId?: string | null }[] | { by: string; fileId?: string | null } | null\n\t) {\n\t\tthis.#members = v == null ? [] : Array.isArray(v) ? v : [v];\n\t\tthis.rerender();\n\t}\n\n\t/** Live state of the ATTACHED backup, from the host's store: the active\n\t * row's pills prefer these over the learned memories (which may lag). */\n\tget activeEncrypted(): boolean | null {\n\t\treturn this.#activeEncrypted;\n\t}\n\tset activeEncrypted(v: boolean | null) {\n\t\tthis.#activeEncrypted = v;\n\t\tthis.rerender();\n\t}\n\tget activeShared(): boolean | null {\n\t\treturn this.#activeShared;\n\t}\n\tset activeShared(v: boolean | null) {\n\t\tthis.#activeShared = v;\n\t\tthis.rerender();\n\t}\n\n\t/** Host veto over the destructive gestures (delete / forget / leave):\n\t * answer (or resolve) false to keep things as they are - window.confirm\n\t * fits as-is. Default: everything proceeds. */\n\tget confirmAction(): ((action: BackupsAction) => boolean | Promise<boolean>) | null {\n\t\treturn this.#confirmAction;\n\t}\n\tset confirmAction(v: ((action: BackupsAction) => boolean | Promise<boolean>) | null) {\n\t\tthis.#confirmAction = v ?? null;\n\t}\n\n\tget withCreate(): boolean {\n\t\treturn this.#withCreate;\n\t}\n\tset withCreate(v: boolean) {\n\t\tthis.#withCreate = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withRename(): boolean {\n\t\treturn this.#withRename;\n\t}\n\tset withRename(v: boolean) {\n\t\tthis.#withRename = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withDelete(): boolean {\n\t\treturn this.#withDelete;\n\t}\n\tset withDelete(v: boolean) {\n\t\tthis.#withDelete = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withOpen(): boolean {\n\t\treturn this.#withOpen;\n\t}\n\tset withOpen(v: boolean) {\n\t\tthis.#withOpen = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withEncrypt(): boolean {\n\t\treturn this.#withEncrypt;\n\t}\n\tset withEncrypt(v: boolean) {\n\t\tthis.#withEncrypt = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withShare(): boolean {\n\t\treturn this.#withShare;\n\t}\n\tset withShare(v: boolean) {\n\t\tthis.#withShare = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withShared(): boolean {\n\t\treturn this.#withShared;\n\t}\n\tset withShared(v: boolean) {\n\t\tthis.#withShared = v !== false;\n\t\tthis.rerender();\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tconst on = value == null || !isOff(value);\n\t\tif (name === 'with-create') this.withCreate = on;\n\t\tif (name === 'with-rename') this.withRename = on;\n\t\tif (name === 'with-delete') this.withDelete = on;\n\t\tif (name === 'with-open') this.withOpen = on;\n\t\tif (name === 'with-encrypt') this.withEncrypt = on;\n\t\tif (name === 'with-share') this.withShare = on;\n\t\tif (name === 'with-shared') this.withShared = on;\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tthis.wire();\n\t}\n\n\t/** Re-list the rows from the destination (the host calls this after a\n\t * gesture of its own moved things - a leave, an external change). */\n\trefresh(): void {\n\t\tvoid this.loadRows();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#manager) return;\n\t\tthis.unsub?.();\n\t\tconst manager = this.#manager;\n\t\tconst unsubManager = manager.subscribe((snap) => {\n\t\t\t// A switch (or first attach) re-lists; every snapshot repaints.\n\t\t\tif (snap.activeFileId !== this.#lastActive) {\n\t\t\t\tthis.#lastActive = snap.activeFileId;\n\t\t\t\tvoid this.loadRows();\n\t\t\t}\n\t\t\tthis.rerender();\n\t\t});\n\t\tconst unsubReplica = this.#replicaFlow?.subscribe((snap) => {\n\t\t\tthis.#replicaSnap = snap;\n\t\t\tthis.rerender();\n\t\t});\n\t\tthis.unsub = () => {\n\t\t\tunsubManager();\n\t\t\tunsubReplica?.();\n\t\t};\n\t\tvoid manager.hydrate().then(() => this.loadRows());\n\t}\n\n\t/** The backup-copy journey (see 'selfstore/flows' replicaFlow). Setting it\n\t * adds a menu entry on the active backup's card and renders the copy\n\t * cards under it; without it the panel is byte-identical to before. The\n\t * widget restores a recorded copy by itself. */\n\tget replica(): ReplicaFlow | null {\n\t\treturn this.#replicaFlow;\n\t}\n\tset replica(v: ReplicaFlow | null) {\n\t\tthis.#replicaFlow = v;\n\t\tthis.#replicaSnap = v?.snapshot ?? null;\n\t\tif (v) void v.restore();\n\t\tthis.wire();\n\t}\n\n\t/** One destination listing, then the lazy encryption probes (each learned\n\t * bit repaints its row). A transient failure keeps the last good list. */\n\tprivate async loadRows(): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager || this.#listing) return;\n\t\tthis.#listing = true;\n\t\ttry {\n\t\t\tthis.#rows = await manager.list();\n\t\t\tthis.rerender();\n\t\t\tfor (const r of this.#rows ?? []) {\n\t\t\t\tif (r.encrypted !== null) continue;\n\t\t\t\tconst enc = await manager.probeEncryption(r.fileId);\n\t\t\t\tif (enc === null || this.#rows === null) continue;\n\t\t\t\tthis.#rows = this.#rows.map((x) => (x.fileId === r.fileId ? { ...x, encrypted: enc } : x));\n\t\t\t\tthis.rerender();\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.#rows = this.#rows ?? [];\n\t\t\tthis.rerender();\n\t\t} finally {\n\t\t\tthis.#listing = false;\n\t\t}\n\t}\n\n\t/** t() with {placeholders}. */\n\tprivate ts(key: string, params: Record<string, string>): string {\n\t\treturn this.t(key).replace(/\\{(\\w+)\\}/g, (_, k: string) => params[k] ?? '');\n\t}\n\n\tprivate label(row: BackupRow): string {\n\t\treturn row.label ?? this.t('backups.mine.personal');\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst manager = this.#manager;\n\t\tif (!manager) return;\n\t\tconst snap = manager.snapshot;\n\t\tconst rows = this.#rows ?? [];\n\t\tconst active = snap.activeFileId;\n\n\t\t// --- My backups -----------------------------------------------------\n\t\tconst mine = snap.joined ? rows.filter((r) => r.fileId !== active) : rows;\n\t\tif (this.#rows !== null) put(into, this.heading('sub heading', 'backups.mine.heading'));\n\t\tconst list = h('ul', { part: 'list' });\n\t\tfor (const r of mine) {\n\t\t\tconst isActive = r.fileId === active;\n\t\t\tif (this.#pwFor === r.fileId) list.append(this.passwordCard(r));\n\t\t\telse if (this.#renameFor?.fileId === r.fileId) list.append(this.renameCard(r));\n\t\t\t// The attached copy is not a backup of its own: it rides INSIDE the\n\t\t\t// active card as one line under its pills (never a card of its own,\n\t\t\t// never for a joined member's shared file).\n\t\t\telse list.append(this.rowCard(r, isActive, isActive ? this.replicaAttachedLine() : null));\n\t\t\t// The destination choice / config form (transient setup) renders as a\n\t\t\t// card right under the active one.\n\t\t\tif (isActive) for (const el of this.replicaSetup()) list.append(el);\n\t\t}\n\t\tif (list.childElementCount > 0) into.append(list);\n\n\t\t// --- Create ---------------------------------------------------------\n\t\tif (this.#withCreate) {\n\t\t\tif (this.#createOpen) into.append(this.createCard());\n\t\t\telse {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button new-button',\n\t\t\t\t\t\t\t'data-action': 'new',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\t\t\tthis.#createOpen = true;\n\t\t\t\t\t\t\t\tthis.#createLabel = '';\n\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.new')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// --- Shared with me -------------------------------------------------\n\t\tif (!this.#withShared) return;\n\t\tconst members = this.#members;\n\t\t// The badge row: the membership riding the ATTACHED file - wallet-bound\n\t\t// when its silo is active (the others' registry rows stand in), or a\n\t\t// legacy unbound one on whatever file is attached.\n\t\tconst badge = members.find((m) => (m.fileId != null ? m.fileId === active : true)) ?? null;\n\t\t// An owner already present as a MEMBERSHIP owns its row, and its one\n\t\t// action is Leave. A registry entry for that same owner is a stale\n\t\t// duplicate of the same share (a re-join left the old file behind): never\n\t\t// show it as a second, Forget-only row. Forget rows also collapse to one\n\t\t// per owner - never the same email twice.\n\t\tconst memberWhos = new Set(members.map((m) => m.by));\n\t\tconst others: { fileId: string; who: string; member: boolean }[] = [];\n\t\tconst seenForget = new Set<string>();\n\t\tfor (const s of snap.registry.shared) {\n\t\t\tif (s.fileId === active && !snap.joined) continue;\n\t\t\tconst member = members.some((m) => m.fileId === s.fileId);\n\t\t\tconst who = s.ownerEmail ?? s.ownerName ?? '?';\n\t\t\tif (!member) {\n\t\t\t\tif (memberWhos.has(who) || seenForget.has(who)) continue;\n\t\t\t\tseenForget.add(who);\n\t\t\t}\n\t\t\tothers.push({ fileId: s.fileId, who, member });\n\t\t}\n\t\tif (members.length === 0 && others.length === 0) return;\n\t\tput(into, this.heading('sub heading', 'backups.shared.heading'));\n\t\tconst shared = h('ul', { part: 'list' });\n\t\tif (badge) {\n\t\t\tconst activeRow = rows.find((r) => r.fileId === active) ?? null;\n\t\t\tconst leaveAction: BackupsAction = {\n\t\t\t\ttype: 'leave',\n\t\t\t\tfileId: badge.fileId ?? null,\n\t\t\t\twho: badge.by\n\t\t\t};\n\t\t\tshared.append(\n\t\t\t\th(\n\t\t\t\t\t'li',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'card card-active',\n\t\t\t\t\t\tstyle: 'position:relative;border-color:var(--_ok)',\n\t\t\t\t\t\t'data-member': ''\n\t\t\t\t\t},\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\t\t\tbadge.fileId != null || !activeRow\n\t\t\t\t\t\t\t\t? this.ts('backups.shared.by', { who: badge.by })\n\t\t\t\t\t\t\t\t: this.label(activeRow),\n\t\t\t\t\t\t\th('span', { part: 'tag' }, this.t('backups.active'))\n\t\t\t\t\t\t),\n\t\t\t\t\t\tbadge.fileId == null && activeRow\n\t\t\t\t\t\t\t? h('div', { part: 'sub' }, this.ts('backups.shared.by', { who: badge.by }))\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t),\n\t\t\t\t\tthis.menuButton('member'),\n\t\t\t\t\tthis.#menuFor === 'member'\n\t\t\t\t\t\t? this.menu(\n\t\t\t\t\t\t\t\tthis.#withDelete\n\t\t\t\t\t\t\t\t\t? this.menuItem('leave', this.t('backups.shared.leave'), true, () =>\n\t\t\t\t\t\t\t\t\t\t\tthis.guarded(leaveAction, () =>\n\t\t\t\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-leave', { fileId: leaveAction.fileId })\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tfor (const s of others) {\n\t\t\t// The badge row's file never doubles as a registry row.\n\t\t\tif (badge && s.fileId === active) continue;\n\t\t\tconst memberEntry = s.member;\n\t\t\tshared.append(\n\t\t\t\th(\n\t\t\t\t\t'li',\n\t\t\t\t\t{ part: 'card', style: 'position:relative', 'data-shared': s.fileId },\n\t\t\t\t\tthis.#withOpen\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpart: 'link open-shared',\n\t\t\t\t\t\t\t\t\tstyle: 'flex:1;min-width:0;text-align:left;text-decoration:none',\n\t\t\t\t\t\t\t\t\t'data-action': 'open-shared',\n\t\t\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\t\t\tonclick: () => this.open(s.fileId)\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\th('div', { part: 'title' }, this.ts('backups.shared.by', { who: s.who })),\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{ part: 'sub' },\n\t\t\t\t\t\t\t\t\tthis.#openBusy === s.fileId\n\t\t\t\t\t\t\t\t\t\t? this.t('backups.loading')\n\t\t\t\t\t\t\t\t\t\t: this.t('backups.replaceHint')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\t\t\t\t\th('div', { part: 'title' }, this.ts('backups.shared.by', { who: s.who })),\n\t\t\t\t\t\t\t\th('div', { part: 'sub' }, this.t('backups.replaceHint'))\n\t\t\t\t\t\t\t),\n\t\t\t\t\tthis.menuButton(s.fileId),\n\t\t\t\t\tthis.#menuFor === s.fileId\n\t\t\t\t\t\t? this.menu(\n\t\t\t\t\t\t\t\tthis.#withDelete\n\t\t\t\t\t\t\t\t\t? memberEntry\n\t\t\t\t\t\t\t\t\t\t? this.menuItem('leave', this.t('backups.shared.leave'), true, () =>\n\t\t\t\t\t\t\t\t\t\t\t\tthis.guarded({ type: 'leave', fileId: s.fileId, who: s.who }, () =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-leave', { fileId: s.fileId })\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t: this.menuItem('forget', this.t('backups.delete'), true, () =>\n\t\t\t\t\t\t\t\t\t\t\t\tthis.guarded(\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ type: 'forget', fileId: s.fileId, who: s.who },\n\t\t\t\t\t\t\t\t\t\t\t\t\t() => void this.forget(s.fileId)\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tif (shared.childElementCount > 0) into.append(shared);\n\t}\n\n\t// --- Cards ----------------------------------------------------------------\n\n\tprivate pills(r: BackupRow, active: boolean): (HTMLElement | string | null)[] {\n\t\tconst enc = active && this.#activeEncrypted !== null ? this.#activeEncrypted : r.encrypted;\n\t\tconst shr = active && this.#activeShared !== null ? this.#activeShared : r.shared;\n\t\tconst bits: (HTMLElement | string | null)[] = [];\n\t\tif (enc !== null) {\n\t\t\tbits.push(\n\t\t\t\th(\n\t\t\t\t\t'span',\n\t\t\t\t\t{ part: enc ? 'pill pill-encrypted sev-ok' : 'pill pill-plain', style: pillStyle },\n\t\t\t\t\tthis.t(enc ? 'backups.pill.encrypted' : 'backups.pill.plain')\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tif (shr !== null) {\n\t\t\tbits.push(\n\t\t\t\th(\n\t\t\t\t\t'span',\n\t\t\t\t\t{ part: shr ? 'pill pill-shared sev-warn' : 'pill pill-private', style: pillStyle },\n\t\t\t\t\tthis.t(shr ? 'backups.pill.shared' : 'backups.pill.private')\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tif (r.modifiedAt) {\n\t\t\tbits.push(\n\t\t\t\th(\n\t\t\t\t\t'span',\n\t\t\t\t\t{ part: 'sub' },\n\t\t\t\t\tthis.ts('backups.modified', { when: new Date(r.modifiedAt).toLocaleDateString() })\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\treturn bits;\n\t}\n\n\tprivate rowCard(r: BackupRow, active: boolean, footer: HTMLElement | null = null): HTMLElement {\n\t\tconst body = h(\n\t\t\t'div',\n\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'title' },\n\t\t\t\tthis.label(r),\n\t\t\t\tactive ? h('span', { part: 'tag' }, this.t('backups.active')) : null\n\t\t\t),\n\t\t\th('div', { part: 'row', style: 'margin-top:0.2rem' }, ...this.pills(r, active)),\n\t\t\tfooter\n\t\t);\n\t\tconst opens = this.#withOpen && !active;\n\t\tconst face = opens\n\t\t\t? h(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'link open-row',\n\t\t\t\t\t\tstyle: 'flex:1;min-width:0;text-align:left;text-decoration:none',\n\t\t\t\t\t\t'data-action': 'open',\n\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\tonclick: () => this.open(r.fileId)\n\t\t\t\t\t},\n\t\t\t\t\tthis.#openBusy === r.fileId ? h('div', { part: 'sub' }, this.t('backups.loading')) : body\n\t\t\t\t)\n\t\t\t: body;\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{\n\t\t\t\tpart: active ? 'card card-active' : 'card',\n\t\t\t\tstyle: active ? 'position:relative;border-color:var(--_ok)' : 'position:relative',\n\t\t\t\t'data-row': r.fileId\n\t\t\t},\n\t\t\tface,\n\t\t\tthis.menuButton(r.fileId),\n\t\t\tthis.#menuFor === r.fileId\n\t\t\t\t? this.menu(\n\t\t\t\t\t\topens\n\t\t\t\t\t\t\t? this.menuItem('open', this.t('backups.open'), false, () => this.open(r.fileId))\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withEncrypt\n\t\t\t\t\t\t\t? this.menuItem('encrypt', this.t('backups.encrypt'), false, () =>\n\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-encrypt', {\n\t\t\t\t\t\t\t\t\t\tfileId: r.fileId,\n\t\t\t\t\t\t\t\t\t\tlabel: r.label,\n\t\t\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withShare\n\t\t\t\t\t\t\t? this.menuItem('share', this.t('backups.share'), false, () =>\n\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-share', { fileId: r.fileId, label: r.label, active })\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tactive &&\n\t\t\t\t\t\t\tthis.#replicaFlow &&\n\t\t\t\t\t\t\tthis.#replicaSnap?.step === 'idle' &&\n\t\t\t\t\t\t\t!this.#replicaSnap.replica\n\t\t\t\t\t\t\t? this.menuItem('replica-add', this.t('backups.replica.add'), false, () =>\n\t\t\t\t\t\t\t\t\tthis.#replicaFlow?.open()\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withRename\n\t\t\t\t\t\t\t? this.menuItem('rename', this.t('backups.rename'), false, () => {\n\t\t\t\t\t\t\t\t\tthis.#renameFor = r;\n\t\t\t\t\t\t\t\t\tthis.#renameLabel = r.label ?? '';\n\t\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withDelete\n\t\t\t\t\t\t\t? this.menuItem('delete', this.t('backups.delete'), true, () =>\n\t\t\t\t\t\t\t\t\tthis.guarded(\n\t\t\t\t\t\t\t\t\t\t{ type: 'delete', fileId: r.fileId, name: r.name, active },\n\t\t\t\t\t\t\t\t\t\t() => void this.deleteRow(r.fileId)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t)\n\t\t\t\t: null\n\t\t);\n\t}\n\n\tprivate passwordCard(r: BackupRow): HTMLElement {\n\t\tconst submit = (): void => {\n\t\t\tif (this.#pw.length > 0) void this.open(r.fileId, this.#pw);\n\t\t};\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card', 'data-password': r.fileId },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\th('div', { part: 'title' }, this.label(r)),\n\t\t\t\th('div', { part: 'sub' }, this.t('backups.pwHint')),\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'span',\n\t\t\t\t\t\t{ part: 'field', style: 'flex:1;min-width:9rem' },\n\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\tpart: 'input',\n\t\t\t\t\t\t\ttype: this.#pwShown ? 'text' : 'password',\n\t\t\t\t\t\t\tautocomplete: 'current-password',\n\t\t\t\t\t\t\t'data-keep': 'backup-pw',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\toninput: (e: Event) => (this.#pw = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\tonkeydown: (e: Event) => {\n\t\t\t\t\t\t\t\tif ((e as KeyboardEvent).key === 'Enter') submit();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tthis.eye()\n\t\t\t\t\t),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'pw-open',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: submit\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.open')\n\t\t\t\t\t),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t'data-action': 'pw-cancel',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: () => this.closePw()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate renameCard(r: BackupRow): HTMLElement {\n\t\tconst taken = this.nameTaken(this.#renameLabel, r.fileId);\n\t\tconst clean = this.#renameLabel.trim();\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card', 'data-rename': r.fileId },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\th('div', { part: 'title' }, this.t('backups.renameTitle')),\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\tstyle: 'margin-top:0.45rem',\n\t\t\t\t\t'data-keep': 'rename-label',\n\t\t\t\t\tmaxlength: '40',\n\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\tvalue: this.#renameLabel,\n\t\t\t\t\toninput: (e: Event) => {\n\t\t\t\t\t\tthis.#renameLabel = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttaken\n\t\t\t\t\t? h('div', { part: 'error-note' }, this.t('backups.taken'))\n\t\t\t\t\t: clean\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ part: 'sub' },\n\t\t\t\t\t\t\t\tthis.ts('backups.willBe', { file: this.#manager?.fileNameFor(clean) ?? '' })\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'rename-save',\n\t\t\t\t\t\t\tdisabled: this.#busy || !clean || taken,\n\t\t\t\t\t\t\tonclick: () => void this.rename(r)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.rename')\n\t\t\t\t\t),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t'data-action': 'rename-cancel',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\t\t\tthis.#renameFor = null;\n\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate createCard(): HTMLElement {\n\t\tconst taken = this.nameTaken(this.#createLabel, null);\n\t\tconst clean = this.#createLabel.trim();\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{ part: 'card', 'data-create': '' },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\th('div', { part: 'title' }, this.t('backups.newTitle')),\n\t\t\t\th('div', { part: 'sub' }, this.t('backups.startsBlank')),\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\tstyle: 'margin-top:0.45rem',\n\t\t\t\t\tplaceholder: this.t('backups.namePh'),\n\t\t\t\t\t'data-keep': 'create-label',\n\t\t\t\t\tmaxlength: '40',\n\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\toninput: (e: Event) => {\n\t\t\t\t\t\tthis.#createLabel = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttaken\n\t\t\t\t\t? h('div', { part: 'error-note' }, this.t('backups.taken'))\n\t\t\t\t\t: clean\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ part: 'sub' },\n\t\t\t\t\t\t\t\tthis.ts('backups.willBe', { file: this.#manager?.fileNameFor(clean) ?? '' })\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'create',\n\t\t\t\t\t\t\tdisabled: this.#busy || !clean || taken,\n\t\t\t\t\t\t\tonclick: () => void this.create()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.create')\n\t\t\t\t\t),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t'data-action': 'create-cancel',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\t\t\tthis.#createOpen = false;\n\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\t// --- Backup copy (replica) -------------------------------------------------\n\n\t/** The transient setup UI under the active card: the destination choice or a\n\t * config form. The ATTACHED copy is not here - it rides inside the active\n\t * card (replicaAttachedLine). Idle renders nothing - the entry point lives\n\t * in the active card's menu. */\n\tprivate replicaSetup(): HTMLElement[] {\n\t\tconst snap = this.#replicaSnap;\n\t\tif (!this.#replicaFlow || !snap || snap.replica) return [];\n\t\tif (snap.step === 'choose') return [this.replicaPicker(snap)];\n\t\tif (snap.step === 'form-webdav') return [this.replicaWebdavForm(snap)];\n\t\tif (snap.step === 'form-s3') return [this.replicaS3Form(snap)];\n\t\treturn [];\n\t}\n\n\t/** The attached copy is not a backup of its own: it renders as ONE line\n\t * INSIDE the active backup's card, under its pills (label, freshness, an\n\t * inline \"remove\") - never a card or a block of its own. Null when no copy\n\t * is attached. */\n\tprivate replicaAttachedLine(): HTMLElement | null {\n\t\tconst snap = this.#replicaSnap;\n\t\tif (!this.#replicaFlow || !snap || !snap.replica) return null;\n\t\tconst rep = snap.replica;\n\t\tconst label = rep.label;\n\t\tconst status = rep.lastError\n\t\t\t? h('span', { part: 'sub replica-error' }, this.t('backups.replica.error'))\n\t\t\t: rep.lastPublishAt\n\t\t\t\t? h(\n\t\t\t\t\t\t'span',\n\t\t\t\t\t\t{ part: 'sub replica-ok' },\n\t\t\t\t\t\tthis.ts('backups.replica.uptodate', {\n\t\t\t\t\t\t\twhen: new Date(rep.lastPublishAt).toLocaleTimeString([], {\n\t\t\t\t\t\t\t\thour: '2-digit',\n\t\t\t\t\t\t\t\tminute: '2-digit'\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t: h('span', { part: 'sub' }, this.t('backups.replica.pending'));\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{\n\t\t\t\tpart: 'sub replica-line',\n\t\t\t\t'data-replica': '',\n\t\t\t\tstyle:\n\t\t\t\t\t'display:flex;flex-wrap:wrap;align-items:baseline;gap:0.1rem 0.5rem;margin-top:0.35rem'\n\t\t\t},\n\t\t\th('span', { part: 'replica-label' }, this.ts('backups.replica.card', { label })),\n\t\t\tstatus,\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{\n\t\t\t\t\tpart: 'link replica-remove',\n\t\t\t\t\ttype: 'button',\n\t\t\t\t\t'data-action': 'replica-remove',\n\t\t\t\t\tonclick: () =>\n\t\t\t\t\t\tthis.guarded({ type: 'replica-remove', label }, () => void this.#replicaFlow?.remove())\n\t\t\t\t},\n\t\t\t\tthis.t('backups.replica.remove')\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate replicaPicker(snap: ReplicaSnapshot): HTMLElement {\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card replica-picker', style: 'display:block' },\n\t\t\th('div', { part: 'title' }, this.t('backups.replica.title')),\n\t\t\th('div', { part: 'sub', style: 'margin:0.2rem 0 0.6rem' }, this.t('backups.replica.intro')),\n\t\t\t...snap.kinds.map((kind: ConnectKind) =>\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'button replica-dest',\n\t\t\t\t\t\tstyle: 'display:block;width:100%;text-align:left;margin-bottom:0.4rem',\n\t\t\t\t\t\t'data-kind': kind,\n\t\t\t\t\t\tdisabled: snap.busy,\n\t\t\t\t\t\tonclick: () => this.#replicaFlow?.pick(kind)\n\t\t\t\t\t},\n\t\t\t\t\tthis.t(`backups.replica.dest.${kind}`)\n\t\t\t\t)\n\t\t\t),\n\t\t\tsnap.error ? h('div', { part: 'error-note' }, this.t('error.generic')) : null,\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{\n\t\t\t\t\tpart: 'button',\n\t\t\t\t\t'data-action': 'replica-cancel',\n\t\t\t\t\tdisabled: snap.busy,\n\t\t\t\t\tonclick: () => this.#replicaFlow?.cancel()\n\t\t\t\t},\n\t\t\t\tthis.t('backups.cancel')\n\t\t\t)\n\t\t);\n\t}\n\n\t/** A config field: mutates state on input, no repaint (validated on submit). */\n\tprivate replicaField(\n\t\tkey: string,\n\t\ttype: string,\n\t\tvalue: string,\n\t\toninput: (v: string) => void\n\t): HTMLElement {\n\t\treturn h('input', {\n\t\t\tpart: 'input',\n\t\t\tstyle: 'display:block;width:100%;margin-bottom:0.4rem',\n\t\t\ttype,\n\t\t\tplaceholder: this.t(key),\n\t\t\t'aria-label': this.t(key),\n\t\t\tvalue,\n\t\t\toninput: (e: Event) => oninput((e.target as HTMLInputElement).value)\n\t\t});\n\t}\n\n\tprivate replicaWebdavForm(snap: ReplicaSnapshot): HTMLElement {\n\t\tconst c = this.#repWebdav;\n\t\tconst submit = (): void => {\n\t\t\tif (!c.url.trim()) return;\n\t\t\tthis.#replicaFlow?.submitWebdav({\n\t\t\t\turl: c.url.trim(),\n\t\t\t\tusername: c.username.trim(),\n\t\t\t\tpassword: c.password\n\t\t\t});\n\t\t};\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card replica-form', style: 'display:block' },\n\t\t\th('div', { part: 'title', style: 'margin-bottom:0.3rem' }, this.t('backups.replica.title')),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'sub', style: 'margin-bottom:0.6rem' },\n\t\t\t\tthis.t('backups.replica.webdav.help')\n\t\t\t),\n\t\t\tthis.replicaField('backups.replica.webdav.url', 'url', c.url, (v) => (c.url = v)),\n\t\t\tthis.replicaField('backups.replica.webdav.user', 'text', c.username, (v) => (c.username = v)),\n\t\t\tthis.replicaField(\n\t\t\t\t'backups.replica.webdav.password',\n\t\t\t\t'password',\n\t\t\t\tc.password,\n\t\t\t\t(v) => (c.password = v)\n\t\t\t),\n\t\t\tsnap.error ? h('div', { part: 'error-note' }, this.t('error.generic')) : null,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t'data-action': 'replica-webdav',\n\t\t\t\t\t\tdisabled: snap.busy,\n\t\t\t\t\t\tonclick: submit\n\t\t\t\t\t},\n\t\t\t\t\tthis.t('backups.replica.save')\n\t\t\t\t),\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button', disabled: snap.busy, onclick: () => this.#replicaFlow?.cancel() },\n\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate replicaS3Form(snap: ReplicaSnapshot): HTMLElement {\n\t\tconst c = this.#repS3;\n\t\tconst submit = (): void => {\n\t\t\tconst config: S3Config = {\n\t\t\t\tendpoint: c.endpoint.trim(),\n\t\t\t\tregion: c.region.trim(),\n\t\t\t\tbucket: c.bucket.trim(),\n\t\t\t\tkey: c.key.trim(),\n\t\t\t\taccessKeyId: c.accessKeyId.trim(),\n\t\t\t\tsecretAccessKey: c.secretAccessKey\n\t\t\t};\n\t\t\tif (!config.endpoint || !config.region || !config.bucket || !config.key) return;\n\t\t\tif (!config.accessKeyId || !config.secretAccessKey) return;\n\t\t\tthis.#replicaFlow?.submitS3(config);\n\t\t};\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card replica-form', style: 'display:block' },\n\t\t\th('div', { part: 'title', style: 'margin-bottom:0.5rem' }, this.t('backups.replica.title')),\n\t\t\tthis.replicaField('backups.replica.s3.endpoint', 'url', c.endpoint, (v) => (c.endpoint = v)),\n\t\t\tthis.replicaField('backups.replica.s3.region', 'text', c.region, (v) => (c.region = v)),\n\t\t\tthis.replicaField('backups.replica.s3.bucket', 'text', c.bucket, (v) => (c.bucket = v)),\n\t\t\tthis.replicaField('backups.replica.s3.key', 'text', c.key, (v) => (c.key = v)),\n\t\t\tthis.replicaField(\n\t\t\t\t'backups.replica.s3.accessKeyId',\n\t\t\t\t'text',\n\t\t\t\tc.accessKeyId,\n\t\t\t\t(v) => (c.accessKeyId = v)\n\t\t\t),\n\t\t\tthis.replicaField(\n\t\t\t\t'backups.replica.s3.secret',\n\t\t\t\t'password',\n\t\t\t\tc.secretAccessKey,\n\t\t\t\t(v) => (c.secretAccessKey = v)\n\t\t\t),\n\t\t\tsnap.error ? h('div', { part: 'error-note' }, this.t('error.generic')) : null,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t'data-action': 'replica-s3',\n\t\t\t\t\t\tdisabled: snap.busy,\n\t\t\t\t\t\tonclick: submit\n\t\t\t\t\t},\n\t\t\t\t\tthis.t('backups.replica.save')\n\t\t\t\t),\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button', disabled: snap.busy, onclick: () => this.#replicaFlow?.cancel() },\n\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\t// --- Menu -----------------------------------------------------------------\n\n\tprivate menuButton(key: string): HTMLElement {\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{\n\t\t\t\tpart: 'button menu-button',\n\t\t\t\t'aria-label': this.t('backups.menu'),\n\t\t\t\t'aria-haspopup': 'menu',\n\t\t\t\t'aria-expanded': this.#menuFor === key ? 'true' : 'false',\n\t\t\t\t'data-action': 'menu',\n\t\t\t\t'data-menu-key': key,\n\t\t\t\tdisabled: this.#busy,\n\t\t\t\tonclick: () => {\n\t\t\t\t\tthis.#menuFor = this.#menuFor === key ? null : key;\n\t\t\t\t\tthis.rerender();\n\t\t\t\t\t(this.root.querySelector('[part~=\"menu\"]') as HTMLElement | null)?.focus();\n\t\t\t\t}\n\t\t\t},\n\t\t\t'⋯'\n\t\t);\n\t}\n\n\t/** The open overflow menu: a backdrop closes it on any outside click or\n\t * tap, Escape closes it and hands focus back to its trigger. The panel is\n\t * a dropdown over the trigger's corner on wide screens and a bottom sheet\n\t * on phones - both styled in the base sheet. */\n\tprivate menu(...items: (HTMLElement | null)[]): HTMLElement {\n\t\tconst key = this.#menuFor;\n\t\tconst close = (): void => {\n\t\t\tthis.#menuFor = null;\n\t\t\tthis.rerender();\n\t\t\t(this.root.querySelector(`[data-menu-key=\"${key}\"]`) as HTMLElement | null)?.focus();\n\t\t};\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{ part: 'menu-layer' },\n\t\t\th('div', { part: 'menu-backdrop', 'data-action': 'menu-close', onclick: close }),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tpart: 'menu',\n\t\t\t\t\trole: 'menu',\n\t\t\t\t\ttabindex: '-1',\n\t\t\t\t\tonkeydown: (e: Event) => {\n\t\t\t\t\t\tif ((e as KeyboardEvent).key === 'Escape') close();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t...items.filter((i): i is HTMLElement => i !== null)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate menuItem(action: string, text: string, danger: boolean, run: () => void): HTMLElement {\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{\n\t\t\t\tpart: danger ? 'menu-item menu-item-danger' : 'menu-item',\n\t\t\t\ttype: 'button',\n\t\t\t\trole: 'menuitem',\n\t\t\t\t'data-action': action,\n\t\t\t\tonclick: () => {\n\t\t\t\t\tthis.#menuFor = null;\n\t\t\t\t\trun();\n\t\t\t\t}\n\t\t\t},\n\t\t\ttext\n\t\t);\n\t}\n\n\tprivate eye(): HTMLElement {\n\t\tconst btn = h('button', {\n\t\t\tpart: 'eye',\n\t\t\ttype: 'button',\n\t\t\t'aria-label': this.t(this.#pwShown ? 'backups.pwHide' : 'backups.pwShow'),\n\t\t\tonclick: () => {\n\t\t\t\tthis.#pwShown = !this.#pwShown;\n\t\t\t\tthis.rerender();\n\t\t\t}\n\t\t});\n\t\tbtn.innerHTML = this.#pwShown ? EYE_SHUT : EYE_OPEN;\n\t\treturn btn;\n\t}\n\n\t// --- Gestures --------------------------------------------------------------\n\n\tprivate nameTaken(label: string, exceptFileId: string | null): boolean {\n\t\tconst clean = label.trim().toLowerCase();\n\t\tif (!clean || this.#busy) return false;\n\t\treturn (this.#rows ?? []).some(\n\t\t\t(r) => r.fileId !== exceptFileId && r.label !== null && r.label.trim().toLowerCase() === clean\n\t\t);\n\t}\n\n\t/** Run a destructive action through the host's veto (default: proceed).\n\t * A throwing hook reads as \"no\": destruction needs a clear yes. */\n\tprivate guarded(action: BackupsAction, run: () => void): void {\n\t\tconst gate = this.#confirmAction;\n\t\tif (!gate) {\n\t\t\trun();\n\t\t\treturn;\n\t\t}\n\t\tvoid Promise.resolve()\n\t\t\t.then(() => gate(action))\n\t\t\t.then((ok) => {\n\t\t\t\tif (ok) run();\n\t\t\t})\n\t\t\t.catch(() => undefined);\n\t}\n\n\t/** Open a row programmatically - the same gesture as tapping it, password\n\t * card included. Lets a host chain \"open this backup, then act on it\"\n\t * (its own sub-views) without re-implementing the passphrase step. */\n\tasync open(fileId: string, passphrase?: string): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.#openBusy = fileId;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tconst r = await manager.openBackup(fileId, passphrase ?? null);\n\t\t\tif (r === 'encrypted') {\n\t\t\t\tthis.#pwFor = fileId;\n\t\t\t\tif (passphrase) this.emit('selfstore-backups-wrong-password', { fileId });\n\t\t\t} else if (r === 'ok') {\n\t\t\t\tthis.closePw();\n\t\t\t\tthis.emit('selfstore-backups-opened', { fileId });\n\t\t\t\tvoid this.loadRows();\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t\tvoid this.loadRows(); // a GONE file was pruned: repaint truthfully\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.#openBusy = null;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async create(): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tconst label = this.#createLabel.trim();\n\t\tif (!manager || !label || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tconst r = await manager.createNamed(label);\n\t\t\tif (r === 'ok') {\n\t\t\t\tthis.#createOpen = false;\n\t\t\t\tthis.#createLabel = '';\n\t\t\t\tthis.emit('selfstore-backups-created', { label });\n\t\t\t\tvoid this.loadRows();\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async rename(row: BackupRow): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tconst label = this.#renameLabel.trim();\n\t\tif (!manager || !label || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tconst r = await manager.renameBackup(row.fileId, label);\n\t\t\tif (r === 'ok') {\n\t\t\t\tthis.#renameFor = null;\n\t\t\t\tthis.emit('selfstore-backups-renamed', { fileId: row.fileId, label });\n\t\t\t\tvoid this.loadRows();\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async deleteRow(fileId: string): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tif (await manager.deleteBackup(fileId)) {\n\t\t\t\tthis.#rows = (this.#rows ?? []).filter((r) => r.fileId !== fileId);\n\t\t\t\tthis.emit('selfstore-backups-deleted', { fileId });\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async forget(fileId: string): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager) return;\n\t\tawait manager.forgetShared(fileId);\n\t\tthis.emit('selfstore-backups-forgotten', { fileId });\n\t\tthis.rerender();\n\t}\n\n\tprivate closePw(): void {\n\t\tthis.#pwFor = null;\n\t\tthis.#pw = '';\n\t\tthis.#pwShown = false;\n\t}\n}\n\nconst pillStyle =\n\t'display:inline-block;font-size:0.72em;font-weight:600;line-height:1.6;padding:0 0.55em;border-radius:999px;border:1px solid var(--_border)';\n","/**\n * <selfstore-gate>: the first-run screen that asks where the data should live,\n * before the app has a durable home. Data that lives only in a browser profile\n * dies with it, so the question is worth a screen of its own rather than a line\n * buried in a settings pane.\n *\n * It is a frame around <selfstore-connect>, and it decides ONE thing the plain\n * connect widget cannot: whether to be on screen at all. That condition is the\n * engine's own `status.action === 'choose-destination'`, which covers both an\n * ephemeral store and one still on the device-only cache, and which ranks a\n * destination needing attention above a missing one - so the gate never demands\n * a choice when the real problem is a broken connection.\n *\n * import { defineSelfstoreWidgets } from 'selfstore/widgets';\n * defineSelfstoreWidgets();\n *\n * const el = document.querySelector('selfstore-gate');\n * el.store = store;\n * el.targets = { file: true, webdav: true };\n *\n * The host's own chrome goes in the light DOM through three slots: `brand`\n * (above the title), `extra` (under the destinations, e.g. a link to a demo)\n * and `footer` (the app's usual foot). Slotted nodes are never rebuilt.\n */\n\nimport type {\n\tConnectFlowOptions,\n\tConnectKind,\n\tConnectTargets,\n\tFlowHost,\n\tStoreLike\n} from '../flows/connect';\nimport type { SelfstoreConnectElement, WebdavPreset } from './connect';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'gate.title': 'Where should your data live?',\n\t'gate.hint':\n\t\t'It is encrypted on this device. Choose where to keep it and it gets saved there for you from now on.',\n\t'gate.fine': '',\n\t'gate.defer': 'Later - keep it in this browser only',\n\t'gate.defer.note': 'Data kept only in this browser is lost if its storage is cleared.'\n};\n\nconst FR: WidgetLabels = {\n\t'gate.title': 'Où enregistrer vos données ?',\n\t'gate.hint':\n\t\t'Elles sont chiffrées sur cet appareil. Choisissez une sauvegarde : tout y sera enregistré automatiquement.',\n\t'gate.fine': '',\n\t'gate.defer': 'Plus tard - garder sur cet appareil seulement',\n\t'gate.defer.note':\n\t\t'Sans sauvegarde, les données disparaissent si le stockage de cet appareil est vidé.'\n};\n\n/** The overlay itself. The card is the query container the base styles expect,\n * so the connect cards inside still react to their own width. */\nconst GATE_STYLES = `\n:host { display: contents; }\n[part~='gate'] {\n\tposition: fixed;\n\tinset: 0;\n\tz-index: var(--selfstore-gate-z, 280);\n\toverflow-y: auto;\n\tbackground: var(--selfstore-gate-backdrop, Canvas);\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n}\n[part~='gate-card'] {\n\twidth: 100%;\n\tmax-width: var(--selfstore-gate-width, 30rem);\n\tbox-sizing: border-box;\n\tpadding: calc(2rem + env(safe-area-inset-top)) 1.25rem 1.5rem;\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex: 1 0 auto;\n\tgap: var(--_gap);\n\tcontainer-type: inline-size;\n\toutline: none;\n}\n[part~='gate-title'] {\n\tmargin: 0;\n\tfont-size: var(--selfstore-gate-title-size, 1.5rem);\n\tfont-weight: 700;\n\tline-height: 1.25;\n}\nbutton[part~='gate-defer'] { align-self: flex-start; text-align: left; }\n[part~='gate-foot'] {\n\tflex-shrink: 0;\n\twidth: 100%;\n\tpadding-bottom: env(safe-area-inset-bottom);\n}\n`;\n\n/** The tag the connect element took, derived from the gate's own registered\n * name: both are defined together under the same prefix, so <app-gate> builds\n * an <app-connect> without anyone having to tell it. */\nfunction connectTagFor(gateTag: string): string {\n\treturn gateTag.endsWith('-gate')\n\t\t? `${gateTag.slice(0, -'-gate'.length)}-connect`\n\t\t: 'selfstore-connect';\n}\n\nexport class SelfstoreGateElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['armed', 'deferrable'];\n\t}\n\n\t#store: StoreLike | null = null;\n\t#targets: ConnectTargets | null = null;\n\t#options: ConnectFlowOptions = {};\n\t#icons: Partial<Record<ConnectKind, string>> = {};\n\t#recommended: ConnectKind | null = null;\n\t#advanced: ConnectKind[] = [];\n\t#presets: WebdavPreset[] = [];\n\t#armed = true;\n\t#deferrable = true;\n\t#deferred = false;\n\t#open = false;\n\t#connect: SelfstoreConnectElement | null = null;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\t/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */\n\tget store(): StoreLike | null {\n\t\treturn this.#store;\n\t}\n\tset store(v: StoreLike | null) {\n\t\t// Idempotent, so a host may assign it from a reactive effect: see the\n\t\t// note on <selfstore-connect>.\n\t\tif (v === this.#store) return;\n\t\tthis.#store = v;\n\t\tthis.wire();\n\t}\n\n\t/** The destinations to offer, exactly as <selfstore-connect> takes them.\n\t * Read when the gate opens; a change while it is open waits for the next\n\t * opening rather than rebuilding a journey under the user. */\n\tget targets(): ConnectTargets | null {\n\t\treturn this.#targets;\n\t}\n\tset targets(v: ConnectTargets | null) {\n\t\tthis.#targets = v;\n\t}\n\n\t/** Options for the connect flow (`defaultResolution`, `password`, ...).\n\t * Same timing as `targets`. */\n\tget options(): ConnectFlowOptions {\n\t\treturn this.#options;\n\t}\n\tset options(v: ConnectFlowOptions) {\n\t\tthis.#options = v ?? {};\n\t}\n\n\tget icons(): Partial<Record<ConnectKind, string>> {\n\t\treturn this.#icons;\n\t}\n\tset icons(v: Partial<Record<ConnectKind, string>> | null) {\n\t\tthis.#icons = v ?? {};\n\t\tthis.rerender();\n\t}\n\n\tget recommended(): ConnectKind | null {\n\t\treturn this.#recommended;\n\t}\n\tset recommended(v: ConnectKind | null) {\n\t\tthis.#recommended = v;\n\t\tthis.rerender();\n\t}\n\n\tget advanced(): ConnectKind[] {\n\t\treturn this.#advanced;\n\t}\n\tset advanced(v: ConnectKind[] | null) {\n\t\tthis.#advanced = v ?? [];\n\t\tthis.rerender();\n\t}\n\n\tget webdavPresets(): WebdavPreset[] {\n\t\treturn this.#presets;\n\t}\n\tset webdavPresets(v: WebdavPreset[] | null) {\n\t\tthis.#presets = Array.isArray(v) ? v : [];\n\t\tthis.rerender();\n\t}\n\n\t/** Whether the app has finished booting. Leave it true for a plain drop-in;\n\t * an app that restores its destination asynchronously sets it false until\n\t * that settles, so a connected user never glimpses the gate on the way in.\n\t * Also the `armed` attribute (`armed=\"false\"` to hold it shut). */\n\tget armed(): boolean {\n\t\treturn this.#armed;\n\t}\n\tset armed(v: boolean) {\n\t\tthis.#armed = v;\n\t\tthis.sync();\n\t}\n\n\t/** Whether to offer the way out (device-only is a working mode, just a\n\t * fragile one). Also the `deferrable` attribute. Part of the frame, so it\n\t * follows the same timing as `targets`: read when the gate opens. */\n\tget deferrable(): boolean {\n\t\treturn this.#deferrable;\n\t}\n\tset deferrable(v: boolean) {\n\t\tthis.#deferrable = v;\n\t}\n\n\t/** Set once the user chose to stay device-only; keeps the gate shut for the\n\t * rest of the session. Assign false to bring it back (a \"choose a\n\t * destination\" entry somewhere else in the app). */\n\tget deferred(): boolean {\n\t\treturn this.#deferred;\n\t}\n\tset deferred(v: boolean) {\n\t\tthis.#deferred = v;\n\t\tthis.sync();\n\t}\n\n\t/** Whether the gate is currently on screen. */\n\tget open(): boolean {\n\t\treturn this.#open;\n\t}\n\n\t/** The connect element the gate built, for programmatic control (its own\n\t * `flow` included). Null while the gate is shut. */\n\tget connect(): SelfstoreConnectElement | null {\n\t\treturn this.#connect;\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.root.append(h('style', {}, GATE_STYLES));\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'armed') this.armed = value !== 'false';\n\t\tif (name === 'deferrable') this.deferrable = value !== 'false';\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tif (this.hasAttribute('armed')) this.armed = this.getAttribute('armed') !== 'false';\n\t\tif (this.hasAttribute('deferrable')) {\n\t\t\tthis.deferrable = this.getAttribute('deferrable') !== 'false';\n\t\t}\n\t\tthis.wire();\n\t}\n\n\tprivate host(): FlowHost | null {\n\t\tconst s = this.#store;\n\t\tif (!s) return null;\n\t\treturn 'flowHost' in s ? s.flowHost : s;\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected) return;\n\t\tthis.unsub?.();\n\t\tthis.unsub = null;\n\t\tconst host = this.host();\n\t\tif (!host) return;\n\t\tthis.unsub = host.engine.subscribe(() => this.sync());\n\t\tthis.sync();\n\t}\n\n\t/** The library already derives \"no durable home yet\" - asking the target\n\t * kind by hand would miss the ranking and nag over a broken connection. */\n\tprivate shouldOpen(): boolean {\n\t\tconst host = this.host();\n\t\tif (!host || !this.#armed || this.#deferred) return false;\n\t\treturn host.engine.state.status.action === 'choose-destination';\n\t}\n\n\tprivate sync(): void {\n\t\tconst open = this.shouldOpen();\n\t\tif (open === this.#open) return; // a status tick that changes nothing\n\t\tthis.#open = open;\n\t\tif (!open) this.#connect = null;\n\t\tsuper.rerender();\n\t\tif (open) this.root.querySelector<HTMLElement>('[part~=\"gate-card\"]')?.focus();\n\t}\n\n\t/** Rebuilding the frame would re-append the child connect element, and a\n\t * custom element that leaves the DOM and comes back rebuilds its flow: a\n\t * journey in progress would be dropped on the floor. So while the gate is\n\t * open the frame stands and late cosmetics are pushed into the child.\n\t * Set `labels` before `store` for them to reach the frame's own copy. */\n\tprotected rerender(): void {\n\t\tconst el = this.#connect;\n\t\tif (!el) {\n\t\t\tsuper.rerender();\n\t\t\treturn;\n\t\t}\n\t\tel.labels = this.childLabels();\n\t\tel.icons = this.#icons;\n\t\tel.recommended = this.#recommended;\n\t\tel.advanced = this.#advanced;\n\t\tel.webdavPresets = this.#presets;\n\t}\n\n\t/** The gate's title already asks the question; the child's heading would\n\t * repeat it. An empty label removes a heading, and a host that wants it\n\t * back just says so in its own map. */\n\tprivate childLabels(): WidgetLabels {\n\t\treturn { 'connect.title': '', ...this.labels };\n\t}\n\n\tprivate buildConnect(): SelfstoreConnectElement {\n\t\tconst el = document.createElement(\n\t\t\tconnectTagFor(this.tagName.toLowerCase())\n\t\t) as SelfstoreConnectElement;\n\t\tel.labels = this.childLabels();\n\t\tel.icons = this.#icons;\n\t\tel.recommended = this.#recommended;\n\t\tel.advanced = this.#advanced;\n\t\tel.webdavPresets = this.#presets;\n\t\tel.options = this.#options;\n\t\tel.targets = this.#targets;\n\t\t// Last, and before the element enters the DOM: every one of these setters\n\t\t// wires the flow, and the store is what makes wiring possible at all.\n\t\tel.store = this.#store;\n\t\treturn el;\n\t}\n\n\tprivate deferButton(): HTMLElement | null {\n\t\tif (!this.#deferrable) return null;\n\t\tconst note = this.t('gate.defer.note');\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{},\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{\n\t\t\t\t\tpart: 'link gate-defer',\n\t\t\t\t\ttype: 'button',\n\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\tthis.deferred = true;\n\t\t\t\t\t\tthis.emit('selfstore-gate-deferred');\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tthis.t('gate.defer')\n\t\t\t),\n\t\t\tnote ? h('div', { part: 'hint gate-defer-note' }, note) : null\n\t\t);\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tif (!this.#open) return;\n\t\tthis.#connect = this.buildConnect();\n\t\tconst title = h('h1', { part: 'gate-title', id: 'gate-title' }, this.t('gate.title'));\n\t\tconst card = h('div', {\n\t\t\tpart: 'gate-card',\n\t\t\ttabindex: '-1'\n\t\t});\n\t\tput(\n\t\t\tcard,\n\t\t\th('slot', { name: 'brand' }),\n\t\t\ttitle,\n\t\t\tthis.heading('sub gate-hint', 'gate.hint'),\n\t\t\tthis.#connect,\n\t\t\th('slot', { name: 'extra' }),\n\t\t\tthis.heading('hint gate-fine', 'gate.fine'),\n\t\t\tthis.deferButton()\n\t\t);\n\t\tput(\n\t\t\tinto,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tpart: 'gate',\n\t\t\t\t\trole: 'dialog',\n\t\t\t\t\t'aria-modal': 'true',\n\t\t\t\t\t'aria-labelledby': 'gate-title'\n\t\t\t\t},\n\t\t\t\tcard,\n\t\t\t\th('div', { part: 'gate-foot' }, h('slot', { name: 'footer' }))\n\t\t\t)\n\t\t);\n\t}\n}\n","/**\n * <selfstore-destination>: where the data is kept, once it has a home.\n *\n * The counterpart of <selfstore-gate>. The gate asks the question before there\n * is an answer; this panel states the answer and carries the gestures that act\n * on it - export a copy, change destination, stop saving here.\n *\n * const el = document.querySelector('selfstore-destination');\n * el.store = store;\n * el.targets = { drive: driveAuth, file: true }; // enables \"change\"\n *\n * It DOES the work rather than asking the host to. Exporting a copy, detaching\n * and re-connecting are all the engine's own operations, so a panel that only\n * emitted intentions would leave the same two hundred lines in every app - the\n * very lines this widget exists to delete.\n *\n * The one exception is structural, not a choice: **loading a copy back cannot\n * be done from here.** The library holds no records; the app's `apply` does.\n * The engine exposes `exportBlob()` and no import, so the panel asks for that\n * one through `selfstore-destination-action` and the host runs its own import.\n *\n * Two things stay the host's, deliberately: the WORDS (every label is\n * overridable, and a pack ships per language) and the VETO on what is\n * destructive (`confirmAction`, which defaults to proceeding). Neither is\n * customisation - they are the decisions a library must not take for an app.\n */\n\nimport type { ConnectKind, ConnectTargets, FlowHost, StoreLike } from '../flows/connect';\nimport type { SelfstoreConnectElement } from './connect';\nimport { datedName, saveToDisk } from '../selfstore/targets/local';\nimport { FlowWidget, h, hostOf, put, type WidgetLabels } from './base';\n\n/** What the panel is about to do, for the host's veto. */\nexport interface DestinationAction {\n\ttype: 'detach';\n\t/** The destination's own name, when it has one. */\n\tlabel: string | null;\n}\n\nconst EN: WidgetLabels = {\n\t'destination.heading': 'Where your data is kept',\n\t'destination.kind.drive': 'Google Drive',\n\t'destination.kind.file': 'A file on this device',\n\t'destination.kind.webdav': 'Your own server',\n\t'destination.kind.s3': 'Your own bucket',\n\t'destination.kind.device': 'This device only',\n\t'destination.encrypted': 'Password-protected',\n\t'destination.export': 'Export a copy',\n\t'destination.exported': 'The copy is written.',\n\t'destination.exportCancelled': 'Nothing was written.',\n\t'destination.restore': 'Restore a copy',\n\t'destination.change': 'Change destination',\n\t'destination.detach': 'Stop saving here',\n\t'destination.detached': 'Stopped. Your data stays on this device.',\n\t'destination.back': 'Back',\n\t'error.generic': 'Something went wrong.'\n};\n\n// One verb per gesture, and the precious thing is never the object of the verb:\n// \"ne plus enregistrer ici\" says what stops, where \"detacher cette sauvegarde\"\n// would read as taking the backup away.\n//\n// A pack carries only what READS differently: `t()` falls back to the EN\n// defaults, so a key repeated word for word (a brand name) would just be a\n// second place to keep it in step.\nconst FR: WidgetLabels = {\n\t'destination.heading': 'Où vos données sont enregistrées',\n\t'destination.kind.file': 'Un fichier sur cet appareil',\n\t'destination.kind.webdav': 'Votre serveur',\n\t'destination.kind.s3': 'Votre bucket',\n\t'destination.kind.device': 'Cet appareil seulement',\n\t'destination.encrypted': 'Protégée par un mot de passe',\n\t'destination.export': 'Exporter une copie',\n\t'destination.exported': 'La copie est écrite.',\n\t'destination.exportCancelled': \"Rien n'a été écrit.\",\n\t// \"Restaurer\", pas \"charger\" : le premier dit qu'on REVIENT a un etat, le\n\t// second pourrait ajouter. Face a \"Exporter une copie\", la paire se lit\n\t// comme l'aller-retour qu'elle est.\n\t'destination.restore': 'Restaurer une copie',\n\t'destination.change': 'Changer de sauvegarde',\n\t'destination.detach': 'Ne plus enregistrer ici',\n\t'destination.detached': 'Arrêté. Vos données restent sur cet appareil.',\n\t'destination.back': 'Retour',\n\t'error.generic': \"Quelque chose n'a pas fonctionné.\"\n};\n\nconst DESTINATION_STYLES = `\n[part~='destination-card'] { align-items: flex-start; }\n[part~='destination-actions'] {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--_gap);\n}\n[part~='destination-heading'] {\n\tmargin: 0;\n\tfont-size: 1rem;\n\tfont-weight: 600;\n}\n`;\n\n/** The sibling element under the same prefix: both are registered together, so\n * <app-destination> composes <app-connect> without being told. */\nfunction siblingTag(own: string, name: string): string {\n\tconst suffix = '-destination';\n\treturn own.endsWith(suffix) ? `${own.slice(0, -suffix.length)}-${name}` : `selfstore-${name}`;\n}\n\nexport class SelfstoreDestinationElement extends FlowWidget {\n\t#store: StoreLike | null = null;\n\t#targets: ConnectTargets | null = null;\n\t#account: string | null = null;\n\t#icons: Partial<Record<ConnectKind, string>> = {};\n\t#confirm: ((a: DestinationAction) => boolean | Promise<boolean>) | null = null;\n\t#changing = false;\n\t#busy = false;\n\t#message: string | null = null;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.root.append(h('style', {}, DESTINATION_STYLES));\n\t}\n\n\t/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */\n\tget store(): StoreLike | null {\n\t\treturn this.#store;\n\t}\n\tset store(v: StoreLike | null) {\n\t\tif (v === this.#store) return;\n\t\tthis.#store = v;\n\t\tthis.wire();\n\t}\n\n\t/** The destinations offered when the user changes their mind. Given them, the\n\t * panel runs the connect journey in place; without them the button is absent\n\t * rather than dead - a host that cannot offer a choice should not show one. */\n\tget targets(): ConnectTargets | null {\n\t\treturn this.#targets;\n\t}\n\tset targets(v: ConnectTargets | null) {\n\t\tthis.#targets = v;\n\t\tthis.rerender();\n\t}\n\n\t/** Who holds the destination (\"someone@example.com\"), when the host knows.\n\t * For Drive that is `driveTarget.account()`: a brand name is not an address,\n\t * and several accounts look alike. */\n\tget account(): string | null {\n\t\treturn this.#account;\n\t}\n\tset account(v: string | null) {\n\t\tthis.#account = v || null;\n\t\tthis.rerender();\n\t}\n\n\t/** Optional glyph per destination kind, same contract as the connect cards. */\n\tget icons(): Partial<Record<ConnectKind, string>> {\n\t\treturn this.#icons;\n\t}\n\tset icons(v: Partial<Record<ConnectKind, string>> | null) {\n\t\tthis.#icons = v ?? {};\n\t\tthis.rerender();\n\t}\n\n\t/** Veto on what is destructive. Returns false (or throws) to stop; absent\n\t * means proceed. The panel never invents its own confirm dialog: an app has\n\t * its own words and its own modal. */\n\tget confirmAction(): ((a: DestinationAction) => boolean | Promise<boolean>) | null {\n\t\treturn this.#confirm;\n\t}\n\tset confirmAction(fn: ((a: DestinationAction) => boolean | Promise<boolean>) | null) {\n\t\tthis.#confirm = fn;\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tthis.wire();\n\t}\n\n\tprivate host(): FlowHost | null {\n\t\treturn hostOf(this.#store);\n\t}\n\n\tprivate wire(): void {\n\t\tthis.follow(this.host());\n\t}\n\n\t/** Run a gesture, keeping the panel honest while it is in flight. */\n\tprivate async run(job: () => Promise<string | null>): Promise<void> {\n\t\tthis.#busy = true;\n\t\tthis.#message = null;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tthis.#message = await job();\n\t\t} catch {\n\t\t\tthis.#message = this.t('error.generic');\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\t/** A portable copy, on the user's own terms. A closed save dialog wrote\n\t * nothing, so it must not clear the pending-export nudge nor claim success -\n\t * that is the download that lies about itself. */\n\tprivate exportCopy(): Promise<void> {\n\t\tconst host = this.host();\n\t\tif (!host) return Promise.resolve();\n\t\treturn this.run(async () => {\n\t\t\tconst blob = await host.engine.exportBlob();\n\t\t\tconst written = await saveToDisk(blob, datedName(host.backupName));\n\t\t\tif (!written) return this.t('destination.exportCancelled');\n\t\t\thost.engine.markDownloaded();\n\t\t\treturn this.t('destination.exported');\n\t\t});\n\t}\n\n\t/** Stop saving to this destination. The local data stays, and so does the\n\t * backup already written: this detaches, it never deletes. */\n\tprivate detach(label: string | null): Promise<void> {\n\t\tconst host = this.host();\n\t\tif (!host) return Promise.resolve();\n\t\treturn this.run(async () => {\n\t\t\t// A throwing hook reads as \"no\": stopping is a decision, and an\n\t\t\t// undecided answer must not be taken for a yes.\n\t\t\ttry {\n\t\t\t\tif (this.#confirm && !(await this.#confirm({ type: 'detach', label }))) return null;\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tawait host.engine.detachTarget();\n\t\t\tthis.emit('selfstore-destination-detached');\n\t\t\treturn this.t('destination.detached');\n\t\t});\n\t}\n\n\t/** The connect journey, in place. Built like the gate builds it, so the\n\t * destinations, the password step and the cancel path are the library's\n\t * tested ones rather than a second implementation. */\n\tprivate connectView(into: HTMLElement): void {\n\t\tconst el = document.createElement(\n\t\t\tsiblingTag(this.localName, 'connect')\n\t\t) as SelfstoreConnectElement;\n\t\tel.store = this.#store;\n\t\tel.targets = this.#targets;\n\t\tel.icons = this.#icons;\n\t\tel.labels = this.labels;\n\t\tconst done = (): void => {\n\t\t\tthis.#changing = false;\n\t\t\tthis.rerender();\n\t\t};\n\t\tel.addEventListener('selfstore-connected', done);\n\t\tel.addEventListener('selfstore-cancelled', done);\n\t\tput(\n\t\t\tinto,\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{ part: 'link destination-back', type: 'button', onclick: done },\n\t\t\t\tthis.t('destination.back')\n\t\t\t),\n\t\t\tel\n\t\t);\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst host = this.host();\n\t\tif (!host) return; // inert until wired\n\t\tif (this.#changing && this.#targets) return this.connectView(into);\n\n\t\tconst { targetKind, label, encrypted } = host.engine.state;\n\t\tconst kind = this.t(`destination.kind.${targetKind}`);\n\t\t// An unknown kind (a host's own target) has no shipped name: its own label\n\t\t// is a better answer than the raw key.\n\t\tconst title = kind === `destination.kind.${targetKind}` ? (label ?? targetKind) : kind;\n\t\tconst sub = [this.#account, label && label !== title ? label : null]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' · ');\n\t\tconst icon = this.#icons[targetKind as ConnectKind];\n\t\tconst status = document.createElement(siblingTag(this.localName, 'status')) as HTMLElement & {\n\t\t\tstore?: StoreLike | null;\n\t\t\tlabels?: WidgetLabels;\n\t\t\ticons?: Partial<Record<ConnectKind, string>>;\n\t\t};\n\t\tstatus.setAttribute('variant', 'row');\n\t\tstatus.labels = this.labels;\n\t\tstatus.icons = this.#icons;\n\t\tstatus.store = this.#store;\n\n\t\t// An empty-string label removes the gesture, the same convention as the\n\t\t// headings: labels = { 'destination.detach': '' } is how a host that\n\t\t// forbids the device-only state takes that journey off the screen. Each\n\t\t// button also carries its own part, so a host can style or hide ONE of\n\t\t// them from CSS - four gestures sharing one anonymous part made the row\n\t\t// impossible to prune, which is how a panel ends up \"too many buttons\".\n\t\tconst act = (key: string, part: string, onclick: () => void): HTMLElement | null => {\n\t\t\tconst label = this.t(key);\n\t\t\tif (!label) return null;\n\t\t\treturn h(\n\t\t\t\t'button',\n\t\t\t\t{ part: `button ${part}`, type: 'button', disabled: this.#busy ? '' : null, onclick },\n\t\t\t\tlabel\n\t\t\t);\n\t\t};\n\n\t\tput(\n\t\t\tinto,\n\t\t\tthis.heading('destination-heading', 'destination.heading'),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'card destination-card' },\n\t\t\t\ticon ? h('img', { part: 'icon', src: icon, alt: '' }) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{},\n\t\t\t\t\th('div', { part: 'title' }, title),\n\t\t\t\t\tsub ? h('div', { part: 'sub' }, sub) : null,\n\t\t\t\t\tencrypted ? h('div', { part: 'sub' }, this.t('destination.encrypted')) : null\n\t\t\t\t)\n\t\t\t),\n\t\t\tstatus,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'destination-actions' },\n\t\t\t\tact('destination.export', 'destination-export', () => void this.exportCopy()),\n\t\t\t\t// The library holds no records, so loading a copy back is the host's\n\t\t\t\t// own gesture - see the note at the top of this file.\n\t\t\t\tact('destination.restore', 'destination-restore', () =>\n\t\t\t\t\tthis.emit('selfstore-destination-action', { action: 'restore' })\n\t\t\t\t),\n\t\t\t\tthis.#targets\n\t\t\t\t\t? act('destination.change', 'destination-change', () => {\n\t\t\t\t\t\t\tthis.#changing = true;\n\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t})\n\t\t\t\t\t: null,\n\t\t\t\tact('destination.detach', 'destination-detach', () => void this.detach(label))\n\t\t\t),\n\t\t\tthis.#message\n\t\t\t\t? h('div', { part: 'sub destination-message', role: 'status' }, this.#message)\n\t\t\t\t: null\n\t\t);\n\t}\n}\n","// selfstore/widgets - the connect / share / join / backups journeys as\n// drop-in custom elements, skins over the headless flows. Framework-free:\n// plain HTML, Svelte, Vue and React all take them as-is.\n//\n// import { defineSelfstoreWidgets } from 'selfstore/widgets';\n// defineSelfstoreWidgets();\n//\n// Customization is layered, never a fork: --selfstore-* CSS custom\n// properties, ::part() on every node, a `labels` map merged over the EN\n// defaults (also the localization story), per-widget attributes with the\n// full journey as the default, and bubbling composed `selfstore-*` events.\n// The full knob and event list lives in the README.\n\nexport { SelfstoreConnectElement, type WebdavPreset } from '../widgets/connect';\nexport { SelfstoreShareElement, type ShareAction } from '../widgets/share';\nexport { SelfstoreJoinElement } from '../widgets/join';\nexport { SelfstoreStatusElement } from '../widgets/status';\nexport { SelfstoreBackupsElement, type BackupsAction } from '../widgets/backups';\nexport { SelfstoreGateElement } from '../widgets/gate';\nexport { SelfstoreDestinationElement, type DestinationAction } from '../widgets/destination';\nexport { FlowWidget, type WidgetLabels } from '../widgets/base';\n\nimport { SelfstoreConnectElement } from '../widgets/connect';\nimport { SelfstoreShareElement } from '../widgets/share';\nimport { SelfstoreJoinElement } from '../widgets/join';\nimport { SelfstoreStatusElement } from '../widgets/status';\nimport { SelfstoreBackupsElement } from '../widgets/backups';\nimport { SelfstoreGateElement } from '../widgets/gate';\nimport { SelfstoreDestinationElement } from '../widgets/destination';\n\n/** Register the elements as <PREFIX-connect>, <PREFIX-share>, <PREFIX-join>,\n * <PREFIX-status>, <PREFIX-backups>, <PREFIX-gate> and\n * <PREFIX-destination> (default prefix 'selfstore'). Safe to call twice;\n * throws in environments without custom elements (browser code only). */\nexport function defineSelfstoreWidgets(prefix = 'selfstore'): void {\n\tconst define = (name: string, ctor: CustomElementConstructor): void => {\n\t\tif (!customElements.get(name)) customElements.define(name, ctor);\n\t};\n\tdefine(`${prefix}-connect`, SelfstoreConnectElement);\n\tdefine(`${prefix}-share`, SelfstoreShareElement);\n\tdefine(`${prefix}-join`, SelfstoreJoinElement);\n\tdefine(`${prefix}-status`, SelfstoreStatusElement);\n\tdefine(`${prefix}-backups`, SelfstoreBackupsElement);\n\t// The gate builds its own connect child and reads the prefix back off its\n\t// own tag name, so a custom prefix keeps the pair together. The destination\n\t// panel composes both connect and status the same way.\n\tdefine(`${prefix}-gate`, SelfstoreGateElement);\n\tdefine(`${prefix}-destination`, SelfstoreDestinationElement);\n}\n"]}
1
+ {"version":3,"sources":["../src/widgets/icons.ts","../src/widgets/base.ts","../src/widgets/connect.ts","../src/widgets/share.ts","../src/widgets/join.ts","../src/widgets/status.ts","../src/widgets/backups.ts","../src/widgets/gate.ts","../src/widgets/destination.ts","../src/entries/widgets.ts"],"names":["EN","FR","isOff","label"],"mappings":";;;;;;;;;;;AAmBA,IAAM,GAAA,GAAM,SAAA;AAEZ,IAAM,GAAA,GAAM,CAAC,IAAA,KACZ,CAAA,mBAAA,EAAsB,kBAAA;AAAA,EACrB,CAAA,gFAAA,EAAmF,GAAG,CAAA,oEAAA,EAAuE,IAAI,CAAA,MAAA;AAClK,CAAC,CAAA,CAAA;AAIK,IAAM,YAAA,GAA4C;AAAA,EACxD,KAAA,EAAO,IAAI,8EAA8E,CAAA;AAAA,EACzF,IAAA,EAAM,GAAA;AAAA,IACL;AAAA,GACD;AAAA,EACA,MAAA,EAAQ,GAAA;AAAA,IACP;AAAA,GACD;AAAA,EACA,EAAA,EAAI,GAAA;AAAA,IACH;AAAA;AAEF,CAAA;;;ACvBO,SAAS,OAAO,KAAA,EAAsD;AAC5E,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,OAAO,UAAA,IAAc,KAAA,GAAQ,KAAA,CAAM,QAAA,GAAW,KAAA;AAC/C;AAKO,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAuUnB,SAAS,GAAA,CAAI,OAAoB,QAAA,EAAyB;AAChE,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACzB,IAAA,IAAI,KAAK,IAAA,EAAM;AACf,IAAA,EAAA,CAAG,MAAA,CAAO,OAAO,CAAA,KAAM,QAAA,GAAW,SAAS,cAAA,CAAe,CAAC,IAAI,CAAC,CAAA;AAAA,EACjE;AACD;AAGO,SAAS,CAAA,CACf,GAAA,EACA,KAAA,GAAiC,OAC9B,QAAA,EACwB;AAC3B,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACrC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC3C,IAAA,IAAI,CAAA,IAAK,IAAA,IAAQ,CAAA,KAAM,KAAA,EAAO;AAC9B,IAAA,IAAI,EAAE,UAAA,CAAW,IAAI,CAAA,IAAK,OAAO,MAAM,UAAA,EAAY;AAClD,MAAA,EAAA,CAAG,gBAAA,CAAiB,CAAA,CAAE,KAAA,CAAM,CAAC,GAAG,CAAkB,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,MAAM,IAAA,EAAM;AACtB,MAAA,EAAA,CAAG,YAAA,CAAa,GAAG,EAAE,CAAA;AAAA,IACtB,CAAA,MAAO;AACN,MAAA,EAAA,CAAG,YAAA,CAAa,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IAC7B;AAAA,EACD;AACA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACzB,IAAA,IAAI,KAAK,IAAA,EAAM;AACf,IAAA,EAAA,CAAG,MAAA,CAAO,OAAO,CAAA,KAAM,QAAA,GAAW,SAAS,cAAA,CAAe,CAAC,IAAI,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,EAAA;AACR;AA4BO,SAAS,qBAAqB,EAAA,EAAuB;AAC3D,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,CAAe,EAAE,CAAA;AACtC,EAAA,MAAM,GAAA,GAAM,EAAA;AACZ,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,mBAAA,CAAoB,EAAE,CAAA,EAAG;AAClD,IAAA,IAAI,EAAE,QAAQ,KAAA,CAAA,EAAQ;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAI,IAAI,CAAA;AACtB,IAAA,OAAO,IAAI,IAAI,CAAA;AACf,IAAA,GAAA,CAAI,IAAI,CAAA,GAAI,KAAA;AAAA,EACb;AACD;AAEO,IAAe,UAAA,GAAf,cAAkC,WAAA,CAAY;AAAA,EAC1C,IAAA;AAAA,EACF,OAAA;AAAA,EACA,IAAA;AAAA,EACA,YAA0B,EAAC;AAAA,EACzB,KAAA,GAA6B,IAAA;AAAA;AAAA;AAAA,EAM7B,KAAA,GAAsC;AAC/C,IAAA,OAAO,EAAC;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAOU,OAAO,IAAA,EAA6B;AAC7C,IAAA,IAAA,CAAK,KAAA,IAAQ;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,IAAA,EAAM;AAChC,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,MAAA,CAAO,UAAU,MAAM,IAAA,CAAK,UAAU,CAAA;AACxD,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EAEA,WAAA,GAAc;AACb,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC9C,IAAA,IAAA,CAAK,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC7C,IAAA,IAAA,CAAK,QAAQ,WAAA,GAAc,UAAA;AAC3B,IAAA,IAAA,CAAK,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AACtC,IAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,KAAK,IAAI,CAAA;AAAA,EACzC;AAAA;AAAA,EAGA,IAAI,MAAA,GAAuB;AAC1B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACb;AAAA,EACA,IAAI,OAAO,GAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,EAAC;AACzB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,SAAA,GAA0B;AACjC,IAAA,MAAM,GAAA,GACL,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,YAAA,CAAa,MAAM,CAAA,IAC3C,QAAA,CAAS,eAAA,CAAgB,IAAA,IACzB,SAAA,CAAU,QAAA,IACV,EAAA;AACD,IAAA,OAAO,IAAA,CAAK,KAAA,EAAM,CAAE,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,IAAK,EAAC;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYU,CAAA,CAAE,KAAa,IAAA,EAA0D;AAClF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,GAAG,KAAK,IAAA,CAAK,SAAA,EAAU,CAAE,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,EAAS,CAAE,GAAG,CAAA,IAAK,GAAA;AACrF,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,OAAO,IAAA,CAAK,QAAQ,YAAA,EAAc,CAAC,OAAO,IAAA,KAAiB,IAAA,CAAK,IAAI,CAAA,IAAK,KAAK,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKU,OAAA,CAAQ,MAAc,GAAA,EAAiC;AAChE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,CAAE,GAAG,CAAA;AACvB,IAAA,OAAO,OAAO,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAK,EAAG,IAAI,CAAA,GAAI,IAAA;AAAA,EAC1C;AAAA;AAAA;AAAA,EAIU,UAAU,QAAA,EAAsC;AACzD,IAAA,IAAI,QAAA,EAAU;AACb,MAAA,MAAM,QAAA,GACL,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,IAAK,IAAA,CAAK,SAAA,EAAU,CAAE,QAAQ,CAAA,IAAK,IAAA,CAAK,QAAA,GAAW,QAAQ,CAAA;AACnF,MAAA,IAAI,UAAU,OAAO,QAAA;AAAA,IACtB;AACA,IAAA,OAAO,IAAA,CAAK,EAAE,eAAe,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA0B;AACzB,IAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,EAC1B;AAAA,EAEU,IAAA,CAAK,MAAc,MAAA,EAAwB;AACpD,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,WAAA,CAAY,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA,EAIU,QAAA,GAAiB;AAG1B,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACH,MAAA,MAAA,GAAS,KAAK,IAAA,CAAK,aAAA;AAAA,IACpB,CAAA,CAAA,MAAQ;AACP,MAAA,MAAA,GAAS,IAAA;AAAA,IACV;AACA,IAAA,MAAM,IAAA,GAAO,MAAA,EAAQ,YAAA,GAAe,WAAW,CAAA,IAAK,IAAA;AACpD,IAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,IAAA,IAAA,CAAK,KAAK,eAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,IAAI,CAAA;AACnB,IAAA,IAAI,QAAQ,IAAA,EAAM;AACjB,MAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,aAAA,CAAgC,CAAA,YAAA,EAAe,IAAI,CAAA,EAAA,CAAI,CAAA;AAC/E,MAAA,IAAI,KAAA,EAAO;AACV,QAAA,IAAI,KAAA,IAAS,IAAA,EAAM,KAAA,CAAM,KAAA,GAAQ,KAAA;AACjC,QAAA,KAAA,CAAM,KAAA,EAAM;AAAA,MACb;AAAA,IACD;AAAA,EACD;AAAA,EAEA,oBAAA,GAA6B;AAC5B,IAAA,IAAA,CAAK,KAAA,IAAQ;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACd;AACD;;;AChfA,IAAM,EAAA,GAAmB;AAAA,EACxB,eAAA,EAAiB,iCAAA;AAAA,EACjB,qBAAA,EAAuB,aAAA;AAAA;AAAA;AAAA,EAGvB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,YAAA,EAAc,IAAA;AAAA,EACd,eAAA,EAAiB,cAAA;AAAA,EACjB,mBAAA,EAAqB,+BAAA;AAAA,EACrB,cAAA,EAAgB,uBAAA;AAAA,EAChB,kBAAA,EAAoB,4BAAA;AAAA,EACpB,kBAAA,EAAoB,YAAA;AAAA,EACpB,mBAAA,EAAqB,uBAAA;AAAA,EACrB,gBAAA,EAAkB,wBAAA;AAAA,EAClB,oBAAA,EAAsB,4BAAA;AAAA,EACtB,YAAA,EAAc,oBAAA;AAAA,EACd,gBAAA,EAAkB,0BAAA;AAAA,EAClB,gBAAA,EAAkB,eAAA;AAAA,EAClB,oBAAA,EAAsB,oCAAA;AAAA,EACtB,oBAAA,EAAsB,QAAA;AAAA,EACtB,gBAAA,EAAkB,IAAA;AAAA,EAClB,qBAAA,EAAuB,cAAA;AAAA,EACvB,mBAAA,EAAqB,QAAA;AAAA,EACrB,mBAAA,EAAqB,QAAA;AAAA,EACrB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,wBAAA,EAA0B,eAAA;AAAA,EAC1B,mBAAA,EAAqB,mBAAA;AAAA,EACrB,mBAAA,EAAqB,SAAA;AAAA,EACrB,oBAAA,EAAsB,eAAA;AAAA,EACtB,0BAAA,EAA4B,wCAAA;AAAA,EAC5B,gBAAA,EAAkB,QAAA;AAAA,EAClB,eAAA,EAAiB,WAAA;AAAA,EACjB,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,uBAAA,EAAyB,gCAAA;AAAA,EACzB,8BAAA,EAAgC,UAAA;AAAA,EAChC,wBAAA,EAA0B,4BAAA;AAAA,EAC1B,yBAAA,EAA2B,MAAA;AAAA,EAC3B,uBAAA,EAAyB,eAAA;AAAA,EACzB,uBAAA,EAAyB,eAAA;AAAA,EACzB,yBAAA,EAA2B,sBAAA;AAAA,EAC3B,8BAAA,EACC,oIAAA;AAAA,EACD,iCAAA,EAAmC,sBAAA;AAAA,EACnC,8BAAA,EAAgC,MAAA;AAAA,EAChC,wBAAA,EAA0B,yCAAA;AAAA,EAC1B,wBAAA,EAA0B,YAAA;AAAA,EAC1B,4BAAA,EAA8B,iCAAA;AAAA,EAC9B,yBAAA,EAA2B,gBAAA;AAAA,EAC3B,6BAAA,EAA+B,uBAAA;AAAA,EAC/B,0BAAA,EAA4B,oBAAA;AAAA,EAC5B,8BAAA,EAAgC,6CAAA;AAAA,EAChC,oBAAA,EAAsB,YAAA;AAAA,EACtB,qBAAA,EAAuB,UAAA;AAAA,EACvB,yBAAA,EAA2B,UAAA;AAAA,EAC3B,uBAAA,EAAyB,SAAA;AAAA,EACzB,uBAAA,EAAyB,mBAAA;AAAA,EACzB,0BAAA,EAA4B,MAAA;AAAA,EAC5B,cAAA,EAAgB,gCAAA;AAAA,EAChB,qBAAA,EAAuB,wDAAA;AAAA,EACvB,eAAA,EAAiB,wDAAA;AAAA,EACjB,yBAAA,EAA2B,wDAAA;AAAA,EAC3B,mBAAA,EAAqB,wCAAA;AAAA,EACrB,qBAAA,EAAuB,qDAAA;AAAA,EACvB,iBAAA,EAAmB,iDAAA;AAAA,EACnB,qBAAA,EACC;AACF,CAAA;AASA,IAAM,EAAA,GAAmB;AAAA,EACxB,eAAA,EAAiB,oCAAA;AAAA,EACjB,qBAAA,EAAuB,eAAA;AAAA,EACvB,gBAAA,EAAkB,yBAAA;AAAA,EAClB,YAAA,EAAc,IAAA;AAAA,EACd,eAAA,EAAiB,cAAA;AAAA,EACjB,mBAAA,EAAqB,mCAAA;AAAA,EACrB,cAAA,EAAgB,6BAAA;AAAA,EAChB,kBAAA,EAAoB,wCAAA;AAAA,EACpB,kBAAA,EAAoB,qBAAA;AAAA,EACpB,mBAAA,EAAqB,4BAAA;AAAA,EACrB,gBAAA,EAAkB,sBAAA;AAAA,EAClB,oBAAA,EAAsB,kCAAA;AAAA,EACtB,YAAA,EAAc,iBAAA;AAAA,EACd,gBAAA,EAAkB,0BAAA;AAAA,EAClB,gBAAA,EAAkB,aAAA;AAAA,EAClB,oBAAA,EAAsB,8CAAA;AAAA,EACtB,oBAAA,EAAsB,QAAA;AAAA,EACtB,gBAAA,EAAkB,IAAA;AAAA,EAClB,qBAAA,EAAuB,yBAAA;AAAA,EACvB,mBAAA,EAAqB,WAAA;AAAA,EACrB,mBAAA,EAAqB,QAAA;AAAA,EACrB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,wBAAA,EAA0B,qCAAA;AAAA,EAC1B,mBAAA,EAAqB,mBAAA;AAAA,EACrB,mBAAA,EAAqB,WAAA;AAAA,EACrB,oBAAA,EAAsB,uBAAA;AAAA,EACtB,0BAAA,EAA4B,iDAAA;AAAA,EAC5B,gBAAA,EAAkB,SAAA;AAAA,EAClB,eAAA,EAAiB,cAAA;AAAA,EACjB,wBAAA,EAA0B,qCAAA;AAAA,EAC1B,uBAAA,EAAyB,wCAAA;AAAA,EACzB,8BAAA,EAAgC,cAAA;AAAA,EAChC,wBAAA,EAA0B,uCAAA;AAAA,EAC1B,yBAAA,EAA2B,QAAA;AAAA,EAC3B,uBAAA,EAAyB,0BAAA;AAAA,EACzB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,yBAAA,EAA2B,0BAAA;AAAA,EAC3B,8BAAA,EACC,4JAAA;AAAA,EACD,iCAAA,EAAmC,yBAAA;AAAA,EACnC,8BAAA,EAAgC,QAAA;AAAA,EAChC,wBAAA,EAA0B,sCAAA;AAAA,EAC1B,wBAAA,EAA0B,aAAA;AAAA,EAC1B,4BAAA,EAA8B,2DAAA;AAAA,EAC9B,yBAAA,EAA2B,wBAAA;AAAA,EAC3B,6BAAA,EAA+B,6CAAA;AAAA,EAC/B,0BAAA,EAA4B,yBAAA;AAAA,EAC5B,8BAAA,EAAgC,0DAAA;AAAA,EAChC,oBAAA,EAAsB,gBAAA;AAAA,EACtB,qBAAA,EAAuB,aAAA;AAAA,EACvB,yBAAA,EAA2B,cAAA;AAAA,EAC3B,uBAAA,EAAyB,WAAA;AAAA,EACzB,uBAAA,EAAyB,oBAAA;AAAA,EACzB,0BAAA,EAA4B,iBAAA;AAAA,EAC5B,cAAA,EAAgB,mDAAA;AAAA,EAChB,qBAAA,EAAuB,mEAAA;AAAA,EACvB,eAAA,EAAiB,uEAAA;AAAA,EACjB,yBAAA,EAA2B,+DAAA;AAAA,EAC3B,mBAAA,EAAqB,uDAAA;AAAA,EACrB,qBAAA,EAAuB,mEAAA;AAAA,EACvB,iBAAA,EAAmB,0DAAA;AAAA,EACnB,qBAAA,EACC;AACF,CAAA;AAKA,IAAM,QAAA,GACL,+OAAA;AACD,IAAM,QAAA,GACL,8XAAA;AAGD,SAAS,QAAQ,OAAA,EAA8B;AAC9C,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,EAAA,IAAA,CAAK,SAAA,GAAY,UAAU,QAAA,GAAW,QAAA;AACtC,EAAA,OAAO,IAAA,CAAK,iBAAA;AACb;AAEO,IAAM,uBAAA,GAAN,cAAsC,UAAA,CAAW;AAAA,EACvD,WAAW,kBAAA,GAA+B;AACzC,IAAA,OAAO,CAAC,eAAe,UAAU,CAAA;AAAA,EAClC;AAAA,EAEA,MAAA,GAA2B,IAAA;AAAA,EAC3B,QAAA,GAAkC,IAAA;AAAA,EAClC,WAA+B,EAAC;AAAA,EAChC,KAAA,GAA4B,IAAA;AAAA,EAC5B,YAAA,GAAmC,IAAA;AAAA,EACnC,SAA+C,EAAC;AAAA,EAChD,YAA2B,EAAC;AAAA,EAC5B,iBAAiC,EAAC;AAAA,EAClC,UAAA,GAAa,EAAA;AAAA,EACb,WAAA,GAAc,EAAA;AAAA,EACd,WAAA,GAAc,EAAA;AAAA,EACd,aAAA,GAAqC,IAAA;AAAA;AAAA;AAAA,EAGrC,WAAA,GAAc,EAAA;AAAA,EACd,SAAA,GAAY,EAAA;AAAA,EACZ,SAAA,GAAY,EAAA;AAAA,EACZ,MAAA,GAAS,EAAA;AAAA,EACT,cAAA,GAAiB,EAAA;AAAA,EACjB,SAAA,GAAY,EAAA;AAAA;AAAA;AAAA,EAGZ,UAAA,GAAa,KAAA;AAAA,EACb,iBAAA,GAAoB,KAAA;AAAA,EAEV,QAAA,GAAyB;AAClC,IAAA,OAAO,EAAA;AAAA,EACR;AAAA,EAEU,KAAA,GAAsC;AAC/C,IAAA,OAAO,EAAE,IAAI,EAAA,EAAG;AAAA,EACjB;AAAA;AAAA,EAGA,IAAI,KAAA,GAA0B;AAC7B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACb;AAAA,EACA,IAAI,MAAM,CAAA,EAAqB;AAQ9B,IAAA,IAAI,CAAA,KAAM,KAAK,MAAA,EAAQ;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA,EAEA,IAAI,OAAA,GAAiC;AACpC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EACA,IAAI,QAAQ,CAAA,EAA0B;AACrC,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA,EAEA,IAAI,OAAA,GAA8B;AACjC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EACA,IAAI,QAAQ,CAAA,EAAuB;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,EAAC;AACtB,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,GAAkC;AACrC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACb;AAAA,EACA,IAAI,YAAY,CAAA,EAAuB;AACtC,IAAA,IAAA,CAAK,YAAA,GAAe,MAAM,OAAA,IAAW,CAAA,KAAM,UAAU,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,GAAO,CAAA,GAAI,IAAA;AACxF,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,KAAA,GAA8C;AACjD,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACb;AAAA,EACA,IAAI,MAAM,CAAA,EAAgD;AACzD,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,EAAC;AACpB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAA,GAA0B;AAC7B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACb;AAAA,EACA,IAAI,SAAS,CAAA,EAAyB;AACrC,IAAA,IAAA,CAAK,SAAA,GAAA,CAAa,CAAA,IAAK,EAAC,EAAG,MAAA;AAAA,MAC1B,CAAC,MAAM,CAAA,KAAM,OAAA,IAAW,MAAM,MAAA,IAAU,CAAA,KAAM,YAAY,CAAA,KAAM;AAAA,KACjE;AACA,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,aAAA,GAAgC;AACnC,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACb;AAAA,EACA,IAAI,cAAc,CAAA,EAA0B;AAC3C,IAAA,IAAA,CAAK,iBAAiB,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,IAAI,EAAC;AAC9C,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA,EAGA,IAAI,IAAA,GAA2B;AAC9B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACb;AAAA,EAEA,wBAAA,CAAyB,IAAA,EAAc,IAAA,EAAqB,KAAA,EAA4B;AACvF,IAAA,IAAI,IAAA,KAAS,aAAA,EAAe,IAAA,CAAK,WAAA,GAAc,KAAA;AAC/C,IAAA,IAAI,SAAS,UAAA,EAAY;AACxB,MAAA,IAAA,CAAK,QAAA,GAAA,CAAY,KAAA,IAAS,EAAA,EAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,IAC7D;AAAA,EACD;AAAA,EAEA,iBAAA,GAA0B;AACzB,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,IAAI,KAAK,YAAA,KAAiB,IAAA,IAAQ,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA,EAAG;AACnE,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA;AAAA,IACnD;AACA,IAAA,IAAI,KAAK,SAAA,CAAU,MAAA,KAAW,KAAK,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA,EAAG;AACjE,MAAA,IAAA,CAAK,QAAA,GAAA,CAAY,IAAA,CAAK,YAAA,CAAa,UAAU,KAAK,EAAA,EAChD,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA;AAAA,IACtB;AACA,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA,EAEQ,IAAA,GAAa;AACpB,IAAA,IAAI,CAAC,KAAK,WAAA,IAAe,CAAC,KAAK,MAAA,IAAU,CAAC,KAAK,QAAA,EAAU;AACzD,IAAA,IAAA,CAAK,KAAA,IAAQ;AACb,IAAA,IAAA,CAAK,QAAQ,WAAA,CAAY,IAAA,CAAK,QAAQ,IAAA,CAAK,QAAA,EAAU,KAAK,QAAQ,CAAA;AAClE,IAAA,IAAI,IAAA,GAA+B,IAAA;AACnC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,IAAA,KAAS;AAC3C,MAAA,MAAM,GAAA,GAAM,IAAA;AACZ,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,WAAA,IAAe,GAAA,EAAK,SAAS,WAAA,EAAa;AAC3D,QAAA,IAAA,CAAK,KAAK,qBAAA,EAAuB,EAAE,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA;AAAA,MAC3D;AACA,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,GAAA,EAAK,SAAS,OAAA,EAAS;AACnD,QAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAAA,MACnD;AAGA,MAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC7B,QAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,QAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAAA,MAC1B;AACA,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IACf,CAAC,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,UAAA,CAAW,MAAmB,CAAA,EAA0B;AAC/D,IAAA,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,eAAe,CAAC,CAAA;AAIhD,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,CAAS,MAAA;AAC5B,IAAA,IAAI,KAAA,EAAO;AACV,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAClC,MAAA,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,aAAY,EAAG,CAAA,CAAE,MAAA,EAAQ,IAAI,IAAA,CAAK,CAAA,CAAE,YAAY,CAAC,CAAC,CAAC,CAAA;AAAA,IACjF;AAIA,IAAA,MAAM,WAAA,GAAe,CAAC,QAAA,EAAU,IAAI,CAAA,CAAY,MAAA;AAAA,MAC/C,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,IAAK,CAAC,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,CAAC;AAAA,KACzD;AACA,IAAA,MAAM,WAAA,GAAc,YAAY,MAAA,IAAU,CAAA;AAC1C,IAAA,KAAA,MAAW,IAAA,IAAQ,EAAE,KAAA,EAAO;AAC3B,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG;AACnC,MAAA,IAAI,WAAA,KAAgB,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,CAAA,EAAO;AACxD,QAAA,IAAI,IAAA,KAAS,WAAA,CAAY,CAAC,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,CAAC,CAAC,CAAC,CAAA;AACxE,QAAA;AAAA,MACD;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,IAChC;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,EAAE,KAAA,EAAO;AAC3B,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG;AACpC,MAAA,IAAA,CAAK,MAAA;AAAA,QACJ,CAAA;AAAA,UACC,QAAA;AAAA,UACA;AAAA,YACC,IAAA,EAAM,oBAAA;AAAA,YACN,WAAA,EAAa,IAAA;AAAA,YACb,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,EAAO,OAAO,IAAI;AAAA,WACvC;AAAA,UACA,IAAA,CAAK,CAAA,CAAE,CAAA,QAAA,EAAW,IAAI,CAAA,CAAE;AAAA;AACzB,OACD;AAAA,IACD;AAAA,EACD;AAAA,EAEU,KAAK,IAAA,EAAyB;AACvC,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,IAAI,IAAA,CAAK,QAAA;AAEf,IAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACxB,MAAA,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AACvB,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACtB,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,KAAS,IAAA,GAAO,IAAA,GAAO,QAAA;AAGtC,MAAA,MAAM,MAAA,GACJ,CAAC,QAAA,EAAU,IAAI,EAAY,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA,KAAM,IAAI,EAAE,MAAA,IAAU,CAAA;AAClF,MAAA,MAAM,QAAA,GAA0B;AAAA,QAC/B,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAG,IAAA,CAAK,CAAA,CAAE,MAAA,GAAS,gBAAA,GAAmB,CAAA,QAAA,EAAW,IAAI,EAAE,CAAC;AAAA,OAClF;AACA,MAAA,IAAI,QAAQ,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AAC/C,MAAA,QAAA,CAAS,IAAA,CAAK,GAAI,IAAA,KAAS,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA,GAAI,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAE,CAAA;AAC5F,MAAA,IAAA,CAAK,MAAA,CAAO,GAAG,QAAQ,CAAA;AACvB,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,CAAA,CAAE,SAAS,aAAA,EAAe;AAC7B,MAAA,IAAA,CAAK,MAAA;AAAA,QACJ,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAA,EAAQ,EAAE,MAAM,SAAA,EAAW,aAAA,EAAe,QAAQ,CAAA;AAAA,UACpD,CAAA;AAAA,YACC,KAAA;AAAA,YACA,EAAC;AAAA,YACD,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,SAAQ,EAAG,IAAA,CAAK,CAAA,CAAE,oBAAoB,CAAC,CAAA;AAAA,YACxD,CAAA,CAAE,IAAA,KAAS,OAAA,GACR,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAM,EAAG,IAAA,CAAK,CAAA,CAAE,0BAA0B,CAAC,CAAA,GAC5D;AAAA,WACJ;AAAA,UACA,CAAA,CAAE,QAAA,EAAU,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAO,EAAE,EAAG,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAC;AAAA;AACvF,OACD;AACA,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AAG1B,MAAA,IAAI,KAAK,iBAAA,EAAmB;AAC3B,QAAA,GAAA;AAAA,UACC,IAAA;AAAA,UACA,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,SAAQ,EAAG,IAAA,CAAK,CAAA,CAAE,wBAAwB,CAAC,CAAA;AAAA,UAC5D,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,kBAAiB,EAAG,IAAA,CAAK,CAAA,CAAE,8BAA8B,CAAC,CAAA;AAAA,UAC3E,CAAA;AAAA,YACC,KAAA;AAAA,YACA,EAAE,MAAM,KAAA,EAAM;AAAA,YACd,CAAA;AAAA,cACC,QAAA;AAAA,cACA,EAAE,IAAA,EAAM,sBAAA,EAAwB,QAAA,EAAU,CAAA,CAAE,MAAM,OAAA,EAAS,MAAM,IAAA,CAAK,WAAA,EAAY,EAAE;AAAA,cACpF,IAAA,CAAK,EAAE,iCAAiC;AAAA,aACzC;AAAA,YACA,CAAA;AAAA,cACC,QAAA;AAAA,cACA,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,CAAA,CAAE,IAAA,EAAM,OAAA,EAAS,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA,EAAE;AAAA,cACnF,IAAA,CAAK,EAAE,8BAA8B;AAAA;AACtC;AACD,SACD;AACA,QAAA;AAAA,MACD;AAGA,MAAA,MAAM,KAAA,GAAQ,CAAA;AAAA,QACb,KAAA;AAAA,QACA,EAAE,MAAM,OAAA,EAAQ;AAAA,QAChB,EAAE,OAAA,EAAS;AAAA,UACV,IAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAM,IAAA,CAAK,UAAA,GAAa,MAAA,GAAS,UAAA;AAAA,UACjC,WAAA,EAAa,IAAA,CAAK,CAAA,CAAE,8BAA8B,CAAA;AAAA,UAClD,WAAA,EAAa,UAAA;AAAA,UACb,YAAA,EAAc;AAAA,SACd,CAAA;AAAA,QACD,CAAA;AAAA,UACC,QAAA;AAAA,UACA;AAAA,YACC,IAAA,EAAM,KAAA;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,cAAc,IAAA,CAAK,CAAA;AAAA,cAClB,IAAA,CAAK,aAAa,uBAAA,GAA0B;AAAA,aAC7C;AAAA,YACA,cAAA,EAAgB,IAAA,CAAK,UAAA,GAAa,MAAA,GAAS,OAAA;AAAA,YAC3C,OAAA,EAAS,MAAM,IAAA,CAAK,cAAA;AAAe,WACpC;AAAA,UACA,OAAA,CAAQ,KAAK,UAAU;AAAA;AACxB,OACD;AACA,MAAA,GAAA;AAAA,QACC,IAAA;AAAA,QACA,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,SAAQ,EAAG,IAAA,CAAK,CAAA,CAAE,wBAAwB,CAAC,CAAA;AAAA,QAC5D,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,QAAO,EAAG,IAAA,CAAK,CAAA,CAAE,uBAAuB,CAAC,CAAA;AAAA,QAC1D,KAAA;AAAA,QACA,CAAA,CAAE,aAAA,GAAgB,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,YAAA,EAAa,EAAG,IAAA,CAAK,CAAA,CAAE,wBAAwB,CAAC,CAAA,GAAI,IAAA;AAAA,QACvF,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAE,MAAM,KAAA,EAAM;AAAA,UACd,CAAA;AAAA,YACC,QAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,uBAAA;AAAA,cACN,UAAU,CAAA,CAAE,IAAA;AAAA,cACZ,OAAA,EAAS,MAAM,IAAA,CAAK,cAAA;AAAe,aACpC;AAAA,YACA,IAAA,CAAK,EAAE,yBAAyB;AAAA,WACjC;AAAA;AAAA;AAAA;AAAA,UAIA,CAAA,CAAE,QAAA,EAAU,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAO,EAAE,EAAG,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAC;AAAA,SACvF;AAAA;AAAA;AAAA,QAGA,CAAA;AAAA,UACC,QAAA;AAAA,UACA,EAAE,MAAM,kBAAA,EAAoB,OAAA,EAAS,MAAM,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAA,EAAE;AAAA,UAC1E,IAAA,CAAK,EAAE,yBAAyB;AAAA;AACjC,OACD;AACA,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AAC1B,MAAA,IAAA,CAAK,MAAA,CAAO,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAG,IAAA,CAAK,CAAA,CAAE,wBAAwB,CAAC,CAAC,CAAA;AACzE,MAAA,KAAA,MAAW,GAAA,IAAO,CAAC,OAAA,EAAS,QAAA,EAAU,SAAS,CAAA,EAAY;AAC1D,QAAA,IAAA,CAAK,MAAA;AAAA,UACJ,CAAA;AAAA,YACC,QAAA;AAAA,YACA,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,CAAA,CAAE,IAAA,EAAM,OAAA,EAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,GAAG,CAAA,EAAE;AAAA,YAC3E,CAAA;AAAA,cACC,KAAA;AAAA,cACA,EAAC;AAAA,cACD,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAG,IAAA,CAAK,CAAA,CAAE,CAAA,iBAAA,EAAoB,GAAG,CAAA,CAAE,CAAC,CAAA;AAAA,cAC7D,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAM,EAAG,IAAA,CAAK,CAAA,CAAE,CAAA,iBAAA,EAAoB,GAAG,CAAA,IAAA,CAAM,CAAC;AAAA;AAChE;AACD,SACD;AAAA,MACD;AACA,MAAA,IAAA,CAAK,MAAA;AAAA,QACJ,CAAA,CAAE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAO,EAAE,EAAG,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAC;AAAA,OACrF;AACA,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa;AAC3B,MAAA,IAAA,CAAK,MAAA;AAAA,QACJ,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAE,MAAM,kBAAA,EAAmB;AAAA,UAC3B,CAAA;AAAA,YACC,KAAA;AAAA,YACA,EAAE,MAAM,OAAA,EAAQ;AAAA,YAChB,KAAK,CAAA,CAAE,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,wBAAwB,cAAc;AAAA;AACvE;AACD,OACD;AACA,MAAA;AAAA,IACD;AAKA,IAAA,IAAA,CAAK,MAAA;AAAA,MACJ,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,MAAM,qBAAA,EAAsB;AAAA,QAC9B,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAG,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,KAAA,EAAO,QAAQ,CAAC;AAAA,OAC9D;AAAA,MACA,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,MAAM,KAAA,EAAM;AAAA,QACd,CAAA;AAAA,UACC,QAAA;AAAA,UACA,EAAE,IAAA,EAAM,uBAAA,EAAyB,SAAS,MAAM,IAAA,CAAK,OAAM,EAAE;AAAA,UAC7D,IAAA,CAAK,EAAE,eAAe;AAAA,SACvB;AAAA,QACA,CAAA,CAAE,QAAA,EAAU,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAO,EAAE,EAAG,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAC;AAAA;AACvF,KACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,QAAA,CAAS,UAAkB,KAAA,EAAiC;AACnE,IAAA,OAAO,EAAE,OAAA,EAAS,EAAE,IAAA,EAAM,UAAA,IAAc,CAAA,CAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAQ,EAAG,IAAA,CAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAA;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,WAAW,KAAA,EAAiC;AACnD,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,IAAK,YAAA,CAAa,MAAM,IAAI,CAAA;AAC/D,IAAA,MAAM,IAAA,GAAO,IAAA,GAAO,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,EAAA,EAAI,CAAA,GAAI,IAAA;AACrE,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,SAAQ,EAAG,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAC,CAAA;AAClE,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,MAAA,GAAS,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAM,EAAG,KAAA,CAAM,MAAM,CAAA,GAAI,IAAA;AACrE,IAAA,OAAO,CAAA;AAAA,MACN,QAAA;AAAA,MACA;AAAA,QACC,IAAA,EAAM,kBAAA;AAAA,QACN,aAAa,KAAA,CAAM,IAAA;AAAA,QACnB,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,EAAO,MAAA;AAAO,OACnC;AAAA,MACA,IAAA;AAAA,MACA,CAAA,CAAE,KAAA,EAAO,EAAC,EAAG,OAAO,GAAG;AAAA,KACxB;AAAA,EACD;AAAA,EAEQ,SAAS,IAAA,EAAgC;AAGhD,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,IAAK,aAAa,IAAI,CAAA;AACnD,IAAA,MAAM,IAAA,GAAO,IAAA,GAAO,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,EAAA,EAAI,CAAA,GAAI,IAAA;AACrE,IAAA,MAAM,KAAA,GAAQ,CAAA;AAAA,MACb,KAAA;AAAA,MACA,EAAE,MAAM,OAAA,EAAQ;AAAA,MAChB,IAAA,CAAK,CAAA,CAAE,CAAA,QAAA,EAAW,IAAI,CAAA,CAAE,CAAA;AAAA,MACxB,IAAA,CAAK,YAAA,KAAiB,IAAA,GAAO,CAAA,CAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,KAAA,EAAM,EAAG,IAAA,CAAK,CAAA,CAAE,qBAAqB,CAAC,CAAA,GAAI;AAAA,KAC1F;AACA,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAM,EAAG,IAAA,CAAK,CAAA,CAAE,CAAA,QAAA,EAAW,IAAI,CAAA,IAAA,CAAM,CAAC,CAAA;AAMnE,IAAA,MAAM,QAAA,GAAW,IAAA,KAAS,MAAA,GAAS,IAAA,CAAK,UAAU,IAAA,GAAO,IAAA;AACzD,IAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAI7C,MAAA,MAAM,gBAAgB,eAAA,EAAgB;AACtC,MAAA,MAAM,UAAU,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAO,CAAA;AACxC,MAAA,IAAI,QAAA,CAAS,UAAU,IAAA,EAAM;AAC5B,QAAA,OAAA,CAAQ,MAAA;AAAA,UACP,CAAA;AAAA,YACC,QAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,uBAAA;AAAA,cACN,aAAA,EAAe,QAAA;AAAA,cACf,SAAS,MAAM,IAAA,CAAK,KAAA,EAAO,MAAA,CAAO,QAAQ,QAAQ;AAAA,aACnD;AAAA,YACA,IAAA,CAAK,EAAE,kBAAkB;AAAA;AAC1B,SACD;AAAA,MACD;AACA,MAAA,IAAI,SAAS,IAAA,IAAQ,IAAA,KAAS,OAAO,QAAA,CAAS,IAAA,KAAS,cAAc,aAAA,CAAA,EAAgB;AACpF,QAAA,OAAA,CAAQ,MAAA;AAAA,UACP,CAAA;AAAA,YACC,QAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,QAAA;AAAA,cACN,aAAA,EAAe,MAAA;AAAA,cACf,SAAS,MAAM,IAAA,CAAK,KAAA,EAAO,MAAA,CAAO,QAAQ,MAAM;AAAA,aACjD;AAAA,YACA,IAAA,CAAK,EAAE,mBAAmB;AAAA;AAC3B,SACD;AAAA,MACD;AACA,MAAA,MAAM,OAAO,CAAA,CAAE,KAAA,EAAO,EAAC,EAAG,OAAO,GAAG,CAAA;AACpC,MAAA,IAAI,OAAA,CAAQ,iBAAA,GAAoB,CAAA,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AACtD,MAAA,OAAO,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,QAAQ,WAAA,EAAa,IAAA,EAAK,EAAG,IAAA,EAAM,IAAI,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO,CAAA;AAAA,MACN,QAAA;AAAA,MACA,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,EAAO,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,MAC3E,IAAA;AAAA,MACA,CAAA,CAAE,KAAA,EAAO,EAAC,EAAG,OAAO,GAAG;AAAA,KACxB;AAAA,EACD;AAAA;AAAA;AAAA,EAIQ,WAAW,WAAA,EAAuC;AACzD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,KAAiB,QAAA,IAAY,KAAK,YAAA,KAAiB,IAAA;AAC5E,IAAA,OAAO,CAAA;AAAA,MACN,QAAA;AAAA,MACA,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,EAAO,MAAA,CAAO,WAAW,CAAA,EAAE;AAAA,MACtF,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAC;AAAA,QACD,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAE,MAAM,OAAA,EAAQ;AAAA,UAChB,IAAA,CAAK,EAAE,gBAAgB,CAAA;AAAA,UACvB,WAAA,GAAc,CAAA,CAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,KAAA,EAAM,EAAG,IAAA,CAAK,CAAA,CAAE,qBAAqB,CAAC,CAAA,GAAI;AAAA,SAC3E;AAAA,QACA,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,OAAM,EAAG,IAAA,CAAK,CAAA,CAAE,oBAAoB,CAAC;AAAA;AACvD,KACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,MAAA,EAAkC;AACpD,IAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KACZ,CAAA;AAAA,MACC,QAAA;AAAA,MACA;AAAA,QACC,IAAA,EAAM,MAAA,KAAW,CAAA,GAAI,YAAA,GAAe,KAAA;AAAA,QACpC,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY,CAAA;AAAA,QACZ,cAAA,EAAgB,MAAA,KAAW,CAAA,GAAI,MAAA,GAAS,OAAA;AAAA,QACxC,SAAS,MAAM;AACd,UAAA,IAAI,WAAW,CAAA,EAAG;AAClB,UAAA,IAAA,CAAK,OAAO,MAAA,EAAO;AACnB,UAAA,IAAA,CAAK,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,QACrB;AAAA,OACD;AAAA,MACA,IAAA,CAAK,CAAA,CAAE,CAAA,YAAA,EAAe,CAAC,CAAA,CAAE;AAAA,KAC1B;AACD,IAAA,OAAO,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAO,EAAG,GAAA,CAAI,QAAQ,CAAA,EAAG,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,EAC3D;AAAA,EAEQ,mBAAmB,IAAA,EAAkC;AAC5D,IAAA,MAAM,SAAS,IAAA,CAAK,aAAA;AACpB,IAAA,MAAM,MAAqB,EAAC;AAE5B,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,GAAA,CAAI,IAAA;AAAA,QACH,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAE,MAAM,SAAA,EAAU;AAAA,UAClB,GAAG,KAAK,cAAA,CAAe,GAAA;AAAA,YAAI,CAAC,CAAA,KAC3B,CAAA;AAAA,cACC,QAAA;AAAA,cACA;AAAA,gBACC,IAAA,EAAM,MAAA,EAAQ,EAAA,KAAO,CAAA,CAAE,KAAK,kBAAA,GAAqB,QAAA;AAAA,gBACjD,IAAA,EAAM,QAAA;AAAA,gBACN,eAAe,CAAA,CAAE,EAAA;AAAA,gBACjB,cAAA,EAAgB,MAAA,EAAQ,EAAA,KAAO,CAAA,CAAE,KAAK,MAAA,GAAS,OAAA;AAAA,gBAC/C,KAAA,EAAO,EAAE,IAAA,IAAQ,EAAA;AAAA,gBACjB,OAAA,EAAS,MAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC;AAAA,eACvC;AAAA,cACA,CAAA,CAAE;AAAA;AACH;AACD;AACD,OACD;AAAA,IACD;AACA,IAAA,GAAA,CAAI,IAAA;AAAA,MACH,IAAA,CAAK,QAAA;AAAA,QACJ,oBAAA;AAAA,QACA,EAAE,OAAA,EAAS;AAAA,UACV,IAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAM,KAAA;AAAA,UACN,WAAA,EAAa,QAAA;AAAA,UACb,OAAO,IAAA,CAAK,UAAA;AAAA,UACZ,SAAS,CAAC,CAAA,KAAc,IAAA,CAAK,UAAA,GAAc,EAAE,MAAA,CAA4B;AAAA,SACzE;AAAA,OACF;AAAA,MACA,IAAA,CAAK,QAAA;AAAA,QACJ,qBAAA;AAAA,QACA,EAAE,OAAA,EAAS;AAAA,UACV,IAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAM,MAAA;AAAA,UACN,WAAA,EAAa,SAAA;AAAA,UACb,OAAO,IAAA,CAAK,WAAA;AAAA,UACZ,SAAS,CAAC,CAAA,KAAc,IAAA,CAAK,WAAA,GAAe,EAAE,MAAA,CAA4B;AAAA,SAC1E;AAAA,OACF;AAAA,MACA,IAAA,CAAK,QAAA;AAAA,QACJ,yBAAA;AAAA,QACA,EAAE,OAAA,EAAS;AAAA,UACV,IAAA,EAAM,OAAA;AAAA,UACN,IAAA,EAAM,UAAA;AAAA,UACN,WAAA,EAAa,SAAA;AAAA,UACb,OAAO,IAAA,CAAK,WAAA;AAAA,UACZ,SAAS,CAAC,CAAA,KAAc,IAAA,CAAK,WAAA,GAAe,EAAE,MAAA,CAA4B;AAAA,SAC1E;AAAA;AACF,KACD;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AACjB,MAAA,GAAA,CAAI,IAAA;AAAA,QACH,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAE,MAAM,kBAAA,EAAmB;AAAA,UAC3B,MAAA,CAAO,IAAA;AAAA,UACP,OAAO,OAAA,GACJ,CAAA;AAAA,YACA,GAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,kBAAA;AAAA,cACN,MAAM,MAAA,CAAO,OAAA;AAAA,cACb,MAAA,EAAQ,QAAA;AAAA,cACR,GAAA,EAAK;AAAA,aACN;AAAA,YACA,CAAA,CAAA,EAAI,IAAA,CAAK,CAAA,CAAE,0BAA0B,CAAC,CAAA;AAAA,WACvC,GACC;AAAA;AACJ,OACD;AAAA,IACD;AACA,IAAA,GAAA,CAAI,IAAA;AAAA,MACH,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,MAAM,KAAA,EAAM;AAAA,QACd,CAAA;AAAA,UACC,QAAA;AAAA,UACA,EAAE,IAAA,EAAM,uBAAA,EAAyB,SAAS,MAAM,IAAA,CAAK,cAAa,EAAE;AAAA,UACpE,IAAA,CAAK,EAAE,uBAAuB;AAAA,SAC/B;AAAA,QACA,CAAA,CAAE,QAAA,EAAU,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAO,EAAE,EAAG,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAC;AAAA;AACvF,KACD;AACA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACtB,MAAA,GAAA,CAAI,IAAA;AAAA,QACH,CAAA;AAAA,UACC,GAAA;AAAA,UACA;AAAA,YACC,IAAA,EAAM,oBAAA;AAAA,YACN,MAAM,MAAA,CAAO,SAAA;AAAA,YACb,MAAA,EAAQ,QAAA;AAAA,YACR,GAAA,EAAK;AAAA,WACN;AAAA,UACA,IAAA,CAAK,EAAE,uBAAuB;AAAA;AAC/B,OACD;AAAA,IACD;AACA,IAAA,OAAO,GAAA;AAAA,EACR;AAAA,EAEQ,eAAe,IAAA,EAAkC;AACxD,IAAA,MAAM,QAAQ,CACb,IAAA,EACA,OACA,IAAA,EACA,GAAA,EACA,QAEA,IAAA,CAAK,QAAA;AAAA,MACJ,KAAA;AAAA,MACA,EAAE,OAAA,EAAS;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,IAAA;AAAA,QACA,WAAA,EAAa,IAAA;AAAA,QACb,OAAO,GAAA,EAAI;AAAA,QACX,SAAS,CAAC,CAAA,KAAa,GAAA,CAAK,CAAA,CAAE,OAA4B,KAAK;AAAA,OAC/D;AAAA,KACF;AACD,IAAA,OAAO;AAAA,MACN,KAAA;AAAA,QACC,KAAA;AAAA,QACA,qBAAA;AAAA,QACA,aAAA;AAAA,QACA,MAAM,IAAA,CAAK,WAAA;AAAA,QACX,CAAC,CAAA,KAAO,IAAA,CAAK,WAAA,GAAc;AAAA,OAC5B;AAAA,MACA,KAAA;AAAA,QACC,MAAA;AAAA,QACA,mBAAA;AAAA,QACA,WAAA;AAAA,QACA,MAAM,IAAA,CAAK,SAAA;AAAA,QACX,CAAC,CAAA,KAAO,IAAA,CAAK,SAAA,GAAY;AAAA,OAC1B;AAAA,MACA,KAAA;AAAA,QACC,MAAA;AAAA,QACA,mBAAA;AAAA,QACA,WAAA;AAAA,QACA,MAAM,IAAA,CAAK,SAAA;AAAA,QACX,CAAC,CAAA,KAAO,IAAA,CAAK,SAAA,GAAY;AAAA,OAC1B;AAAA,MACA,KAAA;AAAA,QACC,MAAA;AAAA,QACA,gBAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAM,IAAA,CAAK,MAAA;AAAA,QACX,CAAC,CAAA,KAAO,IAAA,CAAK,MAAA,GAAS;AAAA,OACvB;AAAA,MACA,KAAA;AAAA,QACC,MAAA;AAAA,QACA,wBAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAM,IAAA,CAAK,cAAA;AAAA,QACX,CAAC,CAAA,KAAO,IAAA,CAAK,cAAA,GAAiB;AAAA,OAC/B;AAAA,MACA,KAAA;AAAA,QACC,UAAA;AAAA,QACA,mBAAA;AAAA,QACA,WAAA;AAAA,QACA,MAAM,IAAA,CAAK,SAAA;AAAA,QACX,CAAC,CAAA,KAAO,IAAA,CAAK,SAAA,GAAY;AAAA,OAC1B;AAAA,MACA,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,MAAM,KAAA,EAAM;AAAA,QACd,CAAA;AAAA,UACC,QAAA;AAAA,UACA,EAAE,IAAA,EAAM,uBAAA,EAAyB,SAAS,MAAM,IAAA,CAAK,UAAS,EAAE;AAAA,UAChE,IAAA,CAAK,EAAE,mBAAmB;AAAA,SAC3B;AAAA,QACA,CAAA,CAAE,QAAA,EAAU,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,EAAO,EAAE,EAAG,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAC;AAAA;AACvF,KACD;AAAA,EACD;AAAA,EAEQ,QAAA,GAAiB;AACxB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,IAAA,EAAK;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,IAAA,EAAK;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,IAAA,EAAK;AACnC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAC7B,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,UAAU,CAAC,MAAA,IAAU,CAAC,GAAA,EAAK;AAC7C,IAAA,MAAM,MAAA,GAAmB;AAAA,MACxB,QAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,cAAA,CAAe,IAAA,EAAK;AAAA,MACtC,iBAAiB,IAAA,CAAK;AAAA,KACvB;AACA,IAAA,IAAA,CAAK,KAAA,EAAO,SAAS,MAAM,CAAA;AAAA,EAC5B;AAAA,EAEQ,MAAA,GAAe;AACtB,IAAA,IAAA,CAAK,OAAO,MAAA,EAAO;AACnB,IAAA,IAAA,CAAK,KAAK,qBAAqB,CAAA;AAAA,EAChC;AAAA,EAEQ,cAAA,GAAuB;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,aAAA,CAAgC,wBAAwB,CAAA;AAChF,IAAA,IAAI,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,cAAA,CAAe,MAAM,KAAK,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,GAAuB;AAC9B,IAAA,IAAA,CAAK,UAAA,GAAa,CAAC,IAAA,CAAK,UAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,aAAA,CAAgC,wBAAwB,CAAA;AAChF,IAAA,IAAI,KAAA,EAAO;AACV,MAAA,KAAA,CAAM,IAAA,GAAO,IAAA,CAAK,UAAA,GAAa,MAAA,GAAS,UAAA;AACxC,MAAA,KAAA,CAAM,KAAA,EAAM;AAAA,IACb;AACA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAAiC,eAAe,CAAA;AACtE,IAAA,IAAI,GAAA,EAAK;AACR,MAAA,GAAA,CAAI,YAAA;AAAA,QACH,YAAA;AAAA,QACA,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,UAAA,GAAa,0BAA0B,uBAAuB;AAAA,OAC3E;AACA,MAAA,GAAA,CAAI,YAAA,CAAa,cAAA,EAAgB,IAAA,CAAK,UAAA,GAAa,SAAS,OAAO,CAAA;AACnE,MAAA,GAAA,CAAI,eAAA,CAAgB,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IAC7C;AAAA,EACD;AAAA;AAAA,EAGQ,oBAAoB,EAAA,EAAmB;AAC9C,IAAA,IAAA,CAAK,iBAAA,GAAoB,EAAA;AACzB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA,EAIQ,WAAA,GAAoB;AAC3B,IAAA,IAAA,CAAK,OAAO,SAAA,EAAU;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAiB,CAAA,EAAuB;AAC/C,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,UAAA,GAAa,EAAE,GAAA,IAAO,EAAA;AAC3B,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAA,CAAK,IAAA,CAAK,aAAA,CAAgC,uBAAuB,CAAA,EAAG,KAAA,EAAM;AAAA,EAC3E;AAAA,EAEQ,YAAA,GAAqB;AAC5B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK;AACjC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAM,MAAA,GAAuB;AAAA,MAC5B,GAAA;AAAA,MACA,QAAA,EAAU,IAAA,CAAK,WAAA,CAAY,IAAA,EAAK;AAAA,MAChC,UAAU,IAAA,CAAK;AAAA,KAChB;AACA,IAAA,IAAA,CAAK,KAAA,EAAO,aAAa,MAAM,CAAA;AAAA,EAChC;AACD;;;ACp/BA,IAAMA,GAAAA,GAAmB;AAAA,EACxB,aAAA,EAAe,SAAA;AAAA,EACf,mBAAA,EAAqB,oBAAA;AAAA,EACrB,oBAAA,EAAsB,qBAAA;AAAA,EACtB,gBAAA,EAAkB,aAAA;AAAA,EAClB,kBAAA,EAAoB,UAAA;AAAA,EACpB,mBAAA,EAAqB,UAAA;AAAA,EACrB,YAAA,EAAc,MAAA;AAAA,EACd,cAAA,EAAgB,QAAA;AAAA,EAChB,cAAA,EAAgB,QAAA;AAAA,EAChB,eAAA,EAAiB,oBAAA;AAAA,EACjB,kBAAA,EAAoB,KAAA;AAAA,EACpB,oBAAA,EAAsB,OAAA;AAAA,EACtB,cAAA,EAAgB,QAAA;AAAA,EAChB,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe,6BAAA;AAAA,EACf,aAAA,EAAe,6CAAA;AAAA,EACf,eAAA,EAAiB,wDAAA;AAAA,EACjB,yBAAA,EAA2B;AAC5B,CAAA;AAEA,IAAMC,GAAAA,GAAmB;AAAA,EACxB,aAAA,EAAe,SAAA;AAAA,EACf,mBAAA,EAAqB,6BAAA;AAAA,EACrB,oBAAA,EAAsB,kCAAA;AAAA,EACtB,gBAAA,EAAkB,gBAAA;AAAA,EAClB,kBAAA,EAAoB,gBAAA;AAAA,EACpB,mBAAA,EAAqB,eAAA;AAAA,EACrB,YAAA,EAAc,QAAA;AAAA,EACd,cAAA,EAAgB,UAAA;AAAA,EAChB,cAAA,EAAgB,aAAA;AAAA,EAChB,eAAA,EAAiB,0BAAA;AAAA,EACjB,kBAAA,EAAoB,MAAA;AAAA,EACpB,oBAAA,EAAsB,iBAAA;AAAA,EACtB,cAAA,EAAgB,SAAA;AAAA,EAChB,YAAA,EAAc,uBAAA;AAAA,EACd,aAAA,EAAe,+CAAA;AAAA,EACf,aAAA,EAAe,4DAAA;AAAA,EACf,eAAA,EAAiB,uEAAA;AAAA,EACjB,yBAAA,EAA2B;AAC5B,CAAA;AAOA,IAAM,QAAQ,CAAC,CAAA,KACd,CAAA,IAAK,IAAA,IAAQ,CAAC,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,GAAG,EAAE,QAAA,CAAS,CAAA,CAAE,IAAA,EAAK,CAAE,aAAa,CAAA;AAElE,IAAM,qBAAA,GAAN,cAAoC,UAAA,CAAW;AAAA,EACrD,WAAW,kBAAA,GAA+B;AACzC,IAAA,OAAO,CAAC,QAAA,EAAU,aAAA,EAAe,cAAc,CAAA;AAAA,EAChD;AAAA,EAEA,OAAA,GAA8B,IAAA;AAAA,EAC9B,KAAA,GAA0B,IAAA;AAAA,EAC1B,WAAoC,EAAC;AAAA,EACrC,OAAA,GAAwB,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAA,EACxC,WAAA,GAAc,IAAA;AAAA,EACd,YAAA,GAAe,IAAA;AAAA,EACf,cAAA,GAA+E,IAAA;AAAA,EAC/E,WAAA,GAAyD,IAAA;AAAA,EACzD,GAAA,uBAAU,GAAA,EAAoB;AAAA,EAC9B,UAAA,uBAAiB,GAAA,EAAY;AAAA,EAC7B,SAAA,GAA2B,IAAA;AAAA,EAC3B,SAAA,GAA+B,IAAA;AAAA,EAErB,QAAA,GAAyB;AAClC,IAAA,OAAOD,GAAAA;AAAA,EACR;AAAA,EAEU,KAAA,GAAsC;AAC/C,IAAA,OAAO,EAAE,IAAIC,GAAAA,EAAG;AAAA,EACjB;AAAA;AAAA,EAGA,IAAI,MAAA,GAA6B;AAChC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACb;AAAA,EACA,IAAI,OAAO,CAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AACf,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA;AAAA,EAIA,IAAI,OAAA,GAAmC;AACtC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EACA,IAAI,QAAQ,CAAA,EAAmC;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,EAAC;AACtB,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,MAAA,GAAuB;AAC1B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EACxB;AAAA,EACA,IAAI,OAAO,CAAA,EAAiB;AAC3B,IAAA,MAAM,QAAQ,CAAC,GAAG,IAAI,GAAA,CAAA,CAAK,KAAK,EAAC,EAAG,MAAA,CAAO,CAAC,MAAM,CAAA,KAAM,MAAA,IAAU,CAAA,KAAM,OAAO,CAAC,CAAC,CAAA;AACjF,IAAA,IAAA,CAAK,UAAU,KAAA,CAAM,MAAA,GAAS,IAAI,KAAA,GAAQ,CAAC,QAAQ,OAAO,CAAA;AAC1D,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA,EAIA,IAAI,UAAA,GAAsB;AACzB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACb;AAAA,EACA,IAAI,WAAW,CAAA,EAAY;AAC1B,IAAA,IAAA,CAAK,cAAc,CAAA,KAAM,KAAA;AACzB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA,EAIA,IAAI,WAAA,GAAuB;AAC1B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACb;AAAA,EACA,IAAI,YAAY,CAAA,EAAY;AAC3B,IAAA,IAAA,CAAK,eAAe,CAAA,KAAM,KAAA;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAA,GAA8E;AACjF,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACb;AAAA,EACA,IAAI,cAAc,CAAA,EAAiE;AAClF,IAAA,IAAA,CAAK,iBAAiB,CAAA,IAAK,IAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAwD;AAC3D,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACb;AAAA,EACA,IAAI,WAAW,CAAA,EAA8C;AAC5D,IAAA,IAAA,CAAK,cAAc,CAAA,IAAK,IAAA;AACxB,IAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AACf,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EAEA,IAAI,IAAA,GAAyB;AAC5B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACb;AAAA,EAEA,wBAAA,CAAyB,IAAA,EAAc,IAAA,EAAqB,KAAA,EAA4B;AACvF,IAAA,IAAI,SAAS,QAAA,EAAU;AACtB,MAAA,IAAA,CAAK,MAAA,GAAA,CAAU,KAAA,IAAS,EAAA,EAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,IAC3D;AACA,IAAA,IAAI,IAAA,KAAS,eAAe,IAAA,CAAK,UAAA,GAAa,SAAS,IAAA,IAAQ,CAAC,MAAM,KAAK,CAAA;AAC3E,IAAA,IAAI,IAAA,KAAS,gBAAgB,IAAA,CAAK,WAAA,GAAc,SAAS,IAAA,IAAQ,CAAC,MAAM,KAAK,CAAA;AAAA,EAC9E;AAAA,EAEA,iBAAA,GAA0B;AACzB,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA,EAEQ,IAAA,GAAa;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,OAAA,EAAS;AACxC,IAAA,IAAA,CAAK,KAAA,IAAQ;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,KAAK,QAAQ,CAAA;AAClD,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA,CAAM,UAAU,MAAM,IAAA,CAAK,UAAU,CAAA;AAAA,EACxD;AAAA,EAEU,KAAK,IAAA,EAAyB;AACvC,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,IAAI,IAAA,CAAK,QAAA;AAEf,IAAA,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,aAAa,CAAC,CAAA;AAC9C,IAAA,IAAI,CAAA,CAAE,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAO,EAAG,IAAA,CAAK,CAAA,CAAE,aAAa,CAAC,CAAC,CAAA;AAC1E,IAAA,IAAI,CAAA,CAAE,KAAA,IAAS,CAAC,CAAA,CAAE,KAAA,EAAO;AACxB,MAAA,IAAA,CAAK,MAAA,CAAO,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,YAAA,EAAa,EAAG,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAC,CAAC,CAAA;AAAA,IAC/E;AAIA,IAAA,IAAI,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,CAAC,CAAC,CAAA;AAC9E,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,MAAA;AAAA,UACJ,CAAA;AAAA,YACC,KAAA;AAAA,YACA,EAAE,MAAM,KAAA,EAAM;AAAA,YACd,GAAG,OAAA,CAAQ,GAAA;AAAA,cAAI,CAAC,KAAA,KACf,CAAA;AAAA,gBACC,QAAA;AAAA,gBACA;AAAA,kBACC,IAAA,EAAM,uBAAA;AAAA,kBACN,aAAA,EAAe,UAAU,KAAK,CAAA,CAAA;AAAA,kBAC9B,QAAA,EAAU,EAAE,IAAA,KAAS,IAAA;AAAA,kBACrB,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK;AAAA,iBACjC;AAAA,gBACA,IAAA,CAAK,CAAA;AAAA,kBACJ,CAAA,CAAE,SAAS,QAAA,IAAY,IAAA,CAAK,cAAc,KAAA,GACvC,gBAAA,GACA,gBAAgB,KAAK,CAAA;AAAA;AACzB;AACD;AACD;AACD,SACD;AAAA,MACD;AAAA,IACD;AAEA,IAAA,IAAI,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACvB,MAAA,MAAM,OAAO,CAAA,CAAE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAQ,CAAA;AACrC,MAAA,KAAA,MAAW,IAAA,IAAQ,EAAE,KAAA,EAAO;AAC3B,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAC9B,QAAA,IAAA,CAAK,MAAA;AAAA,UACJ,CAAA;AAAA,YACC,IAAA;AAAA,YACA,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,KAAK,EAAA,EAAG;AAAA,YACrC,EAAA,GAAK,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,CAAA,GAAI,IAAA;AAAA,YAClD,CAAA;AAAA,cACC,KAAA;AAAA,cACA,EAAE,OAAO,oBAAA,EAAqB;AAAA,cAC9B,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAG,IAAA,CAAK,CAAA,CAAE,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,CAAA,CAAE,CAAC,CAAA;AAAA,cAC/D,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,OAAO,KAAA,EAAO,sBAAA,EAAuB,EAAG,IAAA,CAAK,GAAG;AAAA,aAClE;AAAA,YACA,CAAA;AAAA,cACC,QAAA;AAAA,cACA;AAAA,gBACC,IAAA,EAAM,QAAA;AAAA,gBACN,aAAA,EAAe,MAAA;AAAA,gBACf,SAAS,MAAM,IAAA,CAAK,KAAK,IAAA,CAAK,EAAA,EAAI,KAAK,GAAG;AAAA,eAC3C;AAAA,cACA,KAAK,CAAA,CAAE,IAAA,CAAK,cAAc,IAAA,CAAK,EAAA,GAAK,iBAAiB,YAAY;AAAA,aAClE;AAAA,YACA,CAAA;AAAA,cACC,QAAA;AAAA,cACA;AAAA,gBACC,IAAA,EAAM,sBAAA;AAAA,gBACN,aAAA,EAAe,QAAA;AAAA,gBACf,QAAA,EAAU,EAAE,IAAA,KAAS,IAAA;AAAA,gBACrB,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE;AAAA,eACnC;AAAA,cACA,IAAA,CAAK,EAAE,cAAc;AAAA;AACtB;AACD,SACD;AAAA,MACD;AACA,MAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IACjB;AAEA,IAAA,IAAI,KAAK,YAAA,EAAc;AACtB,MAAA,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,eAAe,CAAC,CAAA;AAC9C,MAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC3B,QAAA,IAAA,CAAK,MAAA,CAAO,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAO,EAAG,IAAA,CAAK,CAAA,CAAE,aAAa,CAAC,CAAC,CAAA;AAAA,MAC9D,CAAA,MAAO;AACN,QAAA,MAAM,UAAU,CAAA,CAAE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAQ,CAAA;AACxC,QAAA,KAAA,MAAW,CAAA,IAAK,EAAE,OAAA,EAAS;AAC1B,UAAA,MAAM,SAAmB,EAAC;AAC1B,UAAA,IAAI,EAAE,IAAA,EAAM,MAAA,CAAO,KAAK,IAAA,CAAK,CAAA,CAAE,kBAAkB,CAAC,CAAA;AAClD,UAAA,IAAI,EAAE,KAAA,EAAO,MAAA,CAAO,KAAK,IAAA,CAAK,CAAA,CAAE,oBAAoB,CAAC,CAAA;AACrD,UAAA,OAAA,CAAQ,MAAA;AAAA,YACP,CAAA;AAAA,cACC,IAAA;AAAA,cACA,EAAE,IAAA,EAAM,MAAA,EAAQ,aAAA,EAAe,EAAE,EAAA,EAAG;AAAA,cACpC,CAAA;AAAA,gBACC,KAAA;AAAA,gBACA,EAAE,OAAO,QAAA,EAAS;AAAA,gBAClB,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,SAAQ,EAAG,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,EAAE,CAAA;AAAA,gBAC3C,MAAA,CAAO,MAAA,GAAS,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAM,EAAG,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA,GAAI;AAAA,eACjE;AAAA,cACA,CAAA,CAAE,gBAAA,IAAoB,CAAC,CAAA,CAAE,IAAA,GACtB,CAAA;AAAA,gBACA,QAAA;AAAA,gBACA;AAAA,kBACC,IAAA,EAAM,sBAAA;AAAA,kBACN,aAAA,EAAe,QAAA;AAAA,kBACf,QAAA,EAAU,EAAE,IAAA,KAAS,IAAA;AAAA,kBACrB,OAAA,EAAS,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,EAAE;AAAA,iBACnC;AAAA,gBACA,IAAA,CAAK,EAAE,cAAc;AAAA,eACtB,GACC;AAAA;AACJ,WACD;AAAA,QACD;AACA,QAAA,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,MACpB;AAAA,IACD;AAMA,IAAA,IAAI,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAI,CAAA,EAAG;AACrD,MAAA,IAAA,CAAK,MAAA;AAAA,QACJ,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,kBAAA,EAAmB;AAAA,UAC5C,CAAA;AAAA,YACC,QAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,kBAAA;AAAA,cACN,aAAA,EAAe,MAAA;AAAA,cACf,QAAA,EAAU,EAAE,IAAA,KAAS,IAAA;AAAA,cACrB,OAAA,EAAS,MAAM,IAAA,CAAK,IAAA;AAAK,aAC1B;AAAA,YACA,IAAA,CAAK,EAAE,YAAY;AAAA;AACpB;AACD,OACD;AAAA,IACD;AAAA,EACD;AAAA,EAEQ,OAAO,KAAA,EAAyB;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,KAAK,IAAA,CAAK,OAAO,UAAA,CAAW,EAAE,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS;AACrD,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,IAAI,MAAM,IAAA,CAAK,IAAA,CAAK,wBAAA,EAA0B,EAAE,MAAM,CAAA;AACtD,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IACf,CAAC,CAAA;AAAA,EACF;AAAA;AAAA;AAAA,EAIQ,OAAA,CAAQ,QAAqB,GAAA,EAAuB;AAC3D,IAAA,MAAM,OAAO,IAAA,CAAK,cAAA;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACV,MAAA,GAAA,EAAI;AACJ,MAAA;AAAA,IACD;AACA,IAAA,KAAK,OAAA,CAAQ,OAAA,EAAQ,CACnB,IAAA,CAAK,MAAM,IAAA,CAAK,MAAM,CAAC,CAAA,CACvB,IAAA,CAAK,CAAC,EAAA,KAAO;AACb,MAAA,IAAI,IAAI,GAAA,EAAI;AAAA,IACb,CAAC,CAAA,CACA,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EACxB;AAAA,EAEQ,OAAO,EAAA,EAAkB;AAChC,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAG,EAAG,MAAM,KAAK,IAAA,CAAK,KAAA,EAAO,UAAA,CAAW,EAAE,CAAC,CAAA;AAAA,EAC3E;AAAA,EAEQ,UAAU,EAAA,EAAkB;AACnC,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAG,EAAG,MAAM,KAAK,IAAA,CAAK,KAAA,EAAO,YAAA,CAAa,EAAE,CAAC,CAAA;AAAA,EAC7E;AAAA,EAEQ,IAAA,GAAa;AACpB,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,MAAA,IAAU,MAAM;AACpC,MAAA,KAAK,KAAK,KAAA,EAAO,SAAA,EAAU,CAAE,IAAA,CAAK,CAAC,EAAA,KAAO;AACzC,QAAA,IAAI,EAAA,EAAI,IAAA,CAAK,IAAA,CAAK,yBAAyB,CAAA;AAAA,MAC5C,CAAC,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACF;AAAA,EAEQ,MAAM,GAAA,EAA4B;AACzC,IAAA,MAAM,WAAW,IAAA,CAAK,WAAA;AACtB,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAK,OAAO,GAAA;AAChB,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,UAAA,CAAW,IAAI,GAAG,CAAA;AACvB,MAAA,KAAK,QAAA,CAAS,GAAG,CAAA,CACf,IAAA,CAAK,CAAC,GAAA,KAAQ;AACd,QAAA,IAAI,IAAA,CAAK,gBAAgB,QAAA,EAAU;AACnC,QAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AACrB,QAAA,IAAA,CAAK,QAAA,EAAS;AAAA,MACf,CAAC,CAAA,CACA,KAAA,CAAM,MAAM,MAAS,CAAA,CACrB,OAAA,CAAQ,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,IAAA;AAAA,EACR;AAAA,EAEQ,IAAA,CAAK,IAAY,GAAA,EAAmB;AAC3C,IAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,IAAA,IAAA,CAAK,IAAA,CAAK,uBAAA,EAAyB,EAAE,GAAA,EAAK,CAAA;AAC1C,IAAA,KAAK,UAAU,SAAA,EAAW,SAAA,CAAU,GAAG,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAC9D,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,UAAA,CAAW,MAAM;AAChB,MAAA,IAAI,IAAA,CAAK,cAAc,EAAA,EAAI;AAC3B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IACf,GAAG,IAAI,CAAA;AAAA,EACR;AACD;;;ACrYA,IAAMD,GAAAA,GAAmB;AAAA,EACxB,iBAAA,EAAmB,2BAAA;AAAA,EACnB,YAAA,EAAc,iBAAA;AAAA,EACd,WAAA,EAAa,kBAAA;AAAA,EACb,iBAAA,EAAmB,8BAAA;AAAA,EACnB,kBAAA,EAAoB,uCAAA;AAAA,EACpB,aAAA,EAAe,MAAA;AAAA,EACf,cAAA,EAAgB,YAAA;AAAA,EAChB,aAAA,EAAe,uDAAA;AAAA,EACf,eAAA,EACC,oFAAA;AAAA,EACD,eAAA,EAAiB,yDAAA;AAAA,EACjB,oBAAA,EAAsB,qBAAA;AAAA,EACtB,YAAA,EAAc,WAAA;AAAA,EACd,eAAA,EAAiB,wDAAA;AAAA,EACjB,yBAAA,EAA2B;AAC5B,CAAA;AAEA,IAAMC,GAAAA,GAAmB;AAAA,EACxB,iBAAA,EAAmB,4BAAA;AAAA,EACnB,YAAA,EAAc,kCAAA;AAAA,EACd,WAAA,EAAa,uBAAA;AAAA,EACb,iBAAA,EAAmB,yBAAA;AAAA,EACnB,kBAAA,EAAoB,qCAAA;AAAA,EACpB,aAAA,EAAe,WAAA;AAAA,EACf,cAAA,EAAgB,uBAAA;AAAA,EAChB,aAAA,EAAe,4EAAA;AAAA,EACf,eAAA,EACC,iGAAA;AAAA,EACD,eAAA,EAAiB,oEAAA;AAAA,EACjB,oBAAA,EAAsB,0BAAA;AAAA,EACtB,YAAA,EAAc,cAAA;AAAA,EACd,eAAA,EAAiB,uEAAA;AAAA,EACjB,yBAAA,EAA2B;AAC5B,CAAA;AAEO,IAAM,oBAAA,GAAN,cAAmC,UAAA,CAAW;AAAA,EACpD,WAAW,kBAAA,GAA+B;AACzC,IAAA,OAAO,CAAC,QAAQ,SAAS,CAAA;AAAA,EAC1B;AAAA,EAEA,OAAA,GAA6B,IAAA;AAAA,EAC7B,KAAA,GAAuB,IAAA;AAAA,EACvB,KAAA,GAAyB,IAAA;AAAA,EACzB,QAAA,GAA8B,MAAA;AAAA,EAC9B,WAAoC,EAAC;AAAA,EAE3B,QAAA,GAAyB;AAClC,IAAA,OAAOD,GAAAA;AAAA,EACR;AAAA,EAEU,KAAA,GAAsC;AAC/C,IAAA,OAAO,EAAE,IAAIC,GAAAA,EAAG;AAAA,EACjB;AAAA,EAEA,IAAI,MAAA,GAA4B;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACb;AAAA,EACA,IAAI,OAAO,CAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AACf,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA,EAGA,IAAI,IAAA,GAAsB;AACzB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACb;AAAA,EACA,IAAI,KAAK,CAAA,EAAkB;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAmC;AACtC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EACA,IAAI,QAAQ,CAAA,EAAmC;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,EAAC;AACtB,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAA6B;AAChC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EACA,IAAI,QAAQ,CAAA,EAAsB;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA,KAAM,QAAA,GAAW,QAAA,GAAW,MAAA;AAC5C,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EAEA,IAAI,IAAA,GAAwB;AAC3B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACb;AAAA,EAEA,wBAAA,CAAyB,IAAA,EAAc,IAAA,EAAqB,KAAA,EAA4B;AACvF,IAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,IAAA,CAAK,IAAA,GAAO,KAAA;AACjC,IAAA,IAAI,IAAA,KAAS,SAAA,EAAW,IAAA,CAAK,OAAA,GAAW,KAAA,IAAS,MAAA;AAAA,EAClD;AAAA,EAEA,iBAAA,GAA0B;AACzB,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,EAAG,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACnF,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA,EAAG;AACjC,MAAA,IAAA,CAAK,WAAW,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA,KAAM,WAAW,QAAA,GAAW,MAAA;AAAA,IACxE;AACA,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA,EAEQ,IAAA,GAAa;AACpB,IAAA,IAAI,CAAC,KAAK,WAAA,IAAe,CAAC,KAAK,OAAA,IAAW,CAAC,KAAK,KAAA,EAAO;AACvD,IAAA,IAAA,CAAK,KAAA,IAAQ;AACb,IAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,IAAA,CAAK,OAAO,IAAA,CAAK,OAAA,EAAS,KAAK,QAAQ,CAAA;AAC7D,IAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,IAAA,KAAS;AAC3C,MAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC3B,QAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU,IAAA,CAAK,KAAK,kBAAA,EAAoB,EAAE,OAAA,EAAS,QAAA,EAAU,CAAA;AAC/E,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,SAAS,WAAA,EAAa;AAC1D,UAAA,IAAA,CAAK,KAAK,wBAAA,EAA0B,EAAE,OAAA,EAAS,IAAA,CAAK,MAAM,CAAA;AAAA,QAC3D;AACA,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,QAAA,KAAa,SAAA,EAAW;AAEpD,UAAA,IAAA,CAAK,KAAK,qBAAqB,CAAA;AAAA,QAChC;AACA,QAAA,QAAA,GAAW,IAAA,CAAK,IAAA;AAAA,MACjB;AACA,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IACf,CAAC,CAAA;AAAA,EACF;AAAA,EAEU,KAAK,IAAA,EAAyB;AACvC,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,IAAI,IAAA,CAAK,QAAA;AAEf,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,YAAA,IAAgB,CAAA,CAAE,SAAS,SAAA,EAAW;AACpD,MAAA,IAAA,CAAK,MAAA;AAAA,QACJ,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,EAAE,MAAA,EAAQ,EAAE,MAAM,SAAA,EAAW,aAAA,EAAe,QAAQ,CAAA;AAAA,UACpD,CAAA;AAAA,YACC,KAAA;AAAA,YACA,EAAE,MAAM,OAAA,EAAQ;AAAA,YAChB,KAAK,CAAA,CAAE,CAAA,CAAE,IAAA,KAAS,SAAA,GAAY,iBAAiB,iBAAiB;AAAA;AACjE;AACD,OACD;AACA,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS;AACvB,MAAA,MAAM,IAAI,CAAA,CAAE,OAAA;AACZ,MAAA,IAAI,IAAA,CAAK,aAAa,QAAA,EAAU;AAC/B,QAAA,GAAA;AAAA,UACC,IAAA;AAAA,UACA,CAAA;AAAA,YACC,KAAA;AAAA,YACA,EAAE,MAAM,YAAA,EAAa;AAAA,YACrB,CAAA;AAAA,cACC,KAAA;AAAA,cACA,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,oBAAA,EAAqB;AAAA,cAC7C,CAAA,EAAG,KAAA,IAAS,IAAA,CAAK,CAAA,CAAE,YAAY;AAAA,aAChC;AAAA,YACA,CAAA;AAAA,cACC,QAAA;AAAA,cACA;AAAA,gBACC,IAAA,EAAM,uBAAA;AAAA,gBACN,aAAA,EAAe,QAAA;AAAA,gBACf,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA;AAAO,eAC5B;AAAA,cACA,IAAA,CAAK,EAAE,aAAa;AAAA,aACrB;AAAA,YACA,EAAE,gBAAA,GACC,CAAA;AAAA,cACA,QAAA;AAAA,cACA,EAAE,MAAM,MAAA,EAAQ,aAAA,EAAe,UAAU,OAAA,EAAS,MAAM,IAAA,CAAK,aAAA,EAAc,EAAE;AAAA,cAC7E,IAAA,CAAK,EAAE,oBAAoB;AAAA,aAC5B,GACC;AAAA;AACJ,SACD;AACA,QAAA;AAAA,MACD;AACA,MAAA,GAAA;AAAA,QACC,IAAA;AAAA,QACA,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAG,CAAA,EAAG,KAAA,IAAS,IAAA,CAAK,CAAA,CAAE,YAAY,CAAC,CAAA;AAAA,QAC5D,GAAG,IAAA,GAAO,CAAA,CAAE,KAAA,EAAO,EAAE,MAAM,KAAA,EAAM,EAAG,IAAA,CAAK,CAAA,CAAE,WAAW,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA,CAAE,IAAI,CAAC,CAAA,GAAI,IAAA;AAAA,QACrF,CAAA,EAAG,KAAA,GAAQ,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAO,EAAG,IAAA,CAAK,EAAE,CAAA,WAAA,EAAc,CAAA,CAAE,KAAK,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA;AAAA,QACzE,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAE,MAAM,KAAA,EAAM;AAAA,UACd,CAAA;AAAA,YACC,QAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,uBAAA;AAAA,cACN,aAAA,EAAe,QAAA;AAAA,cACf,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA;AAAO,aAC5B;AAAA,YACA,IAAA,CAAK,EAAE,aAAa;AAAA,WACrB;AAAA,UACA,EAAE,gBAAA,GACC,CAAA;AAAA,YACA,QAAA;AAAA,YACA,EAAE,MAAM,MAAA,EAAQ,aAAA,EAAe,UAAU,OAAA,EAAS,MAAM,IAAA,CAAK,aAAA,EAAc,EAAE;AAAA,YAC7E,IAAA,CAAK,EAAE,oBAAoB;AAAA,WAC5B,GACC;AAAA;AACJ,OACD;AACA,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACxB,MAAA,IAAA,CAAK,MAAA;AAAA,QACJ,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,kBAAA,IAAsB,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,SAAQ,EAAG,IAAA,CAAK,CAAA,CAAE,aAAa,CAAC,CAAC;AAAA,OAC1F;AACA,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,SAAS,WAAA,EAAa;AACpD,MAAA,IAAA,CAAK,MAAA;AAAA,QACJ,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAE,MAAM,QAAA,EAAS;AAAA,UACjB,CAAA;AAAA,YACC,KAAA;AAAA,YACA,EAAE,MAAM,OAAA,EAAQ;AAAA,YAChB,KAAK,CAAA,CAAE,CAAA,CAAE,IAAA,KAAS,UAAA,GAAa,kBAAkB,eAAe;AAAA;AACjE;AACD,OACD;AACA,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,WAAA,IAAe,CAAA,CAAE,gBAAA,EAAkB;AACjD,QAAA,IAAA,CAAK,MAAA;AAAA,UACJ,CAAA;AAAA,YACC,KAAA;AAAA,YACA,EAAE,MAAM,KAAA,EAAM;AAAA,YACd,CAAA;AAAA,cACC,QAAA;AAAA,cACA,EAAE,MAAM,QAAA,EAAU,aAAA,EAAe,UAAU,OAAA,EAAS,MAAM,IAAA,CAAK,aAAA,EAAc,EAAE;AAAA,cAC/E,IAAA,CAAK,EAAE,oBAAoB;AAAA;AAC5B;AACD,SACD;AAAA,MACD;AACA,MAAA;AAAA,IACD;AAGA,IAAA,IAAA,CAAK,MAAA;AAAA,MACJ,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,MAAM,qBAAA,EAAsB;AAAA,QAC9B,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAG,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,KAAA,EAAO,QAAQ,CAAC;AAAA,OAC9D;AAAA,MACA,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,MAAM,KAAA,EAAM;AAAA,QACd,CAAA,CAAE,QAAA,EAAU,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,EAAM,EAAE,EAAG,IAAA,CAAK,CAAA,CAAE,YAAY,CAAC,CAAA;AAAA,QACjF,EAAE,gBAAA,GACC,CAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAE,MAAM,MAAA,EAAQ,aAAA,EAAe,UAAU,OAAA,EAAS,MAAM,IAAA,CAAK,aAAA,EAAc,EAAE;AAAA,UAC7E,IAAA,CAAK,EAAE,oBAAoB;AAAA,SAC5B,GACC;AAAA;AACJ,KACD;AAAA,EACD;AACD;;;ACnRA,IAAMD,GAAAA,GAAmB;AAAA,EACxB,kBAAA,EAAoB,kBAAA;AAAA,EACpB,kBAAA,EAAoB,0BAAA;AAAA,EACpB,eAAA,EAAiB,WAAA;AAAA,EACjB,cAAA,EAAgB,mCAAA;AAAA,EAChB,uBAAA,EAAyB,uBAAA;AAAA,EACzB,eAAA,EAAiB,QAAA;AAAA,EACjB,wBAAA,EAA0B,qBAAA;AAAA,EAC1B,wBAAA,EAA0B,OAAA;AAAA,EAC1B,kCAAA,EAAoC,sBAAA;AAAA,EACpC,wBAAA,EAA0B,UAAA;AAAA,EAC1B,yBAAA,EAA2B,WAAA;AAAA,EAC3B,sBAAA,EAAwB;AACzB,CAAA;AAIA,IAAMC,GAAAA,GAAmB;AAAA,EACxB,kBAAA,EAAoB,0BAAA;AAAA,EACpB,kBAAA,EAAoB,gEAAA;AAAA,EACpB,eAAA,EAAiB,mBAAA;AAAA,EACjB,cAAA,EAAgB,oDAAA;AAAA,EAChB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,eAAA,EAAiB,2BAAA;AAAA,EACjB,wBAAA,EAA0B,6BAAA;AAAA,EAC1B,wBAAA,EAA0B,sBAAA;AAAA,EAC1B,kCAAA,EAAoC,wBAAA;AAAA,EACpC,wBAAA,EAA0B,UAAA;AAAA,EAC1B,yBAAA,EAA2B,sBAAA;AAAA,EAC3B,sBAAA,EAAwB;AACzB,CAAA;AAEO,IAAM,sBAAA,GAAN,cAAqC,UAAA,CAAW;AAAA,EACtD,WAAW,kBAAA,GAA+B;AACzC,IAAA,OAAO,CAAC,SAAS,CAAA;AAAA,EAClB;AAAA,EAEA,MAAA,GAA2B,IAAA;AAAA,EAC3B,QAAA,GAA0B,KAAA;AAAA,EAC1B,SAAiC,EAAC;AAAA,EAExB,QAAA,GAAyB;AAClC,IAAA,OAAOD,GAAAA;AAAA,EACR;AAAA,EAEU,KAAA,GAAsC;AAC/C,IAAA,OAAO,EAAE,IAAIC,GAAAA,EAAG;AAAA,EACjB;AAAA;AAAA,EAGA,IAAI,KAAA,GAA0B;AAC7B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACb;AAAA,EACA,IAAI,MAAM,CAAA,EAAqB;AAG9B,IAAA,IAAI,CAAA,KAAM,KAAK,MAAA,EAAQ;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA,EAGA,IAAI,OAAA,GAAyB;AAC5B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EACA,IAAI,QAAQ,CAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA,KAAM,KAAA,GAAQ,KAAA,GAAQ,KAAA;AACtC,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA,EAIA,IAAI,KAAA,GAAgC;AACnC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACb;AAAA,EACA,IAAI,MAAM,CAAA,EAAkC;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,EAAC;AACpB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EAEA,wBAAA,CAAyB,IAAA,EAAc,IAAA,EAAqB,KAAA,EAA4B;AACvF,IAAA,IAAI,IAAA,KAAS,SAAA,EAAW,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACxC;AAAA,EAEA,iBAAA,GAA0B;AACzB,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,IAAI,IAAA,CAAK,aAAa,SAAS,CAAA,OAAQ,OAAA,GAAU,IAAA,CAAK,aAAa,SAAS,CAAA;AAC5E,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA,EAEQ,IAAA,GAAwB;AAC/B,IAAA,OAAO,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,EAC1B;AAAA,EAEQ,IAAA,GAAa;AACpB,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,EACxB;AAAA,EAEU,KAAK,IAAA,EAAyB;AACvC,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAM,GAAI,KAAK,MAAA,CAAO,KAAA;AAMlD,IAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAwB;AACzC,MAAA,MAAM,OAAA,GAAU,GAAG,GAAG,CAAA,UAAA,CAAA;AACtB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,CAAE,OAAO,CAAA;AAE5B,MAAA,OAAO,KAAA,KAAU,OAAA,GAAU,IAAA,CAAK,CAAA,CAAE,GAAG,CAAA,GAAI,KAAA;AAAA,IAC1C,CAAA;AACA,IAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,IAAA,CAAK,CAAA,CAAE,MAAA,CAAO,QAAA,EAAU,EAAE,KAAA,EAAO,CAAA,GAAI,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AAClF,IAAA,MAAM,GAAA,GAAM,EAAE,MAAA,EAAQ;AAAA,MACrB,IAAA,EAAM,CAAA,eAAA,EAAkB,MAAA,CAAO,QAAQ,CAAA,CAAA;AAAA,MACvC,aAAA,EAAe;AAAA,KACf,CAAA;AAED,IAAA,IAAI,IAAA,CAAK,aAAa,KAAA,EAAO;AAC5B,MAAA,IAAA,CAAK,MAAA;AAAA,QACJ,CAAA;AAAA,UACC,QAAA;AAAA,UACA;AAAA,YACC,IAAA,EAAM,YAAA;AAAA,YACN,YAAA,EAAc,IAAA;AAAA,YACd,KAAA,EAAO,IAAA;AAAA,YACP,OAAA,EAAS,MAAM,IAAA,CAAK,IAAA,CAAK,yBAAA,EAA2B,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,IAAA,EAAM;AAAA,WACtF;AAAA,UACA;AAAA;AACD,OACD;AACA,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,CAAE,CAAA,aAAA,EAAgB,UAAU,CAAA,CAAE,CAAA;AAGjD,IAAA,MAAM,MAAM,KAAA,KAAU,CAAA,aAAA,EAAgB,UAAU,CAAA,CAAA,GAAK,QAAS,KAAA,IAAS,EAAA;AACvE,IAAA,GAAA;AAAA,MACC,IAAA;AAAA,MACA,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,MAAM,gBAAA,EAAiB;AAAA,QACzB,GAAA;AAAA,QACA,IAAA,GAAO,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,EAAA,EAAI,CAAA,GAAI,IAAA;AAAA,QACxD,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAC;AAAA,UACD,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,IAAW,IAAI,CAAA;AAAA,UAChC,GAAA,GAAM,EAAE,KAAA,EAAO,EAAE,MAAM,KAAA,EAAM,EAAG,GAAG,CAAA,GAAI;AAAA,SACxC;AAAA,QACA,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,MAAA,GACzB,CAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,YACC,IAAA,EAAM,sBAAA;AAAA,YACN,OAAA,EAAS,MAAM,IAAA,CAAK,IAAA,CAAK,2BAA2B,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ;AAAA,WAC9E;AAAA,UACA,IAAA,CAAK,CAAA,CAAE,CAAA,cAAA,EAAiB,MAAA,CAAO,MAAM,CAAA,CAAE;AAAA,SACxC,GACC;AAAA;AACJ,KACD;AAAA,EACD;AACD;;;AC9JA,IAAMD,GAAAA,GAAmB;AAAA,EACxB,sBAAA,EAAwB,YAAA;AAAA,EACxB,uBAAA,EAAyB,aAAA;AAAA,EACzB,gBAAA,EAAkB,QAAA;AAAA,EAClB,wBAAA,EAA0B,WAAA;AAAA,EAC1B,oBAAA,EAAsB,eAAA;AAAA,EACtB,qBAAA,EAAuB,QAAA;AAAA,EACvB,sBAAA,EAAwB,YAAA;AAAA,EACxB,kBAAA,EAAoB,iBAAA;AAAA,EACpB,qBAAA,EAAuB,2CAAA;AAAA,EACvB,iBAAA,EAAmB,YAAA;AAAA,EACnB,cAAA,EAAgB,gBAAA;AAAA,EAChB,cAAA,EAAgB,MAAA;AAAA,EAChB,iBAAA,EAAmB,SAAA;AAAA,EACnB,eAAA,EAAiB,OAAA;AAAA,EACjB,gBAAA,EAAkB,QAAA;AAAA,EAClB,gBAAA,EAAkB,QAAA;AAAA,EAClB,aAAA,EAAe,cAAA;AAAA,EACf,kBAAA,EAAoB,YAAA;AAAA,EACpB,qBAAA,EAAuB,kBAAA;AAAA,EACvB,gBAAA,EAAkB,UAAA;AAAA,EAClB,gBAAA,EAAkB,cAAA;AAAA,EAClB,eAAA,EAAiB,6BAAA;AAAA,EACjB,gBAAA,EAAkB,QAAA;AAAA,EAClB,qBAAA,EAAuB,oBAAA;AAAA,EACvB,gBAAA,EAAkB,+CAAA;AAAA,EAClB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,gBAAA,EAAkB,QAAA;AAAA,EAClB,wBAAA,EAA0B,gBAAA;AAAA,EAC1B,mBAAA,EAAqB,iBAAA;AAAA,EACrB,sBAAA,EAAwB,OAAA;AAAA,EACxB,qBAAA,EAAuB,aAAA;AAAA,EACvB,uBAAA,EAAyB,aAAA;AAAA,EACzB,uBAAA,EACC,iGAAA;AAAA,EACD,4BAAA,EAA8B,cAAA;AAAA,EAC9B,2BAAA,EAA6B,uBAAA;AAAA,EAC7B,6BAAA,EAA+B,iBAAA;AAAA,EAC/B,yBAAA,EAA2B,cAAA;AAAA,EAC3B,sBAAA,EAAwB,uBAAA;AAAA,EACxB,0BAAA,EAA4B,oBAAA;AAAA,EAC5B,yBAAA,EAA2B,6BAAA;AAAA,EAC3B,uBAAA,EAAyB,2CAAA;AAAA,EACzB,wBAAA,EAA0B,QAAA;AAAA,EAC1B,sBAAA,EAAwB,cAAA;AAAA,EACxB,4BAAA,EAA8B,yDAAA;AAAA,EAC9B,6BAAA,EACC,sLAAA;AAAA,EACD,6BAAA,EAA+B,UAAA;AAAA,EAC/B,iCAAA,EAAmC,UAAA;AAAA,EACnC,6BAAA,EAA+B,cAAA;AAAA,EAC/B,2BAAA,EAA6B,QAAA;AAAA,EAC7B,2BAAA,EAA6B,QAAA;AAAA,EAC7B,wBAAA,EAA0B,wBAAA;AAAA,EAC1B,gCAAA,EAAkC,eAAA;AAAA,EAClC,2BAAA,EAA6B,mBAAA;AAAA,EAC7B,eAAA,EAAiB;AAClB,CAAA;AAEA,IAAMC,GAAAA,GAAmB;AAAA,EACxB,sBAAA,EAAwB,aAAA;AAAA,EACxB,uBAAA,EAAyB,uBAAA;AAAA,EACzB,gBAAA,EAAkB,QAAA;AAAA,EAClB,wBAAA,EAA0B,aAAA;AAAA,EAC1B,oBAAA,EAAsB,iBAAA;AAAA,EACtB,qBAAA,EAAuB,aAAA;AAAA,EACvB,sBAAA,EAAwB,iBAAA;AAAA,EACxB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,qBAAA,EAAuB,mDAAA;AAAA,EACvB,iBAAA,EAAmB,cAAA;AAAA,EACnB,cAAA,EAAgB,SAAA;AAAA,EAChB,cAAA,EAAgB,QAAA;AAAA,EAChB,iBAAA,EAAmB,UAAA;AAAA,EACnB,eAAA,EAAiB,UAAA;AAAA,EACjB,gBAAA,EAAkB,UAAA;AAAA,EAClB,gBAAA,EAAkB,WAAA;AAAA,EAClB,aAAA,EAAe,uBAAA;AAAA,EACf,kBAAA,EAAoB,qBAAA;AAAA,EACpB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,gBAAA,EAAkB,SAAA;AAAA,EAClB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,eAAA,EAAiB,6BAAA;AAAA,EACjB,gBAAA,EAAkB,UAAA;AAAA,EAClB,qBAAA,EAAuB,2BAAA;AAAA,EACvB,gBAAA,EAAkB,gEAAA;AAAA,EAClB,gBAAA,EAAkB,0BAAA;AAAA,EAClB,gBAAA,EAAkB,yBAAA;AAAA,EAClB,gBAAA,EAAkB,SAAA;AAAA,EAClB,wBAAA,EAA0B,uBAAA;AAAA,EAC1B,mBAAA,EAAqB,uBAAA;AAAA,EACrB,sBAAA,EAAwB,SAAA;AAAA,EACxB,qBAAA,EAAuB,oBAAA;AAAA,EACvB,uBAAA,EAAyB,oBAAA;AAAA,EACzB,uBAAA,EACC,qGAAA;AAAA,EACD,4BAAA,EAA8B,cAAA;AAAA,EAC9B,2BAAA,EAA6B,6BAAA;AAAA,EAC7B,6BAAA,EAA+B,mBAAA;AAAA,EAC/B,yBAAA,EAA2B,cAAA;AAAA,EAC3B,sBAAA,EAAwB,8BAAA;AAAA,EACxB,0BAAA,EAA4B,mBAAA;AAAA,EAC5B,yBAAA,EAA2B,8CAAA;AAAA,EAC3B,uBAAA,EAAyB,uDAAA;AAAA,EACzB,wBAAA,EAA0B,SAAA;AAAA,EAC1B,sBAAA,EAAwB,kBAAA;AAAA,EACxB,4BAAA,EAA8B,mEAAA;AAAA,EAC9B,6BAAA,EACC,sOAAA;AAAA,EACD,6BAAA,EAA+B,aAAA;AAAA,EAC/B,iCAAA,EAAmC,cAAA;AAAA,EACnC,6BAAA,EAA+B,yBAAA;AAAA,EAC/B,2BAAA,EAA6B,WAAA;AAAA,EAC7B,2BAAA,EAA6B,QAAA;AAAA,EAC7B,wBAAA,EAA0B,mBAAA;AAAA,EAC1B,gCAAA,EAAkC,qCAAA;AAAA,EAClC,2BAAA,EAA6B,mBAAA;AAAA,EAC7B,eAAA,EAAiB;AAClB,CAAA;AAaA,IAAMC,SAAQ,CAAC,CAAA,KACd,CAAA,IAAK,IAAA,IAAQ,CAAC,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,GAAG,EAAE,QAAA,CAAS,CAAA,CAAE,IAAA,EAAK,CAAE,aAAa,CAAA;AAEzE,IAAM,QAAA,GACL,8NAAA;AACD,IAAM,QAAA,GACL,uSAAA;AAEM,IAAM,uBAAA,GAAN,cAAsC,UAAA,CAAW;AAAA,EACvD,WAAW,kBAAA,GAA+B;AACzC,IAAA,OAAO;AAAA,MACN,aAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACD;AAAA,EACD;AAAA,EAEA,QAAA,GAAkC,IAAA;AAAA,EAClC,KAAA,GAA4B,IAAA;AAAA,EAC5B,WAAA,GAAyC,MAAA;AAAA,EACzC,QAAA,GAAW,KAAA;AAAA,EACX,KAAA,GAAQ,KAAA;AAAA,EACR,SAAA,GAA2B,IAAA;AAAA,EAC3B,QAAA,GAA0B,IAAA;AAAA,EAC1B,MAAA,GAAwB,IAAA;AAAA,EACxB,GAAA,GAAM,EAAA;AAAA,EACN,QAAA,GAAW,KAAA;AAAA,EACX,UAAA,GAA+B,IAAA;AAAA,EAC/B,YAAA,GAAe,EAAA;AAAA,EACf,WAAA,GAAc,KAAA;AAAA,EACd,YAAA,GAAe,EAAA;AAAA,EACf,WAAqD,EAAC;AAAA,EACtD,YAAA,GAAmC,IAAA;AAAA,EACnC,YAAA,GAAuC,IAAA;AAAA,EACvC,aAA2B,EAAE,GAAA,EAAK,IAAI,QAAA,EAAU,EAAA,EAAI,UAAU,EAAA,EAAG;AAAA,EACjE,MAAA,GAAmB;AAAA,IAClB,QAAA,EAAU,EAAA;AAAA,IACV,MAAA,EAAQ,EAAA;AAAA,IACR,MAAA,EAAQ,EAAA;AAAA,IACR,GAAA,EAAK,EAAA;AAAA,IACL,WAAA,EAAa,EAAA;AAAA,IACb,eAAA,EAAiB;AAAA,GAClB;AAAA,EACA,gBAAA,GAAmC,IAAA;AAAA,EACnC,aAAA,GAAgC,IAAA;AAAA,EAChC,cAAA,GAAiF,IAAA;AAAA,EACjF,WAAA,GAAc,IAAA;AAAA,EACd,WAAA,GAAc,IAAA;AAAA,EACd,WAAA,GAAc,IAAA;AAAA,EACd,SAAA,GAAY,IAAA;AAAA,EACZ,YAAA,GAAe,IAAA;AAAA,EACf,UAAA,GAAa,IAAA;AAAA,EACb,WAAA,GAAc,IAAA;AAAA,EAEJ,QAAA,GAAyB;AAClC,IAAA,OAAOF,GAAAA;AAAA,EACR;AAAA,EAEU,KAAA,GAAsC;AAC/C,IAAA,OAAO,EAAE,IAAIC,GAAAA,EAAG;AAAA,EACjB;AAAA;AAAA,EAGA,IAAI,OAAA,GAAiC;AACpC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EACA,IAAI,QAAQ,CAAA,EAA0B;AACrC,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,MAAA,GAA0D;AAC7D,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,KAAK,QAAA,GAAW,IAAA;AAAA,EACnD;AAAA,EACA,IAAI,OACH,CAAA,EACC;AACD,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA,IAAK,IAAA,GAAO,EAAC,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAC1D,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA,EAIA,IAAI,eAAA,GAAkC;AACrC,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACb;AAAA,EACA,IAAI,gBAAgB,CAAA,EAAmB;AACtC,IAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EACA,IAAI,YAAA,GAA+B;AAClC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACb;AAAA,EACA,IAAI,aAAa,CAAA,EAAmB;AACnC,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAA,GAAgF;AACnF,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACb;AAAA,EACA,IAAI,cAAc,CAAA,EAAmE;AACpF,IAAA,IAAA,CAAK,iBAAiB,CAAA,IAAK,IAAA;AAAA,EAC5B;AAAA,EAEA,IAAI,UAAA,GAAsB;AACzB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACb;AAAA,EACA,IAAI,WAAW,CAAA,EAAY;AAC1B,IAAA,IAAA,CAAK,cAAc,CAAA,KAAM,KAAA;AACzB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EACA,IAAI,UAAA,GAAsB;AACzB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACb;AAAA,EACA,IAAI,WAAW,CAAA,EAAY;AAC1B,IAAA,IAAA,CAAK,cAAc,CAAA,KAAM,KAAA;AACzB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EACA,IAAI,UAAA,GAAsB;AACzB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACb;AAAA,EACA,IAAI,WAAW,CAAA,EAAY;AAC1B,IAAA,IAAA,CAAK,cAAc,CAAA,KAAM,KAAA;AACzB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EACA,IAAI,QAAA,GAAoB;AACvB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACb;AAAA,EACA,IAAI,SAAS,CAAA,EAAY;AACxB,IAAA,IAAA,CAAK,YAAY,CAAA,KAAM,KAAA;AACvB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EACA,IAAI,WAAA,GAAuB;AAC1B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACb;AAAA,EACA,IAAI,YAAY,CAAA,EAAY;AAC3B,IAAA,IAAA,CAAK,eAAe,CAAA,KAAM,KAAA;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EACA,IAAI,SAAA,GAAqB;AACxB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACb;AAAA,EACA,IAAI,UAAU,CAAA,EAAY;AACzB,IAAA,IAAA,CAAK,aAAa,CAAA,KAAM,KAAA;AACxB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EACA,IAAI,UAAA,GAAsB;AACzB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACb;AAAA,EACA,IAAI,WAAW,CAAA,EAAY;AAC1B,IAAA,IAAA,CAAK,cAAc,CAAA,KAAM,KAAA;AACzB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EAEA,wBAAA,CAAyB,IAAA,EAAc,IAAA,EAAqB,KAAA,EAA4B;AACvF,IAAA,MAAM,EAAA,GAAK,KAAA,IAAS,IAAA,IAAQ,CAACC,OAAM,KAAK,CAAA;AACxC,IAAA,IAAI,IAAA,KAAS,aAAA,EAAe,IAAA,CAAK,UAAA,GAAa,EAAA;AAC9C,IAAA,IAAI,IAAA,KAAS,aAAA,EAAe,IAAA,CAAK,UAAA,GAAa,EAAA;AAC9C,IAAA,IAAI,IAAA,KAAS,aAAA,EAAe,IAAA,CAAK,UAAA,GAAa,EAAA;AAC9C,IAAA,IAAI,IAAA,KAAS,WAAA,EAAa,IAAA,CAAK,QAAA,GAAW,EAAA;AAC1C,IAAA,IAAI,IAAA,KAAS,cAAA,EAAgB,IAAA,CAAK,WAAA,GAAc,EAAA;AAChD,IAAA,IAAI,IAAA,KAAS,YAAA,EAAc,IAAA,CAAK,SAAA,GAAY,EAAA;AAC5C,IAAA,IAAI,IAAA,KAAS,aAAA,EAAe,IAAA,CAAK,UAAA,GAAa,EAAA;AAAA,EAC/C;AAAA,EAEA,iBAAA,GAA0B;AACzB,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA;AAAA,EAIA,OAAA,GAAgB;AACf,IAAA,KAAK,KAAK,QAAA,EAAS;AAAA,EACpB;AAAA,EAEQ,IAAA,GAAa;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,QAAA,EAAU;AACzC,IAAA,IAAA,CAAK,KAAA,IAAQ;AACb,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AACrB,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,SAAA,CAAU,CAAC,IAAA,KAAS;AAEhD,MAAA,IAAI,IAAA,CAAK,YAAA,KAAiB,IAAA,CAAK,WAAA,EAAa;AAC3C,QAAA,IAAA,CAAK,cAAc,IAAA,CAAK,YAAA;AACxB,QAAA,KAAK,KAAK,QAAA,EAAS;AAAA,MACpB;AACA,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IACf,CAAC,CAAA;AACD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,EAAc,SAAA,CAAU,CAAC,IAAA,KAAS;AAC3D,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IACf,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,QAAQ,MAAM;AAClB,MAAA,YAAA,EAAa;AACb,MAAA,YAAA,IAAe;AAAA,IAChB,CAAA;AACA,IAAA,KAAK,QAAQ,OAAA,EAAQ,CAAE,KAAK,MAAM,IAAA,CAAK,UAAU,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAA,GAA8B;AACjC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACb;AAAA,EACA,IAAI,QAAQ,CAAA,EAAuB;AAClC,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,GAAG,QAAA,IAAY,IAAA;AACnC,IAAA,IAAI,CAAA,EAAG,KAAK,CAAA,CAAE,OAAA,EAAQ;AACtB,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA;AAAA,EAIA,MAAc,QAAA,GAA0B;AACvC,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AACrB,IAAA,IAAI,CAAC,OAAA,IAAW,IAAA,CAAK,QAAA,EAAU;AAC/B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAI;AACH,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAM,OAAA,CAAQ,IAAA,EAAK;AAChC,MAAA,IAAA,CAAK,QAAA,EAAS;AACd,MAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG;AACjC,QAAA,IAAI,CAAA,CAAE,cAAc,IAAA,EAAM;AAC1B,QAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,eAAA,CAAgB,EAAE,MAAM,CAAA;AAClD,QAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,IAAA,CAAK,KAAA,KAAU,IAAA,EAAM;AACzC,QAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,GAAS,EAAE,GAAG,CAAA,EAAG,SAAA,EAAW,GAAA,KAAQ,CAAE,CAAA;AACzF,QAAA,IAAA,CAAK,QAAA,EAAS;AAAA,MACf;AAAA,IACD,CAAA,CAAA,MAAQ;AACP,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAC5B,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IACf,CAAA,SAAE;AACD,MAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,IACjB;AAAA,EACD;AAAA;AAAA,EAGQ,EAAA,CAAG,KAAa,MAAA,EAAwC;AAC/D,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,GAAG,CAAA,CAAE,OAAA,CAAQ,YAAA,EAAc,CAAC,CAAA,EAAG,CAAA,KAAc,MAAA,CAAO,CAAC,CAAA,IAAK,EAAE,CAAA;AAAA,EAC3E;AAAA,EAEQ,MAAM,GAAA,EAAwB;AACrC,IAAA,OAAO,GAAA,CAAI,KAAA,IAAS,IAAA,CAAK,CAAA,CAAE,uBAAuB,CAAA;AAAA,EACnD;AAAA,EAEU,KAAK,IAAA,EAAyB;AACvC,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AACrB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,OAAO,OAAA,CAAQ,QAAA;AACrB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,IAAS,EAAC;AAC5B,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA;AAGpB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA,GAAI,IAAA;AACrE,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM,GAAA,CAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,sBAAsB,CAAC,CAAA;AACtF,IAAA,MAAM,OAAO,CAAA,CAAE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAQ,CAAA;AACrC,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACrB,MAAA,MAAM,QAAA,GAAW,EAAE,MAAA,KAAW,MAAA;AAC9B,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA,OAAa,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,WAAA,IACrD,IAAA,CAAK,UAAA,EAAY,MAAA,KAAW,CAAA,CAAE,MAAA,OAAa,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,WAIxE,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,QAAA,EAAU,QAAA,GAAW,IAAA,CAAK,mBAAA,EAAoB,GAAI,IAAI,CAAC,CAAA;AAGxF,MAAA,IAAI,QAAA,aAAqB,EAAA,IAAM,IAAA,CAAK,cAAa,EAAG,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,IACnE;AACA,IAAA,IAAI,IAAA,CAAK,iBAAA,GAAoB,CAAA,EAAG,IAAA,CAAK,OAAO,IAAI,CAAA;AAGhD,IAAA,IAAI,KAAK,WAAA,EAAa;AACrB,MAAA,IAAI,KAAK,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA;AAAA,WAC9C;AACJ,QAAA,IAAA,CAAK,MAAA;AAAA,UACJ,CAAA;AAAA,YACC,QAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,mBAAA;AAAA,cACN,aAAA,EAAe,KAAA;AAAA,cACf,UAAU,IAAA,CAAK,KAAA;AAAA,cACf,SAAS,MAAM;AACd,gBAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,gBAAA,IAAA,CAAK,YAAA,GAAe,EAAA;AACpB,gBAAA,IAAA,CAAK,QAAA,EAAS;AAAA,cACf;AAAA,aACD;AAAA,YACA,IAAA,CAAK,EAAE,aAAa;AAAA;AACrB,SACD;AAAA,MACD;AAAA,IACD;AAGA,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AAIrB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAO,CAAA,CAAE,MAAA,IAAU,IAAA,GAAO,CAAA,CAAE,MAAA,KAAW,MAAA,GAAS,IAAK,CAAA,IAAK,IAAA;AAMtF,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACnD,IAAA,MAAM,SAA6D,EAAC;AACpE,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ;AACrC,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,IAAU,CAAC,KAAK,MAAA,EAAQ;AACzC,MAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,EAAE,MAAM,CAAA;AACxD,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,SAAA,IAAa,GAAA;AAC3C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACZ,QAAA,IAAI,WAAW,GAAA,CAAI,GAAG,KAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AAChD,QAAA,UAAA,CAAW,IAAI,GAAG,CAAA;AAAA,MACnB;AACA,MAAA,MAAA,CAAO,KAAK,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,GAAA,EAAK,QAAQ,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AACjD,IAAA,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,wBAAwB,CAAC,CAAA;AAC/D,IAAA,MAAM,SAAS,CAAA,CAAE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAQ,CAAA;AACvC,IAAA,IAAI,KAAA,EAAO;AACV,MAAA,MAAM,SAAA,GAAY,KAAK,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA,IAAK,IAAA;AAC3D,MAAA,MAAM,WAAA,GAA6B;AAAA,QAClC,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ,MAAM,MAAA,IAAU,IAAA;AAAA,QACxB,KAAK,KAAA,CAAM;AAAA,OACZ;AACA,MAAA,MAAA,CAAO,MAAA;AAAA,QACN,CAAA;AAAA,UACC,IAAA;AAAA,UACA;AAAA,YACC,IAAA,EAAM,kBAAA;AAAA,YACN,KAAA,EAAO,2CAAA;AAAA,YACP,aAAA,EAAe;AAAA,WAChB;AAAA,UACA,CAAA;AAAA,YACC,KAAA;AAAA,YACA,EAAE,OAAO,oBAAA,EAAqB;AAAA,YAC9B,CAAA;AAAA,cACC,KAAA;AAAA,cACA,EAAE,MAAM,OAAA,EAAQ;AAAA,cAChB,MAAM,MAAA,IAAU,IAAA,IAAQ,CAAC,SAAA,GACtB,KAAK,EAAA,CAAG,mBAAA,EAAqB,EAAE,GAAA,EAAK,MAAM,EAAA,EAAI,CAAA,GAC9C,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,cACvB,CAAA,CAAE,QAAQ,EAAE,IAAA,EAAM,OAAM,EAAG,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAC;AAAA,aACpD;AAAA,YACA,MAAM,MAAA,IAAU,IAAA,IAAQ,YACrB,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,IAAS,IAAA,CAAK,EAAA,CAAG,qBAAqB,EAAE,GAAA,EAAK,MAAM,EAAA,EAAI,CAAC,CAAA,GACzE;AAAA,WACJ;AAAA,UACA,IAAA,CAAK,WAAW,QAAQ,CAAA;AAAA,UACxB,IAAA,CAAK,QAAA,KAAa,QAAA,GACf,IAAA,CAAK,IAAA;AAAA,YACL,IAAA,CAAK,cACF,IAAA,CAAK,QAAA;AAAA,cAAS,OAAA;AAAA,cAAS,IAAA,CAAK,EAAE,sBAAsB,CAAA;AAAA,cAAG,IAAA;AAAA,cAAM,MAC7D,IAAA,CAAK,OAAA;AAAA,gBAAQ,WAAA;AAAA,gBAAa,MACzB,KAAK,IAAA,CAAK,yBAAA,EAA2B,EAAE,MAAA,EAAQ,WAAA,CAAY,QAAQ;AAAA;AACpE,aACD,GACC;AAAA,WACJ,GACC;AAAA;AACJ,OACD;AAAA,IACD;AACA,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AAEvB,MAAA,IAAI,KAAA,IAAS,CAAA,CAAE,MAAA,KAAW,MAAA,EAAQ;AAClC,MAAA,MAAM,cAAc,CAAA,CAAE,MAAA;AACtB,MAAA,MAAA,CAAO,MAAA;AAAA,QACN,CAAA;AAAA,UACC,IAAA;AAAA,UACA,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,mBAAA,EAAqB,aAAA,EAAe,EAAE,MAAA,EAAO;AAAA,UACpE,KAAK,SAAA,GACF,CAAA;AAAA,YACA,QAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,kBAAA;AAAA,cACN,KAAA,EAAO,yDAAA;AAAA,cACP,aAAA,EAAe,aAAA;AAAA,cACf,UAAU,IAAA,CAAK,KAAA;AAAA,cACf,OAAA,EAAS,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,MAAM;AAAA,aAClC;AAAA,YACA,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,SAAQ,EAAG,IAAA,CAAK,EAAA,CAAG,mBAAA,EAAqB,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,CAAC,CAAA;AAAA,YACxE,CAAA;AAAA,cACC,KAAA;AAAA,cACA,EAAE,MAAM,KAAA,EAAM;AAAA,cACd,IAAA,CAAK,SAAA,KAAc,CAAA,CAAE,MAAA,GAClB,IAAA,CAAK,EAAE,iBAAiB,CAAA,GACxB,IAAA,CAAK,CAAA,CAAE,qBAAqB;AAAA;AAChC,WACD,GACC,CAAA;AAAA,YACA,KAAA;AAAA,YACA,EAAE,OAAO,oBAAA,EAAqB;AAAA,YAC9B,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,SAAQ,EAAG,IAAA,CAAK,EAAA,CAAG,mBAAA,EAAqB,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,CAAC,CAAA;AAAA,YACxE,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,OAAM,EAAG,IAAA,CAAK,CAAA,CAAE,qBAAqB,CAAC;AAAA,WACxD;AAAA,UACF,IAAA,CAAK,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AAAA,UACxB,IAAA,CAAK,QAAA,KAAa,CAAA,CAAE,MAAA,GACjB,IAAA,CAAK,IAAA;AAAA,YACL,IAAA,CAAK,WAAA,GACF,WAAA,GACC,IAAA,CAAK,QAAA;AAAA,cAAS,OAAA;AAAA,cAAS,IAAA,CAAK,EAAE,sBAAsB,CAAA;AAAA,cAAG,IAAA;AAAA,cAAM,MAC7D,IAAA,CAAK,OAAA;AAAA,gBAAQ,EAAE,MAAM,OAAA,EAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,GAAA,EAAK,EAAE,GAAA,EAAI;AAAA,gBAAG,MAC7D,KAAK,IAAA,CAAK,yBAAA,EAA2B,EAAE,MAAA,EAAQ,CAAA,CAAE,QAAQ;AAAA;AAC1D,gBAEA,IAAA,CAAK,QAAA;AAAA,cAAS,QAAA;AAAA,cAAU,IAAA,CAAK,EAAE,gBAAgB,CAAA;AAAA,cAAG,IAAA;AAAA,cAAM,MACxD,IAAA,CAAK,OAAA;AAAA,gBACJ,EAAE,MAAM,QAAA,EAAU,MAAA,EAAQ,EAAE,MAAA,EAAQ,GAAA,EAAK,EAAE,GAAA,EAAI;AAAA,gBAC/C,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,EAAE,MAAM;AAAA;AAChC,aACD,GACA;AAAA,WACJ,GACC;AAAA;AACJ,OACD;AAAA,IACD;AACA,IAAA,IAAI,MAAA,CAAO,iBAAA,GAAoB,CAAA,EAAG,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,EACrD;AAAA;AAAA,EAIQ,KAAA,CAAM,GAAc,MAAA,EAAkD;AAC7E,IAAA,MAAM,MAAM,MAAA,IAAU,IAAA,CAAK,qBAAqB,IAAA,GAAO,IAAA,CAAK,mBAAmB,CAAA,CAAE,SAAA;AACjF,IAAA,MAAM,MAAM,MAAA,IAAU,IAAA,CAAK,kBAAkB,IAAA,GAAO,IAAA,CAAK,gBAAgB,CAAA,CAAE,MAAA;AAC3E,IAAA,MAAM,OAAwC,EAAC;AAC/C,IAAA,IAAI,QAAQ,IAAA,EAAM;AACjB,MAAA,IAAA,CAAK,IAAA;AAAA,QACJ,CAAA;AAAA,UACC,MAAA;AAAA,UACA,EAAE,IAAA,EAAM,GAAA,GAAM,4BAAA,GAA+B,iBAAA,EAAmB,OAAO,SAAA,EAAU;AAAA,UACjF,IAAA,CAAK,CAAA,CAAE,GAAA,GAAM,wBAAA,GAA2B,oBAAoB;AAAA;AAC7D,OACD;AAAA,IACD;AACA,IAAA,IAAI,QAAQ,IAAA,EAAM;AACjB,MAAA,IAAA,CAAK,IAAA;AAAA,QACJ,CAAA;AAAA,UACC,MAAA;AAAA,UACA,EAAE,IAAA,EAAM,GAAA,GAAM,2BAAA,GAA8B,mBAAA,EAAqB,OAAO,SAAA,EAAU;AAAA,UAClF,IAAA,CAAK,CAAA,CAAE,GAAA,GAAM,qBAAA,GAAwB,sBAAsB;AAAA;AAC5D,OACD;AAAA,IACD;AACA,IAAA,IAAI,EAAE,UAAA,EAAY;AACjB,MAAA,IAAA,CAAK,IAAA;AAAA,QACJ,CAAA;AAAA,UACC,MAAA;AAAA,UACA,EAAE,MAAM,KAAA,EAAM;AAAA,UACd,IAAA,CAAK,EAAA,CAAG,kBAAA,EAAoB,EAAE,IAAA,EAAM,IAAI,IAAA,CAAK,CAAA,CAAE,UAAU,CAAA,CAAE,kBAAA,EAAmB,EAAG;AAAA;AAClF,OACD;AAAA,IACD;AACA,IAAA,OAAO,IAAA;AAAA,EACR;AAAA,EAEQ,OAAA,CAAQ,CAAA,EAAc,MAAA,EAAiB,MAAA,GAA6B,IAAA,EAAmB;AAC9F,IAAA,MAAM,IAAA,GAAO,CAAA;AAAA,MACZ,KAAA;AAAA,MACA,EAAE,OAAO,oBAAA,EAAqB;AAAA,MAC9B,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,MAAM,OAAA,EAAQ;AAAA,QAChB,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,QACZ,MAAA,GAAS,CAAA,CAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,KAAA,EAAM,EAAG,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAC,CAAA,GAAI;AAAA,OACjE;AAAA,MACA,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAoB,EAAG,GAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,MAC9E;AAAA,KACD;AACA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,IAAa,CAAC,MAAA;AACjC,IAAA,MAAM,OAAO,KAAA,GACV,CAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,QACC,IAAA,EAAM,eAAA;AAAA,QACN,KAAA,EAAO,yDAAA;AAAA,QACP,aAAA,EAAe,MAAA;AAAA,QACf,UAAU,IAAA,CAAK,KAAA;AAAA,QACf,OAAA,EAAS,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,MAAM;AAAA,OAClC;AAAA,MACA,IAAA,CAAK,SAAA,KAAc,CAAA,CAAE,MAAA,GAAS,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAM,EAAG,IAAA,CAAK,CAAA,CAAE,iBAAiB,CAAC,CAAA,GAAI;AAAA,KACtF,GACC,IAAA;AACH,IAAA,OAAO,CAAA;AAAA,MACN,IAAA;AAAA,MACA;AAAA,QACC,IAAA,EAAM,SAAS,kBAAA,GAAqB,MAAA;AAAA,QACpC,KAAA,EAAO,SAAS,2CAAA,GAA8C,mBAAA;AAAA,QAC9D,YAAY,CAAA,CAAE;AAAA,OACf;AAAA,MACA,IAAA;AAAA,MACA,IAAA,CAAK,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AAAA,MACxB,IAAA,CAAK,QAAA,KAAa,CAAA,CAAE,MAAA,GACjB,IAAA,CAAK,IAAA;AAAA,QACL,KAAA,GACG,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,KAAK,CAAA,CAAE,cAAc,CAAA,EAAG,KAAA,EAAO,MAAM,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,MAAM,CAAC,CAAA,GAC9E,IAAA;AAAA,QACH,IAAA,CAAK,eACF,IAAA,CAAK,QAAA;AAAA,UAAS,SAAA;AAAA,UAAW,IAAA,CAAK,EAAE,iBAAiB,CAAA;AAAA,UAAG,KAAA;AAAA,UAAO,MAC3D,IAAA,CAAK,IAAA,CAAK,2BAAA,EAA6B;AAAA,YACtC,QAAQ,CAAA,CAAE,MAAA;AAAA,YACV,OAAO,CAAA,CAAE,KAAA;AAAA,YACT;AAAA,WACA;AAAA,SACF,GACC,IAAA;AAAA,QACH,IAAA,CAAK,aACF,IAAA,CAAK,QAAA;AAAA,UAAS,OAAA;AAAA,UAAS,IAAA,CAAK,EAAE,eAAe,CAAA;AAAA,UAAG,KAAA;AAAA,UAAO,MACvD,IAAA,CAAK,IAAA,CAAK,yBAAA,EAA2B,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,MAAA,EAAQ;AAAA,SAClF,GACC,IAAA;AAAA,QACH,MAAA,IACC,IAAA,CAAK,YAAA,IACL,IAAA,CAAK,YAAA,EAAc,IAAA,KAAS,MAAA,IAC5B,CAAC,IAAA,CAAK,YAAA,CAAa,OAAA,GACjB,IAAA,CAAK,QAAA;AAAA,UAAS,aAAA;AAAA,UAAe,IAAA,CAAK,EAAE,qBAAqB,CAAA;AAAA,UAAG,KAAA;AAAA,UAAO,MACnE,IAAA,CAAK,YAAA,EAAc,IAAA;AAAK,SACzB,GACC,IAAA;AAAA,QACH,IAAA,CAAK,WAAA,GACF,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,KAAK,CAAA,CAAE,gBAAgB,CAAA,EAAG,KAAA,EAAO,MAAM;AAC/D,UAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,UAAA,IAAA,CAAK,YAAA,GAAe,EAAE,KAAA,IAAS,EAAA;AAC/B,UAAA,IAAA,CAAK,QAAA,EAAS;AAAA,QACf,CAAC,CAAA,GACA,IAAA;AAAA,QACH,IAAA,CAAK,cACF,IAAA,CAAK,QAAA;AAAA,UAAS,QAAA;AAAA,UAAU,IAAA,CAAK,EAAE,gBAAgB,CAAA;AAAA,UAAG,IAAA;AAAA,UAAM,MACxD,IAAA,CAAK,OAAA;AAAA,YACJ,EAAE,MAAM,QAAA,EAAU,MAAA,EAAQ,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,MAAA,EAAO;AAAA,YACzD,MAAM,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,MAAM;AAAA;AACnC,SACD,GACC;AAAA,OACJ,GACC;AAAA,KACJ;AAAA,EACD;AAAA,EAEQ,aAAa,CAAA,EAA2B;AAC/C,IAAA,MAAM,SAAS,MAAY;AAC1B,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,KAAK,KAAK,IAAA,CAAK,CAAA,CAAE,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,IAC3D,CAAA;AACA,IAAA,OAAO,CAAA;AAAA,MACN,IAAA;AAAA,MACA,EAAE,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,EAAE,MAAA,EAAO;AAAA,MAC1C,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,OAAO,oBAAA,EAAqB;AAAA,QAC9B,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,SAAQ,EAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,QACzC,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,OAAM,EAAG,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAC,CAAA;AAAA,QAClD,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,oBAAA,EAAqB;AAAA,UAC3C,CAAA;AAAA,YACC,MAAA;AAAA,YACA,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,uBAAA,EAAwB;AAAA,YAChD,EAAE,OAAA,EAAS;AAAA,cACV,IAAA,EAAM,OAAA;AAAA,cACN,IAAA,EAAM,IAAA,CAAK,QAAA,GAAW,MAAA,GAAS,UAAA;AAAA,cAC/B,YAAA,EAAc,kBAAA;AAAA,cACd,WAAA,EAAa,WAAA;AAAA,cACb,UAAU,IAAA,CAAK,KAAA;AAAA,cACf,SAAS,CAAC,CAAA,KAAc,IAAA,CAAK,GAAA,GAAO,EAAE,MAAA,CAA4B,KAAA;AAAA,cAClE,SAAA,EAAW,CAAC,CAAA,KAAa;AACxB,gBAAA,IAAK,CAAA,CAAoB,GAAA,KAAQ,OAAA,EAAS,MAAA,EAAO;AAAA,cAClD;AAAA,aACA,CAAA;AAAA,YACD,KAAK,GAAA;AAAI,WACV;AAAA,UACA,CAAA;AAAA,YACC,QAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,uBAAA;AAAA,cACN,aAAA,EAAe,SAAA;AAAA,cACf,UAAU,IAAA,CAAK,KAAA;AAAA,cACf,OAAA,EAAS;AAAA,aACV;AAAA,YACA,IAAA,CAAK,EAAE,cAAc;AAAA,WACtB;AAAA,UACA,CAAA;AAAA,YACC,QAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,QAAA;AAAA,cACN,aAAA,EAAe,WAAA;AAAA,cACf,UAAU,IAAA,CAAK,KAAA;AAAA,cACf,OAAA,EAAS,MAAM,IAAA,CAAK,OAAA;AAAQ,aAC7B;AAAA,YACA,IAAA,CAAK,EAAE,gBAAgB;AAAA;AACxB;AACD;AACD,KACD;AAAA,EACD;AAAA,EAEQ,WAAW,CAAA,EAA2B;AAC7C,IAAA,MAAM,QAAQ,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,YAAA,EAAc,EAAE,MAAM,CAAA;AACxD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,EAAK;AACrC,IAAA,OAAO,CAAA;AAAA,MACN,IAAA;AAAA,MACA,EAAE,IAAA,EAAM,MAAA,EAAQ,aAAA,EAAe,EAAE,MAAA,EAAO;AAAA,MACxC,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,OAAO,oBAAA,EAAqB;AAAA,QAC9B,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,SAAQ,EAAG,IAAA,CAAK,CAAA,CAAE,qBAAqB,CAAC,CAAA;AAAA,QACzD,EAAE,OAAA,EAAS;AAAA,UACV,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,oBAAA;AAAA,UACP,WAAA,EAAa,cAAA;AAAA,UACb,SAAA,EAAW,IAAA;AAAA,UACX,UAAU,IAAA,CAAK,KAAA;AAAA,UACf,OAAO,IAAA,CAAK,YAAA;AAAA,UACZ,OAAA,EAAS,CAAC,CAAA,KAAa;AACtB,YAAA,IAAA,CAAK,YAAA,GAAgB,EAAE,MAAA,CAA4B,KAAA;AACnD,YAAA,IAAA,CAAK,QAAA,EAAS;AAAA,UACf;AAAA,SACA,CAAA;AAAA,QACD,KAAA,GACG,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,YAAA,EAAa,EAAG,IAAA,CAAK,CAAA,CAAE,eAAe,CAAC,CAAA,GACxD,KAAA,GACC,CAAA;AAAA,UACA,KAAA;AAAA,UACA,EAAE,MAAM,KAAA,EAAM;AAAA,UACd,IAAA,CAAK,EAAA,CAAG,gBAAA,EAAkB,EAAE,IAAA,EAAM,IAAA,CAAK,QAAA,EAAU,WAAA,CAAY,KAAK,CAAA,IAAK,EAAA,EAAI;AAAA,SAC5E,GACC,IAAA;AAAA,QACJ,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,oBAAA,EAAqB;AAAA,UAC3C,CAAA;AAAA,YACC,QAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,uBAAA;AAAA,cACN,aAAA,EAAe,aAAA;AAAA,cACf,QAAA,EAAU,IAAA,CAAK,KAAA,IAAS,CAAC,KAAA,IAAS,KAAA;AAAA,cAClC,OAAA,EAAS,MAAM,KAAK,IAAA,CAAK,OAAO,CAAC;AAAA,aAClC;AAAA,YACA,IAAA,CAAK,EAAE,gBAAgB;AAAA,WACxB;AAAA,UACA,CAAA;AAAA,YACC,QAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,QAAA;AAAA,cACN,aAAA,EAAe,eAAA;AAAA,cACf,UAAU,IAAA,CAAK,KAAA;AAAA,cACf,SAAS,MAAM;AACd,gBAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,gBAAA,IAAA,CAAK,QAAA,EAAS;AAAA,cACf;AAAA,aACD;AAAA,YACA,IAAA,CAAK,EAAE,gBAAgB;AAAA;AACxB;AACD;AACD,KACD;AAAA,EACD;AAAA,EAEQ,UAAA,GAA0B;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,cAAc,IAAI,CAAA;AACpD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,EAAK;AACrC,IAAA,OAAO,CAAA;AAAA,MACN,KAAA;AAAA,MACA,EAAE,IAAA,EAAM,MAAA,EAAQ,aAAA,EAAe,EAAA,EAAG;AAAA,MAClC,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,OAAO,oBAAA,EAAqB;AAAA,QAC9B,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,SAAQ,EAAG,IAAA,CAAK,CAAA,CAAE,kBAAkB,CAAC,CAAA;AAAA,QACtD,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,OAAM,EAAG,IAAA,CAAK,CAAA,CAAE,qBAAqB,CAAC,CAAA;AAAA,QACvD,EAAE,OAAA,EAAS;AAAA,UACV,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,oBAAA;AAAA,UACP,WAAA,EAAa,IAAA,CAAK,CAAA,CAAE,gBAAgB,CAAA;AAAA,UACpC,WAAA,EAAa,cAAA;AAAA,UACb,SAAA,EAAW,IAAA;AAAA,UACX,UAAU,IAAA,CAAK,KAAA;AAAA,UACf,OAAA,EAAS,CAAC,CAAA,KAAa;AACtB,YAAA,IAAA,CAAK,YAAA,GAAgB,EAAE,MAAA,CAA4B,KAAA;AACnD,YAAA,IAAA,CAAK,QAAA,EAAS;AAAA,UACf;AAAA,SACA,CAAA;AAAA,QACD,KAAA,GACG,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,YAAA,EAAa,EAAG,IAAA,CAAK,CAAA,CAAE,eAAe,CAAC,CAAA,GACxD,KAAA,GACC,CAAA;AAAA,UACA,KAAA;AAAA,UACA,EAAE,MAAM,KAAA,EAAM;AAAA,UACd,IAAA,CAAK,EAAA,CAAG,gBAAA,EAAkB,EAAE,IAAA,EAAM,IAAA,CAAK,QAAA,EAAU,WAAA,CAAY,KAAK,CAAA,IAAK,EAAA,EAAI;AAAA,SAC5E,GACC,IAAA;AAAA,QACJ,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,oBAAA,EAAqB;AAAA,UAC3C,CAAA;AAAA,YACC,QAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,uBAAA;AAAA,cACN,aAAA,EAAe,QAAA;AAAA,cACf,QAAA,EAAU,IAAA,CAAK,KAAA,IAAS,CAAC,KAAA,IAAS,KAAA;AAAA,cAClC,OAAA,EAAS,MAAM,KAAK,IAAA,CAAK,MAAA;AAAO,aACjC;AAAA,YACA,IAAA,CAAK,EAAE,gBAAgB;AAAA,WACxB;AAAA,UACA,CAAA;AAAA,YACC,QAAA;AAAA,YACA;AAAA,cACC,IAAA,EAAM,QAAA;AAAA,cACN,aAAA,EAAe,eAAA;AAAA,cACf,UAAU,IAAA,CAAK,KAAA;AAAA,cACf,SAAS,MAAM;AACd,gBAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,gBAAA,IAAA,CAAK,QAAA,EAAS;AAAA,cACf;AAAA,aACD;AAAA,YACA,IAAA,CAAK,EAAE,gBAAgB;AAAA;AACxB;AACD;AACD,KACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,YAAA,GAA8B;AACrC,IAAA,MAAM,OAAO,IAAA,CAAK,YAAA;AAClB,IAAA,IAAI,CAAC,KAAK,YAAA,IAAgB,CAAC,QAAQ,IAAA,CAAK,OAAA,SAAgB,EAAC;AACzD,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU,OAAO,CAAC,IAAA,CAAK,aAAA,CAAc,IAAI,CAAC,CAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,SAAS,aAAA,EAAe,OAAO,CAAC,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAC,CAAA;AACrE,IAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW,OAAO,CAAC,IAAA,CAAK,aAAA,CAAc,IAAI,CAAC,CAAA;AAC7D,IAAA,OAAO,EAAC;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAA,GAA0C;AACjD,IAAA,MAAM,OAAO,IAAA,CAAK,YAAA;AAClB,IAAA,IAAI,CAAC,KAAK,YAAA,IAAgB,CAAC,QAAQ,CAAC,IAAA,CAAK,SAAS,OAAO,IAAA;AACzD,IAAA,MAAM,MAAM,IAAA,CAAK,OAAA;AACjB,IAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,GAChB,CAAA,CAAE,QAAQ,EAAE,IAAA,EAAM,mBAAA,EAAoB,EAAG,KAAK,CAAA,CAAE,uBAAuB,CAAC,CAAA,GACxE,IAAI,aAAA,GACH,CAAA;AAAA,MACA,MAAA;AAAA,MACA,EAAE,MAAM,gBAAA,EAAiB;AAAA,MACzB,IAAA,CAAK,GAAG,0BAAA,EAA4B;AAAA,QACnC,IAAA,EAAM,IAAI,IAAA,CAAK,GAAA,CAAI,aAAa,CAAA,CAAE,kBAAA,CAAmB,EAAC,EAAG;AAAA,UACxD,IAAA,EAAM,SAAA;AAAA,UACN,MAAA,EAAQ;AAAA,SACR;AAAA,OACD;AAAA,KACF,GACC,CAAA,CAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,OAAM,EAAG,IAAA,CAAK,CAAA,CAAE,yBAAyB,CAAC,CAAA;AAChE,IAAA,OAAO,CAAA;AAAA,MACN,KAAA;AAAA,MACA;AAAA,QACC,IAAA,EAAM,kBAAA;AAAA,QACN,cAAA,EAAgB,EAAA;AAAA,QAChB,KAAA,EACC;AAAA,OACF;AAAA,MACA,CAAA,CAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,eAAA,EAAgB,EAAG,IAAA,CAAK,EAAA,CAAG,sBAAA,EAAwB,EAAE,KAAA,EAAO,CAAC,CAAA;AAAA,MAC/E,MAAA;AAAA,MACA,CAAA;AAAA,QACC,QAAA;AAAA,QACA;AAAA,UACC,IAAA,EAAM,qBAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,aAAA,EAAe,gBAAA;AAAA,UACf,OAAA,EAAS,MACR,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAM,EAAG,MAAM,KAAK,IAAA,CAAK,YAAA,EAAc,QAAQ;AAAA,SACxF;AAAA,QACA,IAAA,CAAK,EAAE,wBAAwB;AAAA;AAChC,KACD;AAAA,EACD;AAAA,EAEQ,cAAc,IAAA,EAAoC;AACzD,IAAA,OAAO,CAAA;AAAA,MACN,IAAA;AAAA,MACA,EAAE,IAAA,EAAM,qBAAA,EAAuB,KAAA,EAAO,eAAA,EAAgB;AAAA,MACtD,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,SAAQ,EAAG,IAAA,CAAK,CAAA,CAAE,uBAAuB,CAAC,CAAA;AAAA,MAC3D,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,wBAAA,EAAyB,EAAG,IAAA,CAAK,CAAA,CAAE,uBAAuB,CAAC,CAAA;AAAA,MAC1F,GAAG,KAAK,KAAA,CAAM,GAAA;AAAA,QAAI,CAAC,IAAA,KAClB,CAAA;AAAA,UACC,QAAA;AAAA,UACA;AAAA,YACC,IAAA,EAAM,qBAAA;AAAA,YACN,KAAA,EAAO,+DAAA;AAAA,YACP,WAAA,EAAa,IAAA;AAAA,YACb,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,OAAA,EAAS,MAAM,IAAA,CAAK,YAAA,EAAc,KAAK,IAAI;AAAA,WAC5C;AAAA,UACA,IAAA,CAAK,CAAA,CAAE,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE;AAAA;AACtC,OACD;AAAA,MACA,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,YAAA,EAAa,EAAG,IAAA,CAAK,CAAA,CAAE,eAAe,CAAC,CAAA,GAAI,IAAA;AAAA,MACzE,CAAA;AAAA,QACC,QAAA;AAAA,QACA;AAAA,UACC,IAAA,EAAM,QAAA;AAAA,UACN,aAAA,EAAe,gBAAA;AAAA,UACf,UAAU,IAAA,CAAK,IAAA;AAAA,UACf,OAAA,EAAS,MAAM,IAAA,CAAK,YAAA,EAAc,MAAA;AAAO,SAC1C;AAAA,QACA,IAAA,CAAK,EAAE,gBAAgB;AAAA;AACxB,KACD;AAAA,EACD;AAAA;AAAA,EAGQ,YAAA,CACP,GAAA,EACA,IAAA,EACA,KAAA,EACA,OAAA,EACc;AACd,IAAA,OAAO,EAAE,OAAA,EAAS;AAAA,MACjB,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,+CAAA;AAAA,MACP,IAAA;AAAA,MACA,WAAA,EAAa,IAAA,CAAK,CAAA,CAAE,GAAG,CAAA;AAAA,MACvB,YAAA,EAAc,IAAA,CAAK,CAAA,CAAE,GAAG,CAAA;AAAA,MACxB,KAAA;AAAA,MACA,SAAS,CAAC,CAAA,KAAa,OAAA,CAAS,CAAA,CAAE,OAA4B,KAAK;AAAA,KACnE,CAAA;AAAA,EACF;AAAA,EAEQ,kBAAkB,IAAA,EAAoC;AAC7D,IAAA,MAAM,IAAI,IAAA,CAAK,UAAA;AACf,IAAA,MAAM,SAAS,MAAY;AAC1B,MAAA,IAAI,CAAC,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK,EAAG;AACnB,MAAA,IAAA,CAAK,cAAc,YAAA,CAAa;AAAA,QAC/B,GAAA,EAAK,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAAA,QAChB,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,IAAA,EAAK;AAAA,QAC1B,UAAU,CAAA,CAAE;AAAA,OACZ,CAAA;AAAA,IACF,CAAA;AACA,IAAA,OAAO,CAAA;AAAA,MACN,IAAA;AAAA,MACA,EAAE,IAAA,EAAM,mBAAA,EAAqB,KAAA,EAAO,eAAA,EAAgB;AAAA,MACpD,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,sBAAA,EAAuB,EAAG,IAAA,CAAK,CAAA,CAAE,uBAAuB,CAAC,CAAA;AAAA,MAC1F,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,sBAAA,EAAuB;AAAA,QAC7C,IAAA,CAAK,EAAE,6BAA6B;AAAA,OACrC;AAAA,MACA,IAAA,CAAK,YAAA,CAAa,4BAAA,EAA8B,KAAA,EAAO,CAAA,CAAE,KAAK,CAAC,CAAA,KAAO,CAAA,CAAE,GAAA,GAAM,CAAE,CAAA;AAAA,MAChF,IAAA,CAAK,YAAA,CAAa,6BAAA,EAA+B,MAAA,EAAQ,CAAA,CAAE,UAAU,CAAC,CAAA,KAAO,CAAA,CAAE,QAAA,GAAW,CAAE,CAAA;AAAA,MAC5F,IAAA,CAAK,YAAA;AAAA,QACJ,iCAAA;AAAA,QACA,UAAA;AAAA,QACA,CAAA,CAAE,QAAA;AAAA,QACF,CAAC,CAAA,KAAO,CAAA,CAAE,QAAA,GAAW;AAAA,OACtB;AAAA,MACA,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,YAAA,EAAa,EAAG,IAAA,CAAK,CAAA,CAAE,eAAe,CAAC,CAAA,GAAI,IAAA;AAAA,MACzE,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,oBAAA,EAAqB;AAAA,QAC3C,CAAA;AAAA,UACC,QAAA;AAAA,UACA;AAAA,YACC,IAAA,EAAM,uBAAA;AAAA,YACN,aAAA,EAAe,gBAAA;AAAA,YACf,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,OAAA,EAAS;AAAA,WACV;AAAA,UACA,IAAA,CAAK,EAAE,sBAAsB;AAAA,SAC9B;AAAA,QACA,CAAA;AAAA,UACC,QAAA;AAAA,UACA,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,MAAM,IAAA,CAAK,YAAA,EAAc,MAAA,EAAO,EAAE;AAAA,UAClF,IAAA,CAAK,EAAE,gBAAgB;AAAA;AACxB;AACD,KACD;AAAA,EACD;AAAA,EAEQ,cAAc,IAAA,EAAoC;AACzD,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,MAAM,SAAS,MAAY;AAC1B,MAAA,MAAM,MAAA,GAAmB;AAAA,QACxB,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,IAAA,EAAK;AAAA,QAC1B,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,IAAA,EAAK;AAAA,QACtB,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,IAAA,EAAK;AAAA,QACtB,GAAA,EAAK,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAAA,QAChB,WAAA,EAAa,CAAA,CAAE,WAAA,CAAY,IAAA,EAAK;AAAA,QAChC,iBAAiB,CAAA,CAAE;AAAA,OACpB;AACA,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,IAAY,CAAC,MAAA,CAAO,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA,IAAU,CAAC,MAAA,CAAO,GAAA,EAAK;AACzE,MAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,OAAO,eAAA,EAAiB;AACpD,MAAA,IAAA,CAAK,YAAA,EAAc,SAAS,MAAM,CAAA;AAAA,IACnC,CAAA;AACA,IAAA,OAAO,CAAA;AAAA,MACN,IAAA;AAAA,MACA,EAAE,IAAA,EAAM,mBAAA,EAAqB,KAAA,EAAO,eAAA,EAAgB;AAAA,MACpD,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,sBAAA,EAAuB,EAAG,IAAA,CAAK,CAAA,CAAE,uBAAuB,CAAC,CAAA;AAAA,MAC1F,IAAA,CAAK,YAAA,CAAa,6BAAA,EAA+B,KAAA,EAAO,CAAA,CAAE,UAAU,CAAC,CAAA,KAAO,CAAA,CAAE,QAAA,GAAW,CAAE,CAAA;AAAA,MAC3F,IAAA,CAAK,YAAA,CAAa,2BAAA,EAA6B,MAAA,EAAQ,CAAA,CAAE,QAAQ,CAAC,CAAA,KAAO,CAAA,CAAE,MAAA,GAAS,CAAE,CAAA;AAAA,MACtF,IAAA,CAAK,YAAA,CAAa,2BAAA,EAA6B,MAAA,EAAQ,CAAA,CAAE,QAAQ,CAAC,CAAA,KAAO,CAAA,CAAE,MAAA,GAAS,CAAE,CAAA;AAAA,MACtF,IAAA,CAAK,YAAA,CAAa,wBAAA,EAA0B,MAAA,EAAQ,CAAA,CAAE,KAAK,CAAC,CAAA,KAAO,CAAA,CAAE,GAAA,GAAM,CAAE,CAAA;AAAA,MAC7E,IAAA,CAAK,YAAA;AAAA,QACJ,gCAAA;AAAA,QACA,MAAA;AAAA,QACA,CAAA,CAAE,WAAA;AAAA,QACF,CAAC,CAAA,KAAO,CAAA,CAAE,WAAA,GAAc;AAAA,OACzB;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,QACJ,2BAAA;AAAA,QACA,UAAA;AAAA,QACA,CAAA,CAAE,eAAA;AAAA,QACF,CAAC,CAAA,KAAO,CAAA,CAAE,eAAA,GAAkB;AAAA,OAC7B;AAAA,MACA,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,YAAA,EAAa,EAAG,IAAA,CAAK,CAAA,CAAE,eAAe,CAAC,CAAA,GAAI,IAAA;AAAA,MACzE,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,oBAAA,EAAqB;AAAA,QAC3C,CAAA;AAAA,UACC,QAAA;AAAA,UACA;AAAA,YACC,IAAA,EAAM,uBAAA;AAAA,YACN,aAAA,EAAe,YAAA;AAAA,YACf,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,OAAA,EAAS;AAAA,WACV;AAAA,UACA,IAAA,CAAK,EAAE,sBAAsB;AAAA,SAC9B;AAAA,QACA,CAAA;AAAA,UACC,QAAA;AAAA,UACA,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,MAAM,IAAA,CAAK,YAAA,EAAc,MAAA,EAAO,EAAE;AAAA,UAClF,IAAA,CAAK,EAAE,gBAAgB;AAAA;AACxB;AACD,KACD;AAAA,EACD;AAAA;AAAA,EAIQ,WAAW,GAAA,EAA0B;AAC5C,IAAA,OAAO,CAAA;AAAA,MACN,QAAA;AAAA,MACA;AAAA,QACC,IAAA,EAAM,oBAAA;AAAA,QACN,YAAA,EAAc,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA;AAAA,QACnC,eAAA,EAAiB,MAAA;AAAA,QACjB,eAAA,EAAiB,IAAA,CAAK,QAAA,KAAa,GAAA,GAAM,MAAA,GAAS,OAAA;AAAA,QAClD,aAAA,EAAe,MAAA;AAAA,QACf,eAAA,EAAiB,GAAA;AAAA,QACjB,UAAU,IAAA,CAAK,KAAA;AAAA,QACf,SAAS,MAAM;AACd,UAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,KAAa,GAAA,GAAM,IAAA,GAAO,GAAA;AAC/C,UAAA,IAAA,CAAK,QAAA,EAAS;AACd,UAAC,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,gBAAgB,GAA0B,KAAA,EAAM;AAAA,QAC1E;AAAA,OACD;AAAA,MACA;AAAA,KACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,QAAQ,KAAA,EAA4C;AAC3D,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,IAAA,MAAM,QAAQ,MAAY;AACzB,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,MAAA,IAAA,CAAK,QAAA,EAAS;AACd,MAAC,KAAK,IAAA,CAAK,aAAA,CAAc,mBAAmB,GAAG,CAAA,EAAA,CAAI,GAA0B,KAAA,EAAM;AAAA,IACpF,CAAA;AACA,IAAA,OAAO,CAAA;AAAA,MACN,KAAA;AAAA,MACA,EAAE,MAAM,YAAA,EAAa;AAAA,MACrB,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,iBAAiB,aAAA,EAAe,YAAA,EAAc,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,MAC/E,CAAA;AAAA,QACC,KAAA;AAAA,QACA;AAAA,UACC,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,MAAA;AAAA,UACN,QAAA,EAAU,IAAA;AAAA,UACV,SAAA,EAAW,CAAC,CAAA,KAAa;AACxB,YAAA,IAAK,CAAA,CAAoB,GAAA,KAAQ,QAAA,EAAU,KAAA,EAAM;AAAA,UAClD;AAAA,SACD;AAAA,QACA,GAAG,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAwB,MAAM,IAAI;AAAA;AACpD,KACD;AAAA,EACD;AAAA,EAEQ,QAAA,CAAS,MAAA,EAAgB,IAAA,EAAc,MAAA,EAAiB,GAAA,EAA8B;AAC7F,IAAA,OAAO,CAAA;AAAA,MACN,QAAA;AAAA,MACA;AAAA,QACC,IAAA,EAAM,SAAS,4BAAA,GAA+B,WAAA;AAAA,QAC9C,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,aAAA,EAAe,MAAA;AAAA,QACf,SAAS,MAAM;AACd,UAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,UAAA,GAAA,EAAI;AAAA,QACL;AAAA,OACD;AAAA,MACA;AAAA,KACD;AAAA,EACD;AAAA,EAEQ,GAAA,GAAmB;AAC1B,IAAA,MAAM,GAAA,GAAM,EAAE,QAAA,EAAU;AAAA,MACvB,IAAA,EAAM,KAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,cAAc,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,QAAA,GAAW,mBAAmB,gBAAgB,CAAA;AAAA,MACxE,SAAS,MAAM;AACd,QAAA,IAAA,CAAK,QAAA,GAAW,CAAC,IAAA,CAAK,QAAA;AACtB,QAAA,IAAA,CAAK,QAAA,EAAS;AAAA,MACf;AAAA,KACA,CAAA;AACD,IAAA,GAAA,CAAI,SAAA,GAAY,IAAA,CAAK,QAAA,GAAW,QAAA,GAAW,QAAA;AAC3C,IAAA,OAAO,GAAA;AAAA,EACR;AAAA;AAAA,EAIQ,SAAA,CAAU,OAAe,YAAA,EAAsC;AACtE,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACvC,IAAA,IAAI,CAAC,KAAA,IAAS,IAAA,CAAK,KAAA,EAAO,OAAO,KAAA;AACjC,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,IAAA;AAAA,MACzB,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,YAAA,IAAgB,CAAA,CAAE,KAAA,KAAU,IAAA,IAAQ,CAAA,CAAE,KAAA,CAAM,IAAA,EAAK,CAAE,aAAY,KAAM;AAAA,KAC1F;AAAA,EACD;AAAA;AAAA;AAAA,EAIQ,OAAA,CAAQ,QAAuB,GAAA,EAAuB;AAC7D,IAAA,MAAM,OAAO,IAAA,CAAK,cAAA;AAClB,IAAA,IAAI,CAAC,IAAA,EAAM;AACV,MAAA,GAAA,EAAI;AACJ,MAAA;AAAA,IACD;AACA,IAAA,KAAK,OAAA,CAAQ,OAAA,EAAQ,CACnB,IAAA,CAAK,MAAM,IAAA,CAAK,MAAM,CAAC,CAAA,CACvB,IAAA,CAAK,CAAC,EAAA,KAAO;AACb,MAAA,IAAI,IAAI,GAAA,EAAI;AAAA,IACb,CAAC,CAAA,CACA,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,MAAA,EAAgB,UAAA,EAAoC;AAC9D,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AACrB,IAAA,IAAI,CAAC,OAAA,IAAW,IAAA,CAAK,KAAA,EAAO;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAI;AACH,MAAA,MAAM,IAAI,MAAM,OAAA,CAAQ,UAAA,CAAW,MAAA,EAAQ,cAAc,IAAI,CAAA;AAC7D,MAAA,IAAI,MAAM,WAAA,EAAa;AACtB,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,IAAI,YAAY,IAAA,CAAK,IAAA,CAAK,kCAAA,EAAoC,EAAE,QAAQ,CAAA;AAAA,MACzE,CAAA,MAAA,IAAW,MAAM,IAAA,EAAM;AACtB,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,IAAA,CAAK,IAAA,CAAK,0BAAA,EAA4B,EAAE,MAAA,EAAQ,CAAA;AAChD,QAAA,KAAK,KAAK,QAAA,EAAS;AAAA,MACpB,CAAA,MAAO;AACN,QAAA,IAAA,CAAK,IAAA,CAAK,2BAA2B,EAAE,IAAA,EAAM,QAAQ,QAAA,CAAS,SAAA,IAAa,UAAU,CAAA;AACrF,QAAA,KAAK,KAAK,QAAA,EAAS;AAAA,MACpB;AAAA,IACD,CAAA,SAAE;AACD,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IACf;AAAA,EACD;AAAA,EAEA,MAAc,MAAA,GAAwB;AACrC,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,EAAK;AACrC,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAA,IAAS,KAAK,KAAA,EAAO;AACtC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAI;AACH,MAAA,MAAM,CAAA,GAAI,MAAM,OAAA,CAAQ,WAAA,CAAY,KAAK,CAAA;AACzC,MAAA,IAAI,MAAM,IAAA,EAAM;AACf,QAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,QAAA,IAAA,CAAK,YAAA,GAAe,EAAA;AACpB,QAAA,IAAA,CAAK,IAAA,CAAK,2BAAA,EAA6B,EAAE,KAAA,EAAO,CAAA;AAChD,QAAA,KAAK,KAAK,QAAA,EAAS;AAAA,MACpB,CAAA,MAAO;AACN,QAAA,IAAA,CAAK,IAAA,CAAK,2BAA2B,EAAE,IAAA,EAAM,QAAQ,QAAA,CAAS,SAAA,IAAa,UAAU,CAAA;AAAA,MACtF;AAAA,IACD,CAAA,SAAE;AACD,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IACf;AAAA,EACD;AAAA,EAEA,MAAc,OAAO,GAAA,EAA+B;AACnD,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,EAAK;AACrC,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAA,IAAS,KAAK,KAAA,EAAO;AACtC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAI;AACH,MAAA,MAAM,IAAI,MAAM,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,QAAQ,KAAK,CAAA;AACtD,MAAA,IAAI,MAAM,IAAA,EAAM;AACf,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,QAAA,IAAA,CAAK,KAAK,2BAAA,EAA6B,EAAE,QAAQ,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AACpE,QAAA,KAAK,KAAK,QAAA,EAAS;AAAA,MACpB,CAAA,MAAO;AACN,QAAA,IAAA,CAAK,IAAA,CAAK,2BAA2B,EAAE,IAAA,EAAM,QAAQ,QAAA,CAAS,SAAA,IAAa,UAAU,CAAA;AAAA,MACtF;AAAA,IACD,CAAA,SAAE;AACD,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IACf;AAAA,EACD;AAAA,EAEA,MAAc,UAAU,MAAA,EAA+B;AACtD,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AACrB,IAAA,IAAI,CAAC,OAAA,IAAW,IAAA,CAAK,KAAA,EAAO;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAI;AACH,MAAA,IAAI,MAAM,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,EAAG;AACvC,QAAA,IAAA,CAAK,KAAA,GAAA,CAAS,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA;AACjE,QAAA,IAAA,CAAK,IAAA,CAAK,2BAAA,EAA6B,EAAE,MAAA,EAAQ,CAAA;AAAA,MAClD,CAAA,MAAO;AACN,QAAA,IAAA,CAAK,IAAA,CAAK,2BAA2B,EAAE,IAAA,EAAM,QAAQ,QAAA,CAAS,SAAA,IAAa,UAAU,CAAA;AAAA,MACtF;AAAA,IACD,CAAA,SAAE;AACD,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IACf;AAAA,EACD;AAAA,EAEA,MAAc,OAAO,MAAA,EAA+B;AACnD,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AACrB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,OAAA,CAAQ,aAAa,MAAM,CAAA;AACjC,IAAA,IAAA,CAAK,IAAA,CAAK,6BAAA,EAA+B,EAAE,MAAA,EAAQ,CAAA;AACnD,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EAEQ,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,GAAA,GAAM,EAAA;AACX,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACjB;AACD;AAEA,IAAM,SAAA,GACL,4IAAA;;;AC/wCD,IAAMF,GAAAA,GAAmB;AAAA,EACxB,YAAA,EAAc,8BAAA;AAAA,EACd,WAAA,EACC,sGAAA;AAAA,EACD,WAAA,EAAa,EAAA;AAAA,EACb,YAAA,EAAc,sCAAA;AAAA,EACd,iBAAA,EAAmB;AACpB,CAAA;AAEA,IAAMC,GAAAA,GAAmB;AAAA,EACxB,YAAA,EAAc,oCAAA;AAAA,EACd,WAAA,EACC,kHAAA;AAAA,EACD,WAAA,EAAa,EAAA;AAAA,EACb,YAAA,EAAc,+CAAA;AAAA,EACd,iBAAA,EACC;AACF,CAAA;AAIA,IAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAyCpB,SAAS,cAAc,OAAA,EAAyB;AAC/C,EAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,GAC5B,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,OAAA,CAAQ,MAAM,CAAC,CAAA,QAAA,CAAA,GACpC,mBAAA;AACJ;AAEO,IAAM,oBAAA,GAAN,cAAmC,UAAA,CAAW;AAAA,EACpD,WAAW,kBAAA,GAA+B;AACzC,IAAA,OAAO,CAAC,SAAS,YAAY,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAA,GAA2B,IAAA;AAAA,EAC3B,QAAA,GAAkC,IAAA;AAAA,EAClC,WAA+B,EAAC;AAAA,EAChC,SAA+C,EAAC;AAAA,EAChD,YAAA,GAAmC,IAAA;AAAA,EACnC,YAA2B,EAAC;AAAA,EAC5B,WAA2B,EAAC;AAAA,EAC5B,MAAA,GAAS,IAAA;AAAA,EACT,WAAA,GAAc,IAAA;AAAA,EACd,SAAA,GAAY,KAAA;AAAA,EACZ,KAAA,GAAQ,KAAA;AAAA,EACR,QAAA,GAA2C,IAAA;AAAA,EAEjC,QAAA,GAAyB;AAClC,IAAA,OAAOD,GAAAA;AAAA,EACR;AAAA,EAEU,KAAA,GAAsC;AAC/C,IAAA,OAAO,EAAE,IAAIC,GAAAA,EAAG;AAAA,EACjB;AAAA;AAAA,EAGA,IAAI,KAAA,GAA0B;AAC7B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACb;AAAA,EACA,IAAI,MAAM,CAAA,EAAqB;AAG9B,IAAA,IAAI,CAAA,KAAM,KAAK,MAAA,EAAQ;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAiC;AACpC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EACA,IAAI,QAAQ,CAAA,EAA0B;AACrC,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,EACjB;AAAA;AAAA;AAAA,EAIA,IAAI,OAAA,GAA8B;AACjC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EACA,IAAI,QAAQ,CAAA,EAAuB;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,EAAC;AAAA,EACvB;AAAA,EAEA,IAAI,KAAA,GAA8C;AACjD,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACb;AAAA,EACA,IAAI,MAAM,CAAA,EAAgD;AACzD,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,EAAC;AACpB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EAEA,IAAI,WAAA,GAAkC;AACrC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACb;AAAA,EACA,IAAI,YAAY,CAAA,EAAuB;AACtC,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EAEA,IAAI,QAAA,GAA0B;AAC7B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACb;AAAA,EACA,IAAI,SAAS,CAAA,EAAyB;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,EAAC;AACvB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA,EAEA,IAAI,aAAA,GAAgC;AACnC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EACA,IAAI,cAAc,CAAA,EAA0B;AAC3C,IAAA,IAAA,CAAK,WAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,IAAI,EAAC;AACxC,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,KAAA,GAAiB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACb;AAAA,EACA,IAAI,MAAM,CAAA,EAAY;AACrB,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAsB;AACzB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACb;AAAA,EACA,IAAI,WAAW,CAAA,EAAY;AAC1B,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAAoB;AACvB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACb;AAAA,EACA,IAAI,SAAS,CAAA,EAAY;AACxB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA,EAGA,IAAI,IAAA,GAAgB;AACnB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACb;AAAA;AAAA;AAAA,EAIA,IAAI,OAAA,GAA0C;AAC7C,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EAEA,WAAA,GAAc;AACb,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,KAAK,MAAA,CAAO,CAAA,CAAE,SAAS,EAAC,EAAG,WAAW,CAAC,CAAA;AAAA,EAC7C;AAAA,EAEA,wBAAA,CAAyB,IAAA,EAAc,IAAA,EAAqB,KAAA,EAA4B;AACvF,IAAA,IAAI,IAAA,KAAS,OAAA,EAAS,IAAA,CAAK,KAAA,GAAQ,KAAA,KAAU,OAAA;AAC7C,IAAA,IAAI,IAAA,KAAS,YAAA,EAAc,IAAA,CAAK,UAAA,GAAa,KAAA,KAAU,OAAA;AAAA,EACxD;AAAA,EAEA,iBAAA,GAA0B;AACzB,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,IAAI,IAAA,CAAK,aAAa,OAAO,CAAA,OAAQ,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,KAAM,OAAA;AAC5E,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,YAAY,CAAA,EAAG;AACpC,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,YAAY,CAAA,KAAM,OAAA;AAAA,IACvD;AACA,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA,EAEQ,IAAA,GAAwB;AAC/B,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,IAAA,OAAO,UAAA,IAAc,CAAA,GAAI,CAAA,CAAE,QAAA,GAAW,CAAA;AAAA,EACvC;AAAA,EAEQ,IAAA,GAAa;AACpB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,IAAA,IAAA,CAAK,KAAA,IAAQ;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,MAAA,CAAO,UAAU,MAAM,IAAA,CAAK,MAAM,CAAA;AACpD,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA;AAAA,EAIQ,UAAA,GAAsB;AAC7B,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAK,MAAA,IAAU,IAAA,CAAK,WAAW,OAAO,KAAA;AACpD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,MAAA,KAAW,oBAAA;AAAA,EAC5C;AAAA,EAEQ,IAAA,GAAa;AACpB,IAAA,MAAM,IAAA,GAAO,KAAK,UAAA,EAAW;AAC7B,IAAA,IAAI,IAAA,KAAS,KAAK,KAAA,EAAO;AACzB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAI,CAAC,IAAA,EAAM,IAAA,CAAK,QAAA,GAAW,IAAA;AAC3B,IAAA,KAAA,CAAM,QAAA,EAAS;AACf,IAAA,IAAI,MAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAA2B,qBAAqB,GAAG,KAAA,EAAM;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,QAAA,GAAiB;AAC1B,IAAA,MAAM,KAAK,IAAA,CAAK,QAAA;AAChB,IAAA,IAAI,CAAC,EAAA,EAAI;AACR,MAAA,KAAA,CAAM,QAAA,EAAS;AACf,MAAA;AAAA,IACD;AACA,IAAA,EAAA,CAAG,MAAA,GAAS,KAAK,WAAA,EAAY;AAC7B,IAAA,EAAA,CAAG,QAAQ,IAAA,CAAK,MAAA;AAChB,IAAA,EAAA,CAAG,cAAc,IAAA,CAAK,YAAA;AACtB,IAAA,EAAA,CAAG,WAAW,IAAA,CAAK,SAAA;AACnB,IAAA,EAAA,CAAG,gBAAgB,IAAA,CAAK,QAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAA4B;AACnC,IAAA,OAAO,EAAE,eAAA,EAAiB,EAAA,EAAI,GAAG,KAAK,MAAA,EAAO;AAAA,EAC9C;AAAA,EAEQ,YAAA,GAAwC;AAC/C,IAAA,MAAM,KAAK,QAAA,CAAS,aAAA;AAAA,MACnB,aAAA,CAAc,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa;AAAA,KACzC;AACA,IAAA,EAAA,CAAG,MAAA,GAAS,KAAK,WAAA,EAAY;AAC7B,IAAA,EAAA,CAAG,QAAQ,IAAA,CAAK,MAAA;AAChB,IAAA,EAAA,CAAG,cAAc,IAAA,CAAK,YAAA;AACtB,IAAA,EAAA,CAAG,WAAW,IAAA,CAAK,SAAA;AACnB,IAAA,EAAA,CAAG,gBAAgB,IAAA,CAAK,QAAA;AACxB,IAAA,EAAA,CAAG,UAAU,IAAA,CAAK,QAAA;AAClB,IAAA,EAAA,CAAG,UAAU,IAAA,CAAK,QAAA;AAGlB,IAAA,EAAA,CAAG,QAAQ,IAAA,CAAK,MAAA;AAChB,IAAA,OAAO,EAAA;AAAA,EACR;AAAA,EAEQ,WAAA,GAAkC;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,IAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,CAAE,iBAAiB,CAAA;AACrC,IAAA,OAAO,CAAA;AAAA,MACN,KAAA;AAAA,MACA,EAAC;AAAA,MACD,CAAA;AAAA,QACC,QAAA;AAAA,QACA;AAAA,UACC,IAAA,EAAM,iBAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,SAAS,MAAM;AACd,YAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,YAAA,IAAA,CAAK,KAAK,yBAAyB,CAAA;AAAA,UACpC;AAAA,SACD;AAAA,QACA,IAAA,CAAK,EAAE,YAAY;AAAA,OACpB;AAAA,MACA,IAAA,GAAO,EAAE,KAAA,EAAO,EAAE,MAAM,sBAAA,EAAuB,EAAG,IAAI,CAAA,GAAI;AAAA,KAC3D;AAAA,EACD;AAAA,EAEU,KAAK,IAAA,EAAyB;AACvC,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAK,YAAA,EAAa;AAClC,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,EAAM,EAAE,IAAA,EAAM,YAAA,EAAc,EAAA,EAAI,YAAA,EAAa,EAAG,IAAA,CAAK,CAAA,CAAE,YAAY,CAAC,CAAA;AACpF,IAAA,MAAM,IAAA,GAAO,EAAE,KAAA,EAAO;AAAA,MACrB,IAAA,EAAM,WAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACV,CAAA;AACD,IAAA,GAAA;AAAA,MACC,IAAA;AAAA,MACA,CAAA,CAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAS,CAAA;AAAA,MAC3B,KAAA;AAAA,MACA,IAAA,CAAK,OAAA,CAAQ,eAAA,EAAiB,WAAW,CAAA;AAAA,MACzC,IAAA,CAAK,QAAA;AAAA,MACL,CAAA,CAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAS,CAAA;AAAA,MAC3B,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,WAAW,CAAA;AAAA,MAC1C,KAAK,WAAA;AAAY,KAClB;AACA,IAAA,GAAA;AAAA,MACC,IAAA;AAAA,MACA,CAAA;AAAA,QACC,KAAA;AAAA,QACA;AAAA,UACC,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,YAAA,EAAc,MAAA;AAAA,UACd,iBAAA,EAAmB;AAAA,SACpB;AAAA,QACA,IAAA;AAAA,QACA,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,WAAA,EAAY,EAAG,CAAA,CAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,CAAC;AAAA;AAC9D,KACD;AAAA,EACD;AACD;;;AC1VA,IAAMD,GAAAA,GAAmB;AAAA,EACxB,qBAAA,EAAuB,yBAAA;AAAA,EACvB,wBAAA,EAA0B,cAAA;AAAA,EAC1B,uBAAA,EAAyB,uBAAA;AAAA,EACzB,yBAAA,EAA2B,iBAAA;AAAA,EAC3B,qBAAA,EAAuB,iBAAA;AAAA,EACvB,yBAAA,EAA2B,kBAAA;AAAA,EAC3B,uBAAA,EAAyB,oBAAA;AAAA,EACzB,oBAAA,EAAsB,eAAA;AAAA,EACtB,sBAAA,EAAwB,sBAAA;AAAA,EACxB,6BAAA,EAA+B,sBAAA;AAAA,EAC/B,qBAAA,EAAuB,gBAAA;AAAA,EACvB,oBAAA,EAAsB,oBAAA;AAAA,EACtB,oBAAA,EAAsB,kBAAA;AAAA,EACtB,sBAAA,EAAwB,0CAAA;AAAA,EACxB,kBAAA,EAAoB,MAAA;AAAA,EACpB,eAAA,EAAiB;AAClB,CAAA;AASA,IAAMC,GAAAA,GAAmB;AAAA,EACxB,qBAAA,EAAuB,2CAAA;AAAA,EACvB,uBAAA,EAAyB,6BAAA;AAAA,EACzB,yBAAA,EAA2B,eAAA;AAAA,EAC3B,qBAAA,EAAuB,cAAA;AAAA,EACvB,yBAAA,EAA2B,wBAAA;AAAA,EAC3B,uBAAA,EAAyB,oCAAA;AAAA,EACzB,oBAAA,EAAsB,oBAAA;AAAA,EACtB,sBAAA,EAAwB,yBAAA;AAAA,EACxB,6BAAA,EAA+B,8BAAA;AAAA;AAAA;AAAA;AAAA,EAI/B,qBAAA,EAAuB,qBAAA;AAAA,EACvB,oBAAA,EAAsB,uBAAA;AAAA,EACtB,oBAAA,EAAsB,yBAAA;AAAA,EACtB,sBAAA,EAAwB,wDAAA;AAAA,EACxB,kBAAA,EAAoB,QAAA;AAAA,EACpB,eAAA,EAAiB;AAClB,CAAA;AAEA,IAAM,kBAAA,GAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAgB3B,SAAS,UAAA,CAAW,KAAa,IAAA,EAAsB;AACtD,EAAA,MAAM,MAAA,GAAS,cAAA;AACf,EAAA,OAAO,IAAI,QAAA,CAAS,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,KAAA,CAAM,CAAA,EAAG,CAAC,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,aAAa,IAAI,CAAA,CAAA;AAC5F;AAEO,IAAM,2BAAA,GAAN,cAA0C,UAAA,CAAW;AAAA,EAC3D,MAAA,GAA2B,IAAA;AAAA,EAC3B,QAAA,GAAkC,IAAA;AAAA,EAClC,QAAA,GAA0B,IAAA;AAAA,EAC1B,SAA+C,EAAC;AAAA,EAChD,QAAA,GAA0E,IAAA;AAAA,EAC1E,SAAA,GAAY,KAAA;AAAA,EACZ,KAAA,GAAQ,KAAA;AAAA,EACR,QAAA,GAA0B,IAAA;AAAA,EAEhB,QAAA,GAAyB;AAClC,IAAA,OAAOD,GAAAA;AAAA,EACR;AAAA,EAEU,KAAA,GAAsC;AAC/C,IAAA,OAAO,EAAE,IAAIC,GAAAA,EAAG;AAAA,EACjB;AAAA,EAEA,WAAA,GAAc;AACb,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,KAAK,MAAA,CAAO,CAAA,CAAE,SAAS,EAAC,EAAG,kBAAkB,CAAC,CAAA;AAAA,EACpD;AAAA;AAAA,EAGA,IAAI,KAAA,GAA0B;AAC7B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACb;AAAA,EACA,IAAI,MAAM,CAAA,EAAqB;AAC9B,IAAA,IAAI,CAAA,KAAM,KAAK,MAAA,EAAQ;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAiC;AACpC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EACA,IAAI,QAAQ,CAAA,EAA0B;AACrC,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAyB;AAC5B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EACA,IAAI,QAAQ,CAAA,EAAkB;AAC7B,IAAA,IAAA,CAAK,WAAW,CAAA,IAAK,IAAA;AACrB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA,EAGA,IAAI,KAAA,GAA8C;AACjD,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACb;AAAA,EACA,IAAI,MAAM,CAAA,EAAgD;AACzD,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,EAAC;AACpB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAA,GAA+E;AAClF,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACb;AAAA,EACA,IAAI,cAAc,EAAA,EAAmE;AACpF,IAAA,IAAA,CAAK,QAAA,GAAW,EAAA;AAAA,EACjB;AAAA,EAEA,iBAAA,GAA0B;AACzB,IAAA,KAAA,CAAM,iBAAA,EAAkB;AACxB,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACX;AAAA,EAEQ,IAAA,GAAwB;AAC/B,IAAA,OAAO,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,EAC1B;AAAA,EAEQ,IAAA,GAAa;AACpB,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,EACxB;AAAA;AAAA,EAGA,MAAc,IAAI,GAAA,EAAkD;AACnE,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAI;AACH,MAAA,IAAA,CAAK,QAAA,GAAW,MAAM,GAAA,EAAI;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACP,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,CAAA,CAAE,eAAe,CAAA;AAAA,IACvC,CAAA,SAAE;AACD,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IACf;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAA,GAA4B;AACnC,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,OAAA,CAAQ,OAAA,EAAQ;AAClC,IAAA,OAAO,IAAA,CAAK,IAAI,YAAY;AAC3B,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AAC1C,MAAA,MAAM,UAAU,MAAM,UAAA,CAAW,MAAM,SAAA,CAAU,IAAA,CAAK,UAAU,CAAC,CAAA;AACjE,MAAA,IAAI,CAAC,OAAA,EAAS,OAAO,IAAA,CAAK,EAAE,6BAA6B,CAAA;AACzD,MAAA,IAAA,CAAK,OAAO,cAAA,EAAe;AAC3B,MAAA,OAAO,IAAA,CAAK,EAAE,sBAAsB,CAAA;AAAA,IACrC,CAAC,CAAA;AAAA,EACF;AAAA;AAAA;AAAA,EAIQ,OAAO,KAAA,EAAqC;AACnD,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,OAAA,CAAQ,OAAA,EAAQ;AAClC,IAAA,OAAO,IAAA,CAAK,IAAI,YAAY;AAG3B,MAAA,IAAI;AACH,QAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAE,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,CAAA,EAAI,OAAO,IAAA;AAAA,MAChF,CAAA,CAAA,MAAQ;AACP,QAAA,OAAO,IAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAA,CAAK,OAAO,YAAA,EAAa;AAC/B,MAAA,IAAA,CAAK,KAAK,gCAAgC,CAAA;AAC1C,MAAA,OAAO,IAAA,CAAK,EAAE,sBAAsB,CAAA;AAAA,IACrC,CAAC,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,IAAA,EAAyB;AAC5C,IAAA,MAAM,KAAK,QAAA,CAAS,aAAA;AAAA,MACnB,UAAA,CAAW,IAAA,CAAK,SAAA,EAAW,SAAS;AAAA,KACrC;AACA,IAAA,EAAA,CAAG,QAAQ,IAAA,CAAK,MAAA;AAChB,IAAA,EAAA,CAAG,UAAU,IAAA,CAAK,QAAA;AAClB,IAAA,EAAA,CAAG,QAAQ,IAAA,CAAK,MAAA;AAChB,IAAA,EAAA,CAAG,SAAS,IAAA,CAAK,MAAA;AACjB,IAAA,MAAM,OAAO,MAAY;AACxB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IACf,CAAA;AACA,IAAA,EAAA,CAAG,gBAAA,CAAiB,uBAAuB,IAAI,CAAA;AAC/C,IAAA,EAAA,CAAG,gBAAA,CAAiB,uBAAuB,IAAI,CAAA;AAC/C,IAAA,GAAA;AAAA,MACC,IAAA;AAAA,MACA,CAAA;AAAA,QACC,QAAA;AAAA,QACA,EAAE,IAAA,EAAM,uBAAA,EAAyB,IAAA,EAAM,QAAA,EAAU,SAAS,IAAA,EAAK;AAAA,QAC/D,IAAA,CAAK,EAAE,kBAAkB;AAAA,OAC1B;AAAA,MACA;AAAA,KACD;AAAA,EACD;AAAA,EAEU,KAAK,IAAA,EAAyB;AACvC,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,KAAK,SAAA,IAAa,IAAA,CAAK,UAAU,OAAO,IAAA,CAAK,YAAY,IAAI,CAAA;AAEjE,IAAA,MAAM,EAAE,UAAA,EAAY,KAAA,EAAO,SAAA,EAAU,GAAI,KAAK,MAAA,CAAO,KAAA;AACrD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,CAAE,CAAA,iBAAA,EAAoB,UAAU,CAAA,CAAE,CAAA;AAGpD,IAAA,MAAM,QAAQ,IAAA,KAAS,CAAA,iBAAA,EAAoB,UAAU,CAAA,CAAA,GAAM,SAAS,UAAA,GAAc,IAAA;AAClF,IAAA,MAAM,GAAA,GAAM,CAAC,IAAA,CAAK,QAAA,EAAU,SAAS,KAAA,KAAU,KAAA,GAAQ,KAAA,GAAQ,IAAI,CAAA,CACjE,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,QAAK,CAAA;AACZ,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,UAAyB,CAAA;AAClD,IAAA,MAAM,SAAS,QAAA,CAAS,aAAA,CAAc,WAAW,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAC,CAAA;AAK1E,IAAA,MAAA,CAAO,YAAA,CAAa,WAAW,KAAK,CAAA;AACpC,IAAA,MAAA,CAAO,SAAS,IAAA,CAAK,MAAA;AACrB,IAAA,MAAA,CAAO,QAAQ,IAAA,CAAK,MAAA;AACpB,IAAA,MAAA,CAAO,QAAQ,IAAA,CAAK,MAAA;AAQpB,IAAA,MAAM,GAAA,GAAM,CAAC,GAAA,EAAa,IAAA,EAAc,OAAA,KAA4C;AACnF,MAAA,MAAME,MAAAA,GAAQ,IAAA,CAAK,CAAA,CAAE,GAAG,CAAA;AACxB,MAAA,IAAI,CAACA,QAAO,OAAO,IAAA;AACnB,MAAA,OAAO,CAAA;AAAA,QACN,QAAA;AAAA,QACA,EAAE,IAAA,EAAM,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,EAAI,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,IAAA,CAAK,KAAA,GAAQ,EAAA,GAAK,IAAA,EAAM,OAAA,EAAQ;AAAA,QACpFA;AAAA,OACD;AAAA,IACD,CAAA;AAEA,IAAA,GAAA;AAAA,MACC,IAAA;AAAA,MACA,IAAA,CAAK,OAAA,CAAQ,qBAAA,EAAuB,qBAAqB,CAAA;AAAA,MACzD,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,MAAM,uBAAA,EAAwB;AAAA,QAChC,IAAA,GAAO,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,EAAA,EAAI,CAAA,GAAI,IAAA;AAAA,QACxD,CAAA;AAAA,UACC,KAAA;AAAA,UACA,EAAC;AAAA,UACD,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,IAAW,KAAK,CAAA;AAAA,UACjC,GAAA,GAAM,EAAE,KAAA,EAAO,EAAE,MAAM,KAAA,EAAM,EAAG,GAAG,CAAA,GAAI,IAAA;AAAA,UACvC,SAAA,GAAY,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAM,EAAG,IAAA,CAAK,CAAA,CAAE,uBAAuB,CAAC,CAAA,GAAI;AAAA;AAC1E,OACD;AAAA,MACA,MAAA;AAAA,MACA,CAAA;AAAA,QACC,KAAA;AAAA,QACA,EAAE,MAAM,qBAAA,EAAsB;AAAA,QAC9B,IAAI,oBAAA,EAAsB,oBAAA,EAAsB,MAAM,KAAK,IAAA,CAAK,YAAY,CAAA;AAAA;AAAA;AAAA,QAG5E,GAAA;AAAA,UAAI,qBAAA;AAAA,UAAuB,qBAAA;AAAA,UAAuB,MACjD,IAAA,CAAK,IAAA,CAAK,gCAAgC,EAAE,MAAA,EAAQ,WAAW;AAAA,SAChE;AAAA,QACA,IAAA,CAAK,QAAA,GACF,GAAA,CAAI,oBAAA,EAAsB,sBAAsB,MAAM;AACtD,UAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,UAAA,IAAA,CAAK,QAAA,EAAS;AAAA,QACf,CAAC,CAAA,GACA,IAAA;AAAA,QACH,GAAA,CAAI,sBAAsB,oBAAA,EAAsB,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC;AAAA,OAC9E;AAAA,MACA,IAAA,CAAK,QAAA,GACF,CAAA,CAAE,KAAA,EAAO,EAAE,IAAA,EAAM,yBAAA,EAA2B,IAAA,EAAM,QAAA,EAAS,EAAG,IAAA,CAAK,QAAQ,CAAA,GAC3E;AAAA,KACJ;AAAA,EACD;AACD;;;AC3TO,SAAS,sBAAA,CAAuB,SAAS,WAAA,EAAmB;AAClE,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAc,IAAA,KAAyC;AACtE,IAAA,IAAI,CAAC,eAAe,GAAA,CAAI,IAAI,GAAG,cAAA,CAAe,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,EAChE,CAAA;AACA,EAAA,MAAA,CAAO,CAAA,EAAG,MAAM,CAAA,QAAA,CAAA,EAAY,uBAAuB,CAAA;AACnD,EAAA,MAAA,CAAO,CAAA,EAAG,MAAM,CAAA,MAAA,CAAA,EAAU,qBAAqB,CAAA;AAC/C,EAAA,MAAA,CAAO,CAAA,EAAG,MAAM,CAAA,KAAA,CAAA,EAAS,oBAAoB,CAAA;AAC7C,EAAA,MAAA,CAAO,CAAA,EAAG,MAAM,CAAA,OAAA,CAAA,EAAW,sBAAsB,CAAA;AACjD,EAAA,MAAA,CAAO,CAAA,EAAG,MAAM,CAAA,QAAA,CAAA,EAAY,uBAAuB,CAAA;AAInD,EAAA,MAAA,CAAO,CAAA,EAAG,MAAM,CAAA,KAAA,CAAA,EAAS,oBAAoB,CAAA;AAC7C,EAAA,MAAA,CAAO,CAAA,EAAG,MAAM,CAAA,YAAA,CAAA,EAAgB,2BAA2B,CAAA;AAC5D","file":"widgets.js","sourcesContent":["// The destination glyphs the connect cards fall back to when a host passes\n// none. A card with no icon reads as unfinished, and every consuming app was\n// solving that the same way: two image files of its own, copied from app to\n// app, drifting in size and color.\n//\n// Deliberately NEUTRAL drawings, not brand marks. A provider logo is a\n// trademark, and redistributing one inside a public package is a different\n// question from an application displaying it to name an integration it\n// actually offers. Shipping a cloud rather than a company's mark keeps every\n// consumer clean by default; a host that has cleared the right to a real logo\n// passes it through `icons` and wins.\n//\n// Inlined as data URIs: a library that promises the data stays put cannot\n// fetch an image from a third party to draw its own screen.\n\nimport type { ConnectKind } from '../flows/connect';\n\n/** One neutral gray that stays legible on a light and on a dark surface;\n * an <img> cannot inherit the host's currentColor. */\nconst INK = '#8a8f98';\n\nconst svg = (body: string): string =>\n\t`data:image/svg+xml,${encodeURIComponent(\n\t\t`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${INK}\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${body}</svg>`\n\t)}`;\n\n/** A glyph per destination kind: a cloud for a hosted drive, a document for a\n * file on the device, a server for WebDAV, a bucket for object storage. */\nexport const defaultIcons: Record<ConnectKind, string> = {\n\tdrive: svg('<path d=\"M7 18h10a4 4 0 0 0 .6-7.96A6 6 0 0 0 6.2 9.2 3.9 3.9 0 0 0 7 18Z\"/>'),\n\tfile: svg(\n\t\t'<path d=\"M14 3H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V7Z\"/><path d=\"M14 3v4h4\"/>'\n\t),\n\twebdav: svg(\n\t\t'<rect x=\"3\" y=\"4\" width=\"18\" height=\"7\" rx=\"2\"/><rect x=\"3\" y=\"13\" width=\"18\" height=\"7\" rx=\"2\"/><path d=\"M7 7.5h.01M7 16.5h.01\"/>'\n\t),\n\ts3: svg(\n\t\t'<path d=\"M4.5 6h15l-1.4 13a2 2 0 0 1-2 1.8H7.9a2 2 0 0 1-2-1.8Z\"/><path d=\"M4.5 6c0-1.1 3.4-2 7.5-2s7.5.9 7.5 2\"/>'\n\t)\n};\n","// Shared foundation for the widgets: zero-dependency custom elements over\n// the headless flows. Look and words stay the host's business through three\n// layers - --selfstore-* custom properties (fonts and text colors inherit),\n// part=\"...\" on every significant node, and a flat `labels` map merged over\n// the EN defaults (also the localization story). Elements are inert until\n// wired: assign the properties, the widget builds its flow and renders; they\n// clean up on disconnect and expose the flow for programmatic control.\n\nimport type { FlowHost, StoreLike } from '../flows/connect';\n\n/** Flat key -> string map; widgets merge a partial override over EN defaults. */\nexport type WidgetLabels = Record<string, string>;\n\n/** The ports behind whatever a caller passed as \"the store\": the simple facade\n * carries them on `flowHost`, a hand-built host IS them. Every widget that\n * reads the engine needs this line, so it lives once. */\nexport function hostOf(store: StoreLike | null | undefined): FlowHost | null {\n\tif (!store) return null;\n\treturn 'flowHost' in store ? store.flowHost : store;\n}\n\n/** Structural theme, applied inside every widget's shadow root. Neutral by\n * design: it borrows the host font and text color, and every visual decision\n * routes through a --selfstore-* custom property a host page can set. */\nexport const baseStyles = `\n:host {\n\tdisplay: block;\n\tfont: inherit;\n\tcolor: inherit;\n\t--_accent: var(--selfstore-accent, #2563eb);\n\t--_accent-ink: var(--selfstore-accent-contrast, #ffffff);\n\t--_ink-dim: var(--selfstore-muted, color-mix(in srgb, currentColor 55%, transparent));\n\t--_border: var(--selfstore-border, color-mix(in srgb, currentColor 16%, transparent));\n\t--_radius: var(--selfstore-radius, 12px);\n\t--_gap: var(--selfstore-gap, 0.6rem);\n\t--_danger: var(--selfstore-danger, #dc2626);\n\t--_ok: var(--selfstore-ok, #16a34a);\n\t--_warn: var(--selfstore-warn, #d97706);\n}\n/* Status severity, as a text color the dot inherits (background: currentColor). */\n[part~='sev-ok'] { color: var(--_ok); }\n[part~='sev-info'] { color: var(--_accent); }\n[part~='sev-warn'] { color: var(--_warn); }\n[part~='sev-danger'] { color: var(--_danger); }\nspan[part~='status-dot'] {\n\tdisplay: inline-block;\n\twidth: 0.6em;\n\theight: 0.6em;\n\tborder-radius: 50%;\n\tbackground: currentColor;\n\tflex-shrink: 0;\n}\nbutton[part~='dot-button'] {\n\tbackground: none;\n\tborder: none;\n\tpadding: 0.2em;\n\tcursor: pointer;\n\tline-height: 0;\n}\n[part~='status-row'] [part~='status-action'] { margin-left: auto; }\n[part~='card'] {\n\tborder: 1px solid var(--_border);\n\tborder-radius: var(--_radius);\n\tpadding: 0.8rem 0.9rem;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--_gap);\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tbackground: transparent;\n\ttext-align: left;\n}\nbutton[part~='card'] { cursor: pointer; font: inherit; color: inherit; }\nbutton[part~='card']:hover { border-color: var(--_accent); }\n/* The rule between \"go back to what you had\" and \"start something new\". A word\n sits in the gap rather than beside it, so the two groups read as two even\n before either is read. */\n[part~='separator'] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 0.7rem;\n\tmargin: 0.15rem 0;\n\tcolor: var(--_ink-dim);\n\tfont-size: 0.85em;\n}\n[part~='separator']::before,\n[part~='separator']::after {\n\tcontent: '';\n\tflex: 1;\n\theight: 1px;\n\tbackground: var(--_border);\n}\nimg[part~='icon'] {\n\twidth: var(--selfstore-icon-size, 2.1em);\n\theight: var(--selfstore-icon-size, 2.1em);\n\tobject-fit: contain;\n\tflex-shrink: 0;\n}\n[part~='stack'] { display: flex; flex-direction: column; gap: var(--_gap); container-type: inline-size; }\n[part~='row'] { display: flex; align-items: center; gap: var(--_gap); flex-wrap: wrap; }\n[part~='title'] { font-weight: 600; }\n[part~='sub'], [part~='hint'] { color: var(--_ink-dim); font-size: 0.9em; }\n[part~='tag'] {\n\tdisplay: inline-block;\n\tfont-size: 0.72em;\n\tfont-weight: 600;\n\tline-height: 1.5;\n\tpadding: 0 0.55em;\n\tmargin-left: 0.5em;\n\tborder-radius: 999px;\n\tbackground: var(--_accent);\n\tcolor: var(--_accent-ink);\n\tvertical-align: middle;\n}\n[part~='status'] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--_gap);\n\tpadding: 0.7rem 0.9rem;\n\tborder-radius: var(--_radius);\n\tbackground: color-mix(in srgb, var(--_accent) 10%, transparent);\n}\n[part~='status-ok'] { background: color-mix(in srgb, var(--_ok) 12%, transparent); }\n[part~='status-error'] { background: color-mix(in srgb, var(--_danger) 12%, transparent); }\n[part='spinner'] {\n\twidth: 0.7em; height: 0.7em; flex-shrink: 0;\n\tborder-radius: 50%;\n\tborder: 2px solid var(--_accent);\n\tborder-top-color: transparent;\n\tanimation: ss-spin 0.8s linear infinite;\n}\n@keyframes ss-spin { to { transform: rotate(360deg); } }\nbutton[part~='button'] {\n\tfont: inherit;\n\tpadding: 0.45rem 0.9rem;\n\tborder-radius: calc(var(--_radius) * 0.75);\n\tborder: 1px solid var(--_border);\n\tbackground: transparent;\n\tcolor: inherit;\n\tcursor: pointer;\n}\nbutton[part~='button']:disabled { opacity: 0.55; cursor: default; }\nbutton[part~='button-primary'] {\n\tbackground: var(--_accent);\n\tborder-color: var(--_accent);\n\tcolor: var(--_accent-ink);\n}\nbutton[part~='button-danger'] { color: var(--_danger); }\nbutton[part~='link'] {\n\tfont: inherit;\n\tbackground: none;\n\tborder: none;\n\tpadding: 0;\n\tcolor: var(--_ink-dim);\n\ttext-decoration: underline;\n\tcursor: pointer;\n}\nbutton[part~='link']:disabled { opacity: 0.55; cursor: default; }\nbutton[part~='link-danger'] { color: var(--_danger); }\nbutton[part~='advanced-link'] {\n\twidth: fit-content;\n\tfont-size: 0.85em;\n\tmargin-top: 0.1rem;\n}\n[part~='card'] [part~='row'] { margin-top: 0.45rem; }\n/* A card carrying its own action row is tall; centering then floated the icon\n somewhere in the middle of the text, next to no line in particular. It\n belongs on the title's line. */\n[part~='card']:has([part~='row']) { align-items: flex-start; }\ninput[part~='input'] {\n\tfont: inherit;\n\tcolor: inherit;\n\tbackground: transparent;\n\tborder: 1px solid var(--_border);\n\tborder-radius: calc(var(--_radius) * 0.75);\n\tpadding: 0.45rem 0.6rem;\n\twidth: 100%;\n\tbox-sizing: border-box;\n}\ninput[part~='input']:focus { outline: 2px solid var(--_accent); outline-offset: 1px; }\n/* A field that keeps its name visible above the box, placeholders being hints\n and not labels. */\nlabel[part~='labelled'] { display: flex; flex-direction: column; gap: 0.2rem; width: 100%; }\nlabel[part~='labelled'] [part~='label'] { font-size: 0.85em; color: var(--_ink-dim); }\n/* A text input with a trailing button (the password eye) tucked inside it. */\n[part~='field'] { position: relative; display: flex; align-items: center; width: 100%; }\n[part~='field'] input[part~='input'] { padding-right: 2.4rem; }\nbutton[part~='eye'] {\n\tposition: absolute;\n\tright: 0.25rem;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 2rem;\n\theight: 2rem;\n\tbackground: none;\n\tborder: none;\n\tpadding: 0;\n\tcursor: pointer;\n\tcolor: var(--_ink-dim);\n}\nbutton[part~='eye']:hover { color: inherit; }\nbutton[part~='eye'] svg { width: 1.15em; height: 1.15em; display: block; }\n[part~='warn-note'] { color: var(--_warn); }\nbutton[part~='forgot-link'] { width: fit-content; font-size: 0.85em; margin-top: 0.15rem; }\n[part~='error-note'] { color: var(--_danger); font-size: 0.9em; }\n/* WebDAV/S3 segmented control: a rail with the inactive segments quiet and the\n active one lifted onto the surface. Full-width segments, equal share. */\n[part~='tabs'] {\n\tdisplay: flex;\n\tgap: 0.2rem;\n\tpadding: 0.25rem;\n\tborder-radius: calc(var(--_radius) * 0.7);\n\tbackground: color-mix(in srgb, currentColor 8%, transparent);\n}\nbutton[part~='tab'] {\n\tflex: 1 1 0;\n\tfont: inherit;\n\tfont-weight: 600;\n\tpadding: 0.4rem 0.7rem;\n\tborder: none;\n\tborder-radius: calc(var(--_radius) * 0.5);\n\tbackground: transparent;\n\tcolor: var(--_ink-dim);\n\tcursor: pointer;\n}\nbutton[part~='tab']:hover { color: inherit; }\nbutton[part~='tab-on'] {\n\tbackground: Canvas;\n\tcolor: inherit;\n\tbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n/* WebDAV provider quick-pick chips. */\n[part~='presets'] { display: flex; flex-wrap: wrap; gap: 0.4rem; }\nbutton[part~='preset'] {\n\tfont: inherit;\n\tfont-size: 0.85em;\n\tpadding: 0.3rem 0.75rem;\n\tborder: 1px solid var(--_border);\n\tborder-radius: 999px;\n\tbackground: transparent;\n\tcolor: inherit;\n\tcursor: pointer;\n}\nbutton[part~='preset']:hover { border-color: var(--_accent); }\nbutton[part~='preset-on'] {\n\tborder-color: var(--_accent);\n\tbackground: color-mix(in srgb, var(--_accent) 12%, transparent);\n}\nul[part~='list'] { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--_gap); }\nimg[part~='qr'] {\n\twidth: var(--selfstore-qr-size, 6.5em);\n\theight: var(--selfstore-qr-size, 6.5em);\n\tborder-radius: calc(var(--_radius) * 0.5);\n\tbackground: #ffffff;\n\tflex-shrink: 0;\n}\n/* Overflow menu. The trigger is a quiet in-card button; the open menu is a\n dropdown over the trigger's corner on wide screens and a bottom sheet on\n phones. The backdrop catches every outside click or tap (the standard\n dismiss), sitting above the sibling cards but under the panel. */\nbutton[part~='menu-button'] {\n\tborder: none;\n\tbackground: none;\n\tpadding: 0.25rem 0.6rem;\n\tfont-size: 1.1em;\n\tline-height: 1.3;\n\tborder-radius: calc(var(--_radius) * 0.5);\n\tcolor: var(--_ink-dim);\n\tcursor: pointer;\n}\nbutton[part~='menu-button']:hover,\nbutton[part~='menu-button'][aria-expanded='true'] {\n\tbackground: color-mix(in srgb, currentColor 10%, transparent);\n\tcolor: inherit;\n}\n[part~='card'] > button[part~='menu-button'] { align-self: flex-start; }\n[part~='menu-layer'] { display: contents; }\n[part~='menu-backdrop'] { position: fixed; inset: 0; z-index: 29; background: transparent; }\n[part~='menu'] {\n\tposition: absolute;\n\tright: 0.4rem;\n\ttop: 0.4rem;\n\tz-index: 30;\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-width: 11rem;\n\tpadding: 0.3rem 0;\n\tborder: 1px solid var(--_border);\n\tborder-radius: calc(var(--_radius) * 0.75);\n\tbackground: Canvas;\n\tcolor: CanvasText;\n\tbox-shadow: 0 10px 30px rgba(0, 0, 0, 0.16);\n\toutline: none;\n}\nbutton[part~='menu-item'] {\n\tfont: inherit;\n\ttext-align: left;\n\tpadding: 0.55rem 0.95rem;\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tcursor: pointer;\n\twhite-space: nowrap;\n}\nbutton[part~='menu-item']:hover,\nbutton[part~='menu-item']:focus-visible {\n\tbackground: color-mix(in srgb, var(--_accent) 10%, transparent);\n}\nbutton[part~='menu-item-danger'] { color: var(--_danger); }\n@media (pointer: coarse) {\n\tbutton[part~='menu-item'] { padding: 0.8rem 1rem; }\n}\n@media (max-width: 500px) {\n\t[part~='menu-backdrop'] { background: rgba(0, 0, 0, 0.35); }\n\t[part~='menu'] {\n\t\tposition: fixed;\n\t\tinset: auto 0 0 0;\n\t\tborder-radius: var(--_radius) var(--_radius) 0 0;\n\t\tborder-bottom: none;\n\t\tmin-width: 0;\n\t\tpadding: 0.4rem 0 max(0.5rem, env(safe-area-inset-bottom));\n\t\tbox-shadow: 0 -12px 34px rgba(0, 0, 0, 0.28);\n\t}\n\tbutton[part~='menu-item'] { padding: 0.95rem 1.2rem; }\n}\n/* Responsive by default. The stack div above is the query container, so a\n widget reacts to ITS OWN width (a narrow column on a wide screen counts),\n and the host element's own sizing stays untouched. When the widget is\n narrow, a list card's row (QR + url + copy + revoke) would squeeze the\n text into a sliver: stack the card and centre the QR instead. */\n@container (max-width: 480px) {\n\tli[part~='card'] {\n\t\tflex-direction: column;\n\t\talign-items: stretch;\n\t}\n\tli[part~='card'] img[part~='qr'] { align-self: center; }\n\t/* Stacked cards must not push the overflow trigger below the body: it\n\t stays a top-right kebab (the card is position:relative already). */\n\tli[part~='card']:has(> button[part~='menu-button']) { padding-right: 2.4rem; }\n\tli[part~='card'] > button[part~='menu-button'] {\n\t\tposition: absolute;\n\t\ttop: 0.4rem;\n\t\tright: 0.4rem;\n\t}\n}\n`;\n\ntype Child = Node | string | null | undefined;\n\n/** Append children to an element, skipping null/undefined (conditional bits). */\nexport function put(el: HTMLElement, ...children: Child[]): void {\n\tfor (const c of children) {\n\t\tif (c == null) continue;\n\t\tel.append(typeof c === 'string' ? document.createTextNode(c) : c);\n\t}\n}\n\n/** Tiny DOM builder: h('button', { part: 'button', onclick }, label). */\nexport function h<K extends keyof HTMLElementTagNameMap>(\n\ttag: K,\n\tattrs: Record<string, unknown> = {},\n\t...children: Child[]\n): HTMLElementTagNameMap[K] {\n\tconst el = document.createElement(tag);\n\tfor (const [k, v] of Object.entries(attrs)) {\n\t\tif (v == null || v === false) continue;\n\t\tif (k.startsWith('on') && typeof v === 'function') {\n\t\t\tel.addEventListener(k.slice(2), v as EventListener);\n\t\t} else if (v === true) {\n\t\t\tel.setAttribute(k, '');\n\t\t} else {\n\t\t\tel.setAttribute(k, String(v));\n\t\t}\n\t}\n\tfor (const c of children) {\n\t\tif (c == null) continue;\n\t\tel.append(typeof c === 'string' ? document.createTextNode(c) : c);\n\t}\n\treturn el;\n}\n\n/** The common shell: shadow root + styles, label merging, focus-preserving\n * re-render, event emission, subscription cleanup. */\n/**\n * Hand back the properties a host set BEFORE the element's class existed.\n *\n * `el.store = handle` on a not-yet-defined element writes an OWN property on\n * the instance. Once the class is defined, that own property shadows the\n * accessor for good: the setter never runs, the widget never learns it has a\n * store, and it sits there - shut, or open and empty - without a word in the\n * console. Every host that loads `defineSelfstoreWidgets()` lazily hits this\n * (a dynamic import, a framework effect, a script at the end of the body),\n * and the symptom points nowhere near the cause.\n *\n * So on connect: delete each own property that a prototype accessor was meant\n * to answer, and set it again through the accessor. Only those - the widget's\n * own fields are not on the prototype, so they are left alone.\n *\n * Deliberately a plain function, not a method: happy-dom calls\n * connectedCallback without swapping the prototype, so `this` may not carry\n * the class's methods there. As a function it is a harmless no-op in that\n * case instead of a crash, and does the real work in a browser.\n *\n * Deliberately called from connectedCallback rather than the constructor: on\n * an upgrade the base constructor runs BEFORE the subclass field\n * initializers, which would wipe whatever the setter had just stored.\n */\nexport function upgradeOwnProperties(el: HTMLElement): void {\n\tconst proto = Object.getPrototypeOf(el) as object;\n\tconst bag = el as unknown as Record<string, unknown>;\n\tfor (const name of Object.getOwnPropertyNames(el)) {\n\t\tif (!(name in proto)) continue;\n\t\tconst value = bag[name];\n\t\tdelete bag[name];\n\t\tbag[name] = value;\n\t}\n}\n\nexport abstract class FlowWidget extends HTMLElement {\n\tprotected root: ShadowRoot;\n\tprivate styleEl: HTMLStyleElement;\n\tprivate body: HTMLDivElement;\n\tprivate overrides: WidgetLabels = {};\n\tprotected unsub: (() => void) | null = null;\n\n\t/** The widget's EN default strings; subclasses provide theirs. */\n\tprotected abstract defaults(): WidgetLabels;\n\t/** Translations shipped with the widget, by language subtag ('fr'). A widget\n\t * without any stays English until the host passes `labels`. */\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn {};\n\t}\n\t/** Build the current view into the given container. */\n\tprotected abstract view(into: HTMLElement): void;\n\n\t/** Follow an engine: rerender on every notification, replacing any previous\n\t * subscription. A no-op before connection and on a null host, so a host may\n\t * assign the store from a reactive effect that runs more than once. */\n\tprotected follow(host: FlowHost | null): void {\n\t\tthis.unsub?.();\n\t\tthis.unsub = null;\n\t\tif (!this.isConnected || !host) return;\n\t\tthis.unsub = host.engine.subscribe(() => this.rerender());\n\t\tthis.rerender();\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.root = this.attachShadow({ mode: 'open' });\n\t\tthis.styleEl = document.createElement('style');\n\t\tthis.styleEl.textContent = baseStyles;\n\t\tthis.body = document.createElement('div');\n\t\tthis.body.setAttribute('part', 'stack');\n\t\tthis.root.append(this.styleEl, this.body);\n\t}\n\n\t/** Partial override map, merged over the EN defaults (also the i18n hook). */\n\tget labels(): WidgetLabels {\n\t\treturn this.overrides;\n\t}\n\tset labels(map: WidgetLabels) {\n\t\tthis.overrides = map ?? {};\n\t\tthis.rerender();\n\t}\n\n\t/** The shipped translation for the page's language, if the widget has one.\n\t * An explicit `lang` on the element (or on any ancestor) wins over the\n\t * document's, which wins over the browser's, so a host that already sets\n\t * `<html lang>` gets translated copy without writing a single label. */\n\tprivate localized(): WidgetLabels {\n\t\tconst tag =\n\t\t\tthis.closest('[lang]')?.getAttribute('lang') ||\n\t\t\tdocument.documentElement.lang ||\n\t\t\tnavigator.language ||\n\t\t\t'';\n\t\treturn this.packs()[tag.slice(0, 2).toLowerCase()] ?? {};\n\t}\n\n\t/**\n\t * The copy for a key, with `{placeholders}` filled in.\n\t *\n\t * A status that cannot name WHERE it saved has to be read twice: once for the\n\t * state, once for the destination on another line. Interpolation lets a pack\n\t * write one sentence instead - and lets each language put the place where its\n\t * own grammar wants it, which a fixed \"state, then label\" layout cannot.\n\t * A placeholder with no value is left as written rather than blanked, so a\n\t * missing variable shows up instead of producing a sentence with a hole.\n\t */\n\tprotected t(key: string, vars?: Record<string, string | null | undefined>): string {\n\t\tconst copy = this.overrides[key] ?? this.localized()[key] ?? this.defaults()[key] ?? key;\n\t\tif (!vars) return copy;\n\t\treturn copy.replace(/\\{(\\w+)\\}/g, (whole, name: string) => vars[name] ?? whole);\n\t}\n\n\t/** A heading an empty-string label removes: labels = { 'share.title': '' }\n\t * hides that heading (the host page already says it) without a fork.\n\t * Append through put(), which skips the null. */\n\tprotected heading(part: string, key: string): HTMLElement | null {\n\t\tconst text = this.t(key);\n\t\treturn text ? h('div', { part }, text) : null;\n\t}\n\n\t/** Map a flow error to copy: labels can override per labelKey\n\t * ('error.targetUnavailable', ...), with a generic fallback. */\n\tprotected errorText(labelKey: string | undefined): string {\n\t\tif (labelKey) {\n\t\t\tconst specific =\n\t\t\t\tthis.overrides[labelKey] ?? this.localized()[labelKey] ?? this.defaults()[labelKey];\n\t\t\tif (specific) return specific;\n\t\t}\n\t\treturn this.t('error.generic');\n\t}\n\n\t/** Hands back whatever the host set before this class existed, then the\n\t * subclass reads its attributes and wires itself. Subclasses override this\n\t * and call `super.connectedCallback()` FIRST, for that reason. */\n\tconnectedCallback(): void {\n\t\tupgradeOwnProperties(this);\n\t}\n\n\tprotected emit(name: string, detail?: unknown): void {\n\t\tthis.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n\t}\n\n\t/** Rebuild the body, keeping the focused input's value and focus across the\n\t * rebuild (inputs carry data-keep so typing survives a snapshot change). */\n\tprotected rerender(): void {\n\t\t// happy-dom's ShadowRoot.activeElement throws once the focused node was\n\t\t// replaced by an earlier rebuild; browsers just report null/body.\n\t\tlet active: HTMLInputElement | null;\n\t\ttry {\n\t\t\tactive = this.root.activeElement as HTMLInputElement | null;\n\t\t} catch {\n\t\t\tactive = null;\n\t\t}\n\t\tconst keep = active?.getAttribute?.('data-keep') ?? null;\n\t\tconst value = active?.value;\n\t\tthis.body.replaceChildren();\n\t\tthis.view(this.body);\n\t\tif (keep != null) {\n\t\t\tconst again = this.body.querySelector<HTMLInputElement>(`[data-keep=\"${keep}\"]`);\n\t\t\tif (again) {\n\t\t\t\tif (value != null) again.value = value;\n\t\t\t\tagain.focus();\n\t\t\t}\n\t\t}\n\t}\n\n\tdisconnectedCallback(): void {\n\t\tthis.unsub?.();\n\t\tthis.unsub = null;\n\t}\n}\n","import { defaultIcons } from './icons';\n/**\n * <selfstore-connect>: the \"where does my data live\" journey, ready to drop\n * in. A thin skin over connectFlow - every ordering and failure rule lives in\n * the flow (and its tests); this element only renders the snapshot and calls\n * the actions. Theme it with --selfstore-* custom properties and ::part()\n * selectors; reword or localize it through the `labels` property.\n *\n * import { defineSelfstoreWidgets } from 'selfstore/widgets';\n * defineSelfstoreWidgets();\n *\n * const el = document.querySelector('selfstore-connect');\n * el.store = store; // simple store (or a FlowHost)\n * el.targets = { drive: gisDriveAuth({ clientId }), file: true };\n * el.addEventListener('selfstore-connected', (e) => ...e.detail.outcome...);\n */\n\nimport type { WebdavConfig } from '../persistence/targets/webdav';\nimport type { S3Config } from '../persistence/targets/s3';\nimport { isOpenSupported } from '../persistence/targets/file';\nimport {\n\tconnectFlow,\n\ttype ConnectFlow,\n\ttype ConnectFlowOptions,\n\ttype ConnectKind,\n\ttype ConnectSnapshot,\n\ttype ConnectTargets,\n\ttype ResumeOffer,\n\ttype StoreLike\n} from '../flows/connect';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\n/** A named WebDAV provider offered in the connect form's quick-pick row, so a\n * user can start from their host instead of a blank URL field. selfstore ships\n * no list - the app supplies whichever providers it wants to surface (its own\n * server, a sovereign host, ...); the widget just renders them and pre-fills the\n * URL field on pick. Pure UI sugar over the same WebDAV form. */\nexport interface WebdavPreset {\n\t/** Stable id (also the `data-preset` attribute, for theming/tests). */\n\tid: string;\n\t/** Button text: the provider or host name. */\n\tlabel: string;\n\t/** Base server URL that pre-fills the WebDAV URL field when picked. Omit for a\n\t * label-only entry (the user then types the full URL themselves). */\n\turl?: string;\n\t/** Optional guidance, shown as a line under the form once this preset is\n\t * picked (e.g. where to find the app password for this host) and as the\n\t * quick-pick button's tooltip. */\n\thelp?: string;\n\t/** Optional link appended to the `help` line (e.g. a how-to page). */\n\thelpUrl?: string;\n\t/** Optional \"create an account\" link shown once this preset is picked, for a\n\t * user who has no account with the host yet. The app owns the URL; selfstore\n\t * hard-codes no provider. */\n\tsignupUrl?: string;\n}\n\nconst EN: WidgetLabels = {\n\t'connect.title': 'Where should we save your data?',\n\t'connect.recommended': 'Recommended',\n\t// The way back, and the rule under it. A host that can name the destination\n\t// overrides this with something less abstract (\"Resume my Google Drive\").\n\t'connect.resume': 'Resume my backup',\n\t'connect.or': 'or',\n\t'connect.drive': 'Google Drive',\n\t'connect.drive.sub': 'Available on all your devices',\n\t'connect.file': 'A file on this device',\n\t'connect.file.sub': 'Offline, you keep the file',\n\t'connect.file.new': 'New backup',\n\t'connect.file.open': 'Load an existing file',\n\t'connect.webdav': 'My own server (WebDAV)',\n\t'connect.webdav.sub': 'Nextcloud, ownCloud, yours',\n\t'connect.s3': 'My own bucket (S3)',\n\t'connect.s3.sub': 'Amazon S3, R2, B2, MinIO',\n\t'connect.server': 'My own server',\n\t'connect.server.sub': 'WebDAV or an S3 bucket you control',\n\t'connect.tab.webdav': 'WebDAV',\n\t'connect.tab.s3': 'S3',\n\t'connect.s3.endpoint': 'Endpoint URL',\n\t'connect.s3.region': 'Region',\n\t'connect.s3.bucket': 'Bucket',\n\t'connect.s3.key': 'Object key (path)',\n\t'connect.s3.accessKeyId': 'Access key ID',\n\t'connect.s3.secret': 'Secret access key',\n\t'connect.s3.submit': 'Connect',\n\t'connect.connecting': 'Connecting...',\n\t'connect.connecting.drive': 'Authorise access in the Google window.',\n\t'connect.cancel': 'Cancel',\n\t'connect.retry': 'Try again',\n\t'connect.password.title': 'This backup is protected',\n\t'connect.password.hint': 'Enter its password to open it.',\n\t'connect.password.placeholder': 'Password',\n\t'connect.password.wrong': 'Wrong password. Try again.',\n\t'connect.password.submit': 'Open',\n\t'connect.password.show': 'Show password',\n\t'connect.password.hide': 'Hide password',\n\t'connect.password.forgot': 'Forgot the password?',\n\t'connect.password.forgot.warn':\n\t\t'Without the password, this backup cannot be opened. You can erase it and start from an empty one. The old backup is lost for good.',\n\t'connect.password.forgot.confirm': 'Overwrite the backup',\n\t'connect.password.forgot.back': 'Back',\n\t'connect.conflict.title': 'This destination already holds a backup',\n\t'connect.conflict.merge': 'Merge both',\n\t'connect.conflict.merge.sub': 'Keep everything from both sides',\n\t'connect.conflict.resume': 'Use the backup',\n\t'connect.conflict.resume.sub': 'This device adopts it',\n\t'connect.conflict.replace': 'Replace the backup',\n\t'connect.conflict.replace.sub': 'This device wins, the backup is overwritten',\n\t'connect.webdav.url': 'Server URL',\n\t'connect.webdav.user': 'Username',\n\t'connect.webdav.password': 'Password',\n\t'connect.webdav.submit': 'Connect',\n\t'connect.webdav.signup': 'Create an account',\n\t'connect.webdav.help.more': 'How?',\n\t'connect.done': 'Connected. Your data is saved.',\n\t'connect.done.manual': 'Download mode: this browser cannot keep the file open.',\n\t'error.generic': 'That did not work. Check the connection and try again.',\n\t'error.targetUnavailable': 'The destination did not answer. Try again in a moment.',\n\t'error.authExpired': 'Access expired: reconnect to continue.',\n\t'error.decryptFailed': 'This backup could not be opened with that password.',\n\t'error.badFormat': 'This file does not look like a readable backup.',\n\t'error.foreignBackup':\n\t\t'This backup belongs to a different app. Open it in the app that created it.'\n};\n\n// The lexicon this pack holds to: the durable destination is \"la sauvegarde\",\n// the live copy is \"cet appareil\" (never a place the user can pick), the\n// portable file is an \"export\". One verb, one meaning. The act that loses\n// nothing opens with \"Tout garder\"; the ones that overwrite open with\n// \"Remplacer\", so the first word alone says whether something is lost.\n// lexicon.test.ts holds every pack to the first rule: stated in a comment, it\n// had already drifted in two strings before anyone noticed.\nconst FR: WidgetLabels = {\n\t'connect.title': 'Où enregistrer vos données ?',\n\t'connect.recommended': 'Recommandé',\n\t'connect.resume': 'Reprendre ma sauvegarde',\n\t'connect.or': 'ou',\n\t'connect.drive': 'Google Drive',\n\t'connect.drive.sub': 'Disponible sur tous vos appareils',\n\t'connect.file': 'Un fichier sur cet appareil',\n\t'connect.file.sub': 'Hors ligne, le fichier reste chez vous',\n\t'connect.file.new': 'Nouvelle sauvegarde',\n\t'connect.file.open': 'Ouvrir un fichier existant',\n\t'connect.webdav': 'Mon serveur (WebDAV)',\n\t'connect.webdav.sub': 'Nextcloud, ownCloud, le vôtre',\n\t'connect.s3': 'Mon bucket (S3)',\n\t'connect.s3.sub': 'Amazon S3, R2, B2, MinIO',\n\t'connect.server': 'Mon serveur',\n\t'connect.server.sub': 'WebDAV ou un bucket S3 que vous contrôlez',\n\t'connect.tab.webdav': 'WebDAV',\n\t'connect.tab.s3': 'S3',\n\t'connect.s3.endpoint': \"URL du point d'accès\",\n\t'connect.s3.region': 'Région',\n\t'connect.s3.bucket': 'Bucket',\n\t'connect.s3.key': 'Chemin du fichier',\n\t'connect.s3.accessKeyId': \"Identifiant de la clé d'accès\",\n\t'connect.s3.secret': 'Clé secrète',\n\t'connect.s3.submit': 'Connecter',\n\t'connect.connecting': 'Connexion en cours...',\n\t'connect.connecting.drive': \"Autorisez l'accès dans la fenêtre Google.\",\n\t'connect.cancel': 'Annuler',\n\t'connect.retry': 'Réessayer',\n\t'connect.password.title': 'Cette sauvegarde est protégée',\n\t'connect.password.hint': \"Entrez son mot de passe pour l'ouvrir.\",\n\t'connect.password.placeholder': 'Mot de passe',\n\t'connect.password.wrong': 'Mot de passe incorrect. Réessayez.',\n\t'connect.password.submit': 'Ouvrir',\n\t'connect.password.show': 'Afficher le mot de passe',\n\t'connect.password.hide': 'Masquer le mot de passe',\n\t'connect.password.forgot': 'Mot de passe oublié ?',\n\t'connect.password.forgot.warn':\n\t\t\"Sans le mot de passe, cette sauvegarde ne peut pas être ouverte. Vous pouvez repartir d'une sauvegarde vide : l'ancienne sera perdue définitivement.\",\n\t'connect.password.forgot.confirm': 'Remplacer la sauvegarde',\n\t'connect.password.forgot.back': 'Retour',\n\t'connect.conflict.title': 'Une sauvegarde existe déjà ici',\n\t'connect.conflict.merge': 'Tout garder',\n\t'connect.conflict.merge.sub': 'Réunir la sauvegarde et les données de cet appareil',\n\t'connect.conflict.resume': 'Utiliser la sauvegarde',\n\t'connect.conflict.resume.sub': 'Cet appareil adopte la sauvegarde existante',\n\t'connect.conflict.replace': 'Remplacer la sauvegarde',\n\t'connect.conflict.replace.sub': 'Les données de cet appareil écrasent la sauvegarde',\n\t'connect.webdav.url': 'URL du serveur',\n\t'connect.webdav.user': 'Identifiant',\n\t'connect.webdav.password': 'Mot de passe',\n\t'connect.webdav.submit': 'Connecter',\n\t'connect.webdav.signup': 'Créer un compte',\n\t'connect.webdav.help.more': 'Comment faire ?',\n\t'connect.done': 'Connecté. Vos données sont enregistrées.',\n\t'connect.done.manual': 'Mode export : ce navigateur ne peut pas garder le fichier ouvert.',\n\t'error.generic': \"Cela n'a pas fonctionné. Vérifiez la connexion et réessayez.\",\n\t'error.targetUnavailable': 'La sauvegarde ne répond pas. Réessayez dans un instant.',\n\t'error.authExpired': 'Accès expiré : reconnectez-vous pour continuer.',\n\t'error.decryptFailed': \"Cette sauvegarde n'a pas pu être ouverte avec ce mot de passe.\",\n\t'error.badFormat': 'Ce fichier ne ressemble pas à une sauvegarde lisible.',\n\t'error.foreignBackup':\n\t\t\"Cette sauvegarde appartient à une autre application. Ouvrez-la dans l'application qui l'a créée.\"\n};\n\n// Two glyphs for the password eye: an open eye when the value is hidden (click\n// to reveal), a struck-through eye when it is shown (click to hide). Plain\n// stroke SVG, currentColor, so they inherit the host's text color like any icon.\nconst EYE_SHOW =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 12s3-8 10-8 10 8 10 8-3 8-10 8-10-8-10-8Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>';\nconst EYE_HIDE =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 10 8 10 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/><path d=\"M6.61 6.61A18.45 18.45 0 0 0 2 12s3 8 10 8a9.12 9.12 0 0 0 5.39-1.61\"/><line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\"/></svg>';\n\n/** Build the eye glyph for the current visibility (shown value -> struck eye). */\nfunction eyeIcon(visible: boolean): SVGElement {\n\tconst span = document.createElement('span');\n\tspan.innerHTML = visible ? EYE_HIDE : EYE_SHOW;\n\treturn span.firstElementChild as SVGElement;\n}\n\nexport class SelfstoreConnectElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['recommended', 'advanced'];\n\t}\n\n\t#store: StoreLike | null = null;\n\t#targets: ConnectTargets | null = null;\n\t#options: ConnectFlowOptions = {};\n\t#flow: ConnectFlow | null = null;\n\t#recommended: ConnectKind | null = null;\n\t#icons: Partial<Record<ConnectKind, string>> = {};\n\t#advanced: ConnectKind[] = [];\n\t#webdavPresets: WebdavPreset[] = [];\n\t#webdavUrl = '';\n\t#webdavUser = '';\n\t#webdavPass = '';\n\t#pickedPreset: WebdavPreset | null = null;\n\t// S3 form fields (kept on the element, like the WebDAV ones, so switching the\n\t// server tab never loses what was typed).\n\t#s3Endpoint = '';\n\t#s3Region = '';\n\t#s3Bucket = '';\n\t#s3Key = '';\n\t#s3AccessKeyId = '';\n\t#s3Secret = '';\n\t// Password-step local UI state (never in the flow: purely how this element\n\t// draws the step). Reset whenever the flow leaves 'password' (see wire()).\n\t#pwVisible = false;\n\t#confirmOverwrite = false;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\t/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */\n\tget store(): StoreLike | null {\n\t\treturn this.#store;\n\t}\n\tset store(v: StoreLike | null) {\n\t\t// Assigning the SAME handle is a no-op, so a host can write\n\t\t// `el.store = app.store` inside a reactive effect and let it run as often\n\t\t// as the framework likes. Without this the setter rebuilt the flow every\n\t\t// time, dropping a journey in progress - which forced every host to invent\n\t\t// a \"wire once\" guard, and a guard keyed on the element (the obvious\n\t\t// shape) then swallowed the real assignment when the store was created\n\t\t// after the widget. The widget owes the host this, not the other way round.\n\t\tif (v === this.#store) return;\n\t\tthis.#store = v;\n\t\tthis.wire();\n\t}\n\n\tget targets(): ConnectTargets | null {\n\t\treturn this.#targets;\n\t}\n\tset targets(v: ConnectTargets | null) {\n\t\tthis.#targets = v;\n\t\tthis.wire();\n\t}\n\n\tget options(): ConnectFlowOptions {\n\t\treturn this.#options;\n\t}\n\tset options(v: ConnectFlowOptions) {\n\t\tthis.#options = v ?? {};\n\t\tthis.wire();\n\t}\n\n\t/** Badge one destination as the one to pick (part=\"tag\", label\n\t * 'connect.recommended'). Purely a highlight: the order still follows the\n\t * targets object. Also the `recommended` attribute. Default: none. */\n\tget recommended(): ConnectKind | null {\n\t\treturn this.#recommended;\n\t}\n\tset recommended(v: ConnectKind | null) {\n\t\tthis.#recommended = v === 'drive' || v === 'file' || v === 'webdav' || v === 's3' ? v : null;\n\t\tthis.rerender();\n\t}\n\n\t/** An optional icon per destination - an image URL or data URI, rendered as\n\t * part=\"icon\" at the head of that card. Purely decorative and per-instance;\n\t * omit a kind for no icon. Size it with --selfstore-icon-size. */\n\tget icons(): Partial<Record<ConnectKind, string>> {\n\t\treturn this.#icons;\n\t}\n\tset icons(v: Partial<Record<ConnectKind, string>> | null) {\n\t\tthis.#icons = v ?? {};\n\t\tthis.rerender();\n\t}\n\n\t/** Destinations to tuck behind a discreet link under the cards instead of a\n\t * full card - for power-user options (say, WebDAV) that must stay reachable\n\t * without weighing the everyday choice. Also the `advanced` attribute\n\t * (comma-separated). The journey after the click is exactly the same. */\n\tget advanced(): ConnectKind[] {\n\t\treturn this.#advanced;\n\t}\n\tset advanced(v: ConnectKind[] | null) {\n\t\tthis.#advanced = (v ?? []).filter(\n\t\t\t(k) => k === 'drive' || k === 'file' || k === 'webdav' || k === 's3'\n\t\t);\n\t\tthis.rerender();\n\t}\n\n\t/** Named WebDAV providers offered as a quick-pick row above the WebDAV form,\n\t * pre-filling the URL field. The app owns the list (its own host, sovereign\n\t * providers, ...); selfstore ships none. Purely additive - the blank form\n\t * still works. */\n\tget webdavPresets(): WebdavPreset[] {\n\t\treturn this.#webdavPresets;\n\t}\n\tset webdavPresets(v: WebdavPreset[] | null) {\n\t\tthis.#webdavPresets = Array.isArray(v) ? v : [];\n\t\tthis.rerender();\n\t}\n\n\t/** The underlying flow, for programmatic control (may be null until wired). */\n\tget flow(): ConnectFlow | null {\n\t\treturn this.#flow;\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'recommended') this.recommended = value as ConnectKind | null;\n\t\tif (name === 'advanced') {\n\t\t\tthis.advanced = (value ?? '').split(',').map((s) => s.trim()) as ConnectKind[];\n\t\t}\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tif (this.#recommended === null && this.hasAttribute('recommended')) {\n\t\t\tthis.recommended = this.getAttribute('recommended') as ConnectKind;\n\t\t}\n\t\tif (this.#advanced.length === 0 && this.hasAttribute('advanced')) {\n\t\t\tthis.advanced = (this.getAttribute('advanced') ?? '')\n\t\t\t\t.split(',')\n\t\t\t\t.map((s) => s.trim()) as ConnectKind[];\n\t\t}\n\t\tthis.wire();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#store || !this.#targets) return;\n\t\tthis.unsub?.();\n\t\tthis.#flow = connectFlow(this.#store, this.#targets, this.#options);\n\t\tlet last: ConnectSnapshot | null = null;\n\t\tthis.unsub = this.#flow.subscribe((snap) => {\n\t\t\tconst was = last;\n\t\t\tlast = snap;\n\t\t\tif (snap.step === 'connected' && was?.step !== 'connected') {\n\t\t\t\tthis.emit('selfstore-connected', { outcome: snap.outcome });\n\t\t\t}\n\t\t\tif (snap.step === 'error' && was?.step !== 'error') {\n\t\t\t\tthis.emit('selfstore-error', { error: snap.error });\n\t\t\t}\n\t\t\t// Leaving the password step clears its local UI state, so a later\n\t\t\t// return starts masked and on the form (not on a stale confirmation).\n\t\t\tif (snap.step !== 'password') {\n\t\t\t\tthis.#pwVisible = false;\n\t\t\t\tthis.#confirmOverwrite = false;\n\t\t\t}\n\t\t\tthis.rerender();\n\t\t});\n\t}\n\n\t/**\n\t * The destination choice: the way back first, then a rule, then the ways\n\t * forward.\n\t *\n\t * Its own method because `view` covers every step of the journey and was at\n\t * the complexity cap; this is the step that keeps growing, since it is the\n\t * one the host shapes.\n\t */\n\tprivate viewChoose(into: HTMLElement, s: ConnectSnapshot): void {\n\t\tput(into, this.heading('title', 'connect.title'));\n\t\t// Everything above the rule reopens what this device already had,\n\t\t// everything below starts something. Two groups the eye separates\n\t\t// before reading either.\n\t\tconst offer = this.#options.resume;\n\t\tif (offer) {\n\t\t\tinto.append(this.resumeCard(offer));\n\t\t\tinto.append(h('div', { part: 'separator' }, h('span', {}, this.t('connect.or'))));\n\t\t}\n\t\t// WebDAV and S3 are both \"your own server\": when both are offered as\n\t\t// cards, fold them into one entry that opens the tabbed form, so a new\n\t\t// backend never adds another top-level button.\n\t\tconst serverKinds = (['webdav', 's3'] as const).filter(\n\t\t\t(k) => s.kinds.includes(k) && !this.#advanced.includes(k)\n\t\t);\n\t\tconst groupServer = serverKinds.length >= 2;\n\t\tfor (const kind of s.kinds) {\n\t\t\tif (this.#advanced.includes(kind)) continue;\n\t\t\tif (groupServer && (kind === 'webdav' || kind === 's3')) {\n\t\t\t\tif (kind === serverKinds[0]) into.append(this.serverCard(serverKinds[0]));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tinto.append(this.destCard(kind));\n\t\t}\n\t\t// The tucked-away destinations: same journey, discreet entry.\n\t\tfor (const kind of s.kinds) {\n\t\t\tif (!this.#advanced.includes(kind)) continue;\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'link advanced-link',\n\t\t\t\t\t\t'data-kind': kind,\n\t\t\t\t\t\tonclick: () => this.#flow?.choose(kind)\n\t\t\t\t\t},\n\t\t\t\t\tthis.t(`connect.${kind}`)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst flow = this.#flow;\n\t\tif (!flow) return; // inert until wired\n\t\tconst s = flow.snapshot;\n\n\t\tif (s.step === 'choose') {\n\t\t\tthis.viewChoose(into, s);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'form') {\n\t\t\tconst kind = s.kind === 's3' ? 's3' : 'webdav';\n\t\t\t// The WebDAV/S3 toggle shows only when both are offered as form kinds\n\t\t\t// (a fixed config skips the form and never reaches here).\n\t\t\tconst tabbed =\n\t\t\t\t(['webdav', 's3'] as const).filter((k) => this.#targets?.[k] === true).length >= 2;\n\t\t\tconst children: HTMLElement[] = [\n\t\t\t\th('div', { part: 'title' }, this.t(tabbed ? 'connect.server' : `connect.${kind}`))\n\t\t\t];\n\t\t\tif (tabbed) children.push(this.serverTabs(kind));\n\t\t\tchildren.push(...(kind === 's3' ? this.s3FormChildren(flow) : this.webdavFormChildren(flow)));\n\t\t\tinto.append(...children);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'authorizing') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status' },\n\t\t\t\t\th('span', { part: 'spinner', 'aria-hidden': 'true' }),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{},\n\t\t\t\t\t\th('div', { part: 'title' }, this.t('connect.connecting')),\n\t\t\t\t\t\ts.kind === 'drive'\n\t\t\t\t\t\t\t? h('div', { part: 'sub' }, this.t('connect.connecting.drive'))\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t),\n\t\t\t\t\th('button', { part: 'button', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'password') {\n\t\t\t// Escape sub-state: the password is forgotten - confirm erasing the\n\t\t\t// protected backup before overwrite() makes it unrecoverable.\n\t\t\tif (this.#confirmOverwrite) {\n\t\t\t\tput(\n\t\t\t\t\tinto,\n\t\t\t\t\th('div', { part: 'title' }, this.t('connect.password.title')),\n\t\t\t\t\th('div', { part: 'hint warn-note' }, this.t('connect.password.forgot.warn')),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'button button-danger', disabled: s.busy, onclick: () => this.doOverwrite() },\n\t\t\t\t\t\t\tthis.t('connect.password.forgot.confirm')\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'button', disabled: s.busy, onclick: () => this.setConfirmOverwrite(false) },\n\t\t\t\t\t\t\tthis.t('connect.password.forgot.back')\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// The password field wears a show/hide eye. The eye toggles the input\n\t\t\t// type in place (never a re-render) so the typed value is never lost.\n\t\t\tconst field = h(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'field' },\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\ttype: this.#pwVisible ? 'text' : 'password',\n\t\t\t\t\tplaceholder: this.t('connect.password.placeholder'),\n\t\t\t\t\t'data-keep': 'password',\n\t\t\t\t\tautocomplete: 'current-password'\n\t\t\t\t}),\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'eye',\n\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t'aria-label': this.t(\n\t\t\t\t\t\t\tthis.#pwVisible ? 'connect.password.hide' : 'connect.password.show'\n\t\t\t\t\t\t),\n\t\t\t\t\t\t'aria-pressed': this.#pwVisible ? 'true' : 'false',\n\t\t\t\t\t\tonclick: () => this.togglePassword()\n\t\t\t\t\t},\n\t\t\t\t\teyeIcon(this.#pwVisible)\n\t\t\t\t)\n\t\t\t);\n\t\t\tput(\n\t\t\t\tinto,\n\t\t\t\th('div', { part: 'title' }, this.t('connect.password.title')),\n\t\t\t\th('div', { part: 'hint' }, this.t('connect.password.hint')),\n\t\t\t\tfield,\n\t\t\t\ts.passwordError ? h('div', { part: 'error-note' }, this.t('connect.password.wrong')) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\tdisabled: s.busy,\n\t\t\t\t\t\t\tonclick: () => this.submitPassword()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('connect.password.submit')\n\t\t\t\t\t),\n\t\t\t\t\t// Cancel is never disabled, even mid-trial-read: a hung leg must\n\t\t\t\t\t// always have a working way out. The generation counter makes a\n\t\t\t\t\t// late resolution of the abandoned leg a no-op, so leaving is safe.\n\t\t\t\t\th('button', { part: 'button', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t\t),\n\t\t\t\t// The forgotten-password escape: a discreet link into the confirm\n\t\t\t\t// sub-state above (erasing the backup is never one careless click).\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'link forgot-link', onclick: () => this.setConfirmOverwrite(true) },\n\t\t\t\t\tthis.t('connect.password.forgot')\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'conflict') {\n\t\t\tinto.append(h('div', { part: 'title' }, this.t('connect.conflict.title')));\n\t\t\tfor (const how of ['merge', 'resume', 'replace'] as const) {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{ part: 'card', disabled: s.busy, onclick: () => flow.resolveConflict(how) },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{},\n\t\t\t\t\t\t\th('div', { part: 'title' }, this.t(`connect.conflict.${how}`)),\n\t\t\t\t\t\t\th('div', { part: 'sub' }, this.t(`connect.conflict.${how}.sub`))\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tinto.append(\n\t\t\t\th('button', { part: 'link', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'connected') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status status-ok' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\t\tthis.t(s.outcome === 'manual' ? 'connect.done.manual' : 'connect.done')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// error: retry goes back to the choices; cancel is always offered too, so\n\t\t// a failing destination is never a dead end (the host hears\n\t\t// selfstore-cancelled and can dismiss the widget entirely).\n\t\tinto.append(\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'status status-error' },\n\t\t\t\th('div', { part: 'title' }, this.errorText(s.error?.labelKey))\n\t\t\t),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button button-primary', onclick: () => flow.retry() },\n\t\t\t\t\tthis.t('connect.retry')\n\t\t\t\t),\n\t\t\t\th('button', { part: 'button', onclick: () => this.cancel() }, this.t('connect.cancel'))\n\t\t\t)\n\t\t);\n\t}\n\n\t/**\n\t * A form field that keeps its name once you start typing.\n\t *\n\t * These were placeholders only: the label vanished at the first keystroke, so\n\t * anyone who paused mid-form had to clear a field to remember what it wanted,\n\t * and a screen reader announced three unnamed boxes. A placeholder is a hint,\n\t * never a label.\n\t */\n\tprivate labelled(labelKey: string, input: HTMLElement): HTMLElement {\n\t\treturn h('label', { part: 'labelled' }, h('span', { part: 'label' }, this.t(labelKey)), input);\n\t}\n\n\t/**\n\t * The destination this device already used, first and on its own.\n\t *\n\t * It carries the same shape as an ordinary card so nothing new has to be\n\t * styled, and the host's icon for that kind, so it reads as the same place\n\t * rather than a fourth option. Its second line names WHICH backup - without\n\t * that, \"resume my backup\" is one more thing to wonder about.\n\t */\n\tprivate resumeCard(offer: ResumeOffer): HTMLElement {\n\t\tconst icon = this.#icons[offer.kind] ?? defaultIcons[offer.kind];\n\t\tconst head = icon ? h('img', { part: 'icon', src: icon, alt: '' }) : null;\n\t\tconst title = h('div', { part: 'title' }, this.t('connect.resume'));\n\t\tconst sub = offer.detail ? h('div', { part: 'sub' }, offer.detail) : null;\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{\n\t\t\t\tpart: 'card resume-card',\n\t\t\t\t'data-kind': offer.kind,\n\t\t\t\tonclick: () => this.#flow?.resume()\n\t\t\t},\n\t\t\thead,\n\t\t\th('div', {}, title, sub)\n\t\t);\n\t}\n\n\tprivate destCard(kind: ConnectKind): HTMLElement {\n\t\t// A host icon wins; the shipped glyph only fills a card that would\n\t\t// otherwise render bare.\n\t\tconst icon = this.#icons[kind] ?? defaultIcons[kind];\n\t\tconst head = icon ? h('img', { part: 'icon', src: icon, alt: '' }) : null;\n\t\tconst title = h(\n\t\t\t'div',\n\t\t\t{ part: 'title' },\n\t\t\tthis.t(`connect.${kind}`),\n\t\t\tthis.#recommended === kind ? h('span', { part: 'tag' }, this.t('connect.recommended')) : null\n\t\t);\n\t\tconst sub = h('div', { part: 'sub' }, this.t(`connect.${kind}.sub`));\n\n\t\t// A file target declared with the object form offers TWO gestures on one\n\t\t// card: start a new backup, or adopt an existing file. Buttons cannot\n\t\t// nest, so this card is a div carrying its own action row. The open\n\t\t// gesture needs the browser's open picker; without it only new remains.\n\t\tconst fileSpec = kind === 'file' ? this.#targets?.file : null;\n\t\tif (fileSpec && typeof fileSpec === 'object') {\n\t\t\t// Asked to the target, not to `window`: a browser can ship the picker and\n\t\t\t// refuse to open it, and only the target remembers that refusal. Testing\n\t\t\t// presence here left a button that answered nothing, forever.\n\t\t\tconst openSupported = isOpenSupported();\n\t\t\tconst actions = h('div', { part: 'row' });\n\t\t\tif (fileSpec.create != null) {\n\t\t\t\tactions.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'create',\n\t\t\t\t\t\t\tonclick: () => this.#flow?.choose('file', 'create')\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('connect.file.new')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (fileSpec.open != null && (typeof fileSpec.open === 'function' || openSupported)) {\n\t\t\t\tactions.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t'data-action': 'open',\n\t\t\t\t\t\t\tonclick: () => this.#flow?.choose('file', 'open')\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('connect.file.open')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst body = h('div', {}, title, sub);\n\t\t\tif (actions.childElementCount > 0) body.append(actions);\n\t\t\treturn h('div', { part: 'card', 'data-kind': kind }, head, body);\n\t\t}\n\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{ part: 'card', 'data-kind': kind, onclick: () => this.#flow?.choose(kind) },\n\t\t\thead,\n\t\t\th('div', {}, title, sub)\n\t\t);\n\t}\n\n\t/** The grouped \"your own server\" card shown when both WebDAV and S3 are\n\t * offered: one entry into the tabbed form, opening on the first server kind. */\n\tprivate serverCard(defaultKind: ConnectKind): HTMLElement {\n\t\tconst recommended = this.#recommended === 'webdav' || this.#recommended === 's3';\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{ part: 'card', 'data-kind': 'server', onclick: () => this.#flow?.choose(defaultKind) },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{},\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\tthis.t('connect.server'),\n\t\t\t\t\trecommended ? h('span', { part: 'tag' }, this.t('connect.recommended')) : null\n\t\t\t\t),\n\t\t\t\th('div', { part: 'sub' }, this.t('connect.server.sub'))\n\t\t\t)\n\t\t);\n\t}\n\n\t/** WebDAV/S3 segmented toggle. Switching leaves the form and re-enters it on\n\t * the other kind - no flow surgery - and the typed fields live on the element,\n\t * so nothing the user wrote is lost across the switch. */\n\tprivate serverTabs(active: ConnectKind): HTMLElement {\n\t\tconst tab = (k: 'webdav' | 's3'): HTMLElement =>\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{\n\t\t\t\t\tpart: active === k ? 'tab tab-on' : 'tab',\n\t\t\t\t\ttype: 'button',\n\t\t\t\t\t'data-tab': k,\n\t\t\t\t\t'aria-pressed': active === k ? 'true' : 'false',\n\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\tif (active === k) return;\n\t\t\t\t\t\tthis.#flow?.cancel();\n\t\t\t\t\t\tthis.#flow?.choose(k);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tthis.t(`connect.tab.${k}`)\n\t\t\t);\n\t\treturn h('div', { part: 'tabs' }, tab('webdav'), tab('s3'));\n\t}\n\n\tprivate webdavFormChildren(flow: ConnectFlow): HTMLElement[] {\n\t\tconst picked = this.#pickedPreset;\n\t\tconst out: HTMLElement[] = [];\n\t\t// Optional quick-pick row: the app's WebDAV providers, pre-filling the URL.\n\t\tif (this.#webdavPresets.length > 0) {\n\t\t\tout.push(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'presets' },\n\t\t\t\t\t...this.#webdavPresets.map((p) =>\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: picked?.id === p.id ? 'preset preset-on' : 'preset',\n\t\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t\t'data-preset': p.id,\n\t\t\t\t\t\t\t\t'aria-pressed': picked?.id === p.id ? 'true' : 'false',\n\t\t\t\t\t\t\t\ttitle: p.help ?? '',\n\t\t\t\t\t\t\t\tonclick: () => this.pickWebdavPreset(p)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tp.label\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tout.push(\n\t\t\tthis.labelled(\n\t\t\t\t'connect.webdav.url',\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\ttype: 'url',\n\t\t\t\t\t'data-keep': 'wd-url',\n\t\t\t\t\tvalue: this.#webdavUrl,\n\t\t\t\t\toninput: (e: Event) => (this.#webdavUrl = (e.target as HTMLInputElement).value)\n\t\t\t\t})\n\t\t\t),\n\t\t\tthis.labelled(\n\t\t\t\t'connect.webdav.user',\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\t'data-keep': 'wd-user',\n\t\t\t\t\tvalue: this.#webdavUser,\n\t\t\t\t\toninput: (e: Event) => (this.#webdavUser = (e.target as HTMLInputElement).value)\n\t\t\t\t})\n\t\t\t),\n\t\t\tthis.labelled(\n\t\t\t\t'connect.webdav.password',\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\ttype: 'password',\n\t\t\t\t\t'data-keep': 'wd-pass',\n\t\t\t\t\tvalue: this.#webdavPass,\n\t\t\t\t\toninput: (e: Event) => (this.#webdavPass = (e.target as HTMLInputElement).value)\n\t\t\t\t})\n\t\t\t)\n\t\t);\n\t\t// A picked provider may carry guidance and a sign-up link (no account yet).\n\t\tif (picked?.help) {\n\t\t\tout.push(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'hint webdav-note' },\n\t\t\t\t\tpicked.help,\n\t\t\t\t\tpicked.helpUrl\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'a',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpart: 'link webdav-help',\n\t\t\t\t\t\t\t\t\thref: picked.helpUrl,\n\t\t\t\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\t\t\t\trel: 'noopener noreferrer'\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t` ${this.t('connect.webdav.help.more')}`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tout.push(\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button button-primary', onclick: () => this.submitWebdav() },\n\t\t\t\t\tthis.t('connect.webdav.submit')\n\t\t\t\t),\n\t\t\t\th('button', { part: 'button', onclick: () => flow.cancel() }, this.t('connect.cancel'))\n\t\t\t)\n\t\t);\n\t\tif (picked?.signupUrl) {\n\t\t\tout.push(\n\t\t\t\th(\n\t\t\t\t\t'a',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'link webdav-signup',\n\t\t\t\t\t\thref: picked.signupUrl,\n\t\t\t\t\t\ttarget: '_blank',\n\t\t\t\t\t\trel: 'noopener noreferrer'\n\t\t\t\t\t},\n\t\t\t\t\tthis.t('connect.webdav.signup')\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate s3FormChildren(flow: ConnectFlow): HTMLElement[] {\n\t\tconst field = (\n\t\t\ttype: string,\n\t\t\tlabel: string,\n\t\t\tkeep: string,\n\t\t\tget: () => string,\n\t\t\tset: (v: string) => void\n\t\t): HTMLElement =>\n\t\t\tthis.labelled(\n\t\t\t\tlabel,\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\ttype,\n\t\t\t\t\t'data-keep': keep,\n\t\t\t\t\tvalue: get(),\n\t\t\t\t\toninput: (e: Event) => set((e.target as HTMLInputElement).value)\n\t\t\t\t})\n\t\t\t);\n\t\treturn [\n\t\t\tfield(\n\t\t\t\t'url',\n\t\t\t\t'connect.s3.endpoint',\n\t\t\t\t's3-endpoint',\n\t\t\t\t() => this.#s3Endpoint,\n\t\t\t\t(v) => (this.#s3Endpoint = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'text',\n\t\t\t\t'connect.s3.region',\n\t\t\t\t's3-region',\n\t\t\t\t() => this.#s3Region,\n\t\t\t\t(v) => (this.#s3Region = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'text',\n\t\t\t\t'connect.s3.bucket',\n\t\t\t\t's3-bucket',\n\t\t\t\t() => this.#s3Bucket,\n\t\t\t\t(v) => (this.#s3Bucket = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'text',\n\t\t\t\t'connect.s3.key',\n\t\t\t\t's3-key',\n\t\t\t\t() => this.#s3Key,\n\t\t\t\t(v) => (this.#s3Key = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'text',\n\t\t\t\t'connect.s3.accessKeyId',\n\t\t\t\t's3-akid',\n\t\t\t\t() => this.#s3AccessKeyId,\n\t\t\t\t(v) => (this.#s3AccessKeyId = v)\n\t\t\t),\n\t\t\tfield(\n\t\t\t\t'password',\n\t\t\t\t'connect.s3.secret',\n\t\t\t\t's3-secret',\n\t\t\t\t() => this.#s3Secret,\n\t\t\t\t(v) => (this.#s3Secret = v)\n\t\t\t),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button button-primary', onclick: () => this.submitS3() },\n\t\t\t\t\tthis.t('connect.s3.submit')\n\t\t\t\t),\n\t\t\t\th('button', { part: 'button', onclick: () => flow.cancel() }, this.t('connect.cancel'))\n\t\t\t)\n\t\t];\n\t}\n\n\tprivate submitS3(): void {\n\t\tconst endpoint = this.#s3Endpoint.trim();\n\t\tconst region = this.#s3Region.trim();\n\t\tconst bucket = this.#s3Bucket.trim();\n\t\tconst key = this.#s3Key.trim();\n\t\tif (!endpoint || !region || !bucket || !key) return;\n\t\tconst config: S3Config = {\n\t\t\tendpoint,\n\t\t\tregion,\n\t\t\tbucket,\n\t\t\tkey,\n\t\t\taccessKeyId: this.#s3AccessKeyId.trim(),\n\t\t\tsecretAccessKey: this.#s3Secret\n\t\t};\n\t\tthis.#flow?.submitS3(config);\n\t}\n\n\tprivate cancel(): void {\n\t\tthis.#flow?.cancel();\n\t\tthis.emit('selfstore-cancelled');\n\t}\n\n\tprivate submitPassword(): void {\n\t\tconst input = this.root.querySelector<HTMLInputElement>('[data-keep=\"password\"]');\n\t\tif (input) this.#flow?.submitPassword(input.value);\n\t}\n\n\t/** Flip the password field between hidden and shown IN PLACE - swap the\n\t * input type and the eye glyph without a re-render, so what the user has\n\t * already typed survives the toggle. */\n\tprivate togglePassword(): void {\n\t\tthis.#pwVisible = !this.#pwVisible;\n\t\tconst input = this.root.querySelector<HTMLInputElement>('[data-keep=\"password\"]');\n\t\tif (input) {\n\t\t\tinput.type = this.#pwVisible ? 'text' : 'password';\n\t\t\tinput.focus();\n\t\t}\n\t\tconst eye = this.root.querySelector<HTMLButtonElement>('[part~=\"eye\"]');\n\t\tif (eye) {\n\t\t\teye.setAttribute(\n\t\t\t\t'aria-label',\n\t\t\t\tthis.t(this.#pwVisible ? 'connect.password.hide' : 'connect.password.show')\n\t\t\t);\n\t\t\teye.setAttribute('aria-pressed', this.#pwVisible ? 'true' : 'false');\n\t\t\teye.replaceChildren(eyeIcon(this.#pwVisible));\n\t\t}\n\t}\n\n\t/** Enter or leave the forgotten-password confirmation sub-state. */\n\tprivate setConfirmOverwrite(on: boolean): void {\n\t\tthis.#confirmOverwrite = on;\n\t\tthis.rerender();\n\t}\n\n\t/** Confirmed: abandon the forgotten password and start a fresh backup over\n\t * the protected one (the flow makes this device win). */\n\tprivate doOverwrite(): void {\n\t\tthis.#flow?.overwrite();\n\t}\n\n\t/** Fill the WebDAV URL field from a picked provider preset and move focus on to\n\t * the username, so the pick just seeds the form the user then completes. The\n\t * pick is remembered so its guidance / sign-up link render and its chip flags\n\t * as active; a re-render keeps the already-typed username and password. */\n\tprivate pickWebdavPreset(p: WebdavPreset): void {\n\t\tthis.#pickedPreset = p;\n\t\tthis.#webdavUrl = p.url ?? '';\n\t\tthis.rerender();\n\t\tthis.root.querySelector<HTMLInputElement>('[data-keep=\"wd-user\"]')?.focus();\n\t}\n\n\tprivate submitWebdav(): void {\n\t\tconst url = this.#webdavUrl.trim();\n\t\tif (!url) return;\n\t\tconst config: WebdavConfig = {\n\t\t\turl,\n\t\t\tusername: this.#webdavUser.trim(),\n\t\t\tpassword: this.#webdavPass\n\t\t};\n\t\tthis.#flow?.submitWebdav(config);\n\t}\n}\n","// <selfstore-share>: the share panel over shareFlow, driving an app-provided\n// ShareEngine (how links travel is the app's business).\n//\n// One link per level: each level shows its live link or offers to create it.\n// No second write link next to a first (which one was live?), no name to\n// invent - the level says what it is. Links the engine lists always render,\n// whatever `levels` says: the panel never hides an access that exists.\n//\n// Knobs (all optional): levels, with-create / with-members, confirmAction\n// (host veto over destructive actions), qrProvider (injected, so the element\n// stays zero-dependency). Engines exposing revokeAll get a \"stop sharing\"\n// foot link, rendered only once somebody besides you is in the member list.\n\nimport { shareFlow, type ShareEngine, type ShareFlow, type ShareLevel } from '../flows/share';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'share.title': 'Sharing',\n\t'share.create.read': 'Create a view link',\n\t'share.create.write': 'Create an edit link',\n\t'share.creating': 'Creating...',\n\t'share.level.read': 'Can view',\n\t'share.level.write': 'Can edit',\n\t'share.copy': 'Copy',\n\t'share.copied': 'Copied',\n\t'share.revoke': 'Revoke',\n\t'share.members': 'People with access',\n\t'share.member.you': 'you',\n\t'share.member.owner': 'owner',\n\t'share.remove': 'Remove',\n\t'share.stop': 'Stop sharing',\n\t'share.empty': 'Nobody else has access yet.',\n\t'share.stale': 'Connection hiccup: this view may be behind.',\n\t'error.generic': 'That did not work. Check the connection and try again.',\n\t'error.targetUnavailable': 'The share service did not answer. Try again in a moment.'\n};\n\nconst FR: WidgetLabels = {\n\t'share.title': 'Partage',\n\t'share.create.read': 'Créer un lien de lecture',\n\t'share.create.write': 'Créer un lien de modification',\n\t'share.creating': 'Création...',\n\t'share.level.read': 'Peut consulter',\n\t'share.level.write': 'Peut modifier',\n\t'share.copy': 'Copier',\n\t'share.copied': 'Copié',\n\t'share.revoke': 'Révoquer',\n\t'share.members': 'Personnes ayant accès',\n\t'share.member.you': 'vous',\n\t'share.member.owner': 'propriétaire',\n\t'share.remove': 'Retirer',\n\t'share.stop': 'Arrêter le partage',\n\t'share.empty': \"Personne d'autre n'a accès pour le moment.\",\n\t'share.stale': 'Connexion instable : cette vue est peut-être en retard.',\n\t'error.generic': \"Cela n'a pas fonctionné. Vérifiez la connexion et réessayez.\",\n\t'error.targetUnavailable': 'Le service de partage ne répond pas. Réessayez dans un instant.'\n};\n\n/** A destructive action, offered to confirmAction before it runs: a row's\n * revoke/remove, or 'stop' - ending the whole share. */\nexport type ShareAction = { type: 'revoke' | 'remove'; id: string } | { type: 'stop' };\n\n/** \"off\"-style attribute values; anything else (including empty) reads as on. */\nconst isOff = (v: string | null): boolean =>\n\tv != null && ['off', 'false', 'no', '0'].includes(v.trim().toLowerCase());\n\nexport class SelfstoreShareElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['levels', 'with-create', 'with-members'];\n\t}\n\n\t#engine: ShareEngine | null = null;\n\t#flow: ShareFlow | null = null;\n\t#options: { deadlineMs?: number } = {};\n\t#levels: ShareLevel[] = ['read', 'write'];\n\t#withCreate = true;\n\t#withMembers = true;\n\t#confirmAction: ((action: ShareAction) => boolean | Promise<boolean>) | null = null;\n\t#qrProvider: ((url: string) => Promise<string>) | null = null;\n\t#qr = new Map<string, string>();\n\t#qrPending = new Set<string>();\n\t#copiedId: string | null = null;\n\t#creating: ShareLevel | null = null;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\t/** The app-side transport of links and memberships (see ShareEngine). */\n\tget engine(): ShareEngine | null {\n\t\treturn this.#engine;\n\t}\n\tset engine(v: ShareEngine | null) {\n\t\tthis.#engine = v;\n\t\tthis.wire();\n\t}\n\n\t/** Flow options (deadlineMs), for engines whose legs outgrow the default\n\t * 30s guard (a large first upload, a slow relay). */\n\tget options(): { deadlineMs?: number } {\n\t\treturn this.#options;\n\t}\n\tset options(v: { deadlineMs?: number } | null) {\n\t\tthis.#options = v ?? {};\n\t\tthis.wire();\n\t}\n\n\t/** Which levels the panel OFFERS to create (['read', 'write'] by default) -\n\t * one create button per level without a live link. Also the `levels`\n\t * attribute, comma-separated: levels=\"read\". Links the engine lists\n\t * render whatever this says. */\n\tget levels(): ShareLevel[] {\n\t\treturn [...this.#levels];\n\t}\n\tset levels(v: ShareLevel[]) {\n\t\tconst clean = [...new Set((v ?? []).filter((l) => l === 'read' || l === 'write'))];\n\t\tthis.#levels = clean.length > 0 ? clean : ['read', 'write'];\n\t\tthis.rerender();\n\t}\n\n\t/** Render the create buttons (default). `with-create=\"off\"` hides them: the\n\t * panel becomes list-and-revoke only. */\n\tget withCreate(): boolean {\n\t\treturn this.#withCreate;\n\t}\n\tset withCreate(v: boolean) {\n\t\tthis.#withCreate = v !== false;\n\t\tthis.rerender();\n\t}\n\n\t/** Render the members section (default). `with-members=\"off\"` hides it:\n\t * a links-only panel. */\n\tget withMembers(): boolean {\n\t\treturn this.#withMembers;\n\t}\n\tset withMembers(v: boolean) {\n\t\tthis.#withMembers = v !== false;\n\t\tthis.rerender();\n\t}\n\n\t/** Host veto over the destructive actions: called before revoke, remove or\n\t * stop runs; answer (or resolve) false to keep things as they are -\n\t * window.confirm fits as-is. Default: everything proceeds. */\n\tget confirmAction(): ((action: ShareAction) => boolean | Promise<boolean>) | null {\n\t\treturn this.#confirmAction;\n\t}\n\tset confirmAction(v: ((action: ShareAction) => boolean | Promise<boolean>) | null) {\n\t\tthis.#confirmAction = v ?? null;\n\t}\n\n\t/** Turn a link URL into an image source (a data URL fits): when set, each\n\t * link card renders it as an img part=\"qr\". Injected so the element ships\n\t * no QR dependency. */\n\tget qrProvider(): ((url: string) => Promise<string>) | null {\n\t\treturn this.#qrProvider;\n\t}\n\tset qrProvider(v: ((url: string) => Promise<string>) | null) {\n\t\tthis.#qrProvider = v ?? null;\n\t\tthis.#qr.clear();\n\t\tthis.#qrPending.clear();\n\t\tthis.rerender();\n\t}\n\n\tget flow(): ShareFlow | null {\n\t\treturn this.#flow;\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'levels') {\n\t\t\tthis.levels = (value ?? '').split(',').map((s) => s.trim()) as ShareLevel[];\n\t\t}\n\t\tif (name === 'with-create') this.withCreate = value == null || !isOff(value);\n\t\tif (name === 'with-members') this.withMembers = value == null || !isOff(value);\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tthis.wire();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#engine) return;\n\t\tthis.unsub?.();\n\t\tthis.#flow = shareFlow(this.#engine, this.#options);\n\t\tthis.unsub = this.#flow.subscribe(() => this.rerender());\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst flow = this.#flow;\n\t\tif (!flow) return;\n\t\tconst s = flow.snapshot;\n\n\t\tput(into, this.heading('title', 'share.title'));\n\t\tif (s.stale) into.append(h('div', { part: 'hint' }, this.t('share.stale')));\n\t\tif (s.error && !s.stale) {\n\t\t\tinto.append(h('div', { part: 'error-note' }, this.errorText(s.error.labelKey)));\n\t\t}\n\n\t\t// One link per level: a level with a live link shows it below instead of\n\t\t// offering a second one. One gesture per missing level, nothing to name.\n\t\tif (this.#withCreate) {\n\t\t\tconst missing = this.#levels.filter((l) => !s.links.some((k) => k.level === l));\n\t\t\tif (missing.length > 0) {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\t\t...missing.map((level) =>\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t\t\t'data-action': `create-${level}`,\n\t\t\t\t\t\t\t\t\tdisabled: s.busy !== null,\n\t\t\t\t\t\t\t\t\tonclick: () => this.create(level)\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tthis.t(\n\t\t\t\t\t\t\t\t\ts.busy === 'create' && this.#creating === level\n\t\t\t\t\t\t\t\t\t\t? 'share.creating'\n\t\t\t\t\t\t\t\t\t\t: `share.create.${level}`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (s.links.length > 0) {\n\t\t\tconst list = h('ul', { part: 'list' });\n\t\t\tfor (const link of s.links) {\n\t\t\t\tconst qr = this.qrFor(link.url);\n\t\t\t\tlist.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'li',\n\t\t\t\t\t\t{ part: 'card', 'data-link': link.id },\n\t\t\t\t\t\tqr ? h('img', { part: 'qr', src: qr, alt: '' }) : null,\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\t\t\t\th('div', { part: 'title' }, this.t(`share.level.${link.level}`)),\n\t\t\t\t\t\t\th('div', { part: 'sub', style: 'word-break:break-all' }, link.url)\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t\t'data-action': 'copy',\n\t\t\t\t\t\t\t\tonclick: () => this.copy(link.id, link.url)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t(this.#copiedId === link.id ? 'share.copied' : 'share.copy')\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'button button-danger',\n\t\t\t\t\t\t\t\t'data-action': 'revoke',\n\t\t\t\t\t\t\t\tdisabled: s.busy !== null,\n\t\t\t\t\t\t\t\tonclick: () => this.revoke(link.id)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t('share.revoke')\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\tinto.append(list);\n\t\t}\n\n\t\tif (this.#withMembers) {\n\t\t\tput(into, this.heading('sub', 'share.members'));\n\t\t\tif (s.members.length === 0) {\n\t\t\t\tinto.append(h('div', { part: 'hint' }, this.t('share.empty')));\n\t\t\t} else {\n\t\t\t\tconst members = h('ul', { part: 'list' });\n\t\t\t\tfor (const m of s.members) {\n\t\t\t\t\tconst badges: string[] = [];\n\t\t\t\t\tif (m.self) badges.push(this.t('share.member.you'));\n\t\t\t\t\tif (m.owner) badges.push(this.t('share.member.owner'));\n\t\t\t\t\tmembers.append(\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'li',\n\t\t\t\t\t\t\t{ part: 'card', 'data-member': m.id },\n\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ style: 'flex:1' },\n\t\t\t\t\t\t\t\th('div', { part: 'title' }, m.label || m.id),\n\t\t\t\t\t\t\t\tbadges.length ? h('div', { part: 'sub' }, badges.join(' - ')) : null\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ts.canRemoveMembers && !m.self\n\t\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tpart: 'button button-danger',\n\t\t\t\t\t\t\t\t\t\t\t'data-action': 'remove',\n\t\t\t\t\t\t\t\t\t\t\tdisabled: s.busy !== null,\n\t\t\t\t\t\t\t\t\t\t\tonclick: () => this.removeRow(m.id)\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tthis.t('share.remove')\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tinto.append(members);\n\t\t\t}\n\t\t}\n\n\t\t// Ending the whole share: a quiet link at the panel's foot, not a banner.\n\t\t// Rare, destructive, and only real when the engine has such a move and\n\t\t// somebody besides you is in - kicking nobody is noise, and a share\n\t\t// nobody joined yet ends by revoking its link.\n\t\tif (s.canRevokeAll && s.members.some((m) => !m.self)) {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'footer', style: 'text-align:right' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'link link-danger',\n\t\t\t\t\t\t\t'data-action': 'stop',\n\t\t\t\t\t\t\tdisabled: s.busy !== null,\n\t\t\t\t\t\t\tonclick: () => this.stop()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('share.stop')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate create(level: ShareLevel): void {\n\t\tthis.#creating = level;\n\t\tvoid this.#flow?.createLink({ level }).then((link) => {\n\t\t\tthis.#creating = null;\n\t\t\tif (link) this.emit('selfstore-link-created', { link });\n\t\t\tthis.rerender();\n\t\t});\n\t}\n\n\t/** Run a destructive action through the host's veto (default: proceed).\n\t * A throwing hook reads as \"no\": destruction needs a clear yes. */\n\tprivate guarded(action: ShareAction, run: () => void): void {\n\t\tconst gate = this.#confirmAction;\n\t\tif (!gate) {\n\t\t\trun();\n\t\t\treturn;\n\t\t}\n\t\tvoid Promise.resolve()\n\t\t\t.then(() => gate(action))\n\t\t\t.then((ok) => {\n\t\t\t\tif (ok) run();\n\t\t\t})\n\t\t\t.catch(() => undefined);\n\t}\n\n\tprivate revoke(id: string): void {\n\t\tthis.guarded({ type: 'revoke', id }, () => void this.#flow?.revokeLink(id));\n\t}\n\n\tprivate removeRow(id: string): void {\n\t\tthis.guarded({ type: 'remove', id }, () => void this.#flow?.removeMember(id));\n\t}\n\n\tprivate stop(): void {\n\t\tthis.guarded({ type: 'stop' }, () => {\n\t\t\tvoid this.#flow?.revokeAll().then((ok) => {\n\t\t\t\tif (ok) this.emit('selfstore-share-stopped');\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate qrFor(url: string): string | null {\n\t\tconst provider = this.#qrProvider;\n\t\tif (!provider) return null;\n\t\tconst got = this.#qr.get(url);\n\t\tif (got) return got;\n\t\tif (!this.#qrPending.has(url)) {\n\t\t\tthis.#qrPending.add(url);\n\t\t\tvoid provider(url)\n\t\t\t\t.then((src) => {\n\t\t\t\t\tif (this.#qrProvider !== provider) return; // swapped since: stale image\n\t\t\t\t\tthis.#qr.set(url, src);\n\t\t\t\t\tthis.rerender();\n\t\t\t\t})\n\t\t\t\t.catch(() => undefined)\n\t\t\t\t.finally(() => this.#qrPending.delete(url));\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate copy(id: string, url: string): void {\n\t\tthis.#copiedId = id;\n\t\tthis.emit('selfstore-link-copied', { url });\n\t\tvoid navigator.clipboard?.writeText(url).catch(() => undefined);\n\t\tthis.rerender();\n\t\tsetTimeout(() => {\n\t\t\tif (this.#copiedId !== id) return;\n\t\t\tthis.#copiedId = null;\n\t\t\tthis.rerender();\n\t\t}, 1500);\n\t}\n}\n","/**\n * <selfstore-join>: opening an invitation link, ready to drop in. A skin over\n * joinFlow: preview first, join on an explicit yes, named outcomes (already\n * following another share / invite spent) instead of generic errors, and the\n * account switch as part of the journey when the engine offers one.\n *\n * el.link = location.href; // or the link attribute\n * el.engine = myJoinEngine;\n * el.addEventListener('selfstore-joined', () => goHome());\n *\n * variant=\"banner\" collapses the invitation card to a one-line row (label,\n * join, account switch) for pages that render their own preview around it.\n */\n\nimport { joinFlow, type JoinEngine, type JoinFlow } from '../flows/join';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'join.previewing': 'Reading the invitation...',\n\t'join.title': 'You are invited',\n\t'join.from': 'Shared by {from}',\n\t'join.level.read': 'You will be able to view it.',\n\t'join.level.write': 'You will be able to view and edit it.',\n\t'join.accept': 'Join',\n\t'join.joining': 'Joining...',\n\t'join.joined': 'You are in. The shared data now syncs on this device.',\n\t'join.mismatch':\n\t\t'This device already follows another share. Leave it first, or use another profile.',\n\t'join.noInvite': 'This invitation is spent, or meant for another account.',\n\t'join.switchAccount': 'Use another account',\n\t'join.retry': 'Try again',\n\t'error.generic': 'That did not work. Check the connection and try again.',\n\t'error.targetUnavailable': 'The invitation could not be read. Try again in a moment.'\n};\n\nconst FR: WidgetLabels = {\n\t'join.previewing': \"Lecture de l'invitation...\",\n\t'join.title': 'Vous avez reçu une invitation',\n\t'join.from': 'Partagé par {from}',\n\t'join.level.read': 'Vous pourrez consulter.',\n\t'join.level.write': 'Vous pourrez consulter et modifier.',\n\t'join.accept': 'Rejoindre',\n\t'join.joining': 'Connexion en cours...',\n\t'join.joined': \"C'est fait. Les données partagées se synchronisent sur cet appareil.\",\n\t'join.mismatch':\n\t\t\"Cet appareil suit déjà un autre partage. Quittez-le d'abord, ou utilisez un autre profil.\",\n\t'join.noInvite': 'Cette invitation a déjà servi, ou elle vise un autre compte.',\n\t'join.switchAccount': 'Utiliser un autre compte',\n\t'join.retry': 'Réessayer',\n\t'error.generic': \"Cela n'a pas fonctionné. Vérifiez la connexion et réessayez.\",\n\t'error.targetUnavailable': \"L'invitation n'a pas pu être lue. Réessayez dans un instant.\"\n};\n\nexport class SelfstoreJoinElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['link', 'variant'];\n\t}\n\n\t#engine: JoinEngine | null = null;\n\t#link: string | null = null;\n\t#flow: JoinFlow | null = null;\n\t#variant: 'card' | 'banner' = 'card';\n\t#options: { deadlineMs?: number } = {};\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\tget engine(): JoinEngine | null {\n\t\treturn this.#engine;\n\t}\n\tset engine(v: JoinEngine | null) {\n\t\tthis.#engine = v;\n\t\tthis.wire();\n\t}\n\n\t/** The invitation. Also settable as the `link` attribute. */\n\tget link(): string | null {\n\t\treturn this.#link;\n\t}\n\tset link(v: string | null) {\n\t\tthis.#link = v;\n\t\tthis.wire();\n\t}\n\n\t/** Flow options (deadlineMs). Set it when the engine's join opens a popup:\n\t * a generous deadline keeps the network guard without timing out a human\n\t * who is reading an account chooser. */\n\tget options(): { deadlineMs?: number } {\n\t\treturn this.#options;\n\t}\n\tset options(v: { deadlineMs?: number } | null) {\n\t\tthis.#options = v ?? {};\n\t\tthis.wire();\n\t}\n\n\t/** 'card' (default): the full invitation card - who shared, what level.\n\t * 'banner': one line - label, join, account switch - for a host page that\n\t * renders its own preview around the widget. Also the `variant` attribute. */\n\tget variant(): 'card' | 'banner' {\n\t\treturn this.#variant;\n\t}\n\tset variant(v: 'card' | 'banner') {\n\t\tthis.#variant = v === 'banner' ? 'banner' : 'card';\n\t\tthis.rerender();\n\t}\n\n\tget flow(): JoinFlow | null {\n\t\treturn this.#flow;\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'link') this.link = value;\n\t\tif (name === 'variant') this.variant = (value ?? 'card') as 'card' | 'banner';\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tif (!this.#link && this.hasAttribute('link')) this.#link = this.getAttribute('link');\n\t\tif (this.hasAttribute('variant')) {\n\t\t\tthis.#variant = this.getAttribute('variant') === 'banner' ? 'banner' : 'card';\n\t\t}\n\t\tthis.wire();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#engine || !this.#link) return;\n\t\tthis.unsub?.();\n\t\tthis.#flow = joinFlow(this.#link, this.#engine, this.#options);\n\t\tlet lastStep: string | null = null;\n\t\tthis.unsub = this.#flow.subscribe((snap) => {\n\t\t\tif (snap.step !== lastStep) {\n\t\t\t\tif (snap.step === 'joined') this.emit('selfstore-joined', { outcome: 'joined' });\n\t\t\t\tif (snap.step === 'mismatch' || snap.step === 'no-invite') {\n\t\t\t\t\tthis.emit('selfstore-join-refused', { outcome: snap.step });\n\t\t\t\t}\n\t\t\t\tif (snap.step === 'ready' && lastStep === 'joining') {\n\t\t\t\t\t// join() answered null: the user backed out of the engine's popup.\n\t\t\t\t\tthis.emit('selfstore-cancelled');\n\t\t\t\t}\n\t\t\t\tlastStep = snap.step;\n\t\t\t}\n\t\t\tthis.rerender();\n\t\t});\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst flow = this.#flow;\n\t\tif (!flow) return;\n\t\tconst s = flow.snapshot;\n\n\t\tif (s.step === 'previewing' || s.step === 'joining') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status' },\n\t\t\t\t\th('span', { part: 'spinner', 'aria-hidden': 'true' }),\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\t\tthis.t(s.step === 'joining' ? 'join.joining' : 'join.previewing')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'ready') {\n\t\t\tconst p = s.preview;\n\t\t\tif (this.#variant === 'banner') {\n\t\t\t\tput(\n\t\t\t\t\tinto,\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row banner' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ part: 'title', style: 'flex:1;min-width:0' },\n\t\t\t\t\t\t\tp?.label || this.t('join.title')\n\t\t\t\t\t\t),\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t\t'data-action': 'accept',\n\t\t\t\t\t\t\t\tonclick: () => flow.accept()\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t('join.accept')\n\t\t\t\t\t\t),\n\t\t\t\t\t\ts.canSwitchAccount\n\t\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t\t{ part: 'link', 'data-action': 'switch', onclick: () => flow.switchAccount() },\n\t\t\t\t\t\t\t\t\tthis.t('join.switchAccount')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tput(\n\t\t\t\tinto,\n\t\t\t\th('div', { part: 'title' }, p?.label || this.t('join.title')),\n\t\t\t\tp?.from ? h('div', { part: 'sub' }, this.t('join.from').replace('{from}', p.from)) : null,\n\t\t\t\tp?.level ? h('div', { part: 'hint' }, this.t(`join.level.${p.level}`)) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'accept',\n\t\t\t\t\t\t\tonclick: () => flow.accept()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('join.accept')\n\t\t\t\t\t),\n\t\t\t\t\ts.canSwitchAccount\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t{ part: 'link', 'data-action': 'switch', onclick: () => flow.switchAccount() },\n\t\t\t\t\t\t\t\tthis.t('join.switchAccount')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'joined') {\n\t\t\tinto.append(\n\t\t\t\th('div', { part: 'status status-ok' }, h('div', { part: 'title' }, this.t('join.joined')))\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (s.step === 'mismatch' || s.step === 'no-invite') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'status' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\t\tthis.t(s.step === 'mismatch' ? 'join.mismatch' : 'join.noInvite')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t\tif (s.step === 'no-invite' && s.canSwitchAccount) {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ part: 'row' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'button', 'data-action': 'switch', onclick: () => flow.switchAccount() },\n\t\t\t\t\t\t\tthis.t('join.switchAccount')\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// error\n\t\tinto.append(\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'status status-error' },\n\t\t\t\th('div', { part: 'title' }, this.errorText(s.error?.labelKey))\n\t\t\t),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row' },\n\t\t\t\th('button', { part: 'button', onclick: () => flow.retry() }, this.t('join.retry')),\n\t\t\t\ts.canSwitchAccount\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{ part: 'link', 'data-action': 'switch', onclick: () => flow.switchAccount() },\n\t\t\t\t\t\t\tthis.t('join.switchAccount')\n\t\t\t\t\t\t)\n\t\t\t\t\t: null\n\t\t\t)\n\t\t);\n\t}\n}\n","// <selfstore-status>: the store's save status. Renders the engine's own\n// StatusDescriptor - the widget never invents a state. variant=\"row\" is a\n// severity dot + status line + one action button (settings panel, menu);\n// variant=\"dot\" is just the dot as an aria-labelled button (header corner).\n// An actionable status emits 'selfstore-status-action' with the suggested\n// action; what it means (open settings, run reconnect) is the host's call.\n\nimport type { FlowHost, StoreLike } from '../flows/connect';\nimport { FlowWidget, h, hostOf, put, type WidgetLabels } from './base';\n\n// The browser is never named as the PLACE the data lives. It is not one: it\n// holds a working copy that a cleared profile takes with it. So the state with\n// no destination names what is MISSING - nothing has been saved out - instead\n// of describing the browser as an address, which reads reassuring and is not.\nconst EN: WidgetLabels = {\n\t'status.ephemeral': 'Nothing is saved',\n\t'status.cacheOnly': 'Never saved anywhere yet',\n\t'status.saving': 'Saving...',\n\t'status.saved': 'Saved to {label}, at every change',\n\t'status.needsAttention': 'Reconnect to continue',\n\t'status.locked': 'Locked',\n\t'status.pendingDownload': 'Changes to download',\n\t'status.saved.placeless': 'Saved',\n\t'status.action.choose-destination': 'Choose a destination',\n\t'status.action.download': 'Download',\n\t'status.action.reconnect': 'Reconnect',\n\t'status.action.unlock': 'Unlock'\n};\n\n// A pill states a condition, never a possession: \"Sauvegarde à jour\", not \"Ma\n// sauvegarde\". One verb, one meaning: Exporter is always the portable copy.\nconst FR: WidgetLabels = {\n\t'status.ephemeral': \"Rien n'est enregistré\",\n\t'status.cacheOnly': \"Vos données n'ont jamais été enregistrées ailleurs\",\n\t'status.saving': 'Enregistrement...',\n\t'status.saved': 'Enregistré dans {label}, à chaque changement',\n\t'status.needsAttention': 'Accès à retrouver',\n\t'status.locked': 'Sauvegarde verrouillée',\n\t'status.pendingDownload': 'Modifications à exporter',\n\t'status.saved.placeless': 'Sauvegarde à jour',\n\t'status.action.choose-destination': 'Choisir une sauvegarde',\n\t'status.action.download': 'Exporter',\n\t'status.action.reconnect': \"Retrouver l'accès\",\n\t'status.action.unlock': 'Déverrouiller'\n};\n\nexport class SelfstoreStatusElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['variant'];\n\t}\n\n\t#store: StoreLike | null = null;\n\t#variant: 'row' | 'dot' = 'row';\n\t#icons: Record<string, string> = {};\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\t/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */\n\tget store(): StoreLike | null {\n\t\treturn this.#store;\n\t}\n\tset store(v: StoreLike | null) {\n\t\t// Idempotent, so a host may assign it from a reactive effect: see the\n\t\t// note on <selfstore-connect>.\n\t\tif (v === this.#store) return;\n\t\tthis.#store = v;\n\t\tthis.wire();\n\t}\n\n\t/** 'row' (dot + text + action) or 'dot' (the dot alone). Also the attribute. */\n\tget variant(): 'row' | 'dot' {\n\t\treturn this.#variant;\n\t}\n\tset variant(v: 'row' | 'dot' | null) {\n\t\tthis.#variant = v === 'dot' ? 'dot' : 'row';\n\t\tthis.rerender();\n\t}\n\n\t/** Optional icon per target kind (e.g. { drive: url, file: url }), shown\n\t * before the text in the row variant. Same contract as the connect cards. */\n\tget icons(): Record<string, string> {\n\t\treturn this.#icons;\n\t}\n\tset icons(v: Record<string, string> | null) {\n\t\tthis.#icons = v ?? {};\n\t\tthis.rerender();\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'variant') this.variant = value as 'row' | 'dot' | null;\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tif (this.hasAttribute('variant')) this.variant = this.getAttribute('variant') as 'row' | 'dot';\n\t\tthis.wire();\n\t}\n\n\tprivate host(): FlowHost | null {\n\t\treturn hostOf(this.#store);\n\t}\n\n\tprivate wire(): void {\n\t\tthis.follow(this.host());\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst host = this.host();\n\t\tif (!host) return; // inert until wired\n\t\tconst { status, targetKind, label } = host.engine.state;\n\t\t// The destination's own name is offered to the sentence. A pack that uses\n\t\t// {label} says where in one line; one that does not is unaffected, and the\n\t\t// name still appears on the sub-line below. A target can be attached and\n\t\t// still have no name to give, so a sentence built around the place has a\n\t\t// placeless twin - otherwise it would render the placeholder itself.\n\t\tconst sansLieu = (cle: string): string => {\n\t\t\tconst jumelle = `${cle}.placeless`;\n\t\t\tconst copie = this.t(jumelle);\n\t\t\t// Pas de jumelle declaree: la cle de base ne parle deja pas du lieu.\n\t\t\treturn copie === jumelle ? this.t(cle) : copie;\n\t\t};\n\t\tconst text = label ? this.t(status.labelKey, { label }) : sansLieu(status.labelKey);\n\t\tconst dot = h('span', {\n\t\t\tpart: `status-dot sev-${status.severity}`,\n\t\t\t'aria-hidden': 'true'\n\t\t});\n\n\t\tif (this.#variant === 'dot') {\n\t\t\tinto.append(\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'dot-button',\n\t\t\t\t\t\t'aria-label': text,\n\t\t\t\t\t\ttitle: text,\n\t\t\t\t\t\tonclick: () => this.emit('selfstore-status-action', { action: status.action ?? null })\n\t\t\t\t\t},\n\t\t\t\t\tdot\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst icon = this.#icons[targetKind];\n\t\tconst where = this.t(`status.where.${targetKind}`);\n\t\t// `status.where.<kind>` is a host-provided label; the raw key means \"not\n\t\t// provided\" - fall back to the target's own label (file name, server).\n\t\tconst sub = where !== `status.where.${targetKind}` ? where : (label ?? '');\n\t\tput(\n\t\t\tinto,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row status-row' },\n\t\t\t\tdot,\n\t\t\t\ticon ? h('img', { part: 'icon', src: icon, alt: '' }) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{},\n\t\t\t\t\th('div', { part: 'title' }, text),\n\t\t\t\t\tsub ? h('div', { part: 'sub' }, sub) : null\n\t\t\t\t),\n\t\t\t\tstatus.actionable && status.action\n\t\t\t\t\t? h(\n\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpart: 'button status-action',\n\t\t\t\t\t\t\t\tonclick: () => this.emit('selfstore-status-action', { action: status.action })\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.t(`status.action.${status.action}`)\n\t\t\t\t\t\t)\n\t\t\t\t\t: null\n\t\t\t)\n\t\t);\n\t}\n}\n","// <selfstore-backups>: the backups lists over the headless BackupsManager.\n// Two sections. \"My backups\": every file this account owns, the attached one\n// included (badge + outline, never clickable); tapping another row opens it,\n// collecting its passphrase inline when protected; each row carries state\n// pills (omitted while unknown, never guessed) and an overflow menu. \"Shared\n// with me\": files someone else shares with this device, labelled by who -\n// removal is the only gesture, and for the member row it means leaving,\n// which the host performs ('selfstore-backups-leave').\n//\n// The status card, the unlock gate and the encrypt/share sub-views stay the\n// host's - they carry app identity, passkeys, sharing transport. Encrypt and\n// Share menu items only emit; the host opens its own surface. Destructive\n// gestures route through confirmAction (window.confirm fits as-is). The\n// with-* attributes turn sections and menu items off; labels localize.\n\nimport type { BackupRow, BackupsManager } from '../backups/manager';\nimport type { ConnectKind } from '../flows/connect';\nimport type { ReplicaFlow, ReplicaSnapshot } from '../flows/replica';\nimport type { WebdavConfig } from '../persistence/targets/webdav';\nimport type { S3Config } from '../persistence/targets/s3';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'backups.mine.heading': 'My backups',\n\t'backups.mine.personal': 'Main backup',\n\t'backups.active': 'Active',\n\t'backups.pill.encrypted': 'Encrypted',\n\t'backups.pill.plain': 'Not encrypted',\n\t'backups.pill.shared': 'Shared',\n\t'backups.pill.private': 'Not shared',\n\t'backups.modified': 'modified {when}',\n\t'backups.replaceHint': 'Opening replaces the data on this device.',\n\t'backups.loading': 'Opening...',\n\t'backups.menu': 'Backup actions',\n\t'backups.open': 'Open',\n\t'backups.encrypt': 'Encrypt',\n\t'backups.share': 'Share',\n\t'backups.rename': 'Rename',\n\t'backups.delete': 'Delete',\n\t'backups.new': '+ New backup',\n\t'backups.newTitle': 'New backup',\n\t'backups.startsBlank': 'It starts empty.',\n\t'backups.namePh': 'Its name',\n\t'backups.willBe': 'File: {file}',\n\t'backups.taken': 'This name is already taken.',\n\t'backups.create': 'Create',\n\t'backups.renameTitle': 'Rename this backup',\n\t'backups.pwHint': 'This backup is protected: enter its password.',\n\t'backups.pwShow': 'Show the password',\n\t'backups.pwHide': 'Hide the password',\n\t'backups.cancel': 'Cancel',\n\t'backups.shared.heading': 'Shared with me',\n\t'backups.shared.by': 'Shared by {who}',\n\t'backups.shared.leave': 'Leave',\n\t'backups.replica.add': 'Backup copy',\n\t'backups.replica.title': 'Backup copy',\n\t'backups.replica.intro':\n\t\t'The same encrypted file, also written to a second destination. If one fails, the other remains.',\n\t'backups.replica.dest.drive': 'Google Drive',\n\t'backups.replica.dest.file': 'A file on this device',\n\t'backups.replica.dest.webdav': 'A WebDAV server',\n\t'backups.replica.dest.s3': 'An S3 bucket',\n\t'backups.replica.card': 'Backup copy - {label}',\n\t'backups.replica.uptodate': 'Up to date, {when}',\n\t'backups.replica.pending': 'First copy at the next save',\n\t'backups.replica.error': 'Unreachable - will retry at the next save',\n\t'backups.replica.remove': 'Remove',\n\t'backups.replica.save': 'Add the copy',\n\t'backups.replica.webdav.url': 'File URL on the server (https://host:8443/dav/file.zip)',\n\t'backups.replica.webdav.help':\n\t\t'The full URL of the backup file, including a custom port if any. The server must allow this app to reach it (CORS) - some hosted drives do not, and will not connect from a browser.',\n\t'backups.replica.webdav.user': 'Username',\n\t'backups.replica.webdav.password': 'Password',\n\t'backups.replica.s3.endpoint': 'Endpoint URL',\n\t'backups.replica.s3.region': 'Region',\n\t'backups.replica.s3.bucket': 'Bucket',\n\t'backups.replica.s3.key': 'Object key (file name)',\n\t'backups.replica.s3.accessKeyId': 'Access key ID',\n\t'backups.replica.s3.secret': 'Secret access key',\n\t'error.generic': 'That did not work. Check the connection and try again.'\n};\n\nconst FR: WidgetLabels = {\n\t'backups.mine.heading': 'Sauvegardes',\n\t'backups.mine.personal': 'Sauvegarde principale',\n\t'backups.active': 'Active',\n\t'backups.pill.encrypted': 'Chiffrée',\n\t'backups.pill.plain': 'Non chiffrée',\n\t'backups.pill.shared': 'Partagée',\n\t'backups.pill.private': 'Non partagée',\n\t'backups.modified': 'modifiée {when}',\n\t'backups.replaceHint': \"L'ouvrir remplace les données de cet appareil.\",\n\t'backups.loading': 'Ouverture...',\n\t'backups.menu': 'Actions',\n\t'backups.open': 'Ouvrir',\n\t'backups.encrypt': 'Chiffrer',\n\t'backups.share': 'Partager',\n\t'backups.rename': 'Renommer',\n\t'backups.delete': 'Supprimer',\n\t'backups.new': '+ Nouvelle sauvegarde',\n\t'backups.newTitle': 'Nouvelle sauvegarde',\n\t'backups.startsBlank': 'Elle démarre vide.',\n\t'backups.namePh': 'Son nom',\n\t'backups.willBe': 'Fichier : {file}',\n\t'backups.taken': 'Ce nom est déjà pris.',\n\t'backups.create': 'Créer',\n\t'backups.renameTitle': 'Renommer cette sauvegarde',\n\t'backups.pwHint': 'Cette sauvegarde est protégée : entrez son mot de passe.',\n\t'backups.pwShow': 'Afficher le mot de passe',\n\t'backups.pwHide': 'Masquer le mot de passe',\n\t'backups.cancel': 'Annuler',\n\t'backups.shared.heading': 'Partagées avec moi',\n\t'backups.shared.by': 'Partagée par {who}',\n\t'backups.shared.leave': 'Quitter',\n\t'backups.replica.add': 'Seconde sauvegarde',\n\t'backups.replica.title': 'Seconde sauvegarde',\n\t'backups.replica.intro':\n\t\t\"Le même fichier chiffré, écrit aussi à un second endroit. Si l'un tombe, l'autre reste.\",\n\t'backups.replica.dest.drive': 'Google Drive',\n\t'backups.replica.dest.file': 'Un fichier sur cet appareil',\n\t'backups.replica.dest.webdav': 'Un serveur WebDAV',\n\t'backups.replica.dest.s3': 'Un bucket S3',\n\t'backups.replica.card': 'Seconde sauvegarde - {label}',\n\t'backups.replica.uptodate': 'À jour, {when}',\n\t'backups.replica.pending': 'Première copie au prochain enregistrement',\n\t'backups.replica.error': 'Injoignable - nouvel essai au prochain enregistrement',\n\t'backups.replica.remove': 'Retirer',\n\t'backups.replica.save': 'Ajouter la copie',\n\t'backups.replica.webdav.url': 'URL du fichier sur le serveur (https://hote:8443/dav/fichier.zip)',\n\t'backups.replica.webdav.help':\n\t\t\"L'URL complète du fichier de sauvegarde, port personnalisé compris. Le serveur doit autoriser cette application à le joindre (CORS) : certains hébergeurs ne le font pas et ne se connecteront pas depuis un navigateur.\",\n\t'backups.replica.webdav.user': 'Identifiant',\n\t'backups.replica.webdav.password': 'Mot de passe',\n\t'backups.replica.s3.endpoint': \"URL du point d'accès\",\n\t'backups.replica.s3.region': 'Région',\n\t'backups.replica.s3.bucket': 'Bucket',\n\t'backups.replica.s3.key': 'Chemin du fichier',\n\t'backups.replica.s3.accessKeyId': \"Identifiant de la clé d'accès\",\n\t'backups.replica.s3.secret': 'Clé secrète',\n\t'error.generic': \"Cela n'a pas fonctionné. Vérifiez la connexion et réessayez.\"\n};\n\n/** A destructive gesture, offered to confirmAction before it runs. `delete`\n * and `forget` carry the row; `leave` is a membership's removal (fileId =\n * its wallet, null for a legacy unbound one) - the host performs the actual\n * leave on the 'selfstore-backups-leave' event, whose detail repeats it. */\nexport type BackupsAction =\n\t| { type: 'delete'; fileId: string; name: string; active: boolean }\n\t| { type: 'forget'; fileId: string; who: string }\n\t| { type: 'leave'; fileId: string | null; who: string }\n\t| { type: 'replica-remove'; label: string };\n\n/** \"off\"-style attribute values; anything else (including empty) reads as on. */\nconst isOff = (v: string | null): boolean =>\n\tv != null && ['off', 'false', 'no', '0'].includes(v.trim().toLowerCase());\n\nconst EYE_OPEN =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>';\nconst EYE_SHUT =\n\t'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m3 3 18 18\"/><path d=\"M10.6 5.1A10.9 10.9 0 0 1 12 5c6.5 0 10 7 10 7a17.4 17.4 0 0 1-3.4 4.4M6.6 6.6A17 17 0 0 0 2 12s3.5 7 10 7a10.7 10.7 0 0 0 5.4-1.4\"/></svg>';\n\nexport class SelfstoreBackupsElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn [\n\t\t\t'with-create',\n\t\t\t'with-rename',\n\t\t\t'with-delete',\n\t\t\t'with-open',\n\t\t\t'with-encrypt',\n\t\t\t'with-share',\n\t\t\t'with-shared'\n\t\t];\n\t}\n\n\t#manager: BackupsManager | null = null;\n\t#rows: BackupRow[] | null = null;\n\t#lastActive: string | null | undefined = undefined;\n\t#listing = false;\n\t#busy = false;\n\t#openBusy: string | null = null;\n\t#menuFor: string | null = null;\n\t#pwFor: string | null = null;\n\t#pw = '';\n\t#pwShown = false;\n\t#renameFor: BackupRow | null = null;\n\t#renameLabel = '';\n\t#createOpen = false;\n\t#createLabel = '';\n\t#members: { by: string; fileId?: string | null }[] = [];\n\t#replicaFlow: ReplicaFlow | null = null;\n\t#replicaSnap: ReplicaSnapshot | null = null;\n\t#repWebdav: WebdavConfig = { url: '', username: '', password: '' };\n\t#repS3: S3Config = {\n\t\tendpoint: '',\n\t\tregion: '',\n\t\tbucket: '',\n\t\tkey: '',\n\t\taccessKeyId: '',\n\t\tsecretAccessKey: ''\n\t};\n\t#activeEncrypted: boolean | null = null;\n\t#activeShared: boolean | null = null;\n\t#confirmAction: ((action: BackupsAction) => boolean | Promise<boolean>) | null = null;\n\t#withCreate = true;\n\t#withRename = true;\n\t#withDelete = true;\n\t#withOpen = true;\n\t#withEncrypt = true;\n\t#withShare = true;\n\t#withShared = true;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\t/** The headless manager this panel drives (see 'selfstore/backups'). */\n\tget manager(): BackupsManager | null {\n\t\treturn this.#manager;\n\t}\n\tset manager(v: BackupsManager | null) {\n\t\tthis.#manager = v;\n\t\tthis.wire();\n\t}\n\n\t/** The households this device is a member of (one entry per share, or a\n\t * single object for one): each renders in \"Shared with me\" labeled by who\n\t * shares it, removal = leaving (host performs it on\n\t * 'selfstore-backups-leave', whose detail names the entry's fileId). With\n\t * `fileId` (the share's dedicated wallet), that registry row IS the\n\t * member row: active it wears the badge, inactive it opens like any\n\t * shared silo - and its one menu action is leaving, never a mere forget. */\n\tget member(): { by: string; fileId?: string | null }[] | null {\n\t\treturn this.#members.length > 0 ? this.#members : null;\n\t}\n\tset member(\n\t\tv: { by: string; fileId?: string | null }[] | { by: string; fileId?: string | null } | null\n\t) {\n\t\tthis.#members = v == null ? [] : Array.isArray(v) ? v : [v];\n\t\tthis.rerender();\n\t}\n\n\t/** Live state of the ATTACHED backup, from the host's store: the active\n\t * row's pills prefer these over the learned memories (which may lag). */\n\tget activeEncrypted(): boolean | null {\n\t\treturn this.#activeEncrypted;\n\t}\n\tset activeEncrypted(v: boolean | null) {\n\t\tthis.#activeEncrypted = v;\n\t\tthis.rerender();\n\t}\n\tget activeShared(): boolean | null {\n\t\treturn this.#activeShared;\n\t}\n\tset activeShared(v: boolean | null) {\n\t\tthis.#activeShared = v;\n\t\tthis.rerender();\n\t}\n\n\t/** Host veto over the destructive gestures (delete / forget / leave):\n\t * answer (or resolve) false to keep things as they are - window.confirm\n\t * fits as-is. Default: everything proceeds. */\n\tget confirmAction(): ((action: BackupsAction) => boolean | Promise<boolean>) | null {\n\t\treturn this.#confirmAction;\n\t}\n\tset confirmAction(v: ((action: BackupsAction) => boolean | Promise<boolean>) | null) {\n\t\tthis.#confirmAction = v ?? null;\n\t}\n\n\tget withCreate(): boolean {\n\t\treturn this.#withCreate;\n\t}\n\tset withCreate(v: boolean) {\n\t\tthis.#withCreate = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withRename(): boolean {\n\t\treturn this.#withRename;\n\t}\n\tset withRename(v: boolean) {\n\t\tthis.#withRename = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withDelete(): boolean {\n\t\treturn this.#withDelete;\n\t}\n\tset withDelete(v: boolean) {\n\t\tthis.#withDelete = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withOpen(): boolean {\n\t\treturn this.#withOpen;\n\t}\n\tset withOpen(v: boolean) {\n\t\tthis.#withOpen = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withEncrypt(): boolean {\n\t\treturn this.#withEncrypt;\n\t}\n\tset withEncrypt(v: boolean) {\n\t\tthis.#withEncrypt = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withShare(): boolean {\n\t\treturn this.#withShare;\n\t}\n\tset withShare(v: boolean) {\n\t\tthis.#withShare = v !== false;\n\t\tthis.rerender();\n\t}\n\tget withShared(): boolean {\n\t\treturn this.#withShared;\n\t}\n\tset withShared(v: boolean) {\n\t\tthis.#withShared = v !== false;\n\t\tthis.rerender();\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tconst on = value == null || !isOff(value);\n\t\tif (name === 'with-create') this.withCreate = on;\n\t\tif (name === 'with-rename') this.withRename = on;\n\t\tif (name === 'with-delete') this.withDelete = on;\n\t\tif (name === 'with-open') this.withOpen = on;\n\t\tif (name === 'with-encrypt') this.withEncrypt = on;\n\t\tif (name === 'with-share') this.withShare = on;\n\t\tif (name === 'with-shared') this.withShared = on;\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tthis.wire();\n\t}\n\n\t/** Re-list the rows from the destination (the host calls this after a\n\t * gesture of its own moved things - a leave, an external change). */\n\trefresh(): void {\n\t\tvoid this.loadRows();\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected || !this.#manager) return;\n\t\tthis.unsub?.();\n\t\tconst manager = this.#manager;\n\t\tconst unsubManager = manager.subscribe((snap) => {\n\t\t\t// A switch (or first attach) re-lists; every snapshot repaints.\n\t\t\tif (snap.activeFileId !== this.#lastActive) {\n\t\t\t\tthis.#lastActive = snap.activeFileId;\n\t\t\t\tvoid this.loadRows();\n\t\t\t}\n\t\t\tthis.rerender();\n\t\t});\n\t\tconst unsubReplica = this.#replicaFlow?.subscribe((snap) => {\n\t\t\tthis.#replicaSnap = snap;\n\t\t\tthis.rerender();\n\t\t});\n\t\tthis.unsub = () => {\n\t\t\tunsubManager();\n\t\t\tunsubReplica?.();\n\t\t};\n\t\tvoid manager.hydrate().then(() => this.loadRows());\n\t}\n\n\t/** The backup-copy journey (see 'selfstore/flows' replicaFlow). Setting it\n\t * adds a menu entry on the active backup's card and renders the copy\n\t * cards under it; without it the panel is byte-identical to before. The\n\t * widget restores a recorded copy by itself. */\n\tget replica(): ReplicaFlow | null {\n\t\treturn this.#replicaFlow;\n\t}\n\tset replica(v: ReplicaFlow | null) {\n\t\tthis.#replicaFlow = v;\n\t\tthis.#replicaSnap = v?.snapshot ?? null;\n\t\tif (v) void v.restore();\n\t\tthis.wire();\n\t}\n\n\t/** One destination listing, then the lazy encryption probes (each learned\n\t * bit repaints its row). A transient failure keeps the last good list. */\n\tprivate async loadRows(): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager || this.#listing) return;\n\t\tthis.#listing = true;\n\t\ttry {\n\t\t\tthis.#rows = await manager.list();\n\t\t\tthis.rerender();\n\t\t\tfor (const r of this.#rows ?? []) {\n\t\t\t\tif (r.encrypted !== null) continue;\n\t\t\t\tconst enc = await manager.probeEncryption(r.fileId);\n\t\t\t\tif (enc === null || this.#rows === null) continue;\n\t\t\t\tthis.#rows = this.#rows.map((x) => (x.fileId === r.fileId ? { ...x, encrypted: enc } : x));\n\t\t\t\tthis.rerender();\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.#rows = this.#rows ?? [];\n\t\t\tthis.rerender();\n\t\t} finally {\n\t\t\tthis.#listing = false;\n\t\t}\n\t}\n\n\t/** t() with {placeholders}. */\n\tprivate ts(key: string, params: Record<string, string>): string {\n\t\treturn this.t(key).replace(/\\{(\\w+)\\}/g, (_, k: string) => params[k] ?? '');\n\t}\n\n\tprivate label(row: BackupRow): string {\n\t\treturn row.label ?? this.t('backups.mine.personal');\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst manager = this.#manager;\n\t\tif (!manager) return;\n\t\tconst snap = manager.snapshot;\n\t\tconst rows = this.#rows ?? [];\n\t\tconst active = snap.activeFileId;\n\n\t\t// --- My backups -----------------------------------------------------\n\t\tconst mine = snap.joined ? rows.filter((r) => r.fileId !== active) : rows;\n\t\tif (this.#rows !== null) put(into, this.heading('sub heading', 'backups.mine.heading'));\n\t\tconst list = h('ul', { part: 'list' });\n\t\tfor (const r of mine) {\n\t\t\tconst isActive = r.fileId === active;\n\t\t\tif (this.#pwFor === r.fileId) list.append(this.passwordCard(r));\n\t\t\telse if (this.#renameFor?.fileId === r.fileId) list.append(this.renameCard(r));\n\t\t\t// The attached copy is not a backup of its own: it rides INSIDE the\n\t\t\t// active card as one line under its pills (never a card of its own,\n\t\t\t// never for a joined member's shared file).\n\t\t\telse list.append(this.rowCard(r, isActive, isActive ? this.replicaAttachedLine() : null));\n\t\t\t// The destination choice / config form (transient setup) renders as a\n\t\t\t// card right under the active one.\n\t\t\tif (isActive) for (const el of this.replicaSetup()) list.append(el);\n\t\t}\n\t\tif (list.childElementCount > 0) into.append(list);\n\n\t\t// --- Create ---------------------------------------------------------\n\t\tif (this.#withCreate) {\n\t\t\tif (this.#createOpen) into.append(this.createCard());\n\t\t\telse {\n\t\t\t\tinto.append(\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button new-button',\n\t\t\t\t\t\t\t'data-action': 'new',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\t\t\tthis.#createOpen = true;\n\t\t\t\t\t\t\t\tthis.#createLabel = '';\n\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.new')\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// --- Shared with me -------------------------------------------------\n\t\tif (!this.#withShared) return;\n\t\tconst members = this.#members;\n\t\t// The badge row: the membership riding the ATTACHED file - wallet-bound\n\t\t// when its silo is active (the others' registry rows stand in), or a\n\t\t// legacy unbound one on whatever file is attached.\n\t\tconst badge = members.find((m) => (m.fileId != null ? m.fileId === active : true)) ?? null;\n\t\t// An owner already present as a MEMBERSHIP owns its row, and its one\n\t\t// action is Leave. A registry entry for that same owner is a stale\n\t\t// duplicate of the same share (a re-join left the old file behind): never\n\t\t// show it as a second, Forget-only row. Forget rows also collapse to one\n\t\t// per owner - never the same email twice.\n\t\tconst memberWhos = new Set(members.map((m) => m.by));\n\t\tconst others: { fileId: string; who: string; member: boolean }[] = [];\n\t\tconst seenForget = new Set<string>();\n\t\tfor (const s of snap.registry.shared) {\n\t\t\tif (s.fileId === active && !snap.joined) continue;\n\t\t\tconst member = members.some((m) => m.fileId === s.fileId);\n\t\t\tconst who = s.ownerEmail ?? s.ownerName ?? '?';\n\t\t\tif (!member) {\n\t\t\t\tif (memberWhos.has(who) || seenForget.has(who)) continue;\n\t\t\t\tseenForget.add(who);\n\t\t\t}\n\t\t\tothers.push({ fileId: s.fileId, who, member });\n\t\t}\n\t\tif (members.length === 0 && others.length === 0) return;\n\t\tput(into, this.heading('sub heading', 'backups.shared.heading'));\n\t\tconst shared = h('ul', { part: 'list' });\n\t\tif (badge) {\n\t\t\tconst activeRow = rows.find((r) => r.fileId === active) ?? null;\n\t\t\tconst leaveAction: BackupsAction = {\n\t\t\t\ttype: 'leave',\n\t\t\t\tfileId: badge.fileId ?? null,\n\t\t\t\twho: badge.by\n\t\t\t};\n\t\t\tshared.append(\n\t\t\t\th(\n\t\t\t\t\t'li',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'card card-active',\n\t\t\t\t\t\tstyle: 'position:relative;border-color:var(--_ok)',\n\t\t\t\t\t\t'data-member': ''\n\t\t\t\t\t},\n\t\t\t\t\th(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\t\t\th(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ part: 'title' },\n\t\t\t\t\t\t\tbadge.fileId != null || !activeRow\n\t\t\t\t\t\t\t\t? this.ts('backups.shared.by', { who: badge.by })\n\t\t\t\t\t\t\t\t: this.label(activeRow),\n\t\t\t\t\t\t\th('span', { part: 'tag' }, this.t('backups.active'))\n\t\t\t\t\t\t),\n\t\t\t\t\t\tbadge.fileId == null && activeRow\n\t\t\t\t\t\t\t? h('div', { part: 'sub' }, this.ts('backups.shared.by', { who: badge.by }))\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t),\n\t\t\t\t\tthis.menuButton('member'),\n\t\t\t\t\tthis.#menuFor === 'member'\n\t\t\t\t\t\t? this.menu(\n\t\t\t\t\t\t\t\tthis.#withDelete\n\t\t\t\t\t\t\t\t\t? this.menuItem('leave', this.t('backups.shared.leave'), true, () =>\n\t\t\t\t\t\t\t\t\t\t\tthis.guarded(leaveAction, () =>\n\t\t\t\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-leave', { fileId: leaveAction.fileId })\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tfor (const s of others) {\n\t\t\t// The badge row's file never doubles as a registry row.\n\t\t\tif (badge && s.fileId === active) continue;\n\t\t\tconst memberEntry = s.member;\n\t\t\tshared.append(\n\t\t\t\th(\n\t\t\t\t\t'li',\n\t\t\t\t\t{ part: 'card', style: 'position:relative', 'data-shared': s.fileId },\n\t\t\t\t\tthis.#withOpen\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'button',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpart: 'link open-shared',\n\t\t\t\t\t\t\t\t\tstyle: 'flex:1;min-width:0;text-align:left;text-decoration:none',\n\t\t\t\t\t\t\t\t\t'data-action': 'open-shared',\n\t\t\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\t\t\tonclick: () => this.open(s.fileId)\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\th('div', { part: 'title' }, this.ts('backups.shared.by', { who: s.who })),\n\t\t\t\t\t\t\t\th(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{ part: 'sub' },\n\t\t\t\t\t\t\t\t\tthis.#openBusy === s.fileId\n\t\t\t\t\t\t\t\t\t\t? this.t('backups.loading')\n\t\t\t\t\t\t\t\t\t\t: this.t('backups.replaceHint')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: h(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\t\t\t\t\th('div', { part: 'title' }, this.ts('backups.shared.by', { who: s.who })),\n\t\t\t\t\t\t\t\th('div', { part: 'sub' }, this.t('backups.replaceHint'))\n\t\t\t\t\t\t\t),\n\t\t\t\t\tthis.menuButton(s.fileId),\n\t\t\t\t\tthis.#menuFor === s.fileId\n\t\t\t\t\t\t? this.menu(\n\t\t\t\t\t\t\t\tthis.#withDelete\n\t\t\t\t\t\t\t\t\t? memberEntry\n\t\t\t\t\t\t\t\t\t\t? this.menuItem('leave', this.t('backups.shared.leave'), true, () =>\n\t\t\t\t\t\t\t\t\t\t\t\tthis.guarded({ type: 'leave', fileId: s.fileId, who: s.who }, () =>\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-leave', { fileId: s.fileId })\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t: this.menuItem('forget', this.t('backups.delete'), true, () =>\n\t\t\t\t\t\t\t\t\t\t\t\tthis.guarded(\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ type: 'forget', fileId: s.fileId, who: s.who },\n\t\t\t\t\t\t\t\t\t\t\t\t\t() => void this.forget(s.fileId)\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tif (shared.childElementCount > 0) into.append(shared);\n\t}\n\n\t// --- Cards ----------------------------------------------------------------\n\n\tprivate pills(r: BackupRow, active: boolean): (HTMLElement | string | null)[] {\n\t\tconst enc = active && this.#activeEncrypted !== null ? this.#activeEncrypted : r.encrypted;\n\t\tconst shr = active && this.#activeShared !== null ? this.#activeShared : r.shared;\n\t\tconst bits: (HTMLElement | string | null)[] = [];\n\t\tif (enc !== null) {\n\t\t\tbits.push(\n\t\t\t\th(\n\t\t\t\t\t'span',\n\t\t\t\t\t{ part: enc ? 'pill pill-encrypted sev-ok' : 'pill pill-plain', style: pillStyle },\n\t\t\t\t\tthis.t(enc ? 'backups.pill.encrypted' : 'backups.pill.plain')\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tif (shr !== null) {\n\t\t\tbits.push(\n\t\t\t\th(\n\t\t\t\t\t'span',\n\t\t\t\t\t{ part: shr ? 'pill pill-shared sev-warn' : 'pill pill-private', style: pillStyle },\n\t\t\t\t\tthis.t(shr ? 'backups.pill.shared' : 'backups.pill.private')\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tif (r.modifiedAt) {\n\t\t\tbits.push(\n\t\t\t\th(\n\t\t\t\t\t'span',\n\t\t\t\t\t{ part: 'sub' },\n\t\t\t\t\tthis.ts('backups.modified', { when: new Date(r.modifiedAt).toLocaleDateString() })\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\treturn bits;\n\t}\n\n\tprivate rowCard(r: BackupRow, active: boolean, footer: HTMLElement | null = null): HTMLElement {\n\t\tconst body = h(\n\t\t\t'div',\n\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'title' },\n\t\t\t\tthis.label(r),\n\t\t\t\tactive ? h('span', { part: 'tag' }, this.t('backups.active')) : null\n\t\t\t),\n\t\t\th('div', { part: 'row', style: 'margin-top:0.2rem' }, ...this.pills(r, active)),\n\t\t\tfooter\n\t\t);\n\t\tconst opens = this.#withOpen && !active;\n\t\tconst face = opens\n\t\t\t? h(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'link open-row',\n\t\t\t\t\t\tstyle: 'flex:1;min-width:0;text-align:left;text-decoration:none',\n\t\t\t\t\t\t'data-action': 'open',\n\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\tonclick: () => this.open(r.fileId)\n\t\t\t\t\t},\n\t\t\t\t\tthis.#openBusy === r.fileId ? h('div', { part: 'sub' }, this.t('backups.loading')) : body\n\t\t\t\t)\n\t\t\t: body;\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{\n\t\t\t\tpart: active ? 'card card-active' : 'card',\n\t\t\t\tstyle: active ? 'position:relative;border-color:var(--_ok)' : 'position:relative',\n\t\t\t\t'data-row': r.fileId\n\t\t\t},\n\t\t\tface,\n\t\t\tthis.menuButton(r.fileId),\n\t\t\tthis.#menuFor === r.fileId\n\t\t\t\t? this.menu(\n\t\t\t\t\t\topens\n\t\t\t\t\t\t\t? this.menuItem('open', this.t('backups.open'), false, () => this.open(r.fileId))\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withEncrypt\n\t\t\t\t\t\t\t? this.menuItem('encrypt', this.t('backups.encrypt'), false, () =>\n\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-encrypt', {\n\t\t\t\t\t\t\t\t\t\tfileId: r.fileId,\n\t\t\t\t\t\t\t\t\t\tlabel: r.label,\n\t\t\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withShare\n\t\t\t\t\t\t\t? this.menuItem('share', this.t('backups.share'), false, () =>\n\t\t\t\t\t\t\t\t\tthis.emit('selfstore-backups-share', { fileId: r.fileId, label: r.label, active })\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tactive &&\n\t\t\t\t\t\t\tthis.#replicaFlow &&\n\t\t\t\t\t\t\tthis.#replicaSnap?.step === 'idle' &&\n\t\t\t\t\t\t\t!this.#replicaSnap.replica\n\t\t\t\t\t\t\t? this.menuItem('replica-add', this.t('backups.replica.add'), false, () =>\n\t\t\t\t\t\t\t\t\tthis.#replicaFlow?.open()\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withRename\n\t\t\t\t\t\t\t? this.menuItem('rename', this.t('backups.rename'), false, () => {\n\t\t\t\t\t\t\t\t\tthis.#renameFor = r;\n\t\t\t\t\t\t\t\t\tthis.#renameLabel = r.label ?? '';\n\t\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\tthis.#withDelete\n\t\t\t\t\t\t\t? this.menuItem('delete', this.t('backups.delete'), true, () =>\n\t\t\t\t\t\t\t\t\tthis.guarded(\n\t\t\t\t\t\t\t\t\t\t{ type: 'delete', fileId: r.fileId, name: r.name, active },\n\t\t\t\t\t\t\t\t\t\t() => void this.deleteRow(r.fileId)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: null\n\t\t\t\t\t)\n\t\t\t\t: null\n\t\t);\n\t}\n\n\tprivate passwordCard(r: BackupRow): HTMLElement {\n\t\tconst submit = (): void => {\n\t\t\tif (this.#pw.length > 0) void this.open(r.fileId, this.#pw);\n\t\t};\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card', 'data-password': r.fileId },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\th('div', { part: 'title' }, this.label(r)),\n\t\t\t\th('div', { part: 'sub' }, this.t('backups.pwHint')),\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'span',\n\t\t\t\t\t\t{ part: 'field', style: 'flex:1;min-width:9rem' },\n\t\t\t\t\t\th('input', {\n\t\t\t\t\t\t\tpart: 'input',\n\t\t\t\t\t\t\ttype: this.#pwShown ? 'text' : 'password',\n\t\t\t\t\t\t\tautocomplete: 'current-password',\n\t\t\t\t\t\t\t'data-keep': 'backup-pw',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\toninput: (e: Event) => (this.#pw = (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\tonkeydown: (e: Event) => {\n\t\t\t\t\t\t\t\tif ((e as KeyboardEvent).key === 'Enter') submit();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tthis.eye()\n\t\t\t\t\t),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'pw-open',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: submit\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.open')\n\t\t\t\t\t),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t'data-action': 'pw-cancel',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: () => this.closePw()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate renameCard(r: BackupRow): HTMLElement {\n\t\tconst taken = this.nameTaken(this.#renameLabel, r.fileId);\n\t\tconst clean = this.#renameLabel.trim();\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card', 'data-rename': r.fileId },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\th('div', { part: 'title' }, this.t('backups.renameTitle')),\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\tstyle: 'margin-top:0.45rem',\n\t\t\t\t\t'data-keep': 'rename-label',\n\t\t\t\t\tmaxlength: '40',\n\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\tvalue: this.#renameLabel,\n\t\t\t\t\toninput: (e: Event) => {\n\t\t\t\t\t\tthis.#renameLabel = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttaken\n\t\t\t\t\t? h('div', { part: 'error-note' }, this.t('backups.taken'))\n\t\t\t\t\t: clean\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ part: 'sub' },\n\t\t\t\t\t\t\t\tthis.ts('backups.willBe', { file: this.#manager?.fileNameFor(clean) ?? '' })\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'rename-save',\n\t\t\t\t\t\t\tdisabled: this.#busy || !clean || taken,\n\t\t\t\t\t\t\tonclick: () => void this.rename(r)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.rename')\n\t\t\t\t\t),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t'data-action': 'rename-cancel',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\t\t\tthis.#renameFor = null;\n\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate createCard(): HTMLElement {\n\t\tconst taken = this.nameTaken(this.#createLabel, null);\n\t\tconst clean = this.#createLabel.trim();\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{ part: 'card', 'data-create': '' },\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ style: 'flex:1;min-width:0' },\n\t\t\t\th('div', { part: 'title' }, this.t('backups.newTitle')),\n\t\t\t\th('div', { part: 'sub' }, this.t('backups.startsBlank')),\n\t\t\t\th('input', {\n\t\t\t\t\tpart: 'input',\n\t\t\t\t\tstyle: 'margin-top:0.45rem',\n\t\t\t\t\tplaceholder: this.t('backups.namePh'),\n\t\t\t\t\t'data-keep': 'create-label',\n\t\t\t\t\tmaxlength: '40',\n\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\toninput: (e: Event) => {\n\t\t\t\t\t\tthis.#createLabel = (e.target as HTMLInputElement).value;\n\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttaken\n\t\t\t\t\t? h('div', { part: 'error-note' }, this.t('backups.taken'))\n\t\t\t\t\t: clean\n\t\t\t\t\t\t? h(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ part: 'sub' },\n\t\t\t\t\t\t\t\tthis.ts('backups.willBe', { file: this.#manager?.fileNameFor(clean) ?? '' })\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t\t'data-action': 'create',\n\t\t\t\t\t\t\tdisabled: this.#busy || !clean || taken,\n\t\t\t\t\t\t\tonclick: () => void this.create()\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.create')\n\t\t\t\t\t),\n\t\t\t\t\th(\n\t\t\t\t\t\t'button',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpart: 'button',\n\t\t\t\t\t\t\t'data-action': 'create-cancel',\n\t\t\t\t\t\t\tdisabled: this.#busy,\n\t\t\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\t\t\tthis.#createOpen = false;\n\t\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\t// --- Backup copy (replica) -------------------------------------------------\n\n\t/** The transient setup UI under the active card: the destination choice or a\n\t * config form. The ATTACHED copy is not here - it rides inside the active\n\t * card (replicaAttachedLine). Idle renders nothing - the entry point lives\n\t * in the active card's menu. */\n\tprivate replicaSetup(): HTMLElement[] {\n\t\tconst snap = this.#replicaSnap;\n\t\tif (!this.#replicaFlow || !snap || snap.replica) return [];\n\t\tif (snap.step === 'choose') return [this.replicaPicker(snap)];\n\t\tif (snap.step === 'form-webdav') return [this.replicaWebdavForm(snap)];\n\t\tif (snap.step === 'form-s3') return [this.replicaS3Form(snap)];\n\t\treturn [];\n\t}\n\n\t/** The attached copy is not a backup of its own: it renders as ONE line\n\t * INSIDE the active backup's card, under its pills (label, freshness, an\n\t * inline \"remove\") - never a card or a block of its own. Null when no copy\n\t * is attached. */\n\tprivate replicaAttachedLine(): HTMLElement | null {\n\t\tconst snap = this.#replicaSnap;\n\t\tif (!this.#replicaFlow || !snap || !snap.replica) return null;\n\t\tconst rep = snap.replica;\n\t\tconst label = rep.label;\n\t\tconst status = rep.lastError\n\t\t\t? h('span', { part: 'sub replica-error' }, this.t('backups.replica.error'))\n\t\t\t: rep.lastPublishAt\n\t\t\t\t? h(\n\t\t\t\t\t\t'span',\n\t\t\t\t\t\t{ part: 'sub replica-ok' },\n\t\t\t\t\t\tthis.ts('backups.replica.uptodate', {\n\t\t\t\t\t\t\twhen: new Date(rep.lastPublishAt).toLocaleTimeString([], {\n\t\t\t\t\t\t\t\thour: '2-digit',\n\t\t\t\t\t\t\t\tminute: '2-digit'\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t: h('span', { part: 'sub' }, this.t('backups.replica.pending'));\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{\n\t\t\t\tpart: 'sub replica-line',\n\t\t\t\t'data-replica': '',\n\t\t\t\tstyle:\n\t\t\t\t\t'display:flex;flex-wrap:wrap;align-items:baseline;gap:0.1rem 0.5rem;margin-top:0.35rem'\n\t\t\t},\n\t\t\th('span', { part: 'replica-label' }, this.ts('backups.replica.card', { label })),\n\t\t\tstatus,\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{\n\t\t\t\t\tpart: 'link replica-remove',\n\t\t\t\t\ttype: 'button',\n\t\t\t\t\t'data-action': 'replica-remove',\n\t\t\t\t\tonclick: () =>\n\t\t\t\t\t\tthis.guarded({ type: 'replica-remove', label }, () => void this.#replicaFlow?.remove())\n\t\t\t\t},\n\t\t\t\tthis.t('backups.replica.remove')\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate replicaPicker(snap: ReplicaSnapshot): HTMLElement {\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card replica-picker', style: 'display:block' },\n\t\t\th('div', { part: 'title' }, this.t('backups.replica.title')),\n\t\t\th('div', { part: 'sub', style: 'margin:0.2rem 0 0.6rem' }, this.t('backups.replica.intro')),\n\t\t\t...snap.kinds.map((kind: ConnectKind) =>\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'button replica-dest',\n\t\t\t\t\t\tstyle: 'display:block;width:100%;text-align:left;margin-bottom:0.4rem',\n\t\t\t\t\t\t'data-kind': kind,\n\t\t\t\t\t\tdisabled: snap.busy,\n\t\t\t\t\t\tonclick: () => this.#replicaFlow?.pick(kind)\n\t\t\t\t\t},\n\t\t\t\t\tthis.t(`backups.replica.dest.${kind}`)\n\t\t\t\t)\n\t\t\t),\n\t\t\tsnap.error ? h('div', { part: 'error-note' }, this.t('error.generic')) : null,\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{\n\t\t\t\t\tpart: 'button',\n\t\t\t\t\t'data-action': 'replica-cancel',\n\t\t\t\t\tdisabled: snap.busy,\n\t\t\t\t\tonclick: () => this.#replicaFlow?.cancel()\n\t\t\t\t},\n\t\t\t\tthis.t('backups.cancel')\n\t\t\t)\n\t\t);\n\t}\n\n\t/** A config field: mutates state on input, no repaint (validated on submit). */\n\tprivate replicaField(\n\t\tkey: string,\n\t\ttype: string,\n\t\tvalue: string,\n\t\toninput: (v: string) => void\n\t): HTMLElement {\n\t\treturn h('input', {\n\t\t\tpart: 'input',\n\t\t\tstyle: 'display:block;width:100%;margin-bottom:0.4rem',\n\t\t\ttype,\n\t\t\tplaceholder: this.t(key),\n\t\t\t'aria-label': this.t(key),\n\t\t\tvalue,\n\t\t\toninput: (e: Event) => oninput((e.target as HTMLInputElement).value)\n\t\t});\n\t}\n\n\tprivate replicaWebdavForm(snap: ReplicaSnapshot): HTMLElement {\n\t\tconst c = this.#repWebdav;\n\t\tconst submit = (): void => {\n\t\t\tif (!c.url.trim()) return;\n\t\t\tthis.#replicaFlow?.submitWebdav({\n\t\t\t\turl: c.url.trim(),\n\t\t\t\tusername: c.username.trim(),\n\t\t\t\tpassword: c.password\n\t\t\t});\n\t\t};\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card replica-form', style: 'display:block' },\n\t\t\th('div', { part: 'title', style: 'margin-bottom:0.3rem' }, this.t('backups.replica.title')),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'sub', style: 'margin-bottom:0.6rem' },\n\t\t\t\tthis.t('backups.replica.webdav.help')\n\t\t\t),\n\t\t\tthis.replicaField('backups.replica.webdav.url', 'url', c.url, (v) => (c.url = v)),\n\t\t\tthis.replicaField('backups.replica.webdav.user', 'text', c.username, (v) => (c.username = v)),\n\t\t\tthis.replicaField(\n\t\t\t\t'backups.replica.webdav.password',\n\t\t\t\t'password',\n\t\t\t\tc.password,\n\t\t\t\t(v) => (c.password = v)\n\t\t\t),\n\t\t\tsnap.error ? h('div', { part: 'error-note' }, this.t('error.generic')) : null,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t'data-action': 'replica-webdav',\n\t\t\t\t\t\tdisabled: snap.busy,\n\t\t\t\t\t\tonclick: submit\n\t\t\t\t\t},\n\t\t\t\t\tthis.t('backups.replica.save')\n\t\t\t\t),\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button', disabled: snap.busy, onclick: () => this.#replicaFlow?.cancel() },\n\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate replicaS3Form(snap: ReplicaSnapshot): HTMLElement {\n\t\tconst c = this.#repS3;\n\t\tconst submit = (): void => {\n\t\t\tconst config: S3Config = {\n\t\t\t\tendpoint: c.endpoint.trim(),\n\t\t\t\tregion: c.region.trim(),\n\t\t\t\tbucket: c.bucket.trim(),\n\t\t\t\tkey: c.key.trim(),\n\t\t\t\taccessKeyId: c.accessKeyId.trim(),\n\t\t\t\tsecretAccessKey: c.secretAccessKey\n\t\t\t};\n\t\t\tif (!config.endpoint || !config.region || !config.bucket || !config.key) return;\n\t\t\tif (!config.accessKeyId || !config.secretAccessKey) return;\n\t\t\tthis.#replicaFlow?.submitS3(config);\n\t\t};\n\t\treturn h(\n\t\t\t'li',\n\t\t\t{ part: 'card replica-form', style: 'display:block' },\n\t\t\th('div', { part: 'title', style: 'margin-bottom:0.5rem' }, this.t('backups.replica.title')),\n\t\t\tthis.replicaField('backups.replica.s3.endpoint', 'url', c.endpoint, (v) => (c.endpoint = v)),\n\t\t\tthis.replicaField('backups.replica.s3.region', 'text', c.region, (v) => (c.region = v)),\n\t\t\tthis.replicaField('backups.replica.s3.bucket', 'text', c.bucket, (v) => (c.bucket = v)),\n\t\t\tthis.replicaField('backups.replica.s3.key', 'text', c.key, (v) => (c.key = v)),\n\t\t\tthis.replicaField(\n\t\t\t\t'backups.replica.s3.accessKeyId',\n\t\t\t\t'text',\n\t\t\t\tc.accessKeyId,\n\t\t\t\t(v) => (c.accessKeyId = v)\n\t\t\t),\n\t\t\tthis.replicaField(\n\t\t\t\t'backups.replica.s3.secret',\n\t\t\t\t'password',\n\t\t\t\tc.secretAccessKey,\n\t\t\t\t(v) => (c.secretAccessKey = v)\n\t\t\t),\n\t\t\tsnap.error ? h('div', { part: 'error-note' }, this.t('error.generic')) : null,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'row', style: 'margin-top:0.45rem' },\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{\n\t\t\t\t\t\tpart: 'button button-primary',\n\t\t\t\t\t\t'data-action': 'replica-s3',\n\t\t\t\t\t\tdisabled: snap.busy,\n\t\t\t\t\t\tonclick: submit\n\t\t\t\t\t},\n\t\t\t\t\tthis.t('backups.replica.save')\n\t\t\t\t),\n\t\t\t\th(\n\t\t\t\t\t'button',\n\t\t\t\t\t{ part: 'button', disabled: snap.busy, onclick: () => this.#replicaFlow?.cancel() },\n\t\t\t\t\tthis.t('backups.cancel')\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\t// --- Menu -----------------------------------------------------------------\n\n\tprivate menuButton(key: string): HTMLElement {\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{\n\t\t\t\tpart: 'button menu-button',\n\t\t\t\t'aria-label': this.t('backups.menu'),\n\t\t\t\t'aria-haspopup': 'menu',\n\t\t\t\t'aria-expanded': this.#menuFor === key ? 'true' : 'false',\n\t\t\t\t'data-action': 'menu',\n\t\t\t\t'data-menu-key': key,\n\t\t\t\tdisabled: this.#busy,\n\t\t\t\tonclick: () => {\n\t\t\t\t\tthis.#menuFor = this.#menuFor === key ? null : key;\n\t\t\t\t\tthis.rerender();\n\t\t\t\t\t(this.root.querySelector('[part~=\"menu\"]') as HTMLElement | null)?.focus();\n\t\t\t\t}\n\t\t\t},\n\t\t\t'⋯'\n\t\t);\n\t}\n\n\t/** The open overflow menu: a backdrop closes it on any outside click or\n\t * tap, Escape closes it and hands focus back to its trigger. The panel is\n\t * a dropdown over the trigger's corner on wide screens and a bottom sheet\n\t * on phones - both styled in the base sheet. */\n\tprivate menu(...items: (HTMLElement | null)[]): HTMLElement {\n\t\tconst key = this.#menuFor;\n\t\tconst close = (): void => {\n\t\t\tthis.#menuFor = null;\n\t\t\tthis.rerender();\n\t\t\t(this.root.querySelector(`[data-menu-key=\"${key}\"]`) as HTMLElement | null)?.focus();\n\t\t};\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{ part: 'menu-layer' },\n\t\t\th('div', { part: 'menu-backdrop', 'data-action': 'menu-close', onclick: close }),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tpart: 'menu',\n\t\t\t\t\trole: 'menu',\n\t\t\t\t\ttabindex: '-1',\n\t\t\t\t\tonkeydown: (e: Event) => {\n\t\t\t\t\t\tif ((e as KeyboardEvent).key === 'Escape') close();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t...items.filter((i): i is HTMLElement => i !== null)\n\t\t\t)\n\t\t);\n\t}\n\n\tprivate menuItem(action: string, text: string, danger: boolean, run: () => void): HTMLElement {\n\t\treturn h(\n\t\t\t'button',\n\t\t\t{\n\t\t\t\tpart: danger ? 'menu-item menu-item-danger' : 'menu-item',\n\t\t\t\ttype: 'button',\n\t\t\t\trole: 'menuitem',\n\t\t\t\t'data-action': action,\n\t\t\t\tonclick: () => {\n\t\t\t\t\tthis.#menuFor = null;\n\t\t\t\t\trun();\n\t\t\t\t}\n\t\t\t},\n\t\t\ttext\n\t\t);\n\t}\n\n\tprivate eye(): HTMLElement {\n\t\tconst btn = h('button', {\n\t\t\tpart: 'eye',\n\t\t\ttype: 'button',\n\t\t\t'aria-label': this.t(this.#pwShown ? 'backups.pwHide' : 'backups.pwShow'),\n\t\t\tonclick: () => {\n\t\t\t\tthis.#pwShown = !this.#pwShown;\n\t\t\t\tthis.rerender();\n\t\t\t}\n\t\t});\n\t\tbtn.innerHTML = this.#pwShown ? EYE_SHUT : EYE_OPEN;\n\t\treturn btn;\n\t}\n\n\t// --- Gestures --------------------------------------------------------------\n\n\tprivate nameTaken(label: string, exceptFileId: string | null): boolean {\n\t\tconst clean = label.trim().toLowerCase();\n\t\tif (!clean || this.#busy) return false;\n\t\treturn (this.#rows ?? []).some(\n\t\t\t(r) => r.fileId !== exceptFileId && r.label !== null && r.label.trim().toLowerCase() === clean\n\t\t);\n\t}\n\n\t/** Run a destructive action through the host's veto (default: proceed).\n\t * A throwing hook reads as \"no\": destruction needs a clear yes. */\n\tprivate guarded(action: BackupsAction, run: () => void): void {\n\t\tconst gate = this.#confirmAction;\n\t\tif (!gate) {\n\t\t\trun();\n\t\t\treturn;\n\t\t}\n\t\tvoid Promise.resolve()\n\t\t\t.then(() => gate(action))\n\t\t\t.then((ok) => {\n\t\t\t\tif (ok) run();\n\t\t\t})\n\t\t\t.catch(() => undefined);\n\t}\n\n\t/** Open a row programmatically - the same gesture as tapping it, password\n\t * card included. Lets a host chain \"open this backup, then act on it\"\n\t * (its own sub-views) without re-implementing the passphrase step. */\n\tasync open(fileId: string, passphrase?: string): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.#openBusy = fileId;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tconst r = await manager.openBackup(fileId, passphrase ?? null);\n\t\t\tif (r === 'encrypted') {\n\t\t\t\tthis.#pwFor = fileId;\n\t\t\t\tif (passphrase) this.emit('selfstore-backups-wrong-password', { fileId });\n\t\t\t} else if (r === 'ok') {\n\t\t\t\tthis.closePw();\n\t\t\t\tthis.emit('selfstore-backups-opened', { fileId });\n\t\t\t\tvoid this.loadRows();\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t\tvoid this.loadRows(); // a GONE file was pruned: repaint truthfully\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.#openBusy = null;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async create(): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tconst label = this.#createLabel.trim();\n\t\tif (!manager || !label || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tconst r = await manager.createNamed(label);\n\t\t\tif (r === 'ok') {\n\t\t\t\tthis.#createOpen = false;\n\t\t\t\tthis.#createLabel = '';\n\t\t\t\tthis.emit('selfstore-backups-created', { label });\n\t\t\t\tvoid this.loadRows();\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async rename(row: BackupRow): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tconst label = this.#renameLabel.trim();\n\t\tif (!manager || !label || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tconst r = await manager.renameBackup(row.fileId, label);\n\t\t\tif (r === 'ok') {\n\t\t\t\tthis.#renameFor = null;\n\t\t\t\tthis.emit('selfstore-backups-renamed', { fileId: row.fileId, label });\n\t\t\t\tvoid this.loadRows();\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async deleteRow(fileId: string): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager || this.#busy) return;\n\t\tthis.#busy = true;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tif (await manager.deleteBackup(fileId)) {\n\t\t\t\tthis.#rows = (this.#rows ?? []).filter((r) => r.fileId !== fileId);\n\t\t\t\tthis.emit('selfstore-backups-deleted', { fileId });\n\t\t\t} else {\n\t\t\t\tthis.emit('selfstore-backups-error', { code: manager.snapshot.lastError ?? 'failed' });\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\tprivate async forget(fileId: string): Promise<void> {\n\t\tconst manager = this.#manager;\n\t\tif (!manager) return;\n\t\tawait manager.forgetShared(fileId);\n\t\tthis.emit('selfstore-backups-forgotten', { fileId });\n\t\tthis.rerender();\n\t}\n\n\tprivate closePw(): void {\n\t\tthis.#pwFor = null;\n\t\tthis.#pw = '';\n\t\tthis.#pwShown = false;\n\t}\n}\n\nconst pillStyle =\n\t'display:inline-block;font-size:0.72em;font-weight:600;line-height:1.6;padding:0 0.55em;border-radius:999px;border:1px solid var(--_border)';\n","/**\n * <selfstore-gate>: the first-run screen that asks where the data should live,\n * before the app has a durable home. Data that lives only in a browser profile\n * dies with it, so the question is worth a screen of its own rather than a line\n * buried in a settings pane.\n *\n * It is a frame around <selfstore-connect>, and it decides ONE thing the plain\n * connect widget cannot: whether to be on screen at all. That condition is the\n * engine's own `status.action === 'choose-destination'`, which covers both an\n * ephemeral store and one still on the device-only cache, and which ranks a\n * destination needing attention above a missing one - so the gate never demands\n * a choice when the real problem is a broken connection.\n *\n * import { defineSelfstoreWidgets } from 'selfstore/widgets';\n * defineSelfstoreWidgets();\n *\n * const el = document.querySelector('selfstore-gate');\n * el.store = store;\n * el.targets = { file: true, webdav: true };\n *\n * The host's own chrome goes in the light DOM through three slots: `brand`\n * (above the title), `extra` (under the destinations, e.g. a link to a demo)\n * and `footer` (the app's usual foot). Slotted nodes are never rebuilt.\n */\n\nimport type {\n\tConnectFlowOptions,\n\tConnectKind,\n\tConnectTargets,\n\tFlowHost,\n\tStoreLike\n} from '../flows/connect';\nimport type { SelfstoreConnectElement, WebdavPreset } from './connect';\nimport { FlowWidget, h, put, type WidgetLabels } from './base';\n\nconst EN: WidgetLabels = {\n\t'gate.title': 'Where should your data live?',\n\t'gate.hint':\n\t\t'It is encrypted on this device. Choose where to keep it and it gets saved there for you from now on.',\n\t'gate.fine': '',\n\t'gate.defer': 'Later - keep it in this browser only',\n\t'gate.defer.note': 'Data kept only in this browser is lost if its storage is cleared.'\n};\n\nconst FR: WidgetLabels = {\n\t'gate.title': 'Où enregistrer vos données ?',\n\t'gate.hint':\n\t\t'Elles sont chiffrées sur cet appareil. Choisissez une sauvegarde : tout y sera enregistré automatiquement.',\n\t'gate.fine': '',\n\t'gate.defer': 'Plus tard - garder sur cet appareil seulement',\n\t'gate.defer.note':\n\t\t'Sans sauvegarde, les données disparaissent si le stockage de cet appareil est vidé.'\n};\n\n/** The overlay itself. The card is the query container the base styles expect,\n * so the connect cards inside still react to their own width. */\nconst GATE_STYLES = `\n:host { display: contents; }\n[part~='gate'] {\n\tposition: fixed;\n\tinset: 0;\n\tz-index: var(--selfstore-gate-z, 280);\n\toverflow-y: auto;\n\tbackground: var(--selfstore-gate-backdrop, Canvas);\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n}\n[part~='gate-card'] {\n\twidth: 100%;\n\tmax-width: var(--selfstore-gate-width, 30rem);\n\tbox-sizing: border-box;\n\tpadding: calc(2rem + env(safe-area-inset-top)) 1.25rem 1.5rem;\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex: 1 0 auto;\n\tgap: var(--_gap);\n\tcontainer-type: inline-size;\n\toutline: none;\n}\n[part~='gate-title'] {\n\tmargin: 0;\n\tfont-size: var(--selfstore-gate-title-size, 1.5rem);\n\tfont-weight: 700;\n\tline-height: 1.25;\n}\nbutton[part~='gate-defer'] { align-self: flex-start; text-align: left; }\n[part~='gate-foot'] {\n\tflex-shrink: 0;\n\twidth: 100%;\n\tpadding-bottom: env(safe-area-inset-bottom);\n}\n`;\n\n/** The tag the connect element took, derived from the gate's own registered\n * name: both are defined together under the same prefix, so <app-gate> builds\n * an <app-connect> without anyone having to tell it. */\nfunction connectTagFor(gateTag: string): string {\n\treturn gateTag.endsWith('-gate')\n\t\t? `${gateTag.slice(0, -'-gate'.length)}-connect`\n\t\t: 'selfstore-connect';\n}\n\nexport class SelfstoreGateElement extends FlowWidget {\n\tstatic get observedAttributes(): string[] {\n\t\treturn ['armed', 'deferrable'];\n\t}\n\n\t#store: StoreLike | null = null;\n\t#targets: ConnectTargets | null = null;\n\t#options: ConnectFlowOptions = {};\n\t#icons: Partial<Record<ConnectKind, string>> = {};\n\t#recommended: ConnectKind | null = null;\n\t#advanced: ConnectKind[] = [];\n\t#presets: WebdavPreset[] = [];\n\t#armed = true;\n\t#deferrable = true;\n\t#deferred = false;\n\t#open = false;\n\t#connect: SelfstoreConnectElement | null = null;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\t/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */\n\tget store(): StoreLike | null {\n\t\treturn this.#store;\n\t}\n\tset store(v: StoreLike | null) {\n\t\t// Idempotent, so a host may assign it from a reactive effect: see the\n\t\t// note on <selfstore-connect>.\n\t\tif (v === this.#store) return;\n\t\tthis.#store = v;\n\t\tthis.wire();\n\t}\n\n\t/** The destinations to offer, exactly as <selfstore-connect> takes them.\n\t * Read when the gate opens; a change while it is open waits for the next\n\t * opening rather than rebuilding a journey under the user. */\n\tget targets(): ConnectTargets | null {\n\t\treturn this.#targets;\n\t}\n\tset targets(v: ConnectTargets | null) {\n\t\tthis.#targets = v;\n\t}\n\n\t/** Options for the connect flow (`defaultResolution`, `password`, ...).\n\t * Same timing as `targets`. */\n\tget options(): ConnectFlowOptions {\n\t\treturn this.#options;\n\t}\n\tset options(v: ConnectFlowOptions) {\n\t\tthis.#options = v ?? {};\n\t}\n\n\tget icons(): Partial<Record<ConnectKind, string>> {\n\t\treturn this.#icons;\n\t}\n\tset icons(v: Partial<Record<ConnectKind, string>> | null) {\n\t\tthis.#icons = v ?? {};\n\t\tthis.rerender();\n\t}\n\n\tget recommended(): ConnectKind | null {\n\t\treturn this.#recommended;\n\t}\n\tset recommended(v: ConnectKind | null) {\n\t\tthis.#recommended = v;\n\t\tthis.rerender();\n\t}\n\n\tget advanced(): ConnectKind[] {\n\t\treturn this.#advanced;\n\t}\n\tset advanced(v: ConnectKind[] | null) {\n\t\tthis.#advanced = v ?? [];\n\t\tthis.rerender();\n\t}\n\n\tget webdavPresets(): WebdavPreset[] {\n\t\treturn this.#presets;\n\t}\n\tset webdavPresets(v: WebdavPreset[] | null) {\n\t\tthis.#presets = Array.isArray(v) ? v : [];\n\t\tthis.rerender();\n\t}\n\n\t/** Whether the app has finished booting. Leave it true for a plain drop-in;\n\t * an app that restores its destination asynchronously sets it false until\n\t * that settles, so a connected user never glimpses the gate on the way in.\n\t * Also the `armed` attribute (`armed=\"false\"` to hold it shut). */\n\tget armed(): boolean {\n\t\treturn this.#armed;\n\t}\n\tset armed(v: boolean) {\n\t\tthis.#armed = v;\n\t\tthis.sync();\n\t}\n\n\t/** Whether to offer the way out (device-only is a working mode, just a\n\t * fragile one). Also the `deferrable` attribute. Part of the frame, so it\n\t * follows the same timing as `targets`: read when the gate opens. */\n\tget deferrable(): boolean {\n\t\treturn this.#deferrable;\n\t}\n\tset deferrable(v: boolean) {\n\t\tthis.#deferrable = v;\n\t}\n\n\t/** Set once the user chose to stay device-only; keeps the gate shut for the\n\t * rest of the session. Assign false to bring it back (a \"choose a\n\t * destination\" entry somewhere else in the app). */\n\tget deferred(): boolean {\n\t\treturn this.#deferred;\n\t}\n\tset deferred(v: boolean) {\n\t\tthis.#deferred = v;\n\t\tthis.sync();\n\t}\n\n\t/** Whether the gate is currently on screen. */\n\tget open(): boolean {\n\t\treturn this.#open;\n\t}\n\n\t/** The connect element the gate built, for programmatic control (its own\n\t * `flow` included). Null while the gate is shut. */\n\tget connect(): SelfstoreConnectElement | null {\n\t\treturn this.#connect;\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.root.append(h('style', {}, GATE_STYLES));\n\t}\n\n\tattributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n\t\tif (name === 'armed') this.armed = value !== 'false';\n\t\tif (name === 'deferrable') this.deferrable = value !== 'false';\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tif (this.hasAttribute('armed')) this.armed = this.getAttribute('armed') !== 'false';\n\t\tif (this.hasAttribute('deferrable')) {\n\t\t\tthis.deferrable = this.getAttribute('deferrable') !== 'false';\n\t\t}\n\t\tthis.wire();\n\t}\n\n\tprivate host(): FlowHost | null {\n\t\tconst s = this.#store;\n\t\tif (!s) return null;\n\t\treturn 'flowHost' in s ? s.flowHost : s;\n\t}\n\n\tprivate wire(): void {\n\t\tif (!this.isConnected) return;\n\t\tthis.unsub?.();\n\t\tthis.unsub = null;\n\t\tconst host = this.host();\n\t\tif (!host) return;\n\t\tthis.unsub = host.engine.subscribe(() => this.sync());\n\t\tthis.sync();\n\t}\n\n\t/** The library already derives \"no durable home yet\" - asking the target\n\t * kind by hand would miss the ranking and nag over a broken connection. */\n\tprivate shouldOpen(): boolean {\n\t\tconst host = this.host();\n\t\tif (!host || !this.#armed || this.#deferred) return false;\n\t\treturn host.engine.state.status.action === 'choose-destination';\n\t}\n\n\tprivate sync(): void {\n\t\tconst open = this.shouldOpen();\n\t\tif (open === this.#open) return; // a status tick that changes nothing\n\t\tthis.#open = open;\n\t\tif (!open) this.#connect = null;\n\t\tsuper.rerender();\n\t\tif (open) this.root.querySelector<HTMLElement>('[part~=\"gate-card\"]')?.focus();\n\t}\n\n\t/** Rebuilding the frame would re-append the child connect element, and a\n\t * custom element that leaves the DOM and comes back rebuilds its flow: a\n\t * journey in progress would be dropped on the floor. So while the gate is\n\t * open the frame stands and late cosmetics are pushed into the child.\n\t * Set `labels` before `store` for them to reach the frame's own copy. */\n\tprotected rerender(): void {\n\t\tconst el = this.#connect;\n\t\tif (!el) {\n\t\t\tsuper.rerender();\n\t\t\treturn;\n\t\t}\n\t\tel.labels = this.childLabels();\n\t\tel.icons = this.#icons;\n\t\tel.recommended = this.#recommended;\n\t\tel.advanced = this.#advanced;\n\t\tel.webdavPresets = this.#presets;\n\t}\n\n\t/** The gate's title already asks the question; the child's heading would\n\t * repeat it. An empty label removes a heading, and a host that wants it\n\t * back just says so in its own map. */\n\tprivate childLabels(): WidgetLabels {\n\t\treturn { 'connect.title': '', ...this.labels };\n\t}\n\n\tprivate buildConnect(): SelfstoreConnectElement {\n\t\tconst el = document.createElement(\n\t\t\tconnectTagFor(this.tagName.toLowerCase())\n\t\t) as SelfstoreConnectElement;\n\t\tel.labels = this.childLabels();\n\t\tel.icons = this.#icons;\n\t\tel.recommended = this.#recommended;\n\t\tel.advanced = this.#advanced;\n\t\tel.webdavPresets = this.#presets;\n\t\tel.options = this.#options;\n\t\tel.targets = this.#targets;\n\t\t// Last, and before the element enters the DOM: every one of these setters\n\t\t// wires the flow, and the store is what makes wiring possible at all.\n\t\tel.store = this.#store;\n\t\treturn el;\n\t}\n\n\tprivate deferButton(): HTMLElement | null {\n\t\tif (!this.#deferrable) return null;\n\t\tconst note = this.t('gate.defer.note');\n\t\treturn h(\n\t\t\t'div',\n\t\t\t{},\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{\n\t\t\t\t\tpart: 'link gate-defer',\n\t\t\t\t\ttype: 'button',\n\t\t\t\t\tonclick: () => {\n\t\t\t\t\t\tthis.deferred = true;\n\t\t\t\t\t\tthis.emit('selfstore-gate-deferred');\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tthis.t('gate.defer')\n\t\t\t),\n\t\t\tnote ? h('div', { part: 'hint gate-defer-note' }, note) : null\n\t\t);\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tif (!this.#open) return;\n\t\tthis.#connect = this.buildConnect();\n\t\tconst title = h('h1', { part: 'gate-title', id: 'gate-title' }, this.t('gate.title'));\n\t\tconst card = h('div', {\n\t\t\tpart: 'gate-card',\n\t\t\ttabindex: '-1'\n\t\t});\n\t\tput(\n\t\t\tcard,\n\t\t\th('slot', { name: 'brand' }),\n\t\t\ttitle,\n\t\t\tthis.heading('sub gate-hint', 'gate.hint'),\n\t\t\tthis.#connect,\n\t\t\th('slot', { name: 'extra' }),\n\t\t\tthis.heading('hint gate-fine', 'gate.fine'),\n\t\t\tthis.deferButton()\n\t\t);\n\t\tput(\n\t\t\tinto,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{\n\t\t\t\t\tpart: 'gate',\n\t\t\t\t\trole: 'dialog',\n\t\t\t\t\t'aria-modal': 'true',\n\t\t\t\t\t'aria-labelledby': 'gate-title'\n\t\t\t\t},\n\t\t\t\tcard,\n\t\t\t\th('div', { part: 'gate-foot' }, h('slot', { name: 'footer' }))\n\t\t\t)\n\t\t);\n\t}\n}\n","/**\n * <selfstore-destination>: where the data is kept, once it has a home.\n *\n * The counterpart of <selfstore-gate>. The gate asks the question before there\n * is an answer; this panel states the answer and carries the gestures that act\n * on it - export a copy, change destination, stop saving here.\n *\n * const el = document.querySelector('selfstore-destination');\n * el.store = store;\n * el.targets = { drive: driveAuth, file: true }; // enables \"change\"\n *\n * It DOES the work rather than asking the host to. Exporting a copy, detaching\n * and re-connecting are all the engine's own operations, so a panel that only\n * emitted intentions would leave the same two hundred lines in every app - the\n * very lines this widget exists to delete.\n *\n * The one exception is structural, not a choice: **loading a copy back cannot\n * be done from here.** The library holds no records; the app's `apply` does.\n * The engine exposes `exportBlob()` and no import, so the panel asks for that\n * one through `selfstore-destination-action` and the host runs its own import.\n *\n * Two things stay the host's, deliberately: the WORDS (every label is\n * overridable, and a pack ships per language) and the VETO on what is\n * destructive (`confirmAction`, which defaults to proceeding). Neither is\n * customisation - they are the decisions a library must not take for an app.\n */\n\nimport type { ConnectKind, ConnectTargets, FlowHost, StoreLike } from '../flows/connect';\nimport type { SelfstoreConnectElement } from './connect';\nimport { datedName, saveToDisk } from '../selfstore/targets/local';\nimport { FlowWidget, h, hostOf, put, type WidgetLabels } from './base';\n\n/** What the panel is about to do, for the host's veto. */\nexport interface DestinationAction {\n\ttype: 'detach';\n\t/** The destination's own name, when it has one. */\n\tlabel: string | null;\n}\n\nconst EN: WidgetLabels = {\n\t'destination.heading': 'Where your data is kept',\n\t'destination.kind.drive': 'Google Drive',\n\t'destination.kind.file': 'A file on this device',\n\t'destination.kind.webdav': 'Your own server',\n\t'destination.kind.s3': 'Your own bucket',\n\t'destination.kind.device': 'This device only',\n\t'destination.encrypted': 'Password-protected',\n\t'destination.export': 'Export a copy',\n\t'destination.exported': 'The copy is written.',\n\t'destination.exportCancelled': 'Nothing was written.',\n\t'destination.restore': 'Restore a copy',\n\t'destination.change': 'Change destination',\n\t'destination.detach': 'Stop saving here',\n\t'destination.detached': 'Stopped. Your data stays on this device.',\n\t'destination.back': 'Back',\n\t'error.generic': 'Something went wrong.'\n};\n\n// One verb per gesture, and the precious thing is never the object of the verb:\n// \"ne plus enregistrer ici\" says what stops, where \"detacher cette sauvegarde\"\n// would read as taking the backup away.\n//\n// A pack carries only what READS differently: `t()` falls back to the EN\n// defaults, so a key repeated word for word (a brand name) would just be a\n// second place to keep it in step.\nconst FR: WidgetLabels = {\n\t'destination.heading': 'Où vos données sont enregistrées',\n\t'destination.kind.file': 'Un fichier sur cet appareil',\n\t'destination.kind.webdav': 'Votre serveur',\n\t'destination.kind.s3': 'Votre bucket',\n\t'destination.kind.device': 'Cet appareil seulement',\n\t'destination.encrypted': 'Protégée par un mot de passe',\n\t'destination.export': 'Exporter une copie',\n\t'destination.exported': 'La copie est écrite.',\n\t'destination.exportCancelled': \"Rien n'a été écrit.\",\n\t// \"Restaurer\", pas \"charger\" : le premier dit qu'on REVIENT a un etat, le\n\t// second pourrait ajouter. Face a \"Exporter une copie\", la paire se lit\n\t// comme l'aller-retour qu'elle est.\n\t'destination.restore': 'Restaurer une copie',\n\t'destination.change': 'Changer de sauvegarde',\n\t'destination.detach': 'Ne plus enregistrer ici',\n\t'destination.detached': 'Arrêté. Vos données restent sur cet appareil.',\n\t'destination.back': 'Retour',\n\t'error.generic': \"Quelque chose n'a pas fonctionné.\"\n};\n\nconst DESTINATION_STYLES = `\n[part~='destination-card'] { align-items: flex-start; }\n[part~='destination-actions'] {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--_gap);\n}\n[part~='destination-heading'] {\n\tmargin: 0;\n\tfont-size: 1rem;\n\tfont-weight: 600;\n}\n`;\n\n/** The sibling element under the same prefix: both are registered together, so\n * <app-destination> composes <app-connect> without being told. */\nfunction siblingTag(own: string, name: string): string {\n\tconst suffix = '-destination';\n\treturn own.endsWith(suffix) ? `${own.slice(0, -suffix.length)}-${name}` : `selfstore-${name}`;\n}\n\nexport class SelfstoreDestinationElement extends FlowWidget {\n\t#store: StoreLike | null = null;\n\t#targets: ConnectTargets | null = null;\n\t#account: string | null = null;\n\t#icons: Partial<Record<ConnectKind, string>> = {};\n\t#confirm: ((a: DestinationAction) => boolean | Promise<boolean>) | null = null;\n\t#changing = false;\n\t#busy = false;\n\t#message: string | null = null;\n\n\tprotected defaults(): WidgetLabels {\n\t\treturn EN;\n\t}\n\n\tprotected packs(): Record<string, WidgetLabels> {\n\t\treturn { fr: FR };\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.root.append(h('style', {}, DESTINATION_STYLES));\n\t}\n\n\t/** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */\n\tget store(): StoreLike | null {\n\t\treturn this.#store;\n\t}\n\tset store(v: StoreLike | null) {\n\t\tif (v === this.#store) return;\n\t\tthis.#store = v;\n\t\tthis.wire();\n\t}\n\n\t/** The destinations offered when the user changes their mind. Given them, the\n\t * panel runs the connect journey in place; without them the button is absent\n\t * rather than dead - a host that cannot offer a choice should not show one. */\n\tget targets(): ConnectTargets | null {\n\t\treturn this.#targets;\n\t}\n\tset targets(v: ConnectTargets | null) {\n\t\tthis.#targets = v;\n\t\tthis.rerender();\n\t}\n\n\t/** Who holds the destination (\"someone@example.com\"), when the host knows.\n\t * For Drive that is `driveTarget.account()`: a brand name is not an address,\n\t * and several accounts look alike. */\n\tget account(): string | null {\n\t\treturn this.#account;\n\t}\n\tset account(v: string | null) {\n\t\tthis.#account = v || null;\n\t\tthis.rerender();\n\t}\n\n\t/** Optional glyph per destination kind, same contract as the connect cards. */\n\tget icons(): Partial<Record<ConnectKind, string>> {\n\t\treturn this.#icons;\n\t}\n\tset icons(v: Partial<Record<ConnectKind, string>> | null) {\n\t\tthis.#icons = v ?? {};\n\t\tthis.rerender();\n\t}\n\n\t/** Veto on what is destructive. Returns false (or throws) to stop; absent\n\t * means proceed. The panel never invents its own confirm dialog: an app has\n\t * its own words and its own modal. */\n\tget confirmAction(): ((a: DestinationAction) => boolean | Promise<boolean>) | null {\n\t\treturn this.#confirm;\n\t}\n\tset confirmAction(fn: ((a: DestinationAction) => boolean | Promise<boolean>) | null) {\n\t\tthis.#confirm = fn;\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tthis.wire();\n\t}\n\n\tprivate host(): FlowHost | null {\n\t\treturn hostOf(this.#store);\n\t}\n\n\tprivate wire(): void {\n\t\tthis.follow(this.host());\n\t}\n\n\t/** Run a gesture, keeping the panel honest while it is in flight. */\n\tprivate async run(job: () => Promise<string | null>): Promise<void> {\n\t\tthis.#busy = true;\n\t\tthis.#message = null;\n\t\tthis.rerender();\n\t\ttry {\n\t\t\tthis.#message = await job();\n\t\t} catch {\n\t\t\tthis.#message = this.t('error.generic');\n\t\t} finally {\n\t\t\tthis.#busy = false;\n\t\t\tthis.rerender();\n\t\t}\n\t}\n\n\t/** A portable copy, on the user's own terms. A closed save dialog wrote\n\t * nothing, so it must not clear the pending-export nudge nor claim success -\n\t * that is the download that lies about itself. */\n\tprivate exportCopy(): Promise<void> {\n\t\tconst host = this.host();\n\t\tif (!host) return Promise.resolve();\n\t\treturn this.run(async () => {\n\t\t\tconst blob = await host.engine.exportBlob();\n\t\t\tconst written = await saveToDisk(blob, datedName(host.backupName));\n\t\t\tif (!written) return this.t('destination.exportCancelled');\n\t\t\thost.engine.markDownloaded();\n\t\t\treturn this.t('destination.exported');\n\t\t});\n\t}\n\n\t/** Stop saving to this destination. The local data stays, and so does the\n\t * backup already written: this detaches, it never deletes. */\n\tprivate detach(label: string | null): Promise<void> {\n\t\tconst host = this.host();\n\t\tif (!host) return Promise.resolve();\n\t\treturn this.run(async () => {\n\t\t\t// A throwing hook reads as \"no\": stopping is a decision, and an\n\t\t\t// undecided answer must not be taken for a yes.\n\t\t\ttry {\n\t\t\t\tif (this.#confirm && !(await this.#confirm({ type: 'detach', label }))) return null;\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tawait host.engine.detachTarget();\n\t\t\tthis.emit('selfstore-destination-detached');\n\t\t\treturn this.t('destination.detached');\n\t\t});\n\t}\n\n\t/** The connect journey, in place. Built like the gate builds it, so the\n\t * destinations, the password step and the cancel path are the library's\n\t * tested ones rather than a second implementation. */\n\tprivate connectView(into: HTMLElement): void {\n\t\tconst el = document.createElement(\n\t\t\tsiblingTag(this.localName, 'connect')\n\t\t) as SelfstoreConnectElement;\n\t\tel.store = this.#store;\n\t\tel.targets = this.#targets;\n\t\tel.icons = this.#icons;\n\t\tel.labels = this.labels;\n\t\tconst done = (): void => {\n\t\t\tthis.#changing = false;\n\t\t\tthis.rerender();\n\t\t};\n\t\tel.addEventListener('selfstore-connected', done);\n\t\tel.addEventListener('selfstore-cancelled', done);\n\t\tput(\n\t\t\tinto,\n\t\t\th(\n\t\t\t\t'button',\n\t\t\t\t{ part: 'link destination-back', type: 'button', onclick: done },\n\t\t\t\tthis.t('destination.back')\n\t\t\t),\n\t\t\tel\n\t\t);\n\t}\n\n\tprotected view(into: HTMLElement): void {\n\t\tconst host = this.host();\n\t\tif (!host) return; // inert until wired\n\t\tif (this.#changing && this.#targets) return this.connectView(into);\n\n\t\tconst { targetKind, label, encrypted } = host.engine.state;\n\t\tconst kind = this.t(`destination.kind.${targetKind}`);\n\t\t// An unknown kind (a host's own target) has no shipped name: its own label\n\t\t// is a better answer than the raw key.\n\t\tconst title = kind === `destination.kind.${targetKind}` ? (label ?? targetKind) : kind;\n\t\tconst sub = [this.#account, label && label !== title ? label : null]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' · ');\n\t\tconst icon = this.#icons[targetKind as ConnectKind];\n\t\tconst status = document.createElement(siblingTag(this.localName, 'status')) as HTMLElement & {\n\t\t\tstore?: StoreLike | null;\n\t\t\tlabels?: WidgetLabels;\n\t\t\ticons?: Partial<Record<ConnectKind, string>>;\n\t\t};\n\t\tstatus.setAttribute('variant', 'row');\n\t\tstatus.labels = this.labels;\n\t\tstatus.icons = this.#icons;\n\t\tstatus.store = this.#store;\n\n\t\t// An empty-string label removes the gesture, the same convention as the\n\t\t// headings: labels = { 'destination.detach': '' } is how a host that\n\t\t// forbids the device-only state takes that journey off the screen. Each\n\t\t// button also carries its own part, so a host can style or hide ONE of\n\t\t// them from CSS - four gestures sharing one anonymous part made the row\n\t\t// impossible to prune, which is how a panel ends up \"too many buttons\".\n\t\tconst act = (key: string, part: string, onclick: () => void): HTMLElement | null => {\n\t\t\tconst label = this.t(key);\n\t\t\tif (!label) return null;\n\t\t\treturn h(\n\t\t\t\t'button',\n\t\t\t\t{ part: `button ${part}`, type: 'button', disabled: this.#busy ? '' : null, onclick },\n\t\t\t\tlabel\n\t\t\t);\n\t\t};\n\n\t\tput(\n\t\t\tinto,\n\t\t\tthis.heading('destination-heading', 'destination.heading'),\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'card destination-card' },\n\t\t\t\ticon ? h('img', { part: 'icon', src: icon, alt: '' }) : null,\n\t\t\t\th(\n\t\t\t\t\t'div',\n\t\t\t\t\t{},\n\t\t\t\t\th('div', { part: 'title' }, title),\n\t\t\t\t\tsub ? h('div', { part: 'sub' }, sub) : null,\n\t\t\t\t\tencrypted ? h('div', { part: 'sub' }, this.t('destination.encrypted')) : null\n\t\t\t\t)\n\t\t\t),\n\t\t\tstatus,\n\t\t\th(\n\t\t\t\t'div',\n\t\t\t\t{ part: 'destination-actions' },\n\t\t\t\tact('destination.export', 'destination-export', () => void this.exportCopy()),\n\t\t\t\t// The library holds no records, so loading a copy back is the host's\n\t\t\t\t// own gesture - see the note at the top of this file.\n\t\t\t\tact('destination.restore', 'destination-restore', () =>\n\t\t\t\t\tthis.emit('selfstore-destination-action', { action: 'restore' })\n\t\t\t\t),\n\t\t\t\tthis.#targets\n\t\t\t\t\t? act('destination.change', 'destination-change', () => {\n\t\t\t\t\t\t\tthis.#changing = true;\n\t\t\t\t\t\t\tthis.rerender();\n\t\t\t\t\t\t})\n\t\t\t\t\t: null,\n\t\t\t\tact('destination.detach', 'destination-detach', () => void this.detach(label))\n\t\t\t),\n\t\t\tthis.#message\n\t\t\t\t? h('div', { part: 'sub destination-message', role: 'status' }, this.#message)\n\t\t\t\t: null\n\t\t);\n\t}\n}\n","// selfstore/widgets - the connect / share / join / backups journeys as\n// drop-in custom elements, skins over the headless flows. Framework-free:\n// plain HTML, Svelte, Vue and React all take them as-is.\n//\n// import { defineSelfstoreWidgets } from 'selfstore/widgets';\n// defineSelfstoreWidgets();\n//\n// Customization is layered, never a fork: --selfstore-* CSS custom\n// properties, ::part() on every node, a `labels` map merged over the EN\n// defaults (also the localization story), per-widget attributes with the\n// full journey as the default, and bubbling composed `selfstore-*` events.\n// The full knob and event list lives in the README.\n\nexport { SelfstoreConnectElement, type WebdavPreset } from '../widgets/connect';\nexport { SelfstoreShareElement, type ShareAction } from '../widgets/share';\nexport { SelfstoreJoinElement } from '../widgets/join';\nexport { SelfstoreStatusElement } from '../widgets/status';\nexport { SelfstoreBackupsElement, type BackupsAction } from '../widgets/backups';\nexport { SelfstoreGateElement } from '../widgets/gate';\nexport { SelfstoreDestinationElement, type DestinationAction } from '../widgets/destination';\nexport { FlowWidget, type WidgetLabels } from '../widgets/base';\n\nimport { SelfstoreConnectElement } from '../widgets/connect';\nimport { SelfstoreShareElement } from '../widgets/share';\nimport { SelfstoreJoinElement } from '../widgets/join';\nimport { SelfstoreStatusElement } from '../widgets/status';\nimport { SelfstoreBackupsElement } from '../widgets/backups';\nimport { SelfstoreGateElement } from '../widgets/gate';\nimport { SelfstoreDestinationElement } from '../widgets/destination';\n\n/** Register the elements as <PREFIX-connect>, <PREFIX-share>, <PREFIX-join>,\n * <PREFIX-status>, <PREFIX-backups>, <PREFIX-gate> and\n * <PREFIX-destination> (default prefix 'selfstore'). Safe to call twice;\n * throws in environments without custom elements (browser code only). */\nexport function defineSelfstoreWidgets(prefix = 'selfstore'): void {\n\tconst define = (name: string, ctor: CustomElementConstructor): void => {\n\t\tif (!customElements.get(name)) customElements.define(name, ctor);\n\t};\n\tdefine(`${prefix}-connect`, SelfstoreConnectElement);\n\tdefine(`${prefix}-share`, SelfstoreShareElement);\n\tdefine(`${prefix}-join`, SelfstoreJoinElement);\n\tdefine(`${prefix}-status`, SelfstoreStatusElement);\n\tdefine(`${prefix}-backups`, SelfstoreBackupsElement);\n\t// The gate builds its own connect child and reads the prefix back off its\n\t// own tag name, so a custom prefix keeps the pair together. The destination\n\t// panel composes both connect and status the same way.\n\tdefine(`${prefix}-gate`, SelfstoreGateElement);\n\tdefine(`${prefix}-destination`, SelfstoreDestinationElement);\n}\n"]}