From 8a489dfc5ca7a6f41baaaa27279467afea4682f0 Mon Sep 17 00:00:00 2001 From: Jeuner <62662523+Jeuners@users.noreply.github.com> Date: Fri, 28 Aug 2026 15:04:55 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Werkzeug-Best=C3=A4tigung,=20DNS-Pinnin?= =?UTF-8?q?g,=20Statistik-Leiste,=20Produktionsbetrieb=20(#1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ergebnis eines Security-Reviews des Werkzeug-Pfads plus die daraus hervorgegangenen Verbesserungen. Sicherheit: - runTool wertet requiresConfirmation aus; Rückfrage über den WebSocket mit vollständigen Argumenten, Antwort allow/always/deny. Ohne Rückkanal gilt abgelehnt. read_webpage und remember sind bestätigungspflichtig - remember pinnt nicht mehr automatisch, Modell-Anker verfallen normal - SSRF-Guard mit gepinnter DNS-Auflösung (lookup-Hook statt fetch): geprüft wird genau die Adresse, die auch verbunden wird — schließt DNS-Rebinding - ctx.signal kombiniert Abbruch und Zeitlimit bis in den Netzwerkabruf - activeAborts als Set, Chat-Rate-Limit je Verbindung, Bucket-Cleanup Statistik-Leiste über dem Composer: Tokens, tok/s, TTFT, Gesamtzeit und Kontext-Füllstand, dazu die Session-Summe. Zahlen sind gemessen — bei Ollama aus dem Abschluss-Chunk, bei OpenRouter aus dem usage-Block. Der Füllstand rechnet gegen das tatsächlich genutzte Fenster aus /api/ps, nicht gegen die deklarierte Länge des Modells. Produktionsbetrieb: der Server liefert web/dist jetzt mit aus, npm start genügt. /api und /ws behalten Vorrang. README überarbeitet, Fork-Bezug entfernt, zerbrochene Konfigurationstabelle repariert, API-Referenz ergänzt. Nicht umgesetzt: Auth-/Origin-Härtung — der Server läuft bewusst lokal. --- .gitignore | 3 + README.md | 423 +++++++++++++++++------------ package-lock.json | 267 ++++++++++++++++++ server/package.json | 1 + server/src/index.ts | 173 +++++++++++- server/src/ollama.ts | 106 +++++++- server/src/openrouter.ts | 56 +++- server/src/security.ts | 11 + server/src/tools/index.ts | 38 ++- server/src/tools/remember.ts | 7 +- server/src/tools/types.ts | 12 +- server/src/tools/web.ts | 174 ++++++++---- web/dist/assets/index-CQxQcFyH.js | 74 ----- web/dist/assets/index-CXQcDbVB.css | 10 - web/dist/favicon.svg | 7 - web/dist/index.html | 15 - web/src/App.tsx | 29 ++ web/src/components/StatsBar.tsx | 87 ++++++ web/src/components/ToolConfirm.tsx | 71 +++++ web/src/styles.css | 158 +++++++++++ web/src/types.ts | 40 +++ web/src/useChat.ts | 80 +++++- 22 files changed, 1495 insertions(+), 347 deletions(-) delete mode 100644 web/dist/assets/index-CQxQcFyH.js delete mode 100644 web/dist/assets/index-CXQcDbVB.css delete mode 100644 web/dist/favicon.svg delete mode 100644 web/dist/index.html create mode 100644 web/src/components/StatsBar.tsx create mode 100644 web/src/components/ToolConfirm.tsx diff --git a/.gitignore b/.gitignore index 386c032..bee3a5a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ data.sqlite* # Piper-Stimmmodell (109 MB) — siehe README, wird lokal heruntergeladen server/voices/*.onnx + +# Build-Artefakt, wird aus web/src erzeugt +web/dist/ diff --git a/README.md b/README.md index 327c707..7b142bf 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,34 @@ # agenttwo-tools -> Fork von [agenttwo](https://github.com/Jeuners/agenttwo). Die Basis bleibt dort -> unverändert; hier kommen Vision und Werkzeuge (Tool-Calling) dazu. Läuft auf eigenen Ports -> (Backend 8788, Frontend 5174), damit beide Projekte parallel laufen können. -> Fixes aus der Basis lassen sich per `git cherry-pick` aus dem Remote -> `upstream` übernehmen. +Sprachfähige Chat-Oberfläche für lokale und Cloud-Sprachmodelle. Läuft +vollständig auf dem eigenen Rechner: Modell über [Ollama](https://ollama.com), +Spracheingabe über [whisper.cpp](https://github.com/ggml-org/whisper.cpp), +Sprachausgabe über [Piper](https://github.com/rhasspy/piper). Der Weg nach +außen ist optional — [OpenRouter](https://openrouter.ai) lässt sich pro Chat +zuschalten. -Voice-Chat-Oberfläche für lokale und Cloud-LLMs: lokales Qwen3 über -[Ollama](https://ollama.com), optionaler Fallback auf -[OpenRouter](https://openrouter.ai), Spracheingabe via -[whisper.cpp](https://github.com/ggml-org/whisper.cpp) und deutsche -Sprachausgabe via [Piper](https://github.com/rhasspy/piper) (Stimme: Thorsten). +- **Werkzeuge** — das Modell rechnet, liest Projektdateien, ruft Websites ab + und führt ein eigenes Gedächtnis. Werkzeuge mit Außenwirkung fragen vorher + nach. +- **Anhänge** — Bilder, Textdateien und PDFs, per Button, ⌘V oder Drag & Drop. +- **Gedächtnis** — Append-Only-Log plus destillierte Ankerpunkte, deterministisch + aus dem Log rekonstruierbar. +- **Sprache** — Diktat und freihändiger Dialog, deutsche Stimme, alles lokal. +- **Messwerte** — Tokens, Durchsatz, Latenz und Kontext-Füllstand pro Antwort. ## Aufbau npm-Workspace mit zwei Paketen: -| Pfad | Inhalt | -|-----------|------------------------------------------------------------------------| +| Pfad | Inhalt | +|-----------|-------------------------------------------------------------------------| | `server/` | Fastify + WebSocket-Backend, Ollama-/OpenRouter-Bridge, STT/TTS, SQLite | | `web/` | React 18 + Vite Frontend, Markdown-Rendering, Voice-Recording | +Der Chat läuft über einen WebSocket (`/ws`), alles andere über REST. Chats, +Nachrichten, Anhänge und Gedächtnis liegen in `server/data.sqlite`. Im +Produktionsbetrieb liefert der Server das gebaute Frontend gleich mit aus. + ## Voraussetzungen - **macOS** mit [Homebrew](https://brew.sh) @@ -28,22 +36,19 @@ npm-Workspace mit zwei Paketen: das es unter Node 20 noch nicht gibt. Unter Node 22 erscheint beim Start eine `ExperimentalWarning`; ab Node 24 ist das Modul stabil. - [Ollama](https://ollama.com) mit einem Qwen3-Modell (`ollama pull qwen3.5`) -- `ffmpeg` im `PATH` -- `whisper-cli` im `PATH` (whisper.cpp) inklusive Modell +- `ffmpeg` und `whisper-cli` (whisper.cpp) im `PATH`, inklusive Whisper-Modell - Piper als **Python-Modul** — der Server ruft `python3 -m piper` auf, nicht das gleichnamige Homebrew-Binary -**RAM-Hinweis (Apple Silicon):** Qwen3.5 belegt ~7 GB im Speicher — mit -weniger als 16 GB RAM wird es eng. Dann lieber das kleinere -[`qwen3:8b`](https://ollama.com/library/qwen3) (`ollama pull qwen3:8b`, -~5 GB) laden und in den Einstellungen unter „Lokales Modell“ wählen bzw. -`MODEL=qwen3:8b` in die `.env` schreiben. +**RAM (Apple Silicon):** qwen3.5 belegt ~7 GB — mit weniger als 16 GB RAM wird +es eng. Dann das kleinere [`qwen3:8b`](https://ollama.com/library/qwen3) +(`ollama pull qwen3:8b`, ~5 GB) nehmen und in den Einstellungen unter +„Lokales Modell“ wählen oder `MODEL=qwen3:8b` in die `.env` schreiben. -## Schnellstart (Mac) +## Schnellstart -Ein Befehl von null bis zur lauffähigen App — das Skript prüft alle -Abhängigkeiten und bietet fehlende (Homebrew, Node, ffmpeg, whisper, Piper, -Ollama, Modell, Sprachdateien) zur Installation an: +`setup.sh` prüft alle Abhängigkeiten und bietet fehlende zur Installation an — +Homebrew, Node, ffmpeg, whisper.cpp, Piper, Ollama, Modell und Sprachdateien: ```bash git clone https://github.com/Jeuners/agenttwo-tools.git @@ -52,10 +57,13 @@ cd agenttwo-tools npm run dev # → http://localhost:5174 ``` -Nur prüfen ohne etwas zu ändern: `./setup.sh --check` · Ohne Nachfragen: -`./setup.sh --yes` +| Aufruf | Wirkung | +|----------------------|-------------------------------------------| +| `./setup.sh` | Fragt vor jeder Installation nach | +| `./setup.sh --check` | Prüft nur, ändert nichts | +| `./setup.sh --yes` | Installiert alles Fehlende ohne Rückfrage | -Unter macOS: +### Manuell ```bash brew install ffmpeg whisper-cpp @@ -71,9 +79,8 @@ python3 -m piper --help >/dev/null 2>&1 && echo "piper OK" node -e "require('node:sqlite')" 2>/dev/null && echo "node:sqlite OK" ``` -### Whisper-Modell - -Wird per Default unter `~/whisper-models/ggml-large-v3-turbo.bin` erwartet: +Whisper-Modell (~1,5 GB), per Default unter +`~/whisper-models/ggml-large-v3-turbo.bin` erwartet: ```bash mkdir -p ~/whisper-models @@ -81,10 +88,8 @@ curl -L -o ~/whisper-models/ggml-large-v3-turbo.bin \ https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3-turbo.bin ``` -### Piper-Stimme - -Die Stimmdatei ist **nicht** im Repo (109 MB, über GitHubs Dateilimit). -Einmalig herunterladen: +Piper-Stimme (109 MB, wegen GitHubs Dateilimit nicht im Repo — die zugehörige +`.onnx.json` liegt bereits dort): ```bash mkdir -p server/voices @@ -92,206 +97,284 @@ curl -L -o server/voices/de_DE-thorsten-high.onnx \ https://huggingface.co/rhasspy/piper-voices/resolve/main/de/de_DE/thorsten/high/de_DE-thorsten-high.onnx ``` -Die zugehörige `de_DE-thorsten-high.onnx.json` liegt bereits im Repo. - ## Konfiguration -`.env` im Projekt-Root (wird vom Server eingelesen, ist gitignored): +`.env` im Projekt-Root, wird vom Server eingelesen und ist gitignored. Alle +Werte sind optional außer dem Schlüssel für den Cloud-Fallback: ```bash OPENROUTER_API_KEY=sk-or-... ``` -Weitere optionale Variablen mit ihren Defaults: +| Variable | Default | Zweck | +|-------------------|--------------------------------------------|------------------------------------------------------| +| `PORT` | `8788` | Port des Backends | +| `OLLAMA_URL` | `http://localhost:11434` | Adresse des Ollama-Servers | +| `MODEL` | `qwen3.5:latest` | Lokales Standardmodell | +| `WHISPER_MODEL` | `~/whisper-models/ggml-large-v3-turbo.bin` | Modelldatei für die Spracherkennung | +| `WHISPER_LANG` | `de` | Sprache der Spracherkennung | +| `PIPER_MODEL` | `server/voices/de_DE-thorsten-high.onnx` | Stimme für die Sprachausgabe | +| `TOOLS_ROOT` | Projektverzeichnis | Wurzel der Datei-Sandbox | +| `ALLOWED_ORIGINS` | (leer) | Zusätzliche Origins, siehe [Sicherheit](#sicherheit) | -| Variable | Default | -|----------------------|--------------------------------------------------| -| `PORT` | `8788` | -| `OLLAMA_URL` | `http://localhost:11434` | -| `MODEL` | `qwen3.5:latest` | -| `WHISPER_MODEL` | `~/whisper-models/ggml-large-v3-turbo.bin` | -| `WHISPER_LANG` | `de` | +`MODEL` ist nur der Startwert: In den Einstellungen lässt sich das lokale +Modell pro Chat über das Dropdown „Lokales Modell“ wechseln — die Liste kommt +live von `GET /api/ollama/models`. -`MODEL` ist nur der Default: In den Einstellungen lässt sich das lokale -Ollama-Modell pro Chat über das Dropdown „Lokales Modell“ wechseln (die Liste -kommt live von `GET /api/ollama/models`). -| `PIPER_MODEL` | `server/voices/de_DE-thorsten-high.onnx` | -| `ALLOWED_ORIGINS` | (leer — siehe Sicherheit) | +## Anhänge -## Anhänge (Bilder & Dateien) +Anhängen geht über den Button 📎, aus der Zwischenablage (⌘V) oder per +Drag & Drop auf die Eingabezeile. Eine Nachricht darf auch nur aus einem +Anhang bestehen. -`qwen3.5` bringt die Fähigkeit `vision` mit, deshalb versteht der Chat Bilder. -Anhängen geht auf drei Wegen: Button 📎 im Composer, Einfügen aus der -Zwischenablage (⌘V) oder Drag & Drop auf die Eingabezeile. Eine Nachricht darf -auch nur aus einem Anhang bestehen. +**Bilder** setzen ein Modell mit der Fähigkeit `vision` voraus — qwen3.5 bringt +sie mit. Sie werden zusammen mit der Nachricht gespeichert und bei Folgefragen +erneut mitgeschickt, sodass Rückfragen zum selben Bild funktionieren. Für +Ollama gehen sie als `images: [base64]` raus, für OpenRouter im OpenAI-Format +als `image_url` mit data-URL. -**Bilder** werden zusammen mit der Nachricht in der SQLite-Datei abgelegt und bei -Folgefragen erneut mitgeschickt, sodass Rückfragen zum selben Bild funktionieren. -Für Ollama gehen sie als `images: [base64]` raus, für OpenRouter im -OpenAI-Format als `image_url` mit data-URL — der MIME-Typ wird dabei aus den -Magic Bytes bestimmt. +**Text- und PDF-Dateien** landen als formatierter Block im Kontext und werden +ebenfalls gespeichert. Unterstützt sind `.txt .json .md .csv .yaml .xml .sql` +und gängige Code-Endungen, dazu `.pdf` — der Text wird serverseitig mit +[pdf-parse](https://www.npmjs.com/package/pdf-parse) extrahiert. Gescannte PDFs +ohne Textebene werden abgewiesen, OCR gibt es nicht. -Grenzen (`server/src/images.ts`): maximal 4 Bilder pro Nachricht, je 6 MB, -nur PNG, JPEG, GIF und WebP. Der Typ wird an den Magic Bytes geprüft, nicht am -angegebenen Dateinamen; der WebSocket hat dafür ein Payload-Limit von 32 MB. +| Grenze | Bilder (`images.ts`) | Dateien (`files.ts`) | +|----------------------|----------------------|--------------------------------| +| Anzahl pro Nachricht | 4 | 4 | +| Größe | 6 MB je Bild | 10 MB je PDF | +| Umfang im Kontext | — | 100 kB extrahierter Text | +| Typprüfung | Magic Bytes | Steuerzeichen erkennen Binäres | -**Text- und PDF-Dateien** (`server/src/files.ts`) landen als formatierter Block -im Kontext und werden ebenfalls gespeichert — Rückfragen zur Datei funktionieren -also auch in der nächsten Nachricht. Unterstützt: `.txt .json .md .csv .yaml -.xml .sql` und gängige Code-Endungen, plus `.pdf` (Text wird serverseitig mit -[pdf-parse](https://www.npmjs.com/package/pdf-parse) extrahiert). Grenzen: -maximal 4 Dateien pro Nachricht, je 100 kB extrahierter Text (bei PDFs -gekürzt, nicht abgelehnt), 10 MB PDF-Größe; Binärdateien werden über -Steuerzeichen erkannt und abgelehnt. Gescannte PDFs ohne Textebene werden -abgewiesen (keine OCR). +Der Typ wird an den Magic Bytes geprüft, nicht am Dateinamen; erlaubt sind +PNG, JPEG, GIF und WebP. Der WebSocket hat ein Payload-Limit von 32 MB. Zu +lange PDF-Texte werden gekürzt, nicht abgelehnt. -Ob das eingestellte Modell Bilder kann, verrät: +Ob das eingestellte Modell Bilder kann: ```bash curl -s http://localhost:11434/api/show -d '{"name":"qwen3.5:latest"}' \ | python3 -c "import json,sys; print(json.load(sys.stdin)['capabilities'])" ``` -## Werkzeuge (Tool-Calling) +## Werkzeuge -`qwen3.5` meldet die Fähigkeit `tools`. Der Server schickt bei jeder Anfrage -eine Werkzeugliste mit; will das Modell eines benutzen, wird es ausgeführt und -das Ergebnis zurückgereicht, bis eine Antwort ohne Werkzeugwunsch entsteht -(maximal `MAX_TOOL_ROUNDS` = 5 Runden, je 15 s Zeitlimit). Abschalten lässt -sich das in den Einstellungen. +Der Server schickt bei jeder Anfrage eine Werkzeugliste mit. Will das Modell +eines benutzen, wird es ausgeführt und das Ergebnis zurückgereicht, bis eine +Antwort ohne Werkzeugwunsch entsteht — maximal `MAX_TOOL_ROUNDS` = 5 Runden, +je 15 s Zeitlimit. Abschalten lässt sich das in den Einstellungen. -| Werkzeug | Zweck | -|---|---| -| `get_time` | Datum, Uhrzeit, Wochentag für eine IANA-Zeitzone | -| `calculate` | Arithmetik mit eigenem Parser | -| `read_file` | Textdatei unterhalb des Projektverzeichnisses lesen | -| `list_files` | Verzeichnis auflisten | -| `remember` | Wichtigen Punkt als gepinnten Ankerpunkt ins Gedächtnis schreiben | -| `recall` | Gedächtnis (Ankerpunkte) durchsuchen | -| `read_webpage` | Öffentliche Website laden, Hauptinhalt als Markdown | +| Werkzeug | Zweck | +|----------------|-------------------------------------------------------------| +| `get_time` | Datum, Uhrzeit, Wochentag für eine IANA-Zeitzone | +| `calculate` | Arithmetik mit eigenem Parser | +| `read_file` | Textdatei unterhalb der Sandbox-Wurzel lesen | +| `list_files` | Verzeichnis auflisten | +| `recall` | Gedächtnis nach Ankerpunkten durchsuchen | +| `remember` | Ankerpunkt ins Gedächtnis schreiben — **mit Rückfrage** | +| `read_webpage` | Website laden, Hauptinhalt als Markdown — **mit Rückfrage** | Aktuelle Liste: `curl -s http://localhost:8788/api/tools` -## Gedächtnis (Chat-Memory) +### Rückfrage vor Werkzeugen mit Außenwirkung -Das Gedächtnis hat drei Schichten: +Werkzeuge mit `requiresConfirmation` laufen erst nach Freigabe. Der Server +fragt über den WebSocket an, die Oberfläche zeigt Werkzeugname und die +**vollständigen** Argumente, und erst die Antwort löst die Ausführung aus: -| Schicht | Speicher | Zweck | -|---|---|---| -| Arbeitsgedächtnis | Nachrichtenfenster | Einstellbar (Default 10 Schritte), geht ans Modell | -| Episodisch | `memory_events` | Append-Only-Log: nur INSERT, nie UPDATE/DELETE | -| Semantisch | `anchors` | Ankerpunkte, destilliert in der Traumphase | +| Antwort | Wirkung | +|-----------------|--------------------------------------------------------------------| +| Ablehnen | Werkzeug läuft nicht; das Modell erfährt das und macht ohne weiter | +| Einmal zulassen | Nur dieser eine Aufruf | +| Immer zulassen | Dieses Werkzeug bis zum Neuladen der Seite, je Verbindung | -Das Fenster ist in den Einstellungen per Slider einstellbar (2–100 Schritte). - -### Traumphase - -Die Traumphase konsolidiert neue Log-Einträge in Ankerpunkte — bevorzugt per -LLM-Extraktion (JSON-Format, Temperatur 0.2), mit einer Regex-Heuristik als -Fallback. Auslöser: - -- automatisch nach 3 Minuten Inaktivität oder wenn 10 Schritte unkonsolidiert sind -- manuell über 🧠 **Gedächtnis** → „Traumphase jetzt" - -Ankerpunkte haben eine Wichtigkeit (0–1), eine Art (`fact`, `decision`, -`preference`, `entity`, `open_question`) und einen Ursprung (`dream`, `model`, -`heuristic`, `test`). Ähnliche Anker werden zusammengeführt (Wort-Ähnlichkeit -≥ 0.5, `hits` steigt). Bei jedem Traumlauf verfallen ungepinnte Anker -(Importance × 0.9); unter 0.15 und ohne Treffer werden sie gelöscht. Gepinnte -(★) bleiben dauerhaft. - -Die wichtigsten Anker werden als System-Kontext eingespielt (Budget ~1200 -Zeichen) — das Modell beantwortet dann Fragen aus Inhalten, die nie im -sichtbaren Chatverlauf standen. - -### Rekonstruktion - -Weil das Log append-only ist, lässt sich der Zustand jederzeit deterministisch -aus Seq 0 neu falten: 🧠 **Gedächtnis** → „Aus Log rekonstruieren" (gepinnte -Anker bleiben erhalten). Die Eval der Heuristik und des Dream-Parsers: - -```bash -npm run memory:eval --workspace server -``` - -Endpunkte: `GET /api/sessions/:id/memory`, `POST /api/sessions/:id/dream`, -`POST /api/sessions/:id/memory/rebuild`, `PATCH|DELETE /api/anchors/:id`. +Ohne Antwort gilt nach 2 Minuten „abgelehnt“ — ebenso bei Verbindungsabbruch +und beim Stoppen der Antwort. Läuft ein Werkzeug ohne Rückkanal, etwa in einem +Skript, wird es abgelehnt statt ungefragt ausgeführt: die Bestätigung soll sich +nicht dadurch umgehen lassen, dass niemand zum Fragen da ist. ### Grenzen -Alle Werkzeuge sind **ausschließlich lesend**. Es gibt nichts, was schreibt, -löscht oder Befehle ausführt — entsprechend braucht es noch keine -Rückfrage pro Aufruf. Das Feld `requiresConfirmation` in -`tools/types.ts` ist bereits vorgesehen, damit die Bestätigungspflicht nicht -nachträglich eingezogen werden muss, sobald ein schreibendes Werkzeug dazukommt. +Kein Werkzeug führt Befehle aus oder verändert Dateien. Zwei haben trotzdem +Außenwirkung und sind deshalb bestätigungspflichtig: -Ausnahme Netzwerk: `read_webpage` lädt öffentliche Websites. Der Abruf ist -geguardet — nur http/https, private Adressbereiche werden nach DNS-Auflösung -abgewiesen (SSRF-Schutz, auch über Weiterleitungen), 15 s Zeitlimit, 2 MB -Fetch-Limit, 25 kB Output-Cap. Der Inhalt wird dem Modell als nicht -vertrauenswürdig markiert (Prompt-Injection aus Webseiten). +- **`read_webpage`** verlässt den Rechner. Die URL selbst ist dabei der + kritische Teil: Fremdinhalt kann das Modell anweisen, Gesprächsinhalte in + eine Adresse zu packen und so nach außen zu geben. Deshalb sieht der Nutzer + die vollständige URL vor dem Abruf. +- **`remember`** schreibt dauerhaft und sessionübergreifend. Vom Modell + gesetzte Anker werden **nicht** gepinnt und verfallen normal; gepinnt wird + nur, was der Nutzer im Gedächtnis-Panel selbst mit ★ markiert. + +Der Abruf in `read_webpage` ist mehrfach geguardet: nur http/https, private +Adressbereiche abgewiesen (auch über Weiterleitungen), 15 s Zeitlimit, 2 MB +Fetch-Limit, 25 kB Output-Cap. Die DNS-Auflösung ist **an die Verbindung +gepinnt** (`lookup`-Hook in `tools/web.ts`) — geprüft wird genau die Adresse, +die dann auch verbunden wird. Ein getrennter Vorab-Check, wie ihn `fetch` +erzwingt, ließe DNS-Rebinding zu: öffentlich beim Prüfen, `127.0.0.1` beim +Verbinden. Der Inhalt wird dem Modell zusätzlich als nicht vertrauenswürdig +markiert. Der Dateizugriff liegt in einer Sandbox: Jeder Pfad wird über `realpath` -aufgelöst (löst auch Symlinks auf) und muss danach unterhalb der Wurzel liegen, -sonst wird abgelehnt. Die Wurzel ist standardmäßig das Projektverzeichnis und -über `TOOLS_ROOT` einstellbar. `.env`, `.git/` und Schlüsseldateien sind auch -innerhalb der Wurzel gesperrt. +aufgelöst — das löst auch Symlinks auf — und muss danach unterhalb der Wurzel +liegen. `.env`, `.git/` und Schlüsseldateien sind auch innerhalb der Wurzel +gesperrt. `calculate` benutzt bewusst **kein** `eval` oder `new Function`: der Ausdruck stammt aus einer Modellantwort, die von Nutzereingaben beeinflusst wird. Der Parser in `tools/calculate.ts` kennt nur Zahlen und Grundrechenarten. -Werkzeugaufrufe werden in der Oberfläche über der Antwort angezeigt. Sie leben -nur im Browser-Zustand und sind nach einem Neuladen weg — im Gegensatz zu -Bildern, die in der Datenbank landen. +Ein Abbruch über „Stop“ beendet auch ein laufendes Werkzeug — `ctx.signal` +kombiniert Abbruch und Zeitlimit und wirkt bis in den offenen Netzwerkabruf. + +Werkzeugaufrufe werden über der Antwort angezeigt. Sie leben nur im +Browser-Zustand und sind nach einem Neuladen weg, anders als Anhänge. + +## Statistik-Leiste + +Über dem Eingabefeld stehen die Messwerte der letzten Antwort: + +```text +3.891 ↑ · 127 ↓ · 34,5 tok/s · TTFT 0,6 s · 5,2 s · 2 Runden ▬▬▬ 3.891 / 4.096 Σ 12.480 ↑ 2.143 ↓ +``` + +| Wert | Bedeutung | +|------------|-------------------------------------------------------------| +| `↑` / `↓` | Tokens im Prompt / erzeugte Tokens | +| `tok/s` | Erzeugte Tokens durch reine Generierungszeit | +| `TTFT` | Zeit bis zum ersten sichtbaren Token, Denken zählt mit | +| Gesamtzeit | Wanduhr inklusive Werkzeuglaufzeit | +| Runden | Erst ab 2 — jede Werkzeugrunde ist ein eigener Modellaufruf | +| Balken | Prompt gegen das Kontextfenster, ab 90 % orange | +| `Σ` | Summe über den Chat, seit dem letzten Neuladen der Seite | + +Die Zahlen sind **gemessen, nicht geschätzt**: bei Ollama stammen sie aus dem +Abschluss-Chunk (`prompt_eval_count`, `eval_count`, `eval_duration`), bei +OpenRouter aus dem `usage`-Block, für den `stream_options.include_usage` +gesetzt wird — dort kommen die Kosten aus der Preisliste dazu. Während des +Streamens gibt es diese Werte noch nicht; solange zählt die Leiste die +eingehenden Chunks und markiert das mit `≈`. + +Der Kontextbalken rechnet gegen das **tatsächlich genutzte** Fenster, das +Ollama unter `GET /api/ps` meldet — nicht gegen die im Modell deklarierte +Länge. Das ist nicht +dasselbe: qwen3.5 deklariert 262144, geladen läuft es je nach Ollama-Default +mit 4096. Gegen die deklarierte Länge stünde der Balken bei 1 %, während vorne +längst abgeschnitten wird. + +## Gedächtnis + +Drei Schichten: + +| Schicht | Speicher | Zweck | +|-------------------|--------------------|------------------------------------------------| +| Arbeitsgedächtnis | Nachrichtenfenster | Default 10 Schritte, geht ans Modell | +| Episodisch | `memory_events` | Append-Only-Log: nur INSERT, nie UPDATE/DELETE | +| Semantisch | `anchors` | Ankerpunkte, destilliert in der Traumphase | + +Das Fenster ist in den Einstellungen per Slider einstellbar (2–100 Schritte). + +### Traumphase + +Die Traumphase konsolidiert neue Log-Einträge zu Ankerpunkten — bevorzugt per +LLM-Extraktion (JSON-Format, Temperatur 0.2), mit einer Regex-Heuristik als +Fallback. Sie läuft automatisch nach 3 Minuten Inaktivität oder wenn 10 +Schritte unkonsolidiert sind, manuell über 🧠 **Gedächtnis** → „Traumphase +jetzt“. + +Ankerpunkte haben eine Wichtigkeit (0–1), eine Art (`fact`, `decision`, +`preference`, `entity`, `open_question`) und einen Ursprung (`dream`, `model`, +`heuristic`, `test`). Ähnliche Anker werden zusammengeführt — Wort-Ähnlichkeit +≥ 0.5, `hits` steigt. Bei jedem Traumlauf verfallen ungepinnte Anker +(Wichtigkeit × 0.9); unter 0.15 und ohne Treffer werden sie gelöscht. Gepinnte +(★) bleiben. + +Die wichtigsten Anker gehen als System-Kontext mit (Budget ~1200 Zeichen) — +das Modell beantwortet dann Fragen aus Inhalten, die nie im sichtbaren +Chatverlauf standen. + +### Rekonstruktion + +Weil das Log append-only ist, lässt sich der Zustand jederzeit deterministisch +aus Seq 0 neu falten: 🧠 **Gedächtnis** → „Aus Log rekonstruieren“, gepinnte +Anker bleiben erhalten. Die Eval der Heuristik und des Dream-Parsers: + +```bash +npm run memory:eval --workspace server +``` ## Sicherheit Der Server hat **keine Authentifizierung** und lauscht deshalb bewusst nur auf -`127.0.0.1`. Das allein genügt aber nicht: Eine beliebige Webseite, die im -Browser geöffnet ist, kann `localhost` per `fetch()` oder WebSocket erreichen. -Deshalb prüfen sowohl die HTTP-Endpunkte als auch der WebSocket-Handshake die -`Origin` gegen eine Allowlist (`server/src/security.ts`) — Standard sind -`localhost`/`127.0.0.1` auf Port 5174 und 8788. - -Läuft das Frontend woanders, die Origin ergänzen: +`127.0.0.1`. Das allein genügt nicht: Eine beliebige im Browser geöffnete +Webseite erreicht `localhost` per `fetch()` oder WebSocket. Deshalb prüfen +sowohl die HTTP-Endpunkte als auch der WebSocket-Handshake die `Origin` gegen +eine Allowlist (`server/src/security.ts`) — Standard sind `localhost` und +`127.0.0.1` auf Port 5174 und 8788. Läuft das Frontend woanders: ```bash ALLOWED_ORIGINS=http://192.168.1.50:5174 ``` -Weitere Maßnahmen: Rate-Limits auf `/api/stt` (10/min) und `/api/tts` (30/min), -Format-Whitelist per Magic Bytes vor dem `ffmpeg`-Aufruf, und Fehlerdetails -landen im Server-Log statt in der HTTP-Antwort. +Weitere Maßnahmen: Rate-Limits auf `/api/stt` (10/min), `/api/tts` (30/min), +Traumphase (4/min) und Chats je WebSocket-Verbindung (30/min); +Format-Whitelist per Magic Bytes vor dem `ffmpeg`-Aufruf; Fehlerdetails landen +im Server-Log statt in der HTTP-Antwort. -Für externen Zugriff reicht ein Reverse-Proxy **nicht** — davor gehört eine +Bewusst **nicht** abgesichert: Anfragen ohne `Origin`-Header werden +durchgelassen. Für Browser-Clients trägt die Prüfung, weil `fetch` und +Formular-POSTs immer eine Origin senden — jedes lokale Programm kommt aber +ungefragt an die API. Für den Einzelplatzbetrieb ist das so gewollt. + +Für externen Zugriff reicht ein Reverse-Proxy **nicht**. Davor gehört eine echte Authentifizierung. +## API + +| Endpunkt | Methode | Zweck | +|------------------------------------|---------------|----------------------------------| +| `/ws` | WebSocket | Chat-Stream, Werkzeug-Rückfragen | +| `/api/health` | GET | Lebenszeichen | +| `/api/tools` | GET | Registrierte Werkzeuge | +| `/api/model?name=` | GET | Fähigkeiten eines Ollama-Modells | +| `/api/ollama/models` | GET | Lokal verfügbare Modelle | +| `/api/openrouter/models` | GET | Cloud-Modelle mit Preisen | +| `/api/sessions` | GET, POST | Chats auflisten, anlegen | +| `/api/sessions/:id` | DELETE | Chat samt Gedächtnis löschen | +| `/api/sessions/:id/messages` | GET | Verlauf eines Chats | +| `/api/sessions/:id/memory` | GET | Zustand und Ankerpunkte | +| `/api/sessions/:id/dream` | POST | Traumphase auslösen | +| `/api/sessions/:id/memory/rebuild` | POST | Aus dem Log rekonstruieren | +| `/api/anchors/:id` | PATCH, DELETE | Anker pinnen, löschen | +| `/api/stt` | POST | Audio zu Text (Whisper) | +| `/api/tts` | POST | Text zu Audio (Piper) | + ## Entwicklung ```bash npm install npm run dev # Server (:8788) und Vite-Dev-Server (:5174) parallel +npm run dev:server # nur Backend +npm run dev:web # nur Frontend +npm run typecheck # beide Workspaces ``` -Einzeln: - -```bash -npm run dev:server -npm run dev:web -``` - -Typecheck über beide Workspaces: - -```bash -npm run typecheck -``` +Der Vite-Dev-Server leitet `/api` und `/ws` an das Backend weiter, deshalb +läuft die App unter `http://localhost:5174` aus einer Herkunft. ## Produktion ```bash -npm start # baut das Frontend und startet den Server +npm start # baut web/dist und startet den Server auf :8788 ``` -Der Server bindet nur an `127.0.0.1`. Zum Aussetzen ins Netz siehe +Der Server liefert das gebaute Frontend mit aus — die App läuft dann +vollständig unter `http://localhost:8788`, ohne zweiten Prozess. Fehlt +`web/dist`, stellt er nur die API bereit und sagt das beim Start; das ist der +Normalfall im Entwicklungsbetrieb, wo Vite das Frontend übernimmt. + +`/api` und `/ws` behalten Vorrang vor den statischen Dateien. Unbekannte +`/api`-Pfade antworten mit JSON-404, alles andere bekommt `index.html`. + +Der Server bindet ausschließlich an `127.0.0.1`; zum Aussetzen ins Netz siehe [Sicherheit](#sicherheit). diff --git a/package-lock.json b/package-lock.json index 824e38d..b8e09bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -739,6 +739,22 @@ "node": ">=18" } }, + "node_modules/@fastify/accept-negotiator": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-2.1.0.tgz", + "integrity": "sha512-F3EVbzWt+xcnVaOHmWyIlpuFtbxOln7HDZQsh09MtMmMm/CipMayNt8hnIL8VQi54u2ZociDbf+iluGYkf7B1A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/@fastify/ajv-compiler": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.6.tgz", @@ -870,6 +886,70 @@ "ipaddr.js": "^2.1.0" } }, + "node_modules/@fastify/send": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@fastify/send/-/send-4.1.1.tgz", + "integrity": "sha512-BYo+EiaKwlxH+WetGk6hAs1d39iP0y1gqB8lGF/qwkJ9ZZ/cBY1vx5NvExb9Sc3yRMFjD5X4Eyh4e4+TzRkzdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@lukeed/ms": "^2.0.2", + "escape-html": "~1.0.3", + "fast-decode-uri-component": "^1.0.1", + "http-errors": "^2.0.0", + "mime": "^3" + } + }, + "node_modules/@fastify/static": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/@fastify/static/-/static-10.1.3.tgz", + "integrity": "sha512-W6jqajYS974XjPjB5hQWoxPM8NKM4+p8YmQT6G5IbCa4uhdWSVadZUv75siy1wEA/3ty8RYdpBydfWeu9AqAqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/accept-negotiator": "^2.0.0", + "@fastify/error": "^4.0.0", + "@fastify/send": "^4.0.0", + "content-disposition": "^2.0.1", + "fastify-plugin": "^6.0.0", + "fastq": "^1.17.1", + "glob": "^13.0.0" + } + }, + "node_modules/@fastify/static/node_modules/fastify-plugin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-6.0.0.tgz", + "integrity": "sha512-fZOty7z3O7vOliF6d8bHE3wiEh1KcNnKEQensSgTk9C1DvN6nRLS++XVd86v33Hw/8u9Un8A1zDrQ8ujcQDHEg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -920,6 +1000,15 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@lukeed/ms": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", + "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@mixmark-io/domino": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", @@ -1824,6 +1913,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/baseline-browser-mapping": { "version": "2.11.19", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.19.tgz", @@ -1850,6 +1948,18 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/browserslist": { "version": "4.28.8", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", @@ -1974,6 +2084,19 @@ "node": ">=18" } }, + "node_modules/content-disposition": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-2.0.1.tgz", + "integrity": "sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2087,6 +2210,15 @@ "turndown": "^7.2.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -2247,6 +2379,12 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -2463,6 +2601,23 @@ "node": ">=6.9.0" } }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/hast-util-is-element": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", @@ -2655,6 +2810,32 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, "node_modules/inline-style-parser": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", @@ -3753,6 +3934,42 @@ ], "license": "MIT" }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mnemonist": { "version": "0.40.0", "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.40.0.tgz", @@ -3853,6 +4070,31 @@ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/pdf-parse": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/pdf-parse/-/pdf-parse-2.4.5.tgz", @@ -4313,6 +4555,12 @@ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", "license": "MIT" }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, "node_modules/sonic-boom": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", @@ -4351,6 +4599,15 @@ "node": ">= 10.x" } }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", @@ -4437,6 +4694,15 @@ "node": ">=20" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -5282,6 +5548,7 @@ "version": "0.1.0", "dependencies": { "@fastify/cors": "^10.0.1", + "@fastify/static": "^10.1.3", "defuddle": "^0.19.3", "fastify": "^5.2.1", "linkedom": "^0.18.13", diff --git a/server/package.json b/server/package.json index ce1a843..c71751f 100644 --- a/server/package.json +++ b/server/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "@fastify/cors": "^10.0.1", + "@fastify/static": "^10.1.3", "defuddle": "^0.19.3", "fastify": "^5.2.1", "linkedom": "^0.18.13", diff --git a/server/src/index.ts b/server/src/index.ts index 48138c3..83e8324 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -1,12 +1,14 @@ import Fastify from "fastify"; import cors from "@fastify/cors"; +import fastifyStatic from "@fastify/static"; import { WebSocketServer, WebSocket } from "ws"; import type { IncomingMessage } from "node:http"; -import { readFileSync } from "node:fs"; +import { randomUUID } from "node:crypto"; +import { existsSync, readFileSync } from "node:fs"; import path from "node:path"; import * as dbmod from "./db.js"; import * as mem from "./memory.js"; -import { streamChat, type OllamaOptions } from "./ollama.js"; +import { streamChat, type ChatStats, type OllamaOptions } from "./ollama.js"; import { transcribeAudio, synthesizeSpeech, MAX_AUDIO_BYTES } from "./voice.js"; import { streamOpenRouter, @@ -35,6 +37,46 @@ const PORT = Number(process.env.PORT ?? 8788); const OLLAMA_URL = process.env.OLLAMA_URL ?? "http://localhost:11434"; const MODEL = process.env.MODEL ?? "qwen3.5:latest"; +/** + * Wie lange auf die Freigabe eines bestätigungspflichtigen Werkzeugs gewartet + * wird. Danach gilt "abgelehnt" — eine Antwort soll nicht ewig hängen, nur + * weil niemand am Rechner sitzt. + */ +const CONFIRM_TIMEOUT_MS = 120_000; +/** Chats pro Minute und Verbindung. Bremst Schleifen und OpenRouter-Kosten. */ +const CHAT_LIMIT_PER_MIN = 30; + +/** + * Effektive Kontextlänge eines geladenen Ollama-Modells. + * + * Nicht dasselbe wie die im Modell deklarierte Länge: qwen3.5 meldet 262144, + * geladen läuft es je nach Ollama-Default aber mit 4096. Für einen ehrlichen + * Füllstand zählt nur, womit das Modell tatsächlich läuft — und das steht in + * /api/ps. Kurz gecacht, weil sich das nur beim Nachladen ändert. + */ +const CONTEXT_TTL_MS = 30_000; +const contextCache = new Map(); + +async function effectiveContextLength(model: string): Promise { + const hit = contextCache.get(model); + if (hit && Date.now() - hit.at < CONTEXT_TTL_MS) return hit.value; + try { + const res = await fetch(`${OLLAMA_URL}/api/ps`); + if (!res.ok) return hit?.value; + const data = (await res.json()) as { + models?: { name?: string; model?: string; context_length?: number }[]; + }; + const entry = (data.models ?? []).find( + (m) => m.name === model || m.model === model, + ); + if (!entry?.context_length) return hit?.value; + contextCache.set(model, { value: entry.context_length, at: Date.now() }); + return entry.context_length; + } catch { + return hit?.value; + } +} + const DREAM_IDLE_MS = 180_000; const DREAM_BATCH = 10; const dreamTimers = new Map>(); @@ -268,6 +310,25 @@ app.get("/api/ollama/models", async () => { } }); +// --- Gebautes Frontend --- +// +// Nur wenn web/dist existiert: im Entwicklungsbetrieb liefert der +// Vite-Server das Frontend aus, dann soll hier nichts danebenstehen. +// Registrierung nach den API-Routen, damit /api und /ws Vorrang behalten. +const WEB_DIST = path.join(import.meta.dirname, "..", "..", "web", "dist"); +const hasBuild = existsSync(path.join(WEB_DIST, "index.html")); + +if (hasBuild) { + await app.register(fastifyStatic, { root: WEB_DIST }); + app.setNotFoundHandler((req, reply) => { + // API-Fehler bleiben JSON; alles andere bekommt die App. + if (req.url.startsWith("/api")) { + return reply.code(404).send({ error: "not found" }); + } + return reply.sendFile("index.html"); + }); +} + // --- WebSocket --- interface ChatOptionsPayload { think: boolean; @@ -325,7 +386,54 @@ function broadcast(data: unknown) { } wss.on("connection", (socket: WebSocket, _req: IncomingMessage) => { - let activeAbort: AbortController | null = null; + // Mehrere Antworten können parallel laufen (zweite Nachricht bei laufendem + // Stream). Ein einzelnes Feld würde beim Abbruch nur die letzte erwischen. + const activeAborts = new Set(); + const pendingConfirms = new Map(); + /** Werkzeuge, die der Nutzer für diese Verbindung generell freigegeben hat. */ + const alwaysAllowed = new Set(); + const chatLimiter = createRateLimiter(CHAT_LIMIT_PER_MIN, 60_000); + + function denyAllConfirms() { + for (const entry of [...pendingConfirms.values()]) entry.decide(false); + } + + /** + * Fragt den Nutzer, bevor ein Werkzeug mit Außenwirkung läuft. Bricht die + * Verbindung weg oder bleibt die Antwort aus, gilt das als Ablehnung. + */ + function confirmTool( + messageId: string, + name: string, + args: Record, + ): Promise { + if (alwaysAllowed.has(name)) return Promise.resolve(true); + if (socket.readyState !== WebSocket.OPEN) return Promise.resolve(false); + + const id = randomUUID(); + return new Promise((resolve) => { + const timer = setTimeout(() => decide(false), CONFIRM_TIMEOUT_MS); + function decide(approved: boolean) { + clearTimeout(timer); + pendingConfirms.delete(id); + resolve(approved); + } + pendingConfirms.set(id, { name, decide }); + socket.send( + JSON.stringify({ + type: "tool-confirm", + id, + messageId, + name, + // Ungekürzt: der Nutzer muss genau sehen, was rausgeht — bei + // read_webpage ist die vollständige URL der eigentliche Punkt. + args: JSON.stringify(args), + }), + ); + }); + } + + socket.on("close", denyAllConfirms); socket.on("message", async (raw: Buffer) => { let msg: Record; @@ -336,13 +444,31 @@ wss.on("connection", (socket: WebSocket, _req: IncomingMessage) => { return; } + if (msg.type === "tool-confirm-reply") { + const entry = pendingConfirms.get(String(msg.id ?? "")); + if (!entry) return; + // Der Werkzeugname kommt aus dem Server-Zustand, nicht aus der Antwort: + // sonst könnte eine Freigabe für ein Werkzeug ein anderes freischalten. + if (msg.decision === "always") alwaysAllowed.add(entry.name); + entry.decide(msg.decision === "allow" || msg.decision === "always"); + return; + } + if (msg.type === "abort") { - activeAbort?.abort(); + for (const controller of activeAborts) controller.abort(); + denyAllConfirms(); return; } if (msg.type !== "chat") return; + if (!chatLimiter("chat")) { + socket.send( + JSON.stringify({ type: "error", error: "Zu viele Anfragen — kurz warten." }), + ); + return; + } + const sessionId = String(msg.sessionId ?? ""); const content = String(msg.content ?? "").trim(); @@ -423,7 +549,8 @@ wss.on("connection", (socket: WebSocket, _req: IncomingMessage) => { const assistantRow = dbmod.insertMessage(session.id, "assistant", ""); socket.send(JSON.stringify({ type: "assistant-start", message: assistantRow })); - activeAbort = new AbortController(); + const abort = new AbortController(); + activeAborts.add(abort); let full = ""; let thinking = ""; const callbacks = { @@ -463,6 +590,27 @@ wss.on("connection", (socket: WebSocket, _req: IncomingMessage) => { JSON.stringify({ type: "tool-result", messageId: assistantRow.id, name, ok, durationMs }), ); }, + onToolConfirm(name: string, args: Record) { + return confirmTool(assistantRow.id, name, args); + }, + async onStats(stats: ChatStats) { + // Nur bei Ollama kennt der Server das echte Fenster; bei OpenRouter + // steht die Kontextlänge in der Modellliste, die der Client schon hat. + const contextLength = + opts.provider === "ollama" + ? await effectiveContextLength(opts.model) + : undefined; + socket.send( + JSON.stringify({ + type: "stats", + messageId: assistantRow.id, + model: opts.provider === "ollama" ? opts.model : opts.openrouterModel, + provider: opts.provider, + contextLength, + ...stats, + }), + ); + }, }; try { @@ -479,10 +627,10 @@ wss.on("connection", (socket: WebSocket, _req: IncomingMessage) => { }, apiKey, callbacks, - activeAbort.signal, + abort.signal, ); } else { - await streamChat(history, system, opts, callbacks, activeAbort.signal); + await streamChat(history, system, opts, callbacks, abort.signal); } dbmod.updateAssistantMessage(assistantRow.id, full.trim(), thinking.trim() || null); mem.appendEvent(session.id, "message", { @@ -493,7 +641,7 @@ wss.on("connection", (socket: WebSocket, _req: IncomingMessage) => { JSON.stringify({ type: "done", messageId: assistantRow.id, - aborted: activeAbort.signal.aborted, + aborted: abort.signal.aborted, }), ); broadcast({ type: "sessions-changed" }); @@ -507,7 +655,7 @@ wss.on("connection", (socket: WebSocket, _req: IncomingMessage) => { } } catch (err) { const aborted = - activeAbort.signal.aborted || + abort.signal.aborted || (err instanceof Error && err.name === "AbortError"); dbmod.updateAssistantMessage(assistantRow.id, full.trim(), thinking.trim() || null); if (aborted) { @@ -522,7 +670,7 @@ wss.on("connection", (socket: WebSocket, _req: IncomingMessage) => { ); } } finally { - activeAbort = null; + activeAborts.delete(abort); } }); }); @@ -549,4 +697,9 @@ server.on("upgrade", (req, socket, head) => { app.listen({ port: PORT, host: "127.0.0.1" }, () => { console.log(`[agenttwo-tools] Server läuft auf http://127.0.0.1:${PORT}`); + console.log( + hasBuild + ? "[agenttwo-tools] Frontend aus web/dist wird mit ausgeliefert" + : "[agenttwo-tools] Kein web/dist — Frontend über 'npm run dev:web' (:5174)", + ); }); diff --git a/server/src/ollama.ts b/server/src/ollama.ts index 0f65020..456104b 100644 --- a/server/src/ollama.ts +++ b/server/src/ollama.ts @@ -16,6 +16,24 @@ export interface OllamaOptions { sessionId?: string; } +/** + * Messwerte einer Antwort. Zahlen kommen aus dem Abschluss-Chunk von Ollama + * bzw. dem usage-Block von OpenRouter — nicht geschätzt. + */ +export interface ChatStats { + /** Tokens im Prompt der letzten Runde: das, was zuletzt im Kontext lag. */ + promptTokens: number; + /** Erzeugte Tokens, über alle Werkzeugrunden summiert. */ + responseTokens: number; + /** Bis zum ersten sichtbaren Token (Denken zählt mit). null, wenn keins kam. */ + ttftMs: number | null; + /** Reine Generierungszeit, ohne Prompt-Auswertung und Modell-Laden. */ + evalMs: number; + /** Wanduhr über alles, inklusive Werkzeuglaufzeit. */ + totalMs: number; + rounds: number; +} + export interface StreamCallbacks { onThinking(text: string): void; onToken(text: string): void; @@ -24,6 +42,16 @@ export interface StreamCallbacks { onToolCall?(name: string, args: Record): void; /** Werkzeug ist fertig. */ onToolResult?(name: string, ok: boolean, durationMs: number): void; + /** + * Holt die Freigabe des Nutzers für ein bestätigungspflichtiges Werkzeug. + * Fehlt der Rückkanal, lehnt `runTool` solche Werkzeuge ab. + */ + onToolConfirm?(name: string, args: Record): Promise; + /** + * Messwerte, sobald die Antwort steht. Darf asynchron sein — der Aufrufer + * wartet ab, damit die Zahlen sicher vor `done` beim Client sind. + */ + onStats?(stats: ChatStats): void | Promise; } /** Muss zum OLLAMA_URL in index.ts passen — vorher war der Host hier hartkodiert. */ @@ -42,8 +70,22 @@ interface ChatChunk { }; done?: boolean; error?: string; + /** Nur im Abschluss-Chunk. Dauern in Nanosekunden. */ + prompt_eval_count?: number; + eval_count?: number; + eval_duration?: number; } +/** Rohwerte einer Runde, wie Ollama sie meldet. */ +interface RoundStats { + promptTokens: number; + responseTokens: number; + evalMs: number; + ttftMs: number | null; +} + +const NS_PER_MS = 1e6; + export interface ChatMessage { role: string; content: string; @@ -90,7 +132,23 @@ async function streamOnce( opts: OllamaOptions, cb: StreamCallbacks, signal: AbortSignal, -): Promise<{ toolCalls: ToolCall[]; content: string }> { +): Promise<{ toolCalls: ToolCall[]; content: string; stats: RoundStats }> { + const startedAt = Date.now(); + let firstTokenAt: number | null = null; + const stats: RoundStats = { + promptTokens: 0, + responseTokens: 0, + evalMs: 0, + ttftMs: null, + }; + /** Übernimmt die Zahlen aus dem Abschluss-Chunk. */ + function collect(chunk: ChatChunk) { + stats.promptTokens = chunk.prompt_eval_count ?? 0; + stats.responseTokens = chunk.eval_count ?? 0; + stats.evalMs = Math.round((chunk.eval_duration ?? 0) / NS_PER_MS); + stats.ttftMs = firstTokenAt === null ? null : firstTokenAt - startedAt; + } + const body: Record = { model: opts.model, messages, @@ -139,6 +197,9 @@ async function streamOnce( continue; } if (chunk.error) throw new Error(chunk.error); + if (chunk.message?.thinking || chunk.message?.content) { + firstTokenAt ??= Date.now(); + } if (chunk.message?.thinking) cb.onThinking(chunk.message.thinking); if (chunk.message?.content) { content += chunk.message.content; @@ -150,10 +211,13 @@ async function streamOnce( toolCalls.push({ id: call.id, name, arguments: parseArgs(call.function?.arguments) }); } } - if (chunk.done) return { toolCalls, content }; + if (chunk.done) { + collect(chunk); + return { toolCalls, content, stats }; + } } } - return { toolCalls, content }; + return { toolCalls, content, stats }; } /** @@ -176,15 +240,40 @@ export async function streamChat( ...history.map(toWire), ]; + const startedAt = Date.now(); + const total: ChatStats = { + promptTokens: 0, + responseTokens: 0, + ttftMs: null, + evalMs: 0, + totalMs: 0, + rounds: 0, + }; + /** + * Werkzeugrunden sind mehrere Ollama-Aufrufe für eine sichtbare Antwort: + * Erzeugtes wird summiert, der Prompt-Stand ist der der letzten Runde + * (die größte Belegung), TTFT zählt nur die erste Runde. + */ + function fold(round: RoundStats) { + total.rounds++; + total.promptTokens = round.promptTokens || total.promptTokens; + total.responseTokens += round.responseTokens; + total.evalMs += round.evalMs; + total.ttftMs ??= round.ttftMs; + total.totalMs = Date.now() - startedAt; + } + for (let round = 0; round <= MAX_TOOL_ROUNDS; round++) { const lastRound = round === MAX_TOOL_ROUNDS; // In der letzten Runde ohne Werkzeuge fragen, damit eine Antwort entsteht // statt eines weiteren Aufrufwunsches. const roundOpts = lastRound ? { ...opts, tools: false } : opts; - const { toolCalls, content } = await streamOnce(messages, roundOpts, cb, signal); + const { toolCalls, content, stats } = await streamOnce(messages, roundOpts, cb, signal); + fold(stats); if (toolCalls.length === 0) { + await cb.onStats?.(total); cb.onDone(); return; } @@ -200,11 +289,18 @@ export async function streamChat( for (const call of toolCalls) { cb.onToolCall?.(call.name, call.arguments); - const result = await runTool(call, { signal, sessionId: opts.sessionId }); + const result = await runTool(call, { + signal, + sessionId: opts.sessionId, + confirm: cb.onToolConfirm + ? (c) => cb.onToolConfirm!(c.name, c.arguments) + : undefined, + }); cb.onToolResult?.(result.name, result.ok, result.durationMs); messages.push({ role: "tool", tool_name: result.name, content: result.content }); } } + await cb.onStats?.(total); cb.onDone(); } diff --git a/server/src/openrouter.ts b/server/src/openrouter.ts index 412a0f1..f1fb7dd 100644 --- a/server/src/openrouter.ts +++ b/server/src/openrouter.ts @@ -1,4 +1,5 @@ import { mimeFromBase64 } from "./images.js"; +import type { ChatStats } from "./ollama.js"; export interface OpenRouterOptions { model: string; @@ -10,6 +11,8 @@ export interface StreamCallbacks { onThinking(text: string): void; onToken(text: string): void; onDone(): void; + /** Messwerte, sobald die Antwort steht. Wird vor `done` abgewartet. */ + onStats?(stats: ChatStats): void | Promise; } export function getOpenRouterKey(): string | undefined { @@ -17,7 +20,13 @@ export function getOpenRouterKey(): string | undefined { } export async function listOpenRouterModels(): Promise< - { id: string; name: string; contextLength: number; promptPrice: number }[] + { + id: string; + name: string; + contextLength: number; + promptPrice: number; + completionPrice: number; + }[] > { const res = await fetch("https://openrouter.ai/api/v1/models"); if (!res.ok) throw new Error(`OpenRouter HTTP ${res.status}`); @@ -26,15 +35,17 @@ export async function listOpenRouterModels(): Promise< id: string; name: string; context_length: number; - pricing: { prompt: string }; + pricing: { prompt: string; completion?: string }; }[]; }; + // Preise kommen pro Token; die Anzeige rechnet in Preis je 1 Mio. Tokens. return data.data .map((m) => ({ id: m.id, name: m.name, contextLength: m.context_length, promptPrice: Number(m.pricing?.prompt ?? 0) * 1_000_000, + completionPrice: Number(m.pricing?.completion ?? 0) * 1_000_000, })) .sort((a, b) => a.name.localeCompare(b.name)); } @@ -65,6 +76,10 @@ export async function streamOpenRouter( cb: StreamCallbacks, signal: AbortSignal, ): Promise { + // Vor dem fetch: TTFT soll die Wartezeit auf den Anbieter enthalten, nicht + // erst ab dem Eintreffen der Antwort-Header zählen (so misst es auch Ollama). + const startedAt = Date.now(); + const res = await fetch("https://openrouter.ai/api/v1/chat/completions", { method: "POST", headers: { @@ -76,6 +91,8 @@ export async function streamOpenRouter( body: JSON.stringify({ model: opts.model, stream: true, + // Ohne das kommt kein usage-Block und die Tokenzahlen blieben leer. + stream_options: { include_usage: true }, messages: [ ...(systemPrompt ? [{ role: "system", content: systemPrompt }] : []), ...history.map(toOpenAIMessage), @@ -95,6 +112,27 @@ export async function streamOpenRouter( const decoder = new TextDecoder(); let buffer = ""; + let firstTokenAt: number | null = null; + const stats: ChatStats = { + promptTokens: 0, + responseTokens: 0, + ttftMs: null, + evalMs: 0, + totalMs: 0, + rounds: 1, + }; + /** + * OpenRouter meldet keine reine Generierungszeit. Als evalMs zählt deshalb + * die Zeit ab dem ersten Token — das ist die Spanne, über die tok/s + * überhaupt aussagekräftig ist. + */ + function finish(): void | Promise { + stats.totalMs = Date.now() - startedAt; + stats.ttftMs = firstTokenAt === null ? null : firstTokenAt - startedAt; + stats.evalMs = firstTokenAt === null ? 0 : Date.now() - firstTokenAt; + return cb.onStats?.(stats); + } + while (true) { const { value, done } = await reader.read(); if (done) break; @@ -107,6 +145,7 @@ export async function streamOpenRouter( if (!line.startsWith("data:")) continue; const payload = line.slice(5).trim(); if (payload === "[DONE]") { + await finish(); cb.onDone(); return; } @@ -116,6 +155,7 @@ export async function streamOpenRouter( finish_reason?: string | null; }[]; error?: { message?: string }; + usage?: { prompt_tokens?: number; completion_tokens?: number }; }; try { chunk = JSON.parse(payload); @@ -123,14 +163,24 @@ export async function streamOpenRouter( continue; } if (chunk.error) throw new Error(chunk.error.message ?? "OpenRouter error"); + if (chunk.usage) { + stats.promptTokens = chunk.usage.prompt_tokens ?? 0; + stats.responseTokens = chunk.usage.completion_tokens ?? 0; + } const delta = chunk.choices?.[0]?.delta; + if (delta?.reasoning || delta?.content) firstTokenAt ??= Date.now(); if (delta?.reasoning) cb.onThinking(delta.reasoning); if (delta?.content) cb.onToken(delta.content); - if (chunk.choices?.[0]?.finish_reason && !delta?.content) { + // Der usage-Block kommt erst nach dem finish_reason-Chunk. Nur wenn er + // schon da ist, darf hier abgekürzt werden — sonst bis [DONE] weiterlesen + // und die Tokenzahlen mitnehmen. + if (chunk.choices?.[0]?.finish_reason && !delta?.content && stats.promptTokens) { + await finish(); cb.onDone(); return; } } } + await finish(); cb.onDone(); } diff --git a/server/src/security.ts b/server/src/security.ts index 183be27..58046bc 100644 --- a/server/src/security.ts +++ b/server/src/security.ts @@ -39,6 +39,9 @@ interface Bucket { resetAt: number; } +/** Ab dieser Größe wird aufgeräumt — reicht für jede realistische Nutzung. */ +const MAX_BUCKETS = 1000; + /** * Einfacher In-Memory-Zähler pro Zeitfenster. Bremst teure Endpunkte * (Whisper läuft bis zu 180 s) gegen versehentliche oder böswillige Fluten. @@ -46,8 +49,16 @@ interface Bucket { export function createRateLimiter(limit: number, windowMs: number) { const buckets = new Map(); + /** Abgelaufene Zähler wegräumen, damit die Map nicht unbegrenzt wächst. */ + function sweep(now: number) { + for (const [key, bucket] of buckets) { + if (now >= bucket.resetAt) buckets.delete(key); + } + } + return function allow(key: string): boolean { const now = Date.now(); + if (buckets.size > MAX_BUCKETS) sweep(now); const bucket = buckets.get(key); if (!bucket || now >= bucket.resetAt) { diff --git a/server/src/tools/index.ts b/server/src/tools/index.ts index 3a6bc9a..84431f5 100644 --- a/server/src/tools/index.ts +++ b/server/src/tools/index.ts @@ -43,6 +43,11 @@ export function toolNames(): string[] { return REGISTRY.map((t) => t.name); } +/** + * Zeitlimit für das Ergebnis. Der `signal` unten bricht das Werkzeug zusätzlich + * ab — beides zusammen, weil ein Werkzeug den Signal auch ignorieren kann und + * die Antwort dann trotzdem nicht ewig hängen darf. + */ function withTimeout(p: Promise, ms: number, name: string): Promise { return new Promise((resolve, reject) => { const timer = setTimeout( @@ -74,9 +79,26 @@ export async function runTool(call: ToolCall, ctx: ToolContext): Promise { + if (!ctx.confirm) return false; + try { + return await ctx.confirm(call); + } catch { + return false; + } +} diff --git a/server/src/tools/remember.ts b/server/src/tools/remember.ts index b1ee7b0..bd3fe4f 100644 --- a/server/src/tools/remember.ts +++ b/server/src/tools/remember.ts @@ -6,7 +6,7 @@ import type { Tool } from "./types.js"; export const rememberTool: Tool = { name: "remember", description: - "Speichert einen dauerhaft wichtigen Punkt als Ankerpunkt im Gedächtnis des aktuellen Chats. Nur für Fakten, Entscheidungen, Präferenzen oder offene Punkte — nicht für flüchtige Inhalte.", + "Speichert einen dauerhaft wichtigen Punkt als Ankerpunkt im Gedächtnis des aktuellen Chats. Nur für Fakten, Entscheidungen, Präferenzen oder offene Punkte — nicht für flüchtige Inhalte. Der Nutzer muss jeden Aufruf freigeben.", requiresConfirmation: true, parameters: { type: "object", @@ -27,6 +27,10 @@ export const rememberTool: Tool = { const text = String(args.text ?? "").trim(); if (!ctx.sessionId) throw new ToolError("Keine Sitzung für das Gedächtnis bekannt"); if (text.length < 6) throw new ToolError("Text ist zu kurz, um ihn zu merken"); + // Bewusst ungepinnt: ein vom Modell gesetzter Anker soll dem normalen + // Verfall unterliegen. Gepinnt wird nur, was der Nutzer im + // Gedächtnis-Panel selbst mit ★ markiert — sonst überlebt ein einmal + // untergeschobener "Fakt" jede Traumphase und jede Rekonstruktion. const result = upsertAnchor(ctx.sessionId, { text, kind: ANCHOR_KINDS.includes(args.kind as AnchorKind) @@ -34,7 +38,6 @@ export const rememberTool: Tool = { : "fact", importance: 0.9, origin: "model", - pinned: true, }); return { stored: result, text }; }, diff --git a/server/src/tools/types.ts b/server/src/tools/types.ts index aec6172..2373f4f 100644 --- a/server/src/tools/types.ts +++ b/server/src/tools/types.ts @@ -10,6 +10,12 @@ export interface ToolContext { signal: AbortSignal; /** Sitzung des aktuellen Chats — für Werkzeuge mit Gedächtniszugriff. */ sessionId?: string; + /** + * Holt die Freigabe des Nutzers für ein Werkzeug mit Außenwirkung. + * Fehlt der Rückkanal, werden bestätigungspflichtige Werkzeuge abgelehnt — + * lieber nicht ausführen als ungefragt. + */ + confirm?(call: ToolCall): Promise; } export interface Tool { @@ -17,9 +23,9 @@ export interface Tool { description: string; parameters: ToolSchema; /** - * Kennzeichnet Werkzeuge mit Außenwirkung (schreibend, Netzwerk, Server). - * Bisher gibt es nur lesende Werkzeuge; das Feld existiert, damit die - * Bestätigungspflicht später nicht nachträglich eingezogen werden muss. + * Kennzeichnet Werkzeuge mit Außenwirkung (Netzwerk, dauerhafter Speicher). + * `runTool` fragt vor der Ausführung über `ToolContext.confirm` beim Nutzer + * nach und lehnt ab, wenn keine Freigabe kommt. */ requiresConfirmation?: boolean; /** Gibt zurück, was dem Modell als Ergebnis gezeigt wird. */ diff --git a/server/src/tools/web.ts b/server/src/tools/web.ts index 6368ed9..67f422e 100644 --- a/server/src/tools/web.ts +++ b/server/src/tools/web.ts @@ -1,5 +1,8 @@ -import { lookup } from "node:dns/promises"; -import { isIP } from "node:net"; +import dns from "node:dns"; +import { request as httpRequest, type IncomingMessage } from "node:http"; +import { request as httpsRequest } from "node:https"; +import { isIP, type LookupFunction } from "node:net"; +import { createBrotliDecompress, createGunzip, createInflate } from "node:zlib"; import { parseHTML } from "linkedom"; import { Defuddle } from "defuddle/node"; import { ToolError } from "./types.js"; @@ -9,6 +12,8 @@ const TIMEOUT_MS = 15_000; const MAX_HTML_BYTES = 2 * 1024 * 1024; const MAX_CONTENT_CHARS = 25_000; const MAX_REDIRECTS = 5; +const ALLOWED_TYPES = + /text\/html|text\/plain|application\/xhtml|application\/json|application\/xml|text\/markdown/; const USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36 agenttwo-readweb/1.0"; @@ -39,23 +44,53 @@ function isPrivateIP(ip: string): boolean { first.startsWith("fe9") || first.startsWith("fea") || first.startsWith("feb"); } +/** `new URL().hostname` liefert IPv6-Literale in Klammern: [::1] -> ::1. */ +function bareHost(hostname: string): string { + return hostname.startsWith("[") && hostname.endsWith("]") + ? hostname.slice(1, -1) + : hostname; +} + /** - * SSRF-Schutz: Der Server löst den Host selbst auf und weist private Bereiche - * ab. Ohne das könnte das Modell http://localhost:8788/api/sessions lesen — - * der Origin-Check schützt nicht vor server-eigenem fetch. + * DNS-Auflösung, die private Adressen ablehnt — eingehängt als `lookup` der + * HTTP-Verbindung. + * + * Entscheidend ist, dass genau diese Auflösung auch verbunden wird. Ein + * getrennter Vorab-Check (wie ihn `fetch` erzwingt, das selbst noch einmal + * auflöst) ließe DNS-Rebinding zu: öffentlich bei der Prüfung, 127.0.0.1 beim + * Verbinden. + */ +const guardedLookup: LookupFunction = (hostname, options, callback) => { + dns.lookup(hostname, options, (err, address, family) => { + if (err) return callback(err, "", 0); + const addresses = Array.isArray(address) ? address : [{ address, family }]; + for (const a of addresses) { + if (isPrivateIP(a.address)) { + return callback(new ToolError("Zugriff auf private Adressen ist gesperrt"), "", 0); + } + } + callback(null, address as string, family); + }); +}; + +/** + * Vorab-Prüfung, rein für die Fehlermeldung: so bekommt das Modell "private + * Adresse gesperrt" statt eines generischen Verbindungsfehlers. Die + * verbindliche Grenze ist `guardedLookup`. */ async function assertPublicHost(hostname: string): Promise { - if (isIP(hostname)) { - if (isPrivateIP(hostname)) throw new ToolError("Zugriff auf private Adressen ist gesperrt"); + const host = bareHost(hostname); + if (isIP(host)) { + if (isPrivateIP(host)) throw new ToolError("Zugriff auf private Adressen ist gesperrt"); return; } let addrs: { address: string }[]; try { - addrs = await lookup(hostname, { all: true, verbatim: true }); + addrs = await dns.promises.lookup(host, { all: true, verbatim: true }); } catch { - throw new ToolError(`Host nicht auflösbar: ${hostname}`); + throw new ToolError(`Host nicht auflösbar: ${host}`); } - if (addrs.length === 0) throw new ToolError(`Host nicht auflösbar: ${hostname}`); + if (addrs.length === 0) throw new ToolError(`Host nicht auflösbar: ${host}`); for (const a of addrs) { if (isPrivateIP(a.address)) { throw new ToolError("Zugriff auf private Adressen ist gesperrt"); @@ -76,49 +111,93 @@ function assertHttpUrl(raw: string): URL { return url; } -async function fetchWithGuards(rawUrl: string): Promise<{ url: string; body: string }> { - let url = assertHttpUrl(rawUrl).toString(); +/** Ein GET mit gepinnter Auflösung. Weiterleitungen bleiben Sache des Aufrufers. */ +function send(url: URL, signal: AbortSignal): Promise { + const request = url.protocol === "https:" ? httpsRequest : httpRequest; + return new Promise((resolve, reject) => { + const req = request( + url, + { + method: "GET", + lookup: guardedLookup, + signal, + timeout: TIMEOUT_MS, + headers: { + "User-Agent": USER_AGENT, + Accept: "text/html, text/plain, application/xhtml+xml", + "Accept-Encoding": "gzip, deflate, br", + }, + }, + resolve, + ); + req.on("timeout", () => req.destroy(new ToolError("Zeitlimit beim Abruf überschritten"))); + req.on("error", (err) => { + if (err instanceof ToolError) return reject(err); + if (signal.aborted) return reject(new ToolError("Abruf abgebrochen")); + reject(new ToolError(`Abruf fehlgeschlagen: ${url.host}`)); + }); + req.end(); + }); +} + +/** Antwortkörper bis MAX_HTML_BYTES lesen, komprimierte Antworten auspacken. */ +async function readCapped(res: IncomingMessage): Promise { + const encoding = String(res.headers["content-encoding"] ?? "").toLowerCase(); + const stream = + encoding === "gzip" ? res.pipe(createGunzip()) + : encoding === "deflate" ? res.pipe(createInflate()) + : encoding === "br" ? res.pipe(createBrotliDecompress()) + : res; + + const decoder = new TextDecoder(); + let html = ""; + let bytes = 0; + try { + for await (const chunk of stream as AsyncIterable) { + bytes += chunk.byteLength; + html += decoder.decode(chunk, { stream: true }); + if (bytes > MAX_HTML_BYTES) break; + } + } catch { + // Abbruch mitten im Strom: was schon da ist, reicht dem Extraktor meist. + if (!html) throw new ToolError("Antwort konnte nicht gelesen werden"); + } finally { + res.destroy(); + } + return html; +} + +async function fetchWithGuards( + rawUrl: string, + signal: AbortSignal, +): Promise<{ url: string; body: string }> { + let url = assertHttpUrl(rawUrl); for (let hop = 0; hop <= MAX_REDIRECTS; hop++) { - await assertPublicHost(new URL(url).hostname); + await assertPublicHost(url.hostname); - const res = await fetch(url, { - redirect: "manual", - headers: { "User-Agent": USER_AGENT, Accept: "text/html, text/plain, application/xhtml+xml" }, - signal: AbortSignal.timeout(TIMEOUT_MS), - }); + const res = await send(url, signal); + const status = res.statusCode ?? 0; - if (res.status >= 300 && res.status < 400) { - const location = res.headers.get("location"); - if (!location) break; - url = new URL(location, url).toString(); - assertHttpUrl(url); + if (status >= 300 && status < 400) { + const location = res.headers.location; + res.destroy(); + if (!location) throw new ToolError(`Weiterleitung ohne Ziel (HTTP ${status})`); + url = assertHttpUrl(new URL(location, url).toString()); continue; } - if (!res.ok) throw new ToolError(`HTTP ${res.status} für ${url}`); + if (status < 200 || status >= 300) { + res.destroy(); + throw new ToolError(`HTTP ${status} für ${url}`); + } - const type = (res.headers.get("content-type") ?? "").toLowerCase(); - if (!/text\/html|text\/plain|application\/xhtml|application\/json|application\/xml|text\/markdown/.test(type)) { + const type = String(res.headers["content-type"] ?? "").toLowerCase(); + if (!ALLOWED_TYPES.test(type)) { + res.destroy(); throw new ToolError(`Nicht unterstützter Inhaltstyp: ${type || "unbekannt"}`); } - const reader = res.body?.getReader(); - if (!reader) throw new ToolError("Leere Antwort"); - const decoder = new TextDecoder(); - let html = ""; - let bytes = 0; - for (;;) { - const { done, value } = await reader.read(); - if (done) break; - bytes += value.byteLength; - if (bytes > MAX_HTML_BYTES) { - void reader.cancel(); - html += decoder.decode(value, { stream: true }); - break; - } - html += decoder.decode(value, { stream: true }); - } - return { url, body: html }; + return { url: url.toString(), body: await readCapped(res) }; } throw new ToolError(`Zu viele Weiterleitungen (> ${MAX_REDIRECTS})`); } @@ -126,7 +205,10 @@ async function fetchWithGuards(rawUrl: string): Promise<{ url: string; body: str export const readWebpageTool: Tool = { name: "read_webpage", description: - "Liest eine öffentliche Website und gibt den Hauptinhalt als Markdown zurück (Titel, Autor, Text). Nur für öffentliche URLs — lokale/private Adressen werden abgewiesen.", + "Liest eine öffentliche Website und gibt den Hauptinhalt als Markdown zurück (Titel, Autor, Text). Nur für öffentliche URLs — lokale/private Adressen werden abgewiesen. Der Nutzer muss jeden Aufruf freigeben.", + // Der Abruf verlässt den Rechner: die URL selbst ist ein Kanal nach außen. + // Deshalb sieht der Nutzer sie vor dem Aufruf und gibt sie frei. + requiresConfirmation: true, parameters: { type: "object", properties: { @@ -134,11 +216,11 @@ export const readWebpageTool: Tool = { }, required: ["url"], }, - async run(args) { + async run(args, ctx) { const raw = String(args.url ?? "").trim(); if (!raw) throw new ToolError("url fehlt"); - const { url, body } = await fetchWithGuards(raw); + const { url, body } = await fetchWithGuards(raw, ctx.signal); const { document } = parseHTML(body); const result = await Defuddle(document, url, { markdown: true }); diff --git a/web/dist/assets/index-CQxQcFyH.js b/web/dist/assets/index-CQxQcFyH.js deleted file mode 100644 index b167acb..0000000 --- a/web/dist/assets/index-CQxQcFyH.js +++ /dev/null @@ -1,74 +0,0 @@ -var Dh=Object.defineProperty;var Ph=(e,i,r)=>i in e?Dh(e,i,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[i]=r;var Ti=(e,i,r)=>Ph(e,typeof i!="symbol"?i+"":i,r);(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))l(s);new MutationObserver(s=>{for(const c of s)if(c.type==="childList")for(const u of c.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&l(u)}).observe(document,{childList:!0,subtree:!0});function r(s){const c={};return s.integrity&&(c.integrity=s.integrity),s.referrerPolicy&&(c.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?c.credentials="include":s.crossOrigin==="anonymous"?c.credentials="omit":c.credentials="same-origin",c}function l(s){if(s.ep)return;s.ep=!0;const c=r(s);fetch(s.href,c)}})();function Co(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var js={exports:{}},yo={},Gs={exports:{}},Fe={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var ff;function zh(){if(ff)return Fe;ff=1;var e=Symbol.for("react.element"),i=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),c=Symbol.for("react.provider"),u=Symbol.for("react.context"),f=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),m=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),h=Symbol.iterator;function b(R){return R===null||typeof R!="object"?null:(R=h&&R[h]||R["@@iterator"],typeof R=="function"?R:null)}var E={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},w=Object.assign,N={};function O(R,$,k){this.props=R,this.context=$,this.refs=N,this.updater=k||E}O.prototype.isReactComponent={},O.prototype.setState=function(R,$){if(typeof R!="object"&&typeof R!="function"&&R!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,R,$,"setState")},O.prototype.forceUpdate=function(R){this.updater.enqueueForceUpdate(this,R,"forceUpdate")};function S(){}S.prototype=O.prototype;function L(R,$,k){this.props=R,this.context=$,this.refs=N,this.updater=k||E}var P=L.prototype=new S;P.constructor=L,w(P,O.prototype),P.isPureReactComponent=!0;var q=Array.isArray,X=Object.prototype.hasOwnProperty,M={current:null},le={key:!0,ref:!0,__self:!0,__source:!0};function de(R,$,k){var ke,Me={},we=null,$e=null;if($!=null)for(ke in $.ref!==void 0&&($e=$.ref),$.key!==void 0&&(we=""+$.key),$)X.call($,ke)&&!le.hasOwnProperty(ke)&&(Me[ke]=$[ke]);var De=arguments.length-2;if(De===1)Me.children=k;else if(1>>1,$=V[R];if(0>>1;Rs(Me,v))we<$&&0>s($e,Me)?(V[R]=$e,V[we]=v,R=we):(V[R]=Me,V[ke]=v,R=ke);else if(we<$&&0>s($e,v))V[R]=$e,V[we]=v,R=we;else break e}}return ae}function s(V,ae){var v=V.sortIndex-ae.sortIndex;return v!==0?v:V.id-ae.id}if(typeof performance=="object"&&typeof performance.now=="function"){var c=performance;e.unstable_now=function(){return c.now()}}else{var u=Date,f=u.now();e.unstable_now=function(){return u.now()-f}}var p=[],m=[],y=1,h=null,b=3,E=!1,w=!1,N=!1,O=typeof setTimeout=="function"?setTimeout:null,S=typeof clearTimeout=="function"?clearTimeout:null,L=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function P(V){for(var ae=r(m);ae!==null;){if(ae.callback===null)l(m);else if(ae.startTime<=V)l(m),ae.sortIndex=ae.expirationTime,i(p,ae);else break;ae=r(m)}}function q(V){if(N=!1,P(V),!w)if(r(p)!==null)w=!0,se(X);else{var ae=r(m);ae!==null&&z(q,ae.startTime-V)}}function X(V,ae){w=!1,N&&(N=!1,S(de),de=-1),E=!0;var v=b;try{for(P(ae),h=r(p);h!==null&&(!(h.expirationTime>ae)||V&&!j());){var R=h.callback;if(typeof R=="function"){h.callback=null,b=h.priorityLevel;var $=R(h.expirationTime<=ae);ae=e.unstable_now(),typeof $=="function"?h.callback=$:h===r(p)&&l(p),P(ae)}else l(p);h=r(p)}if(h!==null)var k=!0;else{var ke=r(m);ke!==null&&z(q,ke.startTime-ae),k=!1}return k}finally{h=null,b=v,E=!1}}var M=!1,le=null,de=-1,K=5,A=-1;function j(){return!(e.unstable_now()-AV||125R?(V.sortIndex=v,i(m,V),r(p)===null&&V===r(m)&&(N?(S(de),de=-1):N=!0,z(q,v-R))):(V.sortIndex=$,i(p,V),w||E||(w=!0,se(X))),V},e.unstable_shouldYield=j,e.unstable_wrapCallback=function(V){var ae=b;return function(){var v=b;b=ae;try{return V.apply(this,arguments)}finally{b=v}}}})(Vs)),Vs}var yf;function Hh(){return yf||(yf=1,Ws.exports=$h()),Ws.exports}/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var bf;function jh(){if(bf)return Yt;bf=1;var e=Au(),i=Hh();function r(t){for(var n="https://reactjs.org/docs/error-decoder.html?invariant="+t,o=1;o"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),p=Object.prototype.hasOwnProperty,m=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,y={},h={};function b(t){return p.call(h,t)?!0:p.call(y,t)?!1:m.test(t)?h[t]=!0:(y[t]=!0,!1)}function E(t,n,o,a){if(o!==null&&o.type===0)return!1;switch(typeof n){case"function":case"symbol":return!0;case"boolean":return a?!1:o!==null?!o.acceptsBooleans:(t=t.toLowerCase().slice(0,5),t!=="data-"&&t!=="aria-");default:return!1}}function w(t,n,o,a){if(n===null||typeof n>"u"||E(t,n,o,a))return!0;if(a)return!1;if(o!==null)switch(o.type){case 3:return!n;case 4:return n===!1;case 5:return isNaN(n);case 6:return isNaN(n)||1>n}return!1}function N(t,n,o,a,d,g,_){this.acceptsBooleans=n===2||n===3||n===4,this.attributeName=a,this.attributeNamespace=d,this.mustUseProperty=o,this.propertyName=t,this.type=n,this.sanitizeURL=g,this.removeEmptyString=_}var O={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(t){O[t]=new N(t,0,!1,t,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(t){var n=t[0];O[n]=new N(n,1,!1,t[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(t){O[t]=new N(t,2,!1,t.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(t){O[t]=new N(t,2,!1,t,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(t){O[t]=new N(t,3,!1,t.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(t){O[t]=new N(t,3,!0,t,null,!1,!1)}),["capture","download"].forEach(function(t){O[t]=new N(t,4,!1,t,null,!1,!1)}),["cols","rows","size","span"].forEach(function(t){O[t]=new N(t,6,!1,t,null,!1,!1)}),["rowSpan","start"].forEach(function(t){O[t]=new N(t,5,!1,t.toLowerCase(),null,!1,!1)});var S=/[\-:]([a-z])/g;function L(t){return t[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(t){var n=t.replace(S,L);O[n]=new N(n,1,!1,t,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(t){var n=t.replace(S,L);O[n]=new N(n,1,!1,t,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(t){var n=t.replace(S,L);O[n]=new N(n,1,!1,t,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(t){O[t]=new N(t,1,!1,t.toLowerCase(),null,!1,!1)}),O.xlinkHref=new N("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(t){O[t]=new N(t,1,!1,t.toLowerCase(),null,!0,!0)});function P(t,n,o,a){var d=O.hasOwnProperty(n)?O[n]:null;(d!==null?d.type!==0:a||!(2x||d[_]!==g[x]){var C=` -`+d[_].replace(" at new "," at ");return t.displayName&&C.includes("")&&(C=C.replace("",t.displayName)),C}while(1<=_&&0<=x);break}}}finally{k=!1,Error.prepareStackTrace=o}return(t=t?t.displayName||t.name:"")?$(t):""}function Me(t){switch(t.tag){case 5:return $(t.type);case 16:return $("Lazy");case 13:return $("Suspense");case 19:return $("SuspenseList");case 0:case 2:case 15:return t=ke(t.type,!1),t;case 11:return t=ke(t.type.render,!1),t;case 1:return t=ke(t.type,!0),t;default:return""}}function we(t){if(t==null)return null;if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t;switch(t){case le:return"Fragment";case M:return"Portal";case K:return"Profiler";case de:return"StrictMode";case J:return"Suspense";case Q:return"SuspenseList"}if(typeof t=="object")switch(t.$$typeof){case j:return(t.displayName||"Context")+".Consumer";case A:return(t._context.displayName||"Context")+".Provider";case U:var n=t.render;return t=t.displayName,t||(t=n.displayName||n.name||"",t=t!==""?"ForwardRef("+t+")":"ForwardRef"),t;case G:return n=t.displayName||null,n!==null?n:we(t.type)||"Memo";case se:n=t._payload,t=t._init;try{return we(t(n))}catch{}}return null}function $e(t){var n=t.type;switch(t.tag){case 24:return"Cache";case 9:return(n.displayName||"Context")+".Consumer";case 10:return(n._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return t=n.render,t=t.displayName||t.name||"",n.displayName||(t!==""?"ForwardRef("+t+")":"ForwardRef");case 7:return"Fragment";case 5:return n;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return we(n);case 8:return n===de?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof n=="function")return n.displayName||n.name||null;if(typeof n=="string")return n}return null}function De(t){switch(typeof t){case"boolean":case"number":case"string":case"undefined":return t;case"object":return t;default:return""}}function Ge(t){var n=t.type;return(t=t.nodeName)&&t.toLowerCase()==="input"&&(n==="checkbox"||n==="radio")}function Ze(t){var n=Ge(t)?"checked":"value",o=Object.getOwnPropertyDescriptor(t.constructor.prototype,n),a=""+t[n];if(!t.hasOwnProperty(n)&&typeof o<"u"&&typeof o.get=="function"&&typeof o.set=="function"){var d=o.get,g=o.set;return Object.defineProperty(t,n,{configurable:!0,get:function(){return d.call(this)},set:function(_){a=""+_,g.call(this,_)}}),Object.defineProperty(t,n,{enumerable:o.enumerable}),{getValue:function(){return a},setValue:function(_){a=""+_},stopTracking:function(){t._valueTracker=null,delete t[n]}}}}function Zt(t){t._valueTracker||(t._valueTracker=Ze(t))}function rr(t){if(!t)return!1;var n=t._valueTracker;if(!n)return!0;var o=n.getValue(),a="";return t&&(a=Ge(t)?t.checked?"true":"false":t.value),t=a,t!==o?(n.setValue(t),!0):!1}function An(t){if(t=t||(typeof document<"u"?document:void 0),typeof t>"u")return null;try{return t.activeElement||t.body}catch{return t.body}}function Hn(t,n){var o=n.checked;return v({},n,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:o??t._wrapperState.initialChecked})}function jn(t,n){var o=n.defaultValue==null?"":n.defaultValue,a=n.checked!=null?n.checked:n.defaultChecked;o=De(n.value!=null?n.value:o),t._wrapperState={initialChecked:a,initialValue:o,controlled:n.type==="checkbox"||n.type==="radio"?n.checked!=null:n.value!=null}}function Ke(t,n){n=n.checked,n!=null&&P(t,"checked",n,!1)}function Jt(t,n){Ke(t,n);var o=De(n.value),a=n.type;if(o!=null)a==="number"?(o===0&&t.value===""||t.value!=o)&&(t.value=""+o):t.value!==""+o&&(t.value=""+o);else if(a==="submit"||a==="reset"){t.removeAttribute("value");return}n.hasOwnProperty("value")?Rn(t,n.type,o):n.hasOwnProperty("defaultValue")&&Rn(t,n.type,De(n.defaultValue)),n.checked==null&&n.defaultChecked!=null&&(t.defaultChecked=!!n.defaultChecked)}function an(t,n,o){if(n.hasOwnProperty("value")||n.hasOwnProperty("defaultValue")){var a=n.type;if(!(a!=="submit"&&a!=="reset"||n.value!==void 0&&n.value!==null))return;n=""+t._wrapperState.initialValue,o||n===t.value||(t.value=n),t.defaultValue=n}o=t.name,o!==""&&(t.name=""),t.defaultChecked=!!t._wrapperState.initialChecked,o!==""&&(t.name=o)}function Rn(t,n,o){(n!=="number"||An(t.ownerDocument)!==t)&&(o==null?t.defaultValue=""+t._wrapperState.initialValue:t.defaultValue!==""+o&&(t.defaultValue=""+o))}var bn=Array.isArray;function On(t,n,o,a){if(t=t.options,n){n={};for(var d=0;d"+n.valueOf().toString()+"",n=Ce.firstChild;t.firstChild;)t.removeChild(t.firstChild);for(;n.firstChild;)t.appendChild(n.firstChild)}});function He(t,n){if(n){var o=t.firstChild;if(o&&o===t.lastChild&&o.nodeType===3){o.nodeValue=n;return}}t.textContent=n}var _t={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},En=["Webkit","ms","Moz","O"];Object.keys(_t).forEach(function(t){En.forEach(function(n){n=n+t.charAt(0).toUpperCase()+t.substring(1),_t[n]=_t[t]})});function jt(t,n,o){return n==null||typeof n=="boolean"||n===""?"":o||typeof n!="number"||n===0||_t.hasOwnProperty(t)&&_t[t]?(""+n).trim():n+"px"}function _n(t,n){t=t.style;for(var o in n)if(n.hasOwnProperty(o)){var a=o.indexOf("--")===0,d=jt(o,n[o],a);o==="float"&&(o="cssFloat"),a?t.setProperty(o,d):t[o]=d}}var Gn=v({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function vt(t,n){if(n){if(Gn[t]&&(n.children!=null||n.dangerouslySetInnerHTML!=null))throw Error(r(137,t));if(n.dangerouslySetInnerHTML!=null){if(n.children!=null)throw Error(r(60));if(typeof n.dangerouslySetInnerHTML!="object"||!("__html"in n.dangerouslySetInnerHTML))throw Error(r(61))}if(n.style!=null&&typeof n.style!="object")throw Error(r(62))}}function un(t,n){if(t.indexOf("-")===-1)return typeof n.is=="string";switch(t){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ct=null;function ei(t){return t=t.target||t.srcElement||window,t.correspondingUseElement&&(t=t.correspondingUseElement),t.nodeType===3?t.parentNode:t}var ti=null,ir=null,Kn=null;function Wn(t){if(t=to(t)){if(typeof ti!="function")throw Error(r(280));var n=t.stateNode;n&&(n=tl(n),ti(t.stateNode,t.type,n))}}function T(t){ir?Kn?Kn.push(t):Kn=[t]:ir=t}function Y(){if(ir){var t=ir,n=Kn;if(Kn=ir=null,Wn(t),n)for(t=0;t>>=0,t===0?32:31-(Mn(t)/ii|0)|0}var Ft=64,Ir=4194304;function lr(t){switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return t&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return t}}function Mr(t,n){var o=t.pendingLanes;if(o===0)return 0;var a=0,d=t.suspendedLanes,g=t.pingedLanes,_=o&268435455;if(_!==0){var x=_&~d;x!==0?a=lr(x):(g&=_,g!==0&&(a=lr(g)))}else _=o&~d,_!==0?a=lr(_):g!==0&&(a=lr(g));if(a===0)return 0;if(n!==0&&n!==a&&(n&d)===0&&(d=a&-a,g=n&-n,d>=g||d===16&&(g&4194240)!==0))return n;if((a&4)!==0&&(a|=o&16),n=t.entangledLanes,n!==0)for(t=t.entanglements,n&=a;0o;o++)n.push(t);return n}function sr(t,n,o){t.pendingLanes|=n,n!==536870912&&(t.suspendedLanes=0,t.pingedLanes=0),t=t.eventTimes,n=31-ut(n),t[n]=o}function cn(t,n){var o=t.pendingLanes&~n;t.pendingLanes=n,t.suspendedLanes=0,t.pingedLanes=0,t.expiredLanes&=n,t.mutableReadLanes&=n,t.entangledLanes&=n,n=t.entanglements;var a=t.eventTimes;for(t=t.expirationTimes;0=Wi),ic=" ",oc=!1;function lc(t,n){switch(t){case"keyup":return Rg.indexOf(n.keyCode)!==-1;case"keydown":return n.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ac(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var ai=!1;function Ig(t,n){switch(t){case"compositionend":return ac(n);case"keypress":return n.which!==32?null:(oc=!0,ic);case"textInput":return t=n.data,t===ic&&oc?null:t;default:return null}}function Mg(t,n){if(ai)return t==="compositionend"||!wa&&lc(t,n)?(t=Zu(),Go=ya=cr=null,ai=!1,t):null;switch(t){case"paste":return null;case"keypress":if(!(n.ctrlKey||n.altKey||n.metaKey)||n.ctrlKey&&n.altKey){if(n.char&&1=n)return{node:o,offset:n-t};t=a}e:{for(;o;){if(o.nextSibling){o=o.nextSibling;break e}o=o.parentNode}o=void 0}o=mc(o)}}function hc(t,n){return t&&n?t===n?!0:t&&t.nodeType===3?!1:n&&n.nodeType===3?hc(t,n.parentNode):"contains"in t?t.contains(n):t.compareDocumentPosition?!!(t.compareDocumentPosition(n)&16):!1:!1}function yc(){for(var t=window,n=An();n instanceof t.HTMLIFrameElement;){try{var o=typeof n.contentWindow.location.href=="string"}catch{o=!1}if(o)t=n.contentWindow;else break;n=An(t.document)}return n}function Na(t){var n=t&&t.nodeName&&t.nodeName.toLowerCase();return n&&(n==="input"&&(t.type==="text"||t.type==="search"||t.type==="tel"||t.type==="url"||t.type==="password")||n==="textarea"||t.contentEditable==="true")}function Hg(t){var n=yc(),o=t.focusedElem,a=t.selectionRange;if(n!==o&&o&&o.ownerDocument&&hc(o.ownerDocument.documentElement,o)){if(a!==null&&Na(o)){if(n=a.start,t=a.end,t===void 0&&(t=n),"selectionStart"in o)o.selectionStart=n,o.selectionEnd=Math.min(t,o.value.length);else if(t=(n=o.ownerDocument||document)&&n.defaultView||window,t.getSelection){t=t.getSelection();var d=o.textContent.length,g=Math.min(a.start,d);a=a.end===void 0?g:Math.min(a.end,d),!t.extend&&g>a&&(d=a,a=g,g=d),d=gc(o,g);var _=gc(o,a);d&&_&&(t.rangeCount!==1||t.anchorNode!==d.node||t.anchorOffset!==d.offset||t.focusNode!==_.node||t.focusOffset!==_.offset)&&(n=n.createRange(),n.setStart(d.node,d.offset),t.removeAllRanges(),g>a?(t.addRange(n),t.extend(_.node,_.offset)):(n.setEnd(_.node,_.offset),t.addRange(n)))}}for(n=[],t=o;t=t.parentNode;)t.nodeType===1&&n.push({element:t,left:t.scrollLeft,top:t.scrollTop});for(typeof o.focus=="function"&&o.focus(),o=0;o=document.documentMode,si=null,Ta=null,Qi=null,Ca=!1;function bc(t,n,o){var a=o.window===o?o.document:o.nodeType===9?o:o.ownerDocument;Ca||si==null||si!==An(a)||(a=si,"selectionStart"in a&&Na(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),Qi&&Yi(Qi,a)||(Qi=a,a=Zo(Ta,"onSelect"),0pi||(t.current=Ua[pi],Ua[pi]=null,pi--)}function nt(t,n){pi++,Ua[pi]=t.current,t.current=n}var mr={},Ot=pr(mr),Gt=pr(!1),zr=mr;function mi(t,n){var o=t.type.contextTypes;if(!o)return mr;var a=t.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===n)return a.__reactInternalMemoizedMaskedChildContext;var d={},g;for(g in o)d[g]=n[g];return a&&(t=t.stateNode,t.__reactInternalMemoizedUnmaskedChildContext=n,t.__reactInternalMemoizedMaskedChildContext=d),d}function Kt(t){return t=t.childContextTypes,t!=null}function nl(){ot(Gt),ot(Ot)}function Mc(t,n,o){if(Ot.current!==mr)throw Error(r(168));nt(Ot,n),nt(Gt,o)}function Lc(t,n,o){var a=t.stateNode;if(n=n.childContextTypes,typeof a.getChildContext!="function")return o;a=a.getChildContext();for(var d in a)if(!(d in n))throw Error(r(108,$e(t)||"Unknown",d));return v({},o,a)}function rl(t){return t=(t=t.stateNode)&&t.__reactInternalMemoizedMergedChildContext||mr,zr=Ot.current,nt(Ot,t),nt(Gt,Gt.current),!0}function Dc(t,n,o){var a=t.stateNode;if(!a)throw Error(r(169));o?(t=Lc(t,n,zr),a.__reactInternalMemoizedMergedChildContext=t,ot(Gt),ot(Ot),nt(Ot,t)):ot(Gt),nt(Gt,o)}var Yn=null,il=!1,$a=!1;function Pc(t){Yn===null?Yn=[t]:Yn.push(t)}function eh(t){il=!0,Pc(t)}function gr(){if(!$a&&Yn!==null){$a=!0;var t=0,n=Ve;try{var o=Yn;for(Ve=1;t>=_,d-=_,Qn=1<<32-ut(n)+d|o<Oe?(Tt=Ne,Ne=null):Tt=Ne.sibling;var Ye=Z(D,Ne,F[Oe],ie);if(Ye===null){Ne===null&&(Ne=Tt);break}t&&Ne&&Ye.alternate===null&&n(D,Ne),I=g(Ye,I,Oe),Se===null?_e=Ye:Se.sibling=Ye,Se=Ye,Ne=Tt}if(Oe===F.length)return o(D,Ne),at&&Br(D,Oe),_e;if(Ne===null){for(;OeOe?(Tt=Ne,Ne=null):Tt=Ne.sibling;var xr=Z(D,Ne,Ye.value,ie);if(xr===null){Ne===null&&(Ne=Tt);break}t&&Ne&&xr.alternate===null&&n(D,Ne),I=g(xr,I,Oe),Se===null?_e=xr:Se.sibling=xr,Se=xr,Ne=Tt}if(Ye.done)return o(D,Ne),at&&Br(D,Oe),_e;if(Ne===null){for(;!Ye.done;Oe++,Ye=F.next())Ye=te(D,Ye.value,ie),Ye!==null&&(I=g(Ye,I,Oe),Se===null?_e=Ye:Se.sibling=Ye,Se=Ye);return at&&Br(D,Oe),_e}for(Ne=a(D,Ne);!Ye.done;Oe++,Ye=F.next())Ye=pe(Ne,D,Oe,Ye.value,ie),Ye!==null&&(t&&Ye.alternate!==null&&Ne.delete(Ye.key===null?Oe:Ye.key),I=g(Ye,I,Oe),Se===null?_e=Ye:Se.sibling=Ye,Se=Ye);return t&&Ne.forEach(function(Lh){return n(D,Lh)}),at&&Br(D,Oe),_e}function ht(D,I,F,ie){if(typeof F=="object"&&F!==null&&F.type===le&&F.key===null&&(F=F.props.children),typeof F=="object"&&F!==null){switch(F.$$typeof){case X:e:{for(var _e=F.key,Se=I;Se!==null;){if(Se.key===_e){if(_e=F.type,_e===le){if(Se.tag===7){o(D,Se.sibling),I=d(Se,F.props.children),I.return=D,D=I;break e}}else if(Se.elementType===_e||typeof _e=="object"&&_e!==null&&_e.$$typeof===se&&Hc(_e)===Se.type){o(D,Se.sibling),I=d(Se,F.props),I.ref=no(D,Se,F),I.return=D,D=I;break e}o(D,Se);break}else n(D,Se);Se=Se.sibling}F.type===le?(I=Vr(F.props.children,D.mode,ie,F.key),I.return=D,D=I):(ie=Il(F.type,F.key,F.props,null,D.mode,ie),ie.ref=no(D,I,F),ie.return=D,D=ie)}return _(D);case M:e:{for(Se=F.key;I!==null;){if(I.key===Se)if(I.tag===4&&I.stateNode.containerInfo===F.containerInfo&&I.stateNode.implementation===F.implementation){o(D,I.sibling),I=d(I,F.children||[]),I.return=D,D=I;break e}else{o(D,I);break}else n(D,I);I=I.sibling}I=Fs(F,D.mode,ie),I.return=D,D=I}return _(D);case se:return Se=F._init,ht(D,I,Se(F._payload),ie)}if(bn(F))return be(D,I,F,ie);if(ae(F))return Ee(D,I,F,ie);sl(D,F)}return typeof F=="string"&&F!==""||typeof F=="number"?(F=""+F,I!==null&&I.tag===6?(o(D,I.sibling),I=d(I,F),I.return=D,D=I):(o(D,I),I=zs(F,D.mode,ie),I.return=D,D=I),_(D)):o(D,I)}return ht}var bi=jc(!0),Gc=jc(!1),ul=pr(null),cl=null,Ei=null,Va=null;function qa(){Va=Ei=cl=null}function Ya(t){var n=ul.current;ot(ul),t._currentValue=n}function Qa(t,n,o){for(;t!==null;){var a=t.alternate;if((t.childLanes&n)!==n?(t.childLanes|=n,a!==null&&(a.childLanes|=n)):a!==null&&(a.childLanes&n)!==n&&(a.childLanes|=n),t===o)break;t=t.return}}function _i(t,n){cl=t,Va=Ei=null,t=t.dependencies,t!==null&&t.firstContext!==null&&((t.lanes&n)!==0&&(Wt=!0),t.firstContext=null)}function pn(t){var n=t._currentValue;if(Va!==t)if(t={context:t,memoizedValue:n,next:null},Ei===null){if(cl===null)throw Error(r(308));Ei=t,cl.dependencies={lanes:0,firstContext:t}}else Ei=Ei.next=t;return n}var Ur=null;function Xa(t){Ur===null?Ur=[t]:Ur.push(t)}function Kc(t,n,o,a){var d=n.interleaved;return d===null?(o.next=o,Xa(n)):(o.next=d.next,d.next=o),n.interleaved=o,Zn(t,a)}function Zn(t,n){t.lanes|=n;var o=t.alternate;for(o!==null&&(o.lanes|=n),o=t,t=t.return;t!==null;)t.childLanes|=n,o=t.alternate,o!==null&&(o.childLanes|=n),o=t,t=t.return;return o.tag===3?o.stateNode:null}var hr=!1;function Za(t){t.updateQueue={baseState:t.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Wc(t,n){t=t.updateQueue,n.updateQueue===t&&(n.updateQueue={baseState:t.baseState,firstBaseUpdate:t.firstBaseUpdate,lastBaseUpdate:t.lastBaseUpdate,shared:t.shared,effects:t.effects})}function Jn(t,n){return{eventTime:t,lane:n,tag:0,payload:null,callback:null,next:null}}function yr(t,n,o){var a=t.updateQueue;if(a===null)return null;if(a=a.shared,(qe&2)!==0){var d=a.pending;return d===null?n.next=n:(n.next=d.next,d.next=n),a.pending=n,Zn(t,o)}return d=a.interleaved,d===null?(n.next=n,Xa(a)):(n.next=d.next,d.next=n),a.interleaved=n,Zn(t,o)}function dl(t,n,o){if(n=n.updateQueue,n!==null&&(n=n.shared,(o&4194240)!==0)){var a=n.lanes;a&=t.pendingLanes,o|=a,n.lanes=o,Bi(t,o)}}function Vc(t,n){var o=t.updateQueue,a=t.alternate;if(a!==null&&(a=a.updateQueue,o===a)){var d=null,g=null;if(o=o.firstBaseUpdate,o!==null){do{var _={eventTime:o.eventTime,lane:o.lane,tag:o.tag,payload:o.payload,callback:o.callback,next:null};g===null?d=g=_:g=g.next=_,o=o.next}while(o!==null);g===null?d=g=n:g=g.next=n}else d=g=n;o={baseState:a.baseState,firstBaseUpdate:d,lastBaseUpdate:g,shared:a.shared,effects:a.effects},t.updateQueue=o;return}t=o.lastBaseUpdate,t===null?o.firstBaseUpdate=n:t.next=n,o.lastBaseUpdate=n}function fl(t,n,o,a){var d=t.updateQueue;hr=!1;var g=d.firstBaseUpdate,_=d.lastBaseUpdate,x=d.shared.pending;if(x!==null){d.shared.pending=null;var C=x,B=C.next;C.next=null,_===null?g=B:_.next=B,_=C;var ee=t.alternate;ee!==null&&(ee=ee.updateQueue,x=ee.lastBaseUpdate,x!==_&&(x===null?ee.firstBaseUpdate=B:x.next=B,ee.lastBaseUpdate=C))}if(g!==null){var te=d.baseState;_=0,ee=B=C=null,x=g;do{var Z=x.lane,pe=x.eventTime;if((a&Z)===Z){ee!==null&&(ee=ee.next={eventTime:pe,lane:0,tag:x.tag,payload:x.payload,callback:x.callback,next:null});e:{var be=t,Ee=x;switch(Z=n,pe=o,Ee.tag){case 1:if(be=Ee.payload,typeof be=="function"){te=be.call(pe,te,Z);break e}te=be;break e;case 3:be.flags=be.flags&-65537|128;case 0:if(be=Ee.payload,Z=typeof be=="function"?be.call(pe,te,Z):be,Z==null)break e;te=v({},te,Z);break e;case 2:hr=!0}}x.callback!==null&&x.lane!==0&&(t.flags|=64,Z=d.effects,Z===null?d.effects=[x]:Z.push(x))}else pe={eventTime:pe,lane:Z,tag:x.tag,payload:x.payload,callback:x.callback,next:null},ee===null?(B=ee=pe,C=te):ee=ee.next=pe,_|=Z;if(x=x.next,x===null){if(x=d.shared.pending,x===null)break;Z=x,x=Z.next,Z.next=null,d.lastBaseUpdate=Z,d.shared.pending=null}}while(!0);if(ee===null&&(C=te),d.baseState=C,d.firstBaseUpdate=B,d.lastBaseUpdate=ee,n=d.shared.interleaved,n!==null){d=n;do _|=d.lane,d=d.next;while(d!==n)}else g===null&&(d.shared.lanes=0);jr|=_,t.lanes=_,t.memoizedState=te}}function qc(t,n,o){if(t=n.effects,n.effects=null,t!==null)for(n=0;no?o:4,t(!0);var a=rs.transition;rs.transition={};try{t(!1),n()}finally{Ve=o,rs.transition=a}}function pd(){return mn().memoizedState}function ih(t,n,o){var a=vr(t);if(o={lane:a,action:o,hasEagerState:!1,eagerState:null,next:null},md(t))gd(n,o);else if(o=Kc(t,n,o,a),o!==null){var d=Ut();Tn(o,t,a,d),hd(o,n,a)}}function oh(t,n,o){var a=vr(t),d={lane:a,action:o,hasEagerState:!1,eagerState:null,next:null};if(md(t))gd(n,d);else{var g=t.alternate;if(t.lanes===0&&(g===null||g.lanes===0)&&(g=n.lastRenderedReducer,g!==null))try{var _=n.lastRenderedState,x=g(_,o);if(d.hasEagerState=!0,d.eagerState=x,kn(x,_)){var C=n.interleaved;C===null?(d.next=d,Xa(n)):(d.next=C.next,C.next=d),n.interleaved=d;return}}catch{}finally{}o=Kc(t,n,d,a),o!==null&&(d=Ut(),Tn(o,t,a,d),hd(o,n,a))}}function md(t){var n=t.alternate;return t===dt||n!==null&&n===dt}function gd(t,n){lo=gl=!0;var o=t.pending;o===null?n.next=n:(n.next=o.next,o.next=n),t.pending=n}function hd(t,n,o){if((o&4194240)!==0){var a=n.lanes;a&=t.pendingLanes,o|=a,n.lanes=o,Bi(t,o)}}var bl={readContext:pn,useCallback:It,useContext:It,useEffect:It,useImperativeHandle:It,useInsertionEffect:It,useLayoutEffect:It,useMemo:It,useReducer:It,useRef:It,useState:It,useDebugValue:It,useDeferredValue:It,useTransition:It,useMutableSource:It,useSyncExternalStore:It,useId:It,unstable_isNewReconciler:!1},lh={readContext:pn,useCallback:function(t,n){return zn().memoizedState=[t,n===void 0?null:n],t},useContext:pn,useEffect:od,useImperativeHandle:function(t,n,o){return o=o!=null?o.concat([t]):null,hl(4194308,4,sd.bind(null,n,t),o)},useLayoutEffect:function(t,n){return hl(4194308,4,t,n)},useInsertionEffect:function(t,n){return hl(4,2,t,n)},useMemo:function(t,n){var o=zn();return n=n===void 0?null:n,t=t(),o.memoizedState=[t,n],t},useReducer:function(t,n,o){var a=zn();return n=o!==void 0?o(n):n,a.memoizedState=a.baseState=n,t={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:t,lastRenderedState:n},a.queue=t,t=t.dispatch=ih.bind(null,dt,t),[a.memoizedState,t]},useRef:function(t){var n=zn();return t={current:t},n.memoizedState=t},useState:rd,useDebugValue:cs,useDeferredValue:function(t){return zn().memoizedState=t},useTransition:function(){var t=rd(!1),n=t[0];return t=rh.bind(null,t[1]),zn().memoizedState=t,[n,t]},useMutableSource:function(){},useSyncExternalStore:function(t,n,o){var a=dt,d=zn();if(at){if(o===void 0)throw Error(r(407));o=o()}else{if(o=n(),Nt===null)throw Error(r(349));(Hr&30)!==0||Zc(a,n,o)}d.memoizedState=o;var g={value:o,getSnapshot:n};return d.queue=g,od(ed.bind(null,a,g,t),[t]),a.flags|=2048,uo(9,Jc.bind(null,a,g,o,n),void 0,null),o},useId:function(){var t=zn(),n=Nt.identifierPrefix;if(at){var o=Xn,a=Qn;o=(a&~(1<<32-ut(a)-1)).toString(32)+o,n=":"+n+"R"+o,o=ao++,0<\/script>",t=t.removeChild(t.firstChild)):typeof a.is=="string"?t=_.createElement(o,{is:a.is}):(t=_.createElement(o),o==="select"&&(_=t,a.multiple?_.multiple=!0:a.size&&(_.size=a.size))):t=_.createElementNS(t,o),t[Dn]=n,t[eo]=a,Pd(t,n,!1,!1),n.stateNode=t;e:{switch(_=un(o,a),o){case"dialog":it("cancel",t),it("close",t),d=a;break;case"iframe":case"object":case"embed":it("load",t),d=a;break;case"video":case"audio":for(d=0;dSi&&(n.flags|=128,a=!0,co(g,!1),n.lanes=4194304)}else{if(!a)if(t=pl(_),t!==null){if(n.flags|=128,a=!0,o=t.updateQueue,o!==null&&(n.updateQueue=o,n.flags|=4),co(g,!0),g.tail===null&&g.tailMode==="hidden"&&!_.alternate&&!at)return Mt(n),null}else 2*st()-g.renderingStartTime>Si&&o!==1073741824&&(n.flags|=128,a=!0,co(g,!1),n.lanes=4194304);g.isBackwards?(_.sibling=n.child,n.child=_):(o=g.last,o!==null?o.sibling=_:n.child=_,g.last=_)}return g.tail!==null?(n=g.tail,g.rendering=n,g.tail=n.sibling,g.renderingStartTime=st(),n.sibling=null,o=ct.current,nt(ct,a?o&1|2:o&1),n):(Mt(n),null);case 22:case 23:return Ls(),a=n.memoizedState!==null,t!==null&&t.memoizedState!==null!==a&&(n.flags|=8192),a&&(n.mode&1)!==0?(rn&1073741824)!==0&&(Mt(n),n.subtreeFlags&6&&(n.flags|=8192)):Mt(n),null;case 24:return null;case 25:return null}throw Error(r(156,n.tag))}function mh(t,n){switch(ja(n),n.tag){case 1:return Kt(n.type)&&nl(),t=n.flags,t&65536?(n.flags=t&-65537|128,n):null;case 3:return vi(),ot(Gt),ot(Ot),ns(),t=n.flags,(t&65536)!==0&&(t&128)===0?(n.flags=t&-65537|128,n):null;case 5:return es(n),null;case 13:if(ot(ct),t=n.memoizedState,t!==null&&t.dehydrated!==null){if(n.alternate===null)throw Error(r(340));yi()}return t=n.flags,t&65536?(n.flags=t&-65537|128,n):null;case 19:return ot(ct),null;case 4:return vi(),null;case 10:return Ya(n.type._context),null;case 22:case 23:return Ls(),null;case 24:return null;default:return null}}var kl=!1,Lt=!1,gh=typeof WeakSet=="function"?WeakSet:Set,ye=null;function wi(t,n){var o=t.ref;if(o!==null)if(typeof o=="function")try{o(null)}catch(a){pt(t,n,a)}else o.current=null}function ks(t,n,o){try{o()}catch(a){pt(t,n,a)}}var Bd=!1;function hh(t,n){if(La=Ho,t=yc(),Na(t)){if("selectionStart"in t)var o={start:t.selectionStart,end:t.selectionEnd};else e:{o=(o=t.ownerDocument)&&o.defaultView||window;var a=o.getSelection&&o.getSelection();if(a&&a.rangeCount!==0){o=a.anchorNode;var d=a.anchorOffset,g=a.focusNode;a=a.focusOffset;try{o.nodeType,g.nodeType}catch{o=null;break e}var _=0,x=-1,C=-1,B=0,ee=0,te=t,Z=null;t:for(;;){for(var pe;te!==o||d!==0&&te.nodeType!==3||(x=_+d),te!==g||a!==0&&te.nodeType!==3||(C=_+a),te.nodeType===3&&(_+=te.nodeValue.length),(pe=te.firstChild)!==null;)Z=te,te=pe;for(;;){if(te===t)break t;if(Z===o&&++B===d&&(x=_),Z===g&&++ee===a&&(C=_),(pe=te.nextSibling)!==null)break;te=Z,Z=te.parentNode}te=pe}o=x===-1||C===-1?null:{start:x,end:C}}else o=null}o=o||{start:0,end:0}}else o=null;for(Da={focusedElem:t,selectionRange:o},Ho=!1,ye=n;ye!==null;)if(n=ye,t=n.child,(n.subtreeFlags&1028)!==0&&t!==null)t.return=n,ye=t;else for(;ye!==null;){n=ye;try{var be=n.alternate;if((n.flags&1024)!==0)switch(n.tag){case 0:case 11:case 15:break;case 1:if(be!==null){var Ee=be.memoizedProps,ht=be.memoizedState,D=n.stateNode,I=D.getSnapshotBeforeUpdate(n.elementType===n.type?Ee:xn(n.type,Ee),ht);D.__reactInternalSnapshotBeforeUpdate=I}break;case 3:var F=n.stateNode.containerInfo;F.nodeType===1?F.textContent="":F.nodeType===9&&F.documentElement&&F.removeChild(F.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(ie){pt(n,n.return,ie)}if(t=n.sibling,t!==null){t.return=n.return,ye=t;break}ye=n.return}return be=Bd,Bd=!1,be}function fo(t,n,o){var a=n.updateQueue;if(a=a!==null?a.lastEffect:null,a!==null){var d=a=a.next;do{if((d.tag&t)===t){var g=d.destroy;d.destroy=void 0,g!==void 0&&ks(n,o,g)}d=d.next}while(d!==a)}}function wl(t,n){if(n=n.updateQueue,n=n!==null?n.lastEffect:null,n!==null){var o=n=n.next;do{if((o.tag&t)===t){var a=o.create;o.destroy=a()}o=o.next}while(o!==n)}}function ws(t){var n=t.ref;if(n!==null){var o=t.stateNode;switch(t.tag){case 5:t=o;break;default:t=o}typeof n=="function"?n(t):n.current=t}}function Ud(t){var n=t.alternate;n!==null&&(t.alternate=null,Ud(n)),t.child=null,t.deletions=null,t.sibling=null,t.tag===5&&(n=t.stateNode,n!==null&&(delete n[Dn],delete n[eo],delete n[Ba],delete n[Zg],delete n[Jg])),t.stateNode=null,t.return=null,t.dependencies=null,t.memoizedProps=null,t.memoizedState=null,t.pendingProps=null,t.stateNode=null,t.updateQueue=null}function $d(t){return t.tag===5||t.tag===3||t.tag===4}function Hd(t){e:for(;;){for(;t.sibling===null;){if(t.return===null||$d(t.return))return null;t=t.return}for(t.sibling.return=t.return,t=t.sibling;t.tag!==5&&t.tag!==6&&t.tag!==18;){if(t.flags&2||t.child===null||t.tag===4)continue e;t.child.return=t,t=t.child}if(!(t.flags&2))return t.stateNode}}function xs(t,n,o){var a=t.tag;if(a===5||a===6)t=t.stateNode,n?o.nodeType===8?o.parentNode.insertBefore(t,n):o.insertBefore(t,n):(o.nodeType===8?(n=o.parentNode,n.insertBefore(t,o)):(n=o,n.appendChild(t)),o=o._reactRootContainer,o!=null||n.onclick!==null||(n.onclick=el));else if(a!==4&&(t=t.child,t!==null))for(xs(t,n,o),t=t.sibling;t!==null;)xs(t,n,o),t=t.sibling}function Ss(t,n,o){var a=t.tag;if(a===5||a===6)t=t.stateNode,n?o.insertBefore(t,n):o.appendChild(t);else if(a!==4&&(t=t.child,t!==null))for(Ss(t,n,o),t=t.sibling;t!==null;)Ss(t,n,o),t=t.sibling}var At=null,Sn=!1;function br(t,n,o){for(o=o.child;o!==null;)jd(t,n,o),o=o.sibling}function jd(t,n,o){if(Be&&typeof Be.onCommitFiberUnmount=="function")try{Be.onCommitFiberUnmount(ze,o)}catch{}switch(o.tag){case 5:Lt||wi(o,n);case 6:var a=At,d=Sn;At=null,br(t,n,o),At=a,Sn=d,At!==null&&(Sn?(t=At,o=o.stateNode,t.nodeType===8?t.parentNode.removeChild(o):t.removeChild(o)):At.removeChild(o.stateNode));break;case 18:At!==null&&(Sn?(t=At,o=o.stateNode,t.nodeType===8?Fa(t.parentNode,o):t.nodeType===1&&Fa(t,o),ji(t)):Fa(At,o.stateNode));break;case 4:a=At,d=Sn,At=o.stateNode.containerInfo,Sn=!0,br(t,n,o),At=a,Sn=d;break;case 0:case 11:case 14:case 15:if(!Lt&&(a=o.updateQueue,a!==null&&(a=a.lastEffect,a!==null))){d=a=a.next;do{var g=d,_=g.destroy;g=g.tag,_!==void 0&&((g&2)!==0||(g&4)!==0)&&ks(o,n,_),d=d.next}while(d!==a)}br(t,n,o);break;case 1:if(!Lt&&(wi(o,n),a=o.stateNode,typeof a.componentWillUnmount=="function"))try{a.props=o.memoizedProps,a.state=o.memoizedState,a.componentWillUnmount()}catch(x){pt(o,n,x)}br(t,n,o);break;case 21:br(t,n,o);break;case 22:o.mode&1?(Lt=(a=Lt)||o.memoizedState!==null,br(t,n,o),Lt=a):br(t,n,o);break;default:br(t,n,o)}}function Gd(t){var n=t.updateQueue;if(n!==null){t.updateQueue=null;var o=t.stateNode;o===null&&(o=t.stateNode=new gh),n.forEach(function(a){var d=Sh.bind(null,t,a);o.has(a)||(o.add(a),a.then(d,d))})}}function Nn(t,n){var o=n.deletions;if(o!==null)for(var a=0;ad&&(d=_),a&=~g}if(a=d,a=st()-a,a=(120>a?120:480>a?480:1080>a?1080:1920>a?1920:3e3>a?3e3:4320>a?4320:1960*bh(a/1960))-a,10t?16:t,_r===null)var a=!1;else{if(t=_r,_r=null,Cl=0,(qe&6)!==0)throw Error(r(331));var d=qe;for(qe|=4,ye=t.current;ye!==null;){var g=ye,_=g.child;if((ye.flags&16)!==0){var x=g.deletions;if(x!==null){for(var C=0;Cst()-Cs?Kr(t,0):Ts|=o),qt(t,n)}function rf(t,n){n===0&&((t.mode&1)===0?n=1:(n=Ir,Ir<<=1,(Ir&130023424)===0&&(Ir=4194304)));var o=Ut();t=Zn(t,n),t!==null&&(sr(t,n,o),qt(t,o))}function xh(t){var n=t.memoizedState,o=0;n!==null&&(o=n.retryLane),rf(t,o)}function Sh(t,n){var o=0;switch(t.tag){case 13:var a=t.stateNode,d=t.memoizedState;d!==null&&(o=d.retryLane);break;case 19:a=t.stateNode;break;default:throw Error(r(314))}a!==null&&a.delete(n),rf(t,o)}var of;of=function(t,n,o){if(t!==null)if(t.memoizedProps!==n.pendingProps||Gt.current)Wt=!0;else{if((t.lanes&o)===0&&(n.flags&128)===0)return Wt=!1,fh(t,n,o);Wt=(t.flags&131072)!==0}else Wt=!1,at&&(n.flags&1048576)!==0&&zc(n,ll,n.index);switch(n.lanes=0,n.tag){case 2:var a=n.type;vl(t,n),t=n.pendingProps;var d=mi(n,Ot.current);_i(n,o),d=os(null,n,a,t,d,o);var g=ls();return n.flags|=1,typeof d=="object"&&d!==null&&typeof d.render=="function"&&d.$$typeof===void 0?(n.tag=1,n.memoizedState=null,n.updateQueue=null,Kt(a)?(g=!0,rl(n)):g=!1,n.memoizedState=d.state!==null&&d.state!==void 0?d.state:null,Za(n),d.updater=El,n.stateNode=d,d._reactInternals=n,fs(n,a,t,o),n=hs(null,n,a,!0,g,o)):(n.tag=0,at&&g&&Ha(n),Bt(null,n,d,o),n=n.child),n;case 16:a=n.elementType;e:{switch(vl(t,n),t=n.pendingProps,d=a._init,a=d(a._payload),n.type=a,d=n.tag=Th(a),t=xn(a,t),d){case 0:n=gs(null,n,a,t,o);break e;case 1:n=Rd(null,n,a,t,o);break e;case 11:n=Sd(null,n,a,t,o);break e;case 14:n=Nd(null,n,a,xn(a.type,t),o);break e}throw Error(r(306,a,""))}return n;case 0:return a=n.type,d=n.pendingProps,d=n.elementType===a?d:xn(a,d),gs(t,n,a,d,o);case 1:return a=n.type,d=n.pendingProps,d=n.elementType===a?d:xn(a,d),Rd(t,n,a,d,o);case 3:e:{if(Od(n),t===null)throw Error(r(387));a=n.pendingProps,g=n.memoizedState,d=g.element,Wc(t,n),fl(n,a,null,o);var _=n.memoizedState;if(a=_.element,g.isDehydrated)if(g={element:a,isDehydrated:!1,cache:_.cache,pendingSuspenseBoundaries:_.pendingSuspenseBoundaries,transitions:_.transitions},n.updateQueue.baseState=g,n.memoizedState=g,n.flags&256){d=ki(Error(r(423)),n),n=Id(t,n,a,o,d);break e}else if(a!==d){d=ki(Error(r(424)),n),n=Id(t,n,a,o,d);break e}else for(nn=fr(n.stateNode.containerInfo.firstChild),tn=n,at=!0,wn=null,o=Gc(n,null,a,o),n.child=o;o;)o.flags=o.flags&-3|4096,o=o.sibling;else{if(yi(),a===d){n=er(t,n,o);break e}Bt(t,n,a,o)}n=n.child}return n;case 5:return Yc(n),t===null&&Ka(n),a=n.type,d=n.pendingProps,g=t!==null?t.memoizedProps:null,_=d.children,Pa(a,d)?_=null:g!==null&&Pa(a,g)&&(n.flags|=32),Ad(t,n),Bt(t,n,_,o),n.child;case 6:return t===null&&Ka(n),null;case 13:return Md(t,n,o);case 4:return Ja(n,n.stateNode.containerInfo),a=n.pendingProps,t===null?n.child=bi(n,null,a,o):Bt(t,n,a,o),n.child;case 11:return a=n.type,d=n.pendingProps,d=n.elementType===a?d:xn(a,d),Sd(t,n,a,d,o);case 7:return Bt(t,n,n.pendingProps,o),n.child;case 8:return Bt(t,n,n.pendingProps.children,o),n.child;case 12:return Bt(t,n,n.pendingProps.children,o),n.child;case 10:e:{if(a=n.type._context,d=n.pendingProps,g=n.memoizedProps,_=d.value,nt(ul,a._currentValue),a._currentValue=_,g!==null)if(kn(g.value,_)){if(g.children===d.children&&!Gt.current){n=er(t,n,o);break e}}else for(g=n.child,g!==null&&(g.return=n);g!==null;){var x=g.dependencies;if(x!==null){_=g.child;for(var C=x.firstContext;C!==null;){if(C.context===a){if(g.tag===1){C=Jn(-1,o&-o),C.tag=2;var B=g.updateQueue;if(B!==null){B=B.shared;var ee=B.pending;ee===null?C.next=C:(C.next=ee.next,ee.next=C),B.pending=C}}g.lanes|=o,C=g.alternate,C!==null&&(C.lanes|=o),Qa(g.return,o,n),x.lanes|=o;break}C=C.next}}else if(g.tag===10)_=g.type===n.type?null:g.child;else if(g.tag===18){if(_=g.return,_===null)throw Error(r(341));_.lanes|=o,x=_.alternate,x!==null&&(x.lanes|=o),Qa(_,o,n),_=g.sibling}else _=g.child;if(_!==null)_.return=g;else for(_=g;_!==null;){if(_===n){_=null;break}if(g=_.sibling,g!==null){g.return=_.return,_=g;break}_=_.return}g=_}Bt(t,n,d.children,o),n=n.child}return n;case 9:return d=n.type,a=n.pendingProps.children,_i(n,o),d=pn(d),a=a(d),n.flags|=1,Bt(t,n,a,o),n.child;case 14:return a=n.type,d=xn(a,n.pendingProps),d=xn(a.type,d),Nd(t,n,a,d,o);case 15:return Td(t,n,n.type,n.pendingProps,o);case 17:return a=n.type,d=n.pendingProps,d=n.elementType===a?d:xn(a,d),vl(t,n),n.tag=1,Kt(a)?(t=!0,rl(n)):t=!1,_i(n,o),bd(n,a,d),fs(n,a,d,o),hs(null,n,a,!0,t,o);case 19:return Dd(t,n,o);case 22:return Cd(t,n,o)}throw Error(r(156,n.tag))};function lf(t,n){return Po(t,n)}function Nh(t,n,o,a){this.tag=t,this.key=o,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=n,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=a,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function hn(t,n,o,a){return new Nh(t,n,o,a)}function Ps(t){return t=t.prototype,!(!t||!t.isReactComponent)}function Th(t){if(typeof t=="function")return Ps(t)?1:0;if(t!=null){if(t=t.$$typeof,t===U)return 11;if(t===G)return 14}return 2}function wr(t,n){var o=t.alternate;return o===null?(o=hn(t.tag,n,t.key,t.mode),o.elementType=t.elementType,o.type=t.type,o.stateNode=t.stateNode,o.alternate=t,t.alternate=o):(o.pendingProps=n,o.type=t.type,o.flags=0,o.subtreeFlags=0,o.deletions=null),o.flags=t.flags&14680064,o.childLanes=t.childLanes,o.lanes=t.lanes,o.child=t.child,o.memoizedProps=t.memoizedProps,o.memoizedState=t.memoizedState,o.updateQueue=t.updateQueue,n=t.dependencies,o.dependencies=n===null?null:{lanes:n.lanes,firstContext:n.firstContext},o.sibling=t.sibling,o.index=t.index,o.ref=t.ref,o}function Il(t,n,o,a,d,g){var _=2;if(a=t,typeof t=="function")Ps(t)&&(_=1);else if(typeof t=="string")_=5;else e:switch(t){case le:return Vr(o.children,d,g,n);case de:_=8,d|=8;break;case K:return t=hn(12,o,n,d|2),t.elementType=K,t.lanes=g,t;case J:return t=hn(13,o,n,d),t.elementType=J,t.lanes=g,t;case Q:return t=hn(19,o,n,d),t.elementType=Q,t.lanes=g,t;case z:return Ml(o,d,g,n);default:if(typeof t=="object"&&t!==null)switch(t.$$typeof){case A:_=10;break e;case j:_=9;break e;case U:_=11;break e;case G:_=14;break e;case se:_=16,a=null;break e}throw Error(r(130,t==null?t:typeof t,""))}return n=hn(_,o,n,d),n.elementType=t,n.type=a,n.lanes=g,n}function Vr(t,n,o,a){return t=hn(7,t,a,n),t.lanes=o,t}function Ml(t,n,o,a){return t=hn(22,t,a,n),t.elementType=z,t.lanes=o,t.stateNode={isHidden:!1},t}function zs(t,n,o){return t=hn(6,t,null,n),t.lanes=o,t}function Fs(t,n,o){return n=hn(4,t.children!==null?t.children:[],t.key,n),n.lanes=o,n.stateNode={containerInfo:t.containerInfo,pendingChildren:null,implementation:t.implementation},n}function Ch(t,n,o,a,d){this.tag=n,this.containerInfo=t,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=ar(0),this.expirationTimes=ar(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=ar(0),this.identifierPrefix=a,this.onRecoverableError=d,this.mutableSourceEagerHydrationData=null}function Bs(t,n,o,a,d,g,_,x,C){return t=new Ch(t,n,o,x,C),n===1?(n=1,g===!0&&(n|=8)):n=0,g=hn(3,null,null,n),t.current=g,g.stateNode=t,g.memoizedState={element:a,isDehydrated:o,cache:null,transitions:null,pendingSuspenseBoundaries:null},Za(g),t}function Ah(t,n,o){var a=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(i){console.error(i)}}return e(),Ks.exports=jh(),Ks.exports}var _f;function Kh(){if(_f)return Ul;_f=1;var e=Gh();return Ul.createRoot=e.createRoot,Ul.hydrateRoot=e.hydrateRoot,Ul}var Wh=Kh();const Vh=Co(Wh);class qh{constructor(){Ti(this,"ws",null);Ti(this,"handlers",new Set);Ti(this,"queue",[]);Ti(this,"closedByUser",!1);Ti(this,"onStatus")}connect(){var l;this.closedByUser=!1,(l=this.onStatus)==null||l.call(this,"connecting");const i=location.protocol==="https:"?"wss:":"ws:",r=new WebSocket(`${i}//${location.host}/ws`);r.onopen=()=>{var s;(s=this.onStatus)==null||s.call(this,"open");for(const c of this.queue)r.send(c);this.queue=[]},r.onmessage=s=>{try{const c=JSON.parse(s.data);for(const u of this.handlers)u(c)}catch{}},r.onclose=()=>{var s;(s=this.onStatus)==null||s.call(this,"closed"),this.closedByUser||setTimeout(()=>this.connect(),1500)},this.ws=r}send(i){var l;const r=JSON.stringify(i);((l=this.ws)==null?void 0:l.readyState)===WebSocket.OPEN?this.ws.send(r):this.queue.push(r)}close(){var i;this.closedByUser=!0,(i=this.ws)==null||i.close()}subscribe(i){return this.handlers.add(i),()=>this.handlers.delete(i)}}const Rp="oxagenttwo.options",vf="oxagenttwo.session",kf="oxagenttwo.systemPrompt";function Yh(){const e={model:"qwen3.5:latest",think:!0,tools:!0,temperature:.7,numPredict:2048,provider:"ollama",openrouterModel:"anthropic/claude-sonnet-4.5",memorySteps:10,memoryAnchors:!0,dreamAuto:!0};try{const i=localStorage.getItem(Rp);if(i)return{...e,...JSON.parse(i)}}catch{}return e}function Qh(){const e=ce.useRef(null),[i,r]=ce.useState("connecting"),[l,s]=ce.useState([]),[c,u]=ce.useState(()=>localStorage.getItem(vf)),[f,p]=ce.useState([]),[m,y]=ce.useState(!1),[h,b]=ce.useState({}),[E,w]=ce.useState(Yh),[N,O]=ce.useState(()=>localStorage.getItem(kf)??""),[S,L]=ce.useState(null),P=ce.useRef(!1);ce.useEffect(()=>{const j=new qh;e.current=j,j.onStatus=r;const U=j.subscribe(J=>{const Q=J.type;if(Q==="user-message"){const G=J.message;p(se=>se.some(z=>z.id===G.id)?se:[...se,G]),u(se=>se===G.session_id?se:G.session_id)}else if(Q==="assistant-start"){const G=J.message;p(se=>[...se,{...G,content:"",thinking:""}])}else if(Q==="thinking"){const G=J.text;p(se=>se.map(z=>z.id===J.messageId?{...z,thinking:(z.thinking??"")+G}:z))}else if(Q==="token"){const G=J.text;p(se=>se.map(z=>z.id===J.messageId?{...z,content:z.content+G}:z))}else Q==="tool-call"?b(G=>({...G,[J.messageId]:[...G[J.messageId]??[],{name:J.name,args:J.args}]})):Q==="tool-result"?b(G=>{const se=G[J.messageId]??[],z=[...se].reverse().findIndex(v=>v.name===J.name&&v.ok===void 0);if(z===-1)return G;const V=se.length-1-z,ae=se.map((v,R)=>R===V?{...v,ok:J.ok,durationMs:J.durationMs}:v);return{...G,[J.messageId]:ae}}):Q==="done"||Q==="error"?(P.current=!1,y(!1)):(Q==="sessions-changed"||Q==="session-deleted")&&q()});return j.connect(),()=>{U(),j.close()}},[]);const q=ce.useCallback(async()=>{const U=await(await fetch("/api/sessions")).json();s(U),u(J=>{var Q;return J&&U.some(G=>G.id===J)?J:((Q=U[0])==null?void 0:Q.id)??null})},[]);ce.useEffect(()=>{q()},[q]),ce.useEffect(()=>{fetch(`/api/model?name=${encodeURIComponent(E.model)}`).then(j=>j.json()).then(L).catch(()=>L({ok:!1,error:"Ollama nicht erreichbar"}))},[E.model]),ce.useEffect(()=>{if(!c){p([]);return}localStorage.setItem(vf,c),P.current=!1,y(!1),fetch(`/api/sessions/${c}/messages`).then(j=>j.json()).then(j=>p(Array.isArray(j)?j:[])).catch(()=>p([]))},[c]);const X=ce.useCallback(j=>{w(U=>{const J={...U,...j};return localStorage.setItem(Rp,JSON.stringify(J)),J})},[]),M=ce.useCallback(j=>{O(j),localStorage.setItem(kf,j)},[]),le=ce.useCallback((j,U=[],J=[])=>{var Q;!j.trim()&&U.length===0&&J.length===0||P.current||!c||(P.current=!0,y(!0),(Q=e.current)==null||Q.send({type:"chat",sessionId:c,content:j,images:U,files:J,options:E,systemPrompt:N}))},[c,E,N]),de=ce.useCallback(()=>{var j;(j=e.current)==null||j.send({type:"abort"})},[]),K=ce.useCallback(async()=>{const U=await(await fetch("/api/sessions",{method:"POST"})).json();await q(),u(U.id)},[q]),A=ce.useCallback(async j=>{await fetch(`/api/sessions/${j}`,{method:"DELETE"}),s(U=>U.filter(J=>J.id!==j)),u(U=>U===j?null:U),await q()},[q]);return{status:i,sessions:l,activeId:c,setActiveId:u,messages:f,streaming:m,toolEvents:h,sendMessage:le,abort:de,newSession:K,deleteSession:A,options:E,setOptions:X,systemPrompt:N,setSystemPrompt:M,modelInfo:S}}function Xh({onTranscript:e,onQueueDrained:i}){const[r,l]=ce.useState(!1),[s,c]=ce.useState(!1),[u,f]=ce.useState(!1),[p,m]=ce.useState(null),y=ce.useRef(null),h=ce.useRef([]),b=ce.useRef(null),E=ce.useRef(null),w=ce.useRef([]),N=ce.useRef(null),O=ce.useRef(!1),S=ce.useRef(null),L=ce.useRef(i);L.current=i;const P=ce.useRef(e);P.current=e;const q=ce.useCallback(async()=>{if(O.current)return;const K=w.current.shift();if(K===void 0){f(!1),L.current();return}O.current=!0,f(!0);try{S.current=new AbortController;const A=await fetch("/api/tts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:K}),signal:S.current.signal});if(!A.ok)throw new Error(`TTS HTTP ${A.status}`);const j=await A.blob(),U=new Audio(URL.createObjectURL(j));N.current=U,await new Promise(J=>{U.onended=()=>J(),U.onerror=()=>J(),U.play().catch(()=>J())}),URL.revokeObjectURL(U.src)}catch(A){A instanceof DOMException&&A.name==="AbortError"||m(A instanceof Error?A.message:String(A))}finally{O.current=!1,S.current=null,q()}},[]),X=ce.useCallback(K=>{const A=K.trim();A&&(w.current.push(A),q())},[q]),M=ce.useCallback(()=>{var K;w.current=[],(K=S.current)==null||K.abort(),N.current&&(N.current.pause(),N.current.src=""),O.current=!1,f(!1)},[]),le=ce.useCallback(()=>{var K;E.current&&clearTimeout(E.current),E.current=null,((K=y.current)==null?void 0:K.state)==="recording"&&y.current.stop()},[]),de=ce.useCallback(async()=>{var K;if(((K=y.current)==null?void 0:K.state)!=="recording"){m(null);try{const A=await navigator.mediaDevices.getUserMedia({audio:!0});b.current=A;const j=new MediaRecorder(A);h.current=[],j.ondataavailable=U=>{U.data.size>0&&h.current.push(U.data)},j.onstop=async()=>{var J,Q;(J=b.current)==null||J.getTracks().forEach(G=>G.stop()),b.current=null,l(!1);const U=new Blob(h.current);if(h.current=[],!(U.size<2e3)){c(!0);try{const se=await(await fetch("/api/stt",{method:"POST",headers:{"Content-Type":"application/octet-stream"},body:U})).json();if(!se.ok)throw new Error(se.error??"STT fehlgeschlagen");const z=(Q=se.text)==null?void 0:Q.trim();z?P.current(z):m("Nichts verstanden — bitte nochmal sprechen.")}catch(G){m(G instanceof Error?G.message:String(G))}finally{c(!1)}}},y.current=j,j.start(),l(!0),E.current=setTimeout(()=>le(),3e4)}catch(A){m(A instanceof Error?A.message:String(A))}}},[e,le]);return ce.useEffect(()=>()=>{var K,A;((K=y.current)==null?void 0:K.state)==="recording"&&y.current.stop(),(A=b.current)==null||A.getTracks().forEach(j=>j.stop()),M()},[]),{recording:r,transcribing:s,speaking:u,error:p,setError:m,startRecording:de,stopRecording:le,enqueueSpeech:X,cancelSpeech:M}}function Zh({sessions:e,activeId:i,onSelect:r,onNew:l,onDelete:s}){return H.jsxs("aside",{className:"sidebar",children:[H.jsxs("div",{className:"sidebar-header",children:[H.jsxs("div",{className:"brand",children:[H.jsx("span",{className:"brand-prompt",children:"▸"})," agenttwo-tools"]}),H.jsx("button",{className:"btn-new",onClick:l,children:"+ Neuer Chat"})]}),H.jsxs("nav",{className:"session-list",children:[e.length===0&&H.jsx("div",{className:"empty-hint",children:"Noch keine Sessions."}),e.map(c=>H.jsxs("div",{className:`session-item ${c.id===i?"active":""}`,onClick:()=>r(c.id),children:[H.jsx("span",{className:"session-title",children:c.title}),H.jsx("button",{className:"session-delete",title:"Session löschen",onClick:u=>{u.stopPropagation(),s(c.id)},children:"✕"})]},c.id))]})]})}function Jh(e,i){const r={};return(e[e.length-1]===""?[...e,""]:e).join((r.padRight?" ":"")+","+(r.padLeft===!1?"":" ")).trim()}const ey=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,ty=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,ny={};function wf(e,i){return(ny.jsx?ty:ey).test(e)}const ry=/[ \t\n\f\r]/g;function iy(e){return typeof e=="object"?e.type==="text"?xf(e.value):!1:xf(e)}function xf(e){return e.replace(ry,"")===""}class Ao{constructor(i,r,l){this.normal=r,this.property=i,l&&(this.space=l)}}Ao.prototype.normal={};Ao.prototype.property={};Ao.prototype.space=void 0;function Op(e,i){const r={},l={};for(const s of e)Object.assign(r,s.property),Object.assign(l,s.normal);return new Ao(r,l,i)}function hu(e){return e.toLowerCase()}class Xt{constructor(i,r){this.attribute=r,this.property=i}}Xt.prototype.attribute="";Xt.prototype.booleanish=!1;Xt.prototype.boolean=!1;Xt.prototype.commaOrSpaceSeparated=!1;Xt.prototype.commaSeparated=!1;Xt.prototype.defined=!1;Xt.prototype.mustUseProperty=!1;Xt.prototype.number=!1;Xt.prototype.overloadedBoolean=!1;Xt.prototype.property="";Xt.prototype.spaceSeparated=!1;Xt.prototype.space=void 0;let oy=0;const Le=Zr(),Et=Zr(),yu=Zr(),ne=Zr(),Je=Zr(),Qr=Zr(),on=Zr();function Zr(){return 2**++oy}const bu=Object.freeze(Object.defineProperty({__proto__:null,boolean:Le,booleanish:Et,commaOrSpaceSeparated:on,commaSeparated:Qr,number:ne,overloadedBoolean:yu,spaceSeparated:Je},Symbol.toStringTag,{value:"Module"})),qs=Object.keys(bu);class Ru extends Xt{constructor(i,r,l,s){let c=-1;if(super(i,r),Sf(this,"space",s),typeof l=="number")for(;++c4&&r.slice(0,4)==="data"&&cy.test(i)){if(i.charAt(4)==="-"){const c=i.slice(5).replace(Nf,py);l="data"+c.charAt(0).toUpperCase()+c.slice(1)}else{const c=i.slice(4);if(!Nf.test(c)){let u=c.replace(uy,fy);u.charAt(0)!=="-"&&(u="-"+u),i="data"+u}}s=Ru}return new s(l,i)}function fy(e){return"-"+e.toLowerCase()}function py(e){return e.charAt(1).toUpperCase()}const my=Op([Ip,ly,Dp,Pp,zp],"html"),Ou=Op([Ip,ay,Dp,Pp,zp],"svg");function gy(e){return e.join(" ").trim()}var Ci={},Ys,Tf;function hy(){if(Tf)return Ys;Tf=1;var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,i=/\n/g,r=/^\s*/,l=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,s=/^:\s*/,c=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,u=/^[;\s]*/,f=/^\s+|\s+$/g,p=` -`,m="/",y="*",h="",b="comment",E="declaration";function w(O,S){if(typeof O!="string")throw new TypeError("First argument must be a string");if(!O)return[];S=S||{};var L=1,P=1;function q(Q){var G=Q.match(i);G&&(L+=G.length);var se=Q.lastIndexOf(p);P=~se?Q.length-se:P+Q.length}function X(){var Q={line:L,column:P};return function(G){return G.position=new M(Q),K(),G}}function M(Q){this.start=Q,this.end={line:L,column:P},this.source=S.source}M.prototype.content=O;function le(Q){var G=new Error(S.source+":"+L+":"+P+": "+Q);if(G.reason=Q,G.filename=S.source,G.line=L,G.column=P,G.source=O,!S.silent)throw G}function de(Q){var G=Q.exec(O);if(G){var se=G[0];return q(se),O=O.slice(se.length),G}}function K(){de(r)}function A(Q){var G;for(Q=Q||[];G=j();)G!==!1&&Q.push(G);return Q}function j(){var Q=X();if(!(m!=O.charAt(0)||y!=O.charAt(1))){for(var G=2;h!=O.charAt(G)&&(y!=O.charAt(G)||m!=O.charAt(G+1));)++G;if(G+=2,h===O.charAt(G-1))return le("End of comment missing");var se=O.slice(2,G-2);return P+=2,q(se),O=O.slice(G),P+=2,Q({type:b,comment:se})}}function U(){var Q=X(),G=de(l);if(G){if(j(),!de(s))return le("property missing ':'");var se=de(c),z=Q({type:E,property:N(G[0].replace(e,h)),value:se?N(se[0].replace(e,h)):h});return de(u),z}}function J(){var Q=[];A(Q);for(var G;G=U();)G!==!1&&(Q.push(G),A(Q));return Q}return K(),J()}function N(O){return O?O.replace(f,h):h}return Ys=w,Ys}var Cf;function yy(){if(Cf)return Ci;Cf=1;var e=Ci&&Ci.__importDefault||function(l){return l&&l.__esModule?l:{default:l}};Object.defineProperty(Ci,"__esModule",{value:!0}),Ci.default=r;const i=e(hy());function r(l,s){let c=null;if(!l||typeof l!="string")return c;const u=(0,i.default)(l),f=typeof s=="function";return u.forEach(p=>{if(p.type!=="declaration")return;const{property:m,value:y}=p;f?s(m,y,p):y&&(c=c||{},c[m]=y)}),c}return Ci}var bo={},Af;function by(){if(Af)return bo;Af=1,Object.defineProperty(bo,"__esModule",{value:!0}),bo.camelCase=void 0;var e=/^--[a-zA-Z0-9_-]+$/,i=/-([a-z])/g,r=/^[^-]+$/,l=/^-(webkit|moz|ms|o|khtml)-/,s=/^-(ms)-/,c=function(m){return!m||r.test(m)||e.test(m)},u=function(m,y){return y.toUpperCase()},f=function(m,y){return"".concat(y,"-")},p=function(m,y){return y===void 0&&(y={}),c(m)?m:(m=m.toLowerCase(),y.reactCompat?m=m.replace(s,f):m=m.replace(l,f),m.replace(i,u))};return bo.camelCase=p,bo}var Eo,Rf;function Ey(){if(Rf)return Eo;Rf=1;var e=Eo&&Eo.__importDefault||function(s){return s&&s.__esModule?s:{default:s}},i=e(yy()),r=by();function l(s,c){var u={};return!s||typeof s!="string"||(0,i.default)(s,function(f,p){f&&p&&(u[(0,r.camelCase)(f,c)]=p)}),u}return l.default=l,Eo=l,Eo}var _y=Ey();const vy=Co(_y),Fp=Bp("end"),Iu=Bp("start");function Bp(e){return i;function i(r){const l=r&&r.position&&r.position[e]||{};if(typeof l.line=="number"&&l.line>0&&typeof l.column=="number"&&l.column>0)return{line:l.line,column:l.column,offset:typeof l.offset=="number"&&l.offset>-1?l.offset:void 0}}}function ky(e){const i=Iu(e),r=Fp(e);if(i&&r)return{start:i,end:r}}function wo(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?Of(e.position):"start"in e||"end"in e?Of(e):"line"in e||"column"in e?Eu(e):""}function Eu(e){return If(e&&e.line)+":"+If(e&&e.column)}function Of(e){return Eu(e&&e.start)+"-"+Eu(e&&e.end)}function If(e){return e&&typeof e=="number"?e:1}class Pt extends Error{constructor(i,r,l){super(),typeof r=="string"&&(l=r,r=void 0);let s="",c={},u=!1;if(r&&("line"in r&&"column"in r?c={place:r}:"start"in r&&"end"in r?c={place:r}:"type"in r?c={ancestors:[r],place:r.position}:c={...r}),typeof i=="string"?s=i:!c.cause&&i&&(u=!0,s=i.message,c.cause=i),!c.ruleId&&!c.source&&typeof l=="string"){const p=l.indexOf(":");p===-1?c.ruleId=l:(c.source=l.slice(0,p),c.ruleId=l.slice(p+1))}if(!c.place&&c.ancestors&&c.ancestors){const p=c.ancestors[c.ancestors.length-1];p&&(c.place=p.position)}const f=c.place&&"start"in c.place?c.place.start:c.place;this.ancestors=c.ancestors||void 0,this.cause=c.cause||void 0,this.column=f?f.column:void 0,this.fatal=void 0,this.file="",this.message=s,this.line=f?f.line:void 0,this.name=wo(c.place)||"1:1",this.place=c.place||void 0,this.reason=this.message,this.ruleId=c.ruleId||void 0,this.source=c.source||void 0,this.stack=u&&c.cause&&typeof c.cause.stack=="string"?c.cause.stack:"",this.actual=void 0,this.expected=void 0,this.note=void 0,this.url=void 0}}Pt.prototype.file="";Pt.prototype.name="";Pt.prototype.reason="";Pt.prototype.message="";Pt.prototype.stack="";Pt.prototype.column=void 0;Pt.prototype.line=void 0;Pt.prototype.ancestors=void 0;Pt.prototype.cause=void 0;Pt.prototype.fatal=void 0;Pt.prototype.place=void 0;Pt.prototype.ruleId=void 0;Pt.prototype.source=void 0;const Mu={}.hasOwnProperty,wy=new Map,xy=/[A-Z]/g,Sy=new Set(["table","tbody","thead","tfoot","tr"]),Ny=new Set(["td","th"]),Up="https://github.com/syntax-tree/hast-util-to-jsx-runtime";function Ty(e,i){if(!i||i.Fragment===void 0)throw new TypeError("Expected `Fragment` in options");const r=i.filePath||void 0;let l;if(i.development){if(typeof i.jsxDEV!="function")throw new TypeError("Expected `jsxDEV` in options when `development: true`");l=Dy(r,i.jsxDEV)}else{if(typeof i.jsx!="function")throw new TypeError("Expected `jsx` in production options");if(typeof i.jsxs!="function")throw new TypeError("Expected `jsxs` in production options");l=Ly(r,i.jsx,i.jsxs)}const s={Fragment:i.Fragment,ancestors:[],components:i.components||{},create:l,elementAttributeNameCase:i.elementAttributeNameCase||"react",evaluater:i.createEvaluater?i.createEvaluater():void 0,filePath:r,ignoreInvalidStyle:i.ignoreInvalidStyle||!1,passKeys:i.passKeys!==!1,passNode:i.passNode||!1,schema:i.space==="svg"?Ou:my,stylePropertyNameCase:i.stylePropertyNameCase||"dom",tableCellAlignToStyle:i.tableCellAlignToStyle!==!1},c=$p(s,e,void 0);return c&&typeof c!="string"?c:s.create(e,s.Fragment,{children:c||void 0},void 0)}function $p(e,i,r){if(i.type==="element")return Cy(e,i,r);if(i.type==="mdxFlowExpression"||i.type==="mdxTextExpression")return Ay(e,i);if(i.type==="mdxJsxFlowElement"||i.type==="mdxJsxTextElement")return Oy(e,i,r);if(i.type==="mdxjsEsm")return Ry(e,i);if(i.type==="root")return Iy(e,i,r);if(i.type==="text")return My(e,i)}function Cy(e,i,r){const l=e.schema;let s=l;i.tagName.toLowerCase()==="svg"&&l.space==="html"&&(s=Ou,e.schema=s),e.ancestors.push(i);const c=jp(e,i.tagName,!1),u=Py(e,i);let f=Du(e,i);return Sy.has(i.tagName)&&(f=f.filter(function(p){return typeof p=="string"?!iy(p):!0})),Hp(e,u,c,i),Lu(u,f),e.ancestors.pop(),e.schema=l,e.create(i,c,u,r)}function Ay(e,i){if(i.data&&i.data.estree&&e.evaluater){const l=i.data.estree.body[0];return l.type,e.evaluater.evaluateExpression(l.expression)}No(e,i.position)}function Ry(e,i){if(i.data&&i.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(i.data.estree);No(e,i.position)}function Oy(e,i,r){const l=e.schema;let s=l;i.name==="svg"&&l.space==="html"&&(s=Ou,e.schema=s),e.ancestors.push(i);const c=i.name===null?e.Fragment:jp(e,i.name,!0),u=zy(e,i),f=Du(e,i);return Hp(e,u,c,i),Lu(u,f),e.ancestors.pop(),e.schema=l,e.create(i,c,u,r)}function Iy(e,i,r){const l={};return Lu(l,Du(e,i)),e.create(i,e.Fragment,l,r)}function My(e,i){return i.value}function Hp(e,i,r,l){typeof r!="string"&&r!==e.Fragment&&e.passNode&&(i.node=l)}function Lu(e,i){if(i.length>0){const r=i.length>1?i:i[0];r&&(e.children=r)}}function Ly(e,i,r){return l;function l(s,c,u,f){const m=Array.isArray(u.children)?r:i;return f?m(c,u,f):m(c,u)}}function Dy(e,i){return r;function r(l,s,c,u){const f=Array.isArray(c.children),p=Iu(l);return i(s,c,u,f,{columnNumber:p?p.column-1:void 0,fileName:e,lineNumber:p?p.line:void 0},void 0)}}function Py(e,i){const r={};let l,s;for(s in i.properties)if(s!=="children"&&Mu.call(i.properties,s)){const c=Fy(e,s,i.properties[s]);if(c){const[u,f]=c;e.tableCellAlignToStyle&&u==="align"&&typeof f=="string"&&Ny.has(i.tagName)?l=f:r[u]=f}}if(l){const c=r.style||(r.style={});c[e.stylePropertyNameCase==="css"?"text-align":"textAlign"]=l}return r}function zy(e,i){const r={};for(const l of i.attributes)if(l.type==="mdxJsxExpressionAttribute")if(l.data&&l.data.estree&&e.evaluater){const c=l.data.estree.body[0];c.type;const u=c.expression;u.type;const f=u.properties[0];f.type,Object.assign(r,e.evaluater.evaluateExpression(f.argument))}else No(e,i.position);else{const s=l.name;let c;if(l.value&&typeof l.value=="object")if(l.value.data&&l.value.data.estree&&e.evaluater){const f=l.value.data.estree.body[0];f.type,c=e.evaluater.evaluateExpression(f.expression)}else No(e,i.position);else c=l.value===null?!0:l.value;r[s]=c}return r}function Du(e,i){const r=[];let l=-1;const s=e.passKeys?new Map:wy;for(;++ls?0:s+i:i=i>s?s:i,r=r>0?r:0,l.length<1e4)u=Array.from(l),u.unshift(i,r),e.splice(...u);else for(r&&e.splice(i,r);c0?(ln(e,e.length,0,i),e):i}const Df={}.hasOwnProperty;function Kp(e){const i={};let r=-1;for(;++r13&&r<32||r>126&&r<160||r>55295&&r<57344||r>64975&&r<65008||(r&65535)===65535||(r&65535)===65534||r>1114111?"�":String.fromCodePoint(r)}function Cn(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}const Ht=Nr(/[A-Za-z]/),Dt=Nr(/[\dA-Za-z]/),Vy=Nr(/[#-'*+\--9=?A-Z^-~]/);function Xl(e){return e!==null&&(e<32||e===127)}const _u=Nr(/\d/),qy=Nr(/[\dA-Fa-f]/),Yy=Nr(/[!-/:-@[-`{-~]/);function Te(e){return e!==null&&e<-2}function et(e){return e!==null&&(e<0||e===32)}function Ue(e){return e===-2||e===-1||e===32}const ia=Nr(new RegExp("\\p{P}|\\p{S}","u")),Xr=Nr(/\s/);function Nr(e){return i;function i(r){return r!==null&&r>-1&&e.test(String.fromCharCode(r))}}function Li(e){const i=[];let r=-1,l=0,s=0;for(;++r55295&&c<57344){const f=e.charCodeAt(r+1);c<56320&&f>56319&&f<57344?(u=String.fromCharCode(c,f),s=1):u="�"}else u=String.fromCharCode(c);u&&(i.push(e.slice(l,r),encodeURIComponent(u)),l=r+s+1,u=""),s&&(r+=s,s=0)}return i.join("")+e.slice(l)}function We(e,i,r,l){const s=l?l-1:Number.POSITIVE_INFINITY;let c=0;return u;function u(p){return Ue(p)?(e.enter(r),f(p)):i(p)}function f(p){return Ue(p)&&c++u))return;const le=i.events.length;let de=le,K,A;for(;de--;)if(i.events[de][0]==="exit"&&i.events[de][1].type==="chunkFlow"){if(K){A=i.events[de][1].end;break}K=!0}for(S(l),M=le;MP;){const X=r[q];i.containerState=X[1],X[0].exit.call(i,e)}r.length=P}function L(){s.write([null]),c=void 0,s=void 0,i.containerState._closeFlow=void 0}}function eb(e,i,r){return We(e,e.attempt(this.parser.constructs.document,i,r),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function Ii(e){if(e===null||et(e)||Xr(e))return 1;if(ia(e))return 2}function oa(e,i,r){const l=[];let s=-1;for(;++s1&&e[r][1].end.offset-e[r][1].start.offset>1?2:1;const h={...e[l][1].end},b={...e[r][1].start};zf(h,-p),zf(b,p),u={type:p>1?"strongSequence":"emphasisSequence",start:h,end:{...e[l][1].end}},f={type:p>1?"strongSequence":"emphasisSequence",start:{...e[r][1].start},end:b},c={type:p>1?"strongText":"emphasisText",start:{...e[l][1].end},end:{...e[r][1].start}},s={type:p>1?"strong":"emphasis",start:{...u.start},end:{...f.end}},e[l][1].end={...u.start},e[r][1].start={...f.end},m=[],e[l][1].end.offset-e[l][1].start.offset&&(m=yn(m,[["enter",e[l][1],i],["exit",e[l][1],i]])),m=yn(m,[["enter",s,i],["enter",u,i],["exit",u,i],["enter",c,i]]),m=yn(m,oa(i.parser.constructs.insideSpan.null,e.slice(l+1,r),i)),m=yn(m,[["exit",c,i],["enter",f,i],["exit",f,i],["exit",s,i]]),e[r][1].end.offset-e[r][1].start.offset?(y=2,m=yn(m,[["enter",e[r][1],i],["exit",e[r][1],i]])):y=0,ln(e,l-1,r-l+3,m),r=l+m.length-y-2;break}}for(r=-1;++r0&&Ue(M)?We(e,L,"linePrefix",c+1)(M):L(M)}function L(M){return M===null||Te(M)?e.check(Ff,N,q)(M):(e.enter("codeFlowValue"),P(M))}function P(M){return M===null||Te(M)?(e.exit("codeFlowValue"),L(M)):(e.consume(M),P)}function q(M){return e.exit("codeFenced"),i(M)}function X(M,le,de){let K=0;return A;function A(G){return M.enter("lineEnding"),M.consume(G),M.exit("lineEnding"),j}function j(G){return M.enter("codeFencedFence"),Ue(G)?We(M,U,"linePrefix",l.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(G):U(G)}function U(G){return G===f?(M.enter("codeFencedFenceSequence"),J(G)):de(G)}function J(G){return G===f?(K++,M.consume(G),J):K>=u?(M.exit("codeFencedFenceSequence"),Ue(G)?We(M,Q,"whitespace")(G):Q(G)):de(G)}function Q(G){return G===null||Te(G)?(M.exit("codeFencedFence"),le(G)):de(G)}}}function fb(e,i,r){const l=this;return s;function s(u){return u===null?r(u):(e.enter("lineEnding"),e.consume(u),e.exit("lineEnding"),c)}function c(u){return l.parser.lazy[l.now().line]?r(u):i(u)}}const Xs={name:"codeIndented",tokenize:mb},pb={partial:!0,tokenize:gb};function mb(e,i,r){const l=this;return s;function s(m){return e.enter("codeIndented"),We(e,c,"linePrefix",5)(m)}function c(m){const y=l.events[l.events.length-1];return y&&y[1].type==="linePrefix"&&y[2].sliceSerialize(y[1],!0).length>=4?u(m):r(m)}function u(m){return m===null?p(m):Te(m)?e.attempt(pb,u,p)(m):(e.enter("codeFlowValue"),f(m))}function f(m){return m===null||Te(m)?(e.exit("codeFlowValue"),u(m)):(e.consume(m),f)}function p(m){return e.exit("codeIndented"),i(m)}}function gb(e,i,r){const l=this;return s;function s(u){return l.parser.lazy[l.now().line]?r(u):Te(u)?(e.enter("lineEnding"),e.consume(u),e.exit("lineEnding"),s):We(e,c,"linePrefix",5)(u)}function c(u){const f=l.events[l.events.length-1];return f&&f[1].type==="linePrefix"&&f[2].sliceSerialize(f[1],!0).length>=4?i(u):Te(u)?s(u):r(u)}}const hb={name:"codeText",previous:bb,resolve:yb,tokenize:Eb};function yb(e){let i=e.length-4,r=3,l,s;if((e[r][1].type==="lineEnding"||e[r][1].type==="space")&&(e[i][1].type==="lineEnding"||e[i][1].type==="space")){for(l=r;++l=this.left.length+this.right.length)throw new RangeError("Cannot access index `"+i+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return ithis.left.length?this.right.slice(this.right.length-l+this.left.length,this.right.length-i+this.left.length).reverse():this.left.slice(i).concat(this.right.slice(this.right.length-l+this.left.length).reverse())}splice(i,r,l){const s=r||0;this.setCursor(Math.trunc(i));const c=this.right.splice(this.right.length-s,Number.POSITIVE_INFINITY);return l&&_o(this.left,l),c.reverse()}pop(){return this.setCursor(Number.POSITIVE_INFINITY),this.left.pop()}push(i){this.setCursor(Number.POSITIVE_INFINITY),this.left.push(i)}pushMany(i){this.setCursor(Number.POSITIVE_INFINITY),_o(this.left,i)}unshift(i){this.setCursor(0),this.right.push(i)}unshiftMany(i){this.setCursor(0),_o(this.right,i.reverse())}setCursor(i){if(!(i===this.left.length||i>this.left.length&&this.right.length===0||i<0&&this.left.length===0))if(i=4?i(u):e.interrupt(l.parser.constructs.flow,r,i)(u)}}function Xp(e,i,r,l,s,c,u,f,p){const m=p||Number.POSITIVE_INFINITY;let y=0;return h;function h(S){return S===60?(e.enter(l),e.enter(s),e.enter(c),e.consume(S),e.exit(c),b):S===null||S===32||S===41||Xl(S)?r(S):(e.enter(l),e.enter(u),e.enter(f),e.enter("chunkString",{contentType:"string"}),N(S))}function b(S){return S===62?(e.enter(c),e.consume(S),e.exit(c),e.exit(s),e.exit(l),i):(e.enter(f),e.enter("chunkString",{contentType:"string"}),E(S))}function E(S){return S===62?(e.exit("chunkString"),e.exit(f),b(S)):S===null||S===60||Te(S)?r(S):(e.consume(S),S===92?w:E)}function w(S){return S===60||S===62||S===92?(e.consume(S),E):E(S)}function N(S){return!y&&(S===null||S===41||et(S))?(e.exit("chunkString"),e.exit(f),e.exit(u),e.exit(l),i(S)):y999||E===null||E===91||E===93&&!p||E===94&&!f&&"_hiddenFootnoteSupport"in u.parser.constructs?r(E):E===93?(e.exit(c),e.enter(s),e.consume(E),e.exit(s),e.exit(l),i):Te(E)?(e.enter("lineEnding"),e.consume(E),e.exit("lineEnding"),y):(e.enter("chunkString",{contentType:"string"}),h(E))}function h(E){return E===null||E===91||E===93||Te(E)||f++>999?(e.exit("chunkString"),y(E)):(e.consume(E),p||(p=!Ue(E)),E===92?b:h)}function b(E){return E===91||E===92||E===93?(e.consume(E),f++,h):h(E)}}function Jp(e,i,r,l,s,c){let u;return f;function f(b){return b===34||b===39||b===40?(e.enter(l),e.enter(s),e.consume(b),e.exit(s),u=b===40?41:b,p):r(b)}function p(b){return b===u?(e.enter(s),e.consume(b),e.exit(s),e.exit(l),i):(e.enter(c),m(b))}function m(b){return b===u?(e.exit(c),p(u)):b===null?r(b):Te(b)?(e.enter("lineEnding"),e.consume(b),e.exit("lineEnding"),We(e,m,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),y(b))}function y(b){return b===u||b===null||Te(b)?(e.exit("chunkString"),m(b)):(e.consume(b),b===92?h:y)}function h(b){return b===u||b===92?(e.consume(b),y):y(b)}}function xo(e,i){let r;return l;function l(s){return Te(s)?(e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),r=!0,l):Ue(s)?We(e,l,r?"linePrefix":"lineSuffix")(s):i(s)}}const Tb={name:"definition",tokenize:Ab},Cb={partial:!0,tokenize:Rb};function Ab(e,i,r){const l=this;let s;return c;function c(E){return e.enter("definition"),u(E)}function u(E){return Zp.call(l,e,f,r,"definitionLabel","definitionLabelMarker","definitionLabelString")(E)}function f(E){return s=Cn(l.sliceSerialize(l.events[l.events.length-1][1]).slice(1,-1)),E===58?(e.enter("definitionMarker"),e.consume(E),e.exit("definitionMarker"),p):r(E)}function p(E){return et(E)?xo(e,m)(E):m(E)}function m(E){return Xp(e,y,r,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(E)}function y(E){return e.attempt(Cb,h,h)(E)}function h(E){return Ue(E)?We(e,b,"whitespace")(E):b(E)}function b(E){return E===null||Te(E)?(e.exit("definition"),l.parser.defined.push(s),i(E)):r(E)}}function Rb(e,i,r){return l;function l(f){return et(f)?xo(e,s)(f):r(f)}function s(f){return Jp(e,c,r,"definitionTitle","definitionTitleMarker","definitionTitleString")(f)}function c(f){return Ue(f)?We(e,u,"whitespace")(f):u(f)}function u(f){return f===null||Te(f)?i(f):r(f)}}const Ob={name:"hardBreakEscape",tokenize:Ib};function Ib(e,i,r){return l;function l(c){return e.enter("hardBreakEscape"),e.consume(c),s}function s(c){return Te(c)?(e.exit("hardBreakEscape"),i(c)):r(c)}}const Mb={name:"headingAtx",resolve:Lb,tokenize:Db};function Lb(e,i){let r=e.length-2,l=3,s,c;return e[l][1].type==="whitespace"&&(l+=2),r-2>l&&e[r][1].type==="whitespace"&&(r-=2),e[r][1].type==="atxHeadingSequence"&&(l===r-1||r-4>l&&e[r-2][1].type==="whitespace")&&(r-=l+1===r?2:4),r>l&&(s={type:"atxHeadingText",start:e[l][1].start,end:e[r][1].end},c={type:"chunkText",start:e[l][1].start,end:e[r][1].end,contentType:"text"},ln(e,l,r-l+1,[["enter",s,i],["enter",c,i],["exit",c,i],["exit",s,i]])),e}function Db(e,i,r){let l=0;return s;function s(y){return e.enter("atxHeading"),c(y)}function c(y){return e.enter("atxHeadingSequence"),u(y)}function u(y){return y===35&&l++<6?(e.consume(y),u):y===null||et(y)?(e.exit("atxHeadingSequence"),f(y)):r(y)}function f(y){return y===35?(e.enter("atxHeadingSequence"),p(y)):y===null||Te(y)?(e.exit("atxHeading"),i(y)):Ue(y)?We(e,f,"whitespace")(y):(e.enter("atxHeadingText"),m(y))}function p(y){return y===35?(e.consume(y),p):(e.exit("atxHeadingSequence"),f(y))}function m(y){return y===null||y===35||et(y)?(e.exit("atxHeadingText"),f(y)):(e.consume(y),m)}}const Pb=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],Uf=["pre","script","style","textarea"],zb={concrete:!0,name:"htmlFlow",resolveTo:Ub,tokenize:$b},Fb={partial:!0,tokenize:jb},Bb={partial:!0,tokenize:Hb};function Ub(e){let i=e.length;for(;i--&&!(e[i][0]==="enter"&&e[i][1].type==="htmlFlow"););return i>1&&e[i-2][1].type==="linePrefix"&&(e[i][1].start=e[i-2][1].start,e[i+1][1].start=e[i-2][1].start,e.splice(i-2,2)),e}function $b(e,i,r){const l=this;let s,c,u,f,p;return m;function m(k){return y(k)}function y(k){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(k),h}function h(k){return k===33?(e.consume(k),b):k===47?(e.consume(k),c=!0,N):k===63?(e.consume(k),s=3,l.interrupt?i:v):Ht(k)?(e.consume(k),u=String.fromCharCode(k),O):r(k)}function b(k){return k===45?(e.consume(k),s=2,E):k===91?(e.consume(k),s=5,f=0,w):Ht(k)?(e.consume(k),s=4,l.interrupt?i:v):r(k)}function E(k){return k===45?(e.consume(k),l.interrupt?i:v):r(k)}function w(k){const ke="CDATA[";return k===ke.charCodeAt(f++)?(e.consume(k),f===ke.length?l.interrupt?i:U:w):r(k)}function N(k){return Ht(k)?(e.consume(k),u=String.fromCharCode(k),O):r(k)}function O(k){if(k===null||k===47||k===62||et(k)){const ke=k===47,Me=u.toLowerCase();return!ke&&!c&&Uf.includes(Me)?(s=1,l.interrupt?i(k):U(k)):Pb.includes(u.toLowerCase())?(s=6,ke?(e.consume(k),S):l.interrupt?i(k):U(k)):(s=7,l.interrupt&&!l.parser.lazy[l.now().line]?r(k):c?L(k):P(k))}return k===45||Dt(k)?(e.consume(k),u+=String.fromCharCode(k),O):r(k)}function S(k){return k===62?(e.consume(k),l.interrupt?i:U):r(k)}function L(k){return Ue(k)?(e.consume(k),L):A(k)}function P(k){return k===47?(e.consume(k),A):k===58||k===95||Ht(k)?(e.consume(k),q):Ue(k)?(e.consume(k),P):A(k)}function q(k){return k===45||k===46||k===58||k===95||Dt(k)?(e.consume(k),q):X(k)}function X(k){return k===61?(e.consume(k),M):Ue(k)?(e.consume(k),X):P(k)}function M(k){return k===null||k===60||k===61||k===62||k===96?r(k):k===34||k===39?(e.consume(k),p=k,le):Ue(k)?(e.consume(k),M):de(k)}function le(k){return k===p?(e.consume(k),p=null,K):k===null||Te(k)?r(k):(e.consume(k),le)}function de(k){return k===null||k===34||k===39||k===47||k===60||k===61||k===62||k===96||et(k)?X(k):(e.consume(k),de)}function K(k){return k===47||k===62||Ue(k)?P(k):r(k)}function A(k){return k===62?(e.consume(k),j):r(k)}function j(k){return k===null||Te(k)?U(k):Ue(k)?(e.consume(k),j):r(k)}function U(k){return k===45&&s===2?(e.consume(k),se):k===60&&s===1?(e.consume(k),z):k===62&&s===4?(e.consume(k),R):k===63&&s===3?(e.consume(k),v):k===93&&s===5?(e.consume(k),ae):Te(k)&&(s===6||s===7)?(e.exit("htmlFlowData"),e.check(Fb,$,J)(k)):k===null||Te(k)?(e.exit("htmlFlowData"),J(k)):(e.consume(k),U)}function J(k){return e.check(Bb,Q,$)(k)}function Q(k){return e.enter("lineEnding"),e.consume(k),e.exit("lineEnding"),G}function G(k){return k===null||Te(k)?J(k):(e.enter("htmlFlowData"),U(k))}function se(k){return k===45?(e.consume(k),v):U(k)}function z(k){return k===47?(e.consume(k),u="",V):U(k)}function V(k){if(k===62){const ke=u.toLowerCase();return Uf.includes(ke)?(e.consume(k),R):U(k)}return Ht(k)&&u.length<8?(e.consume(k),u+=String.fromCharCode(k),V):U(k)}function ae(k){return k===93?(e.consume(k),v):U(k)}function v(k){return k===62?(e.consume(k),R):k===45&&s===2?(e.consume(k),v):U(k)}function R(k){return k===null||Te(k)?(e.exit("htmlFlowData"),$(k)):(e.consume(k),R)}function $(k){return e.exit("htmlFlow"),i(k)}}function Hb(e,i,r){const l=this;return s;function s(u){return Te(u)?(e.enter("lineEnding"),e.consume(u),e.exit("lineEnding"),c):r(u)}function c(u){return l.parser.lazy[l.now().line]?r(u):i(u)}}function jb(e,i,r){return l;function l(s){return e.enter("lineEnding"),e.consume(s),e.exit("lineEnding"),e.attempt(Ro,i,r)}}const Gb={name:"htmlText",tokenize:Kb};function Kb(e,i,r){const l=this;let s,c,u;return f;function f(v){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(v),p}function p(v){return v===33?(e.consume(v),m):v===47?(e.consume(v),X):v===63?(e.consume(v),P):Ht(v)?(e.consume(v),de):r(v)}function m(v){return v===45?(e.consume(v),y):v===91?(e.consume(v),c=0,w):Ht(v)?(e.consume(v),L):r(v)}function y(v){return v===45?(e.consume(v),E):r(v)}function h(v){return v===null?r(v):v===45?(e.consume(v),b):Te(v)?(u=h,z(v)):(e.consume(v),h)}function b(v){return v===45?(e.consume(v),E):h(v)}function E(v){return v===62?se(v):v===45?b(v):h(v)}function w(v){const R="CDATA[";return v===R.charCodeAt(c++)?(e.consume(v),c===R.length?N:w):r(v)}function N(v){return v===null?r(v):v===93?(e.consume(v),O):Te(v)?(u=N,z(v)):(e.consume(v),N)}function O(v){return v===93?(e.consume(v),S):N(v)}function S(v){return v===62?se(v):v===93?(e.consume(v),S):N(v)}function L(v){return v===null||v===62?se(v):Te(v)?(u=L,z(v)):(e.consume(v),L)}function P(v){return v===null?r(v):v===63?(e.consume(v),q):Te(v)?(u=P,z(v)):(e.consume(v),P)}function q(v){return v===62?se(v):P(v)}function X(v){return Ht(v)?(e.consume(v),M):r(v)}function M(v){return v===45||Dt(v)?(e.consume(v),M):le(v)}function le(v){return Te(v)?(u=le,z(v)):Ue(v)?(e.consume(v),le):se(v)}function de(v){return v===45||Dt(v)?(e.consume(v),de):v===47||v===62||et(v)?K(v):r(v)}function K(v){return v===47?(e.consume(v),se):v===58||v===95||Ht(v)?(e.consume(v),A):Te(v)?(u=K,z(v)):Ue(v)?(e.consume(v),K):se(v)}function A(v){return v===45||v===46||v===58||v===95||Dt(v)?(e.consume(v),A):j(v)}function j(v){return v===61?(e.consume(v),U):Te(v)?(u=j,z(v)):Ue(v)?(e.consume(v),j):K(v)}function U(v){return v===null||v===60||v===61||v===62||v===96?r(v):v===34||v===39?(e.consume(v),s=v,J):Te(v)?(u=U,z(v)):Ue(v)?(e.consume(v),U):(e.consume(v),Q)}function J(v){return v===s?(e.consume(v),s=void 0,G):v===null?r(v):Te(v)?(u=J,z(v)):(e.consume(v),J)}function Q(v){return v===null||v===34||v===39||v===60||v===61||v===96?r(v):v===47||v===62||et(v)?K(v):(e.consume(v),Q)}function G(v){return v===47||v===62||et(v)?K(v):r(v)}function se(v){return v===62?(e.consume(v),e.exit("htmlTextData"),e.exit("htmlText"),i):r(v)}function z(v){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(v),e.exit("lineEnding"),V}function V(v){return Ue(v)?We(e,ae,"linePrefix",l.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(v):ae(v)}function ae(v){return e.enter("htmlTextData"),u(v)}}const Fu={name:"labelEnd",resolveAll:Yb,resolveTo:Qb,tokenize:Xb},Wb={tokenize:Zb},Vb={tokenize:Jb},qb={tokenize:eE};function Yb(e){let i=-1;const r=[];for(;++i=3&&(m===null||Te(m))?(e.exit("thematicBreak"),i(m)):r(m)}function p(m){return m===s?(e.consume(m),l++,p):(e.exit("thematicBreakSequence"),Ue(m)?We(e,f,"whitespace")(m):f(m))}}const Qt={continuation:{tokenize:cE},exit:fE,name:"list",tokenize:uE},aE={partial:!0,tokenize:pE},sE={partial:!0,tokenize:dE};function uE(e,i,r){const l=this,s=l.events[l.events.length-1];let c=s&&s[1].type==="linePrefix"?s[2].sliceSerialize(s[1],!0).length:0,u=0;return f;function f(E){const w=l.containerState.type||(E===42||E===43||E===45?"listUnordered":"listOrdered");if(w==="listUnordered"?!l.containerState.marker||E===l.containerState.marker:_u(E)){if(l.containerState.type||(l.containerState.type=w,e.enter(w,{_container:!0})),w==="listUnordered")return e.enter("listItemPrefix"),E===42||E===45?e.check(Ql,r,m)(E):m(E);if(!l.interrupt||E===49)return e.enter("listItemPrefix"),e.enter("listItemValue"),p(E)}return r(E)}function p(E){return _u(E)&&++u<10?(e.consume(E),p):(!l.interrupt||u<2)&&(l.containerState.marker?E===l.containerState.marker:E===41||E===46)?(e.exit("listItemValue"),m(E)):r(E)}function m(E){return e.enter("listItemMarker"),e.consume(E),e.exit("listItemMarker"),l.containerState.marker=l.containerState.marker||E,e.check(Ro,l.interrupt?r:y,e.attempt(aE,b,h))}function y(E){return l.containerState.initialBlankLine=!0,c++,b(E)}function h(E){return Ue(E)?(e.enter("listItemPrefixWhitespace"),e.consume(E),e.exit("listItemPrefixWhitespace"),b):r(E)}function b(E){return l.containerState.size=c+l.sliceSerialize(e.exit("listItemPrefix"),!0).length,i(E)}}function cE(e,i,r){const l=this;return l.containerState._closeFlow=void 0,e.check(Ro,s,c);function s(f){return l.containerState.furtherBlankLines=l.containerState.furtherBlankLines||l.containerState.initialBlankLine,We(e,i,"listItemIndent",l.containerState.size+1)(f)}function c(f){return l.containerState.furtherBlankLines||!Ue(f)?(l.containerState.furtherBlankLines=void 0,l.containerState.initialBlankLine=void 0,u(f)):(l.containerState.furtherBlankLines=void 0,l.containerState.initialBlankLine=void 0,e.attempt(sE,i,u)(f))}function u(f){return l.containerState._closeFlow=!0,l.interrupt=void 0,We(e,e.attempt(Qt,i,r),"linePrefix",l.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(f)}}function dE(e,i,r){const l=this;return We(e,s,"listItemIndent",l.containerState.size+1);function s(c){const u=l.events[l.events.length-1];return u&&u[1].type==="listItemIndent"&&u[2].sliceSerialize(u[1],!0).length===l.containerState.size?i(c):r(c)}}function fE(e){e.exit(this.containerState.type)}function pE(e,i,r){const l=this;return We(e,s,"listItemPrefixWhitespace",l.parser.constructs.disable.null.includes("codeIndented")?void 0:5);function s(c){const u=l.events[l.events.length-1];return!Ue(c)&&u&&u[1].type==="listItemPrefixWhitespace"?i(c):r(c)}}const $f={name:"setextUnderline",resolveTo:mE,tokenize:gE};function mE(e,i){let r=e.length,l,s,c;for(;r--;)if(e[r][0]==="enter"){if(e[r][1].type==="content"){l=r;break}e[r][1].type==="paragraph"&&(s=r)}else e[r][1].type==="content"&&e.splice(r,1),!c&&e[r][1].type==="definition"&&(c=r);const u={type:"setextHeading",start:{...e[l][1].start},end:{...e[e.length-1][1].end}};return e[s][1].type="setextHeadingText",c?(e.splice(s,0,["enter",u,i]),e.splice(c+1,0,["exit",e[l][1],i]),e[l][1].end={...e[c][1].end}):e[l][1]=u,e.push(["exit",u,i]),e}function gE(e,i,r){const l=this;let s;return c;function c(m){let y=l.events.length,h;for(;y--;)if(l.events[y][1].type!=="lineEnding"&&l.events[y][1].type!=="linePrefix"&&l.events[y][1].type!=="content"){h=l.events[y][1].type==="paragraph";break}return!l.parser.lazy[l.now().line]&&(l.interrupt||h)?(e.enter("setextHeadingLine"),s=m,u(m)):r(m)}function u(m){return e.enter("setextHeadingLineSequence"),f(m)}function f(m){return m===s?(e.consume(m),f):(e.exit("setextHeadingLineSequence"),Ue(m)?We(e,p,"lineSuffix")(m):p(m))}function p(m){return m===null||Te(m)?(e.exit("setextHeadingLine"),i(m)):r(m)}}const hE={tokenize:yE};function yE(e){const i=this,r=e.attempt(Ro,l,e.attempt(this.parser.constructs.flowInitial,s,We(e,e.attempt(this.parser.constructs.flow,s,e.attempt(kb,s)),"linePrefix")));return r;function l(c){if(c===null){e.consume(c);return}return e.enter("lineEndingBlank"),e.consume(c),e.exit("lineEndingBlank"),i.currentConstruct=void 0,r}function s(c){if(c===null){e.consume(c);return}return e.enter("lineEnding"),e.consume(c),e.exit("lineEnding"),i.currentConstruct=void 0,r}}const bE={resolveAll:tm()},EE=em("string"),_E=em("text");function em(e){return{resolveAll:tm(e==="text"?vE:void 0),tokenize:i};function i(r){const l=this,s=this.parser.constructs[e],c=r.attempt(s,u,f);return u;function u(y){return m(y)?c(y):f(y)}function f(y){if(y===null){r.consume(y);return}return r.enter("data"),r.consume(y),p}function p(y){return m(y)?(r.exit("data"),c(y)):(r.consume(y),p)}function m(y){if(y===null)return!0;const h=s[y];let b=-1;if(h)for(;++b-1){const f=u[0];typeof f=="string"?u[0]=f.slice(l):u.shift()}c>0&&u.push(e[s].slice(0,c))}return u}function LE(e,i){let r=-1;const l=[];let s;for(;++r0){const _t=Ce.tokenStack[Ce.tokenStack.length-1];(_t[1]||jf).call(Ce,void 0,_t[0])}for(oe.position={start:Sr(W.length>0?W[0][1].start:{line:1,column:1,offset:0}),end:Sr(W.length>0?W[W.length-2][1].end:{line:1,column:1,offset:0})},He=-1;++He0&&(l.className=["language-"+s[0]]);let c={type:"element",tagName:"code",properties:l,children:[{type:"text",value:r}]};return i.meta&&(c.data={meta:i.meta}),e.patch(i,c),c=e.applyData(i,c),c={type:"element",tagName:"pre",properties:{},children:[c]},e.patch(i,c),c}function qE(e,i){const r={type:"element",tagName:"del",properties:{},children:e.all(i)};return e.patch(i,r),e.applyData(i,r)}function YE(e,i){const r={type:"element",tagName:"em",properties:{},children:e.all(i)};return e.patch(i,r),e.applyData(i,r)}function QE(e,i){const r=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",l=String(i.identifier).toUpperCase(),s=Li(l.toLowerCase()),c=e.footnoteOrder.indexOf(l);let u,f=e.footnoteCounts.get(l);f===void 0?(f=0,e.footnoteOrder.push(l),u=e.footnoteOrder.length):u=c+1,f+=1,e.footnoteCounts.set(l,f);const p={type:"element",tagName:"a",properties:{href:"#"+r+"fn-"+s,id:r+"fnref-"+s+(f>1?"-"+f:""),dataFootnoteRef:!0,ariaDescribedBy:["footnote-label"]},children:[{type:"text",value:String(u)}]};e.patch(i,p);const m={type:"element",tagName:"sup",properties:{},children:[p]};return e.patch(i,m),e.applyData(i,m)}function XE(e,i){const r={type:"element",tagName:"h"+i.depth,properties:{},children:e.all(i)};return e.patch(i,r),e.applyData(i,r)}function ZE(e,i){if(e.options.allowDangerousHtml){const r={type:"raw",value:i.value};return e.patch(i,r),e.applyData(i,r)}}function im(e,i){const r=i.referenceType;let l="]";if(r==="collapsed"?l+="[]":r==="full"&&(l+="["+(i.label||i.identifier)+"]"),i.type==="imageReference")return[{type:"text",value:"!["+i.alt+l}];const s=e.all(i),c=s[0];c&&c.type==="text"?c.value="["+c.value:s.unshift({type:"text",value:"["});const u=s[s.length-1];return u&&u.type==="text"?u.value+=l:s.push({type:"text",value:l}),s}function JE(e,i){const r=String(i.identifier).toUpperCase(),l=e.definitionById.get(r);if(!l)return im(e,i);const s={src:Li(l.url||""),alt:i.alt};l.title!==null&&l.title!==void 0&&(s.title=l.title);const c={type:"element",tagName:"img",properties:s,children:[]};return e.patch(i,c),e.applyData(i,c)}function e_(e,i){const r={src:Li(i.url)};i.alt!==null&&i.alt!==void 0&&(r.alt=i.alt),i.title!==null&&i.title!==void 0&&(r.title=i.title);const l={type:"element",tagName:"img",properties:r,children:[]};return e.patch(i,l),e.applyData(i,l)}function t_(e,i){const r={type:"text",value:i.value.replace(/\r?\n|\r/g," ")};e.patch(i,r);const l={type:"element",tagName:"code",properties:{},children:[r]};return e.patch(i,l),e.applyData(i,l)}function n_(e,i){const r=String(i.identifier).toUpperCase(),l=e.definitionById.get(r);if(!l)return im(e,i);const s={href:Li(l.url||"")};l.title!==null&&l.title!==void 0&&(s.title=l.title);const c={type:"element",tagName:"a",properties:s,children:e.all(i)};return e.patch(i,c),e.applyData(i,c)}function r_(e,i){const r={href:Li(i.url)};i.title!==null&&i.title!==void 0&&(r.title=i.title);const l={type:"element",tagName:"a",properties:r,children:e.all(i)};return e.patch(i,l),e.applyData(i,l)}function i_(e,i,r){const l=e.all(i),s=r?o_(r):om(i),c={},u=[];if(typeof i.checked=="boolean"){const y=l[0];let h;y&&y.type==="element"&&y.tagName==="p"?h=y:(h={type:"element",tagName:"p",properties:{},children:[]},l.unshift(h)),h.children.length>0&&h.children.unshift({type:"text",value:" "}),h.children.unshift({type:"element",tagName:"input",properties:{type:"checkbox",checked:i.checked,disabled:!0},children:[]}),c.className=["task-list-item"]}let f=-1;for(;++f1}function l_(e,i){const r={},l=e.all(i);let s=-1;for(typeof i.start=="number"&&i.start!==1&&(r.start=i.start);++s0){const u={type:"element",tagName:"tbody",properties:{},children:e.wrap(r,!0)},f=Iu(i.children[1]),p=Fp(i.children[i.children.length-1]);f&&p&&(u.position={start:f,end:p}),s.push(u)}const c={type:"element",tagName:"table",properties:{},children:e.wrap(s,!0)};return e.patch(i,c),e.applyData(i,c)}function d_(e,i,r){const l=r?r.children:void 0,c=(l?l.indexOf(i):1)===0?"th":"td",u=r&&r.type==="table"?r.align:void 0,f=u?u.length:i.children.length;let p=-1;const m=[];for(;++p0,!0),l[0]),s=l.index+l[0].length,l=r.exec(i);return c.push(Wf(i.slice(s),s>0,!1)),c.join("")}function Wf(e,i,r){let l=0,s=e.length;if(i){let c=e.codePointAt(l);for(;c===Gf||c===Kf;)l++,c=e.codePointAt(l)}if(r){let c=e.codePointAt(s-1);for(;c===Gf||c===Kf;)s--,c=e.codePointAt(s-1)}return s>l?e.slice(l,s):""}function m_(e,i){const r={type:"text",value:p_(String(i.value))};return e.patch(i,r),e.applyData(i,r)}function g_(e,i){const r={type:"element",tagName:"hr",properties:{},children:[]};return e.patch(i,r),e.applyData(i,r)}const h_={blockquote:KE,break:WE,code:VE,delete:qE,emphasis:YE,footnoteReference:QE,heading:XE,html:ZE,imageReference:JE,image:e_,inlineCode:t_,linkReference:n_,link:r_,listItem:i_,list:l_,paragraph:a_,root:s_,strong:u_,table:c_,tableCell:f_,tableRow:d_,text:m_,thematicBreak:g_,toml:$l,yaml:$l,definition:$l,footnoteDefinition:$l};function $l(){}const lm=-1,la=0,So=1,Zl=2,Bu=3,Uu=4,$u=5,Hu=6,am=7,sm=8,um=typeof self=="object"?self:globalThis,Vf=(e,i)=>{switch(e){case"Function":case"SharedWorker":case"Worker":case"eval":case"setInterval":case"setTimeout":throw new TypeError("unable to deserialize "+e)}return new um[e](i)},y_=(e,i)=>{const r=(s,c)=>(e.set(c,s),s),l=s=>{if(e.has(s))return e.get(s);const[c,u]=i[s];switch(c){case la:case lm:return r(u,s);case So:{const f=r([],s);for(const p of u)f.push(l(p));return f}case Zl:{const f=r({},s);for(const[p,m]of u)f[l(p)]=l(m);return f}case Bu:return r(new Date(u),s);case Uu:{const{source:f,flags:p}=u;return r(new RegExp(f,p),s)}case $u:{const f=r(new Map,s);for(const[p,m]of u)f.set(l(p),l(m));return f}case Hu:{const f=r(new Set,s);for(const p of u)f.add(l(p));return f}case am:{const{name:f,message:p}=u;return r(typeof um[f]=="function"?Vf(f,p):new Error(p),s)}case sm:return r(BigInt(u),s);case"BigInt":return r(Object(BigInt(u)),s);case"ArrayBuffer":return r(new Uint8Array(u).buffer,u);case"DataView":{const{buffer:f}=new Uint8Array(u);return r(new DataView(f),u)}}return r(Vf(c,u),s)};return l},qf=e=>y_(new Map,e)(0),Yr="",{toString:b_}={},{keys:E_}=Object,vo=e=>{const i=typeof e;if(i!=="object"||!e)return[la,i];const r=b_.call(e).slice(8,-1);switch(r){case"Array":return[So,Yr];case"Object":return[Zl,Yr];case"Date":return[Bu,Yr];case"RegExp":return[Uu,Yr];case"Map":return[$u,Yr];case"Set":return[Hu,Yr];case"DataView":return[So,r]}return r.includes("Array")?[So,r]:e instanceof Error?[am,e.name||"Error"]:[Zl,r]},Hl=([e,i])=>e===la&&(i==="function"||i==="symbol"),__=(e,i,r,l)=>{const s=(u,f)=>{const p=l.push(u)-1;return r.set(f,p),p},c=u=>{if(r.has(u))return r.get(u);let[f,p]=vo(u);switch(f){case la:{let y=u;switch(p){case"bigint":f=sm,y=u.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+p);y=null;break;case"undefined":return s([lm],u)}return s([f,y],u)}case So:{if(p){let b=u;return p==="DataView"?b=new Uint8Array(u.buffer):p==="ArrayBuffer"&&(b=new Uint8Array(u)),s([p,[...b]],u)}const y=[],h=s([f,y],u);for(const b of u)y.push(c(b));return h}case Zl:{if(p)switch(p){case"BigInt":return s([p,u.toString()],u);case"Boolean":case"Number":case"String":return s([p,u.valueOf()],u)}if(i&&"toJSON"in u)return c(u.toJSON());const y=[],h=s([f,y],u);for(const b of E_(u))(e||!Hl(vo(u[b])))&&y.push([c(b),c(u[b])]);return h}case Bu:return s([f,isNaN(u.getTime())?Yr:u.toISOString()],u);case Uu:{const{source:y,flags:h}=u;return s([f,{source:y,flags:h}],u)}case $u:{const y=[],h=s([f,y],u);for(const[b,E]of u)(e||!(Hl(vo(b))||Hl(vo(E))))&&y.push([c(b),c(E)]);return h}case Hu:{const y=[],h=s([f,y],u);for(const b of u)(e||!Hl(vo(b)))&&y.push(c(b));return h}}const{message:m}=u;return s([f,{name:p,message:m}],u)};return c},Yf=(e,{json:i,lossy:r}={})=>{const l=[];return __(!(i||r),!!i,new Map,l)(e),l},Jl=typeof structuredClone=="function"?(e,i)=>i&&("json"in i||"lossy"in i)?qf(Yf(e,i)):structuredClone(e):(e,i)=>qf(Yf(e,i));function v_(e,i){const r=[{type:"text",value:"↩"}];return i>1&&r.push({type:"element",tagName:"sup",properties:{},children:[{type:"text",value:String(i)}]}),r}function k_(e,i){return"Back to reference "+(e+1)+(i>1?"-"+i:"")}function w_(e){const i=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",r=e.options.footnoteBackContent||v_,l=e.options.footnoteBackLabel||k_,s=e.options.footnoteLabel||"Footnotes",c=e.options.footnoteLabelTagName||"h2",u=e.options.footnoteLabelProperties||{className:["sr-only"]},f=[];let p=-1;for(;++p0&&w.push({type:"text",value:" "});let L=typeof r=="string"?r:r(p,E);typeof L=="string"&&(L={type:"text",value:L}),w.push({type:"element",tagName:"a",properties:{href:"#"+i+"fnref-"+b+(E>1?"-"+E:""),dataFootnoteBackref:"",ariaLabel:typeof l=="string"?l:l(p,E),className:["data-footnote-backref"]},children:Array.isArray(L)?L:[L]})}const O=y[y.length-1];if(O&&O.type==="element"&&O.tagName==="p"){const L=O.children[O.children.length-1];L&&L.type==="text"?L.value+=" ":O.children.push({type:"text",value:" "}),O.children.push(...w)}else y.push(...w);const S={type:"element",tagName:"li",properties:{id:i+"fn-"+b},children:e.wrap(y,!0)};e.patch(m,S),f.push(S)}if(f.length!==0)return{type:"element",tagName:"section",properties:{dataFootnotes:!0,className:["footnotes"]},children:[{type:"element",tagName:c,properties:{...Jl(u),id:"footnote-label"},children:[{type:"text",value:s}]},{type:"text",value:` -`},{type:"element",tagName:"ol",properties:{},children:e.wrap(f,!0)},{type:"text",value:` -`}]}}const Oo=(function(e){if(e==null)return T_;if(typeof e=="function")return aa(e);if(typeof e=="object")return Array.isArray(e)?x_(e):S_(e);if(typeof e=="string")return N_(e);throw new Error("Expected function, string, or object as test")});function x_(e){const i=[];let r=-1;for(;++r":""))+")"})}return b;function b(){let E=cm,w,N,O;if((!i||c(p,m,y[y.length-1]||void 0))&&(E=O_(r(p,y)),E[0]===ku))return E;if("children"in p&&p.children){const S=p;if(S.children&&E[0]!==R_)for(N=(l?S.children.length:-1)+u,O=y.concat(S);N>-1&&N0&&r.push({type:"text",value:` -`}),r}function Qf(e){let i=0,r=e.charCodeAt(i);for(;r===9||r===32;)i++,r=e.charCodeAt(i);return e.slice(i)}function Xf(e,i){const r=M_(e,i),l=r.one(e,void 0),s=w_(r),c=Array.isArray(l)?{type:"root",children:l}:l||{type:"root",children:[]};return s&&c.children.push({type:"text",value:` -`},s),c}function F_(e,i){return e&&"run"in e?async function(r,l){const s=Xf(r,{file:l,...i});await e.run(s,l)}:function(r,l){return Xf(r,{file:l,...e||i})}}function Zf(e){if(e)throw e}var Js,Jf;function B_(){if(Jf)return Js;Jf=1;var e=Object.prototype.hasOwnProperty,i=Object.prototype.toString,r=Object.defineProperty,l=Object.getOwnPropertyDescriptor,s=function(m){return typeof Array.isArray=="function"?Array.isArray(m):i.call(m)==="[object Array]"},c=function(m){if(!m||i.call(m)!=="[object Object]")return!1;var y=e.call(m,"constructor"),h=m.constructor&&m.constructor.prototype&&e.call(m.constructor.prototype,"isPrototypeOf");if(m.constructor&&!y&&!h)return!1;var b;for(b in m);return typeof b>"u"||e.call(m,b)},u=function(m,y){r&&y.name==="__proto__"?r(m,y.name,{enumerable:!0,configurable:!0,value:y.newValue,writable:!0}):m[y.name]=y.newValue},f=function(m,y){if(y==="__proto__")if(e.call(m,y)){if(l)return l(m,y).value}else return;return m[y]};return Js=function p(){var m,y,h,b,E,w,N=arguments[0],O=1,S=arguments.length,L=!1;for(typeof N=="boolean"&&(L=N,N=arguments[1]||{},O=2),(N==null||typeof N!="object"&&typeof N!="function")&&(N={});Ou.length;let p;f&&u.push(s);try{p=e.apply(this,u)}catch(m){const y=m;if(f&&r)throw y;return s(y)}f||(p&&p.then&&typeof p.then=="function"?p.then(c,s):p instanceof Error?s(p):c(p))}function s(u,...f){r||(r=!0,i(u,...f))}function c(u){s(null,u)}}const Un={basename:j_,dirname:G_,extname:K_,join:W_,sep:"/"};function j_(e,i){if(i!==void 0&&typeof i!="string")throw new TypeError('"ext" argument must be a string');Io(e);let r=0,l=-1,s=e.length,c;if(i===void 0||i.length===0||i.length>e.length){for(;s--;)if(e.codePointAt(s)===47){if(c){r=s+1;break}}else l<0&&(c=!0,l=s+1);return l<0?"":e.slice(r,l)}if(i===e)return"";let u=-1,f=i.length-1;for(;s--;)if(e.codePointAt(s)===47){if(c){r=s+1;break}}else u<0&&(c=!0,u=s+1),f>-1&&(e.codePointAt(s)===i.codePointAt(f--)?f<0&&(l=s):(f=-1,l=u));return r===l?l=u:l<0&&(l=e.length),e.slice(r,l)}function G_(e){if(Io(e),e.length===0)return".";let i=-1,r=e.length,l;for(;--r;)if(e.codePointAt(r)===47){if(l){i=r;break}}else l||(l=!0);return i<0?e.codePointAt(0)===47?"/":".":i===1&&e.codePointAt(0)===47?"//":e.slice(0,i)}function K_(e){Io(e);let i=e.length,r=-1,l=0,s=-1,c=0,u;for(;i--;){const f=e.codePointAt(i);if(f===47){if(u){l=i+1;break}continue}r<0&&(u=!0,r=i+1),f===46?s<0?s=i:c!==1&&(c=1):s>-1&&(c=-1)}return s<0||r<0||c===0||c===1&&s===r-1&&s===l+1?"":e.slice(s,r)}function W_(...e){let i=-1,r;for(;++i0&&e.codePointAt(e.length-1)===47&&(r+="/"),i?"/"+r:r}function q_(e,i){let r="",l=0,s=-1,c=0,u=-1,f,p;for(;++u<=e.length;){if(u2){if(p=r.lastIndexOf("/"),p!==r.length-1){p<0?(r="",l=0):(r=r.slice(0,p),l=r.length-1-r.lastIndexOf("/")),s=u,c=0;continue}}else if(r.length>0){r="",l=0,s=u,c=0;continue}}i&&(r=r.length>0?r+"/..":"..",l=2)}else r.length>0?r+="/"+e.slice(s+1,u):r=e.slice(s+1,u),l=u-s-1;s=u,c=0}else f===46&&c>-1?c++:c=-1}return r}function Io(e){if(typeof e!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}const Y_={cwd:Q_};function Q_(){return"/"}function Su(e){return!!(e!==null&&typeof e=="object"&&"href"in e&&e.href&&"protocol"in e&&e.protocol&&e.auth===void 0)}function X_(e){if(typeof e=="string")e=new URL(e);else if(!Su(e)){const i=new TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw i.code="ERR_INVALID_ARG_TYPE",i}if(e.protocol!=="file:"){const i=new TypeError("The URL must be of scheme file");throw i.code="ERR_INVALID_URL_SCHEME",i}return Z_(e)}function Z_(e){if(e.hostname!==""){const l=new TypeError('File URL host must be "localhost" or empty on darwin');throw l.code="ERR_INVALID_FILE_URL_HOST",l}const i=e.pathname;let r=-1;for(;++r0){let[E,...w]=y;const N=l[b][1];xu(N)&&xu(E)&&(E=eu(!0,N,E)),l[b]=[m,E,...w]}}}}const nv=new ju().freeze();function iu(e,i){if(typeof i!="function")throw new TypeError("Cannot `"+e+"` without `parser`")}function ou(e,i){if(typeof i!="function")throw new TypeError("Cannot `"+e+"` without `compiler`")}function lu(e,i){if(i)throw new Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function tp(e){if(!xu(e)||typeof e.type!="string")throw new TypeError("Expected node, got `"+e+"`")}function np(e,i,r){if(!r)throw new Error("`"+e+"` finished async. Use `"+i+"` instead")}function jl(e){return rv(e)?e:new fm(e)}function rv(e){return!!(e&&typeof e=="object"&&"message"in e&&"messages"in e)}function iv(e){return typeof e=="string"||ov(e)}function ov(e){return!!(e&&typeof e=="object"&&"byteLength"in e&&"byteOffset"in e)}const lv="https://github.com/remarkjs/react-markdown/blob/main/changelog.md",rp=[],ip={allowDangerousHtml:!0},av=/^(https?|ircs?|mailto|xmpp)$/i,sv=[{from:"astPlugins",id:"remove-buggy-html-in-markdown-parser"},{from:"allowDangerousHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"allowNode",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowElement"},{from:"allowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowedElements"},{from:"disallowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"disallowedElements"},{from:"escapeHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"includeElementIndex",id:"#remove-includeelementindex"},{from:"includeNodeIndex",id:"change-includenodeindex-to-includeelementindex"},{from:"linkTarget",id:"remove-linktarget"},{from:"plugins",id:"change-plugins-to-remarkplugins",to:"remarkPlugins"},{from:"rawSourcePos",id:"#remove-rawsourcepos"},{from:"renderers",id:"change-renderers-to-components",to:"components"},{from:"source",id:"change-source-to-children",to:"children"},{from:"sourcePos",id:"#remove-sourcepos"},{from:"transformImageUri",id:"#add-urltransform",to:"urlTransform"},{from:"transformLinkUri",id:"#add-urltransform",to:"urlTransform"}];function uv(e){const i=cv(e),r=dv(e);return fv(i.runSync(i.parse(r),r),e)}function cv(e){const i=e.rehypePlugins||rp,r=e.remarkPlugins||rp,l=e.remarkRehypeOptions?{...e.remarkRehypeOptions,...ip}:ip;return nv().use(GE).use(r).use(F_,l).use(i)}function dv(e){const i=e.children||"",r=new fm;return typeof i=="string"&&(r.value=i),r}function fv(e,i){const r=i.allowedElements,l=i.allowElement,s=i.components,c=i.disallowedElements,u=i.skipHtml,f=i.unwrapDisallowed,p=i.urlTransform||pv;for(const y of sv)Object.hasOwn(i,y.from)&&(""+y.from+(y.to?"use `"+y.to+"` instead":"remove it")+lv+y.id,void 0);return i.className&&(e={type:"element",tagName:"div",properties:{className:i.className},children:e.type==="root"?e.children:[e]}),sa(e,m),Ty(e,{Fragment:H.Fragment,components:s,ignoreInvalidStyle:!0,jsx:H.jsx,jsxs:H.jsxs,passKeys:!0,passNode:!0});function m(y,h,b){if(y.type==="raw"&&b&&typeof h=="number")return u?b.children.splice(h,1):b.children[h]={type:"text",value:y.value},h;if(y.type==="element"){let E;for(E in Qs)if(Object.hasOwn(Qs,E)&&Object.hasOwn(y.properties,E)){const w=y.properties[E],N=Qs[E];(N===null||N.includes(y.tagName))&&(y.properties[E]=p(String(w||""),E,y))}}if(y.type==="element"){let E=r?!r.includes(y.tagName):c?c.includes(y.tagName):!1;if(!E&&l&&typeof h=="number"&&(E=!l(y,h,b)),E&&b&&typeof h=="number")return f&&y.children?b.children.splice(h,1,...y.children):b.children.splice(h,1),h}}}function pv(e){const i=e.indexOf(":"),r=e.indexOf("?"),l=e.indexOf("#"),s=e.indexOf("/");return i===-1||s!==-1&&i>s||r!==-1&&i>r||l!==-1&&i>l||av.test(e.slice(0,i))?e:""}function op(e,i){const r=String(e);if(typeof i!="string")throw new TypeError("Expected character");let l=0,s=r.indexOf(i);for(;s!==-1;)l++,s=r.indexOf(i,s+i.length);return l}function mv(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function gv(e,i,r){const s=Oo((r||{}).ignore||[]),c=hv(i);let u=-1;for(;++u0?{type:"text",value:M}:void 0),M===!1?b.lastIndex=q+1:(w!==q&&L.push({type:"text",value:m.value.slice(w,q)}),Array.isArray(M)?L.push(...M):M&&L.push(M),w=q+P[0].length,S=!0),!b.global)break;P=b.exec(m.value)}return S?(w?\]}]+$/.exec(e);if(!i)return[e,void 0];e=e.slice(0,i.index);let r=i[0],l=r.indexOf(")");const s=op(e,"(");let c=op(e,")");for(;l!==-1&&s>c;)e+=r.slice(0,l+1),r=r.slice(l+1),l=r.indexOf(")"),c++;return[e,r]}function pm(e,i){const r=e.input.charCodeAt(e.index-1);return(e.index===0||Xr(r)||ia(r))&&(!i||r!==47)}mm.peek=Bv;function Ov(){this.buffer()}function Iv(e){this.enter({type:"footnoteReference",identifier:"",label:""},e)}function Mv(){this.buffer()}function Lv(e){this.enter({type:"footnoteDefinition",identifier:"",label:"",children:[]},e)}function Dv(e){const i=this.resume(),r=this.stack[this.stack.length-1];r.type,r.identifier=Cn(this.sliceSerialize(e)).toLowerCase(),r.label=i}function Pv(e){this.exit(e)}function zv(e){const i=this.resume(),r=this.stack[this.stack.length-1];r.type,r.identifier=Cn(this.sliceSerialize(e)).toLowerCase(),r.label=i}function Fv(e){this.exit(e)}function Bv(){return"["}function mm(e,i,r,l){const s=r.createTracker(l);let c=s.move("[^");const u=r.enter("footnoteReference"),f=r.enter("reference");return c+=s.move(r.safe(r.associationId(e),{after:"]",before:c})),f(),u(),c+=s.move("]"),c}function Uv(){return{enter:{gfmFootnoteCallString:Ov,gfmFootnoteCall:Iv,gfmFootnoteDefinitionLabelString:Mv,gfmFootnoteDefinition:Lv},exit:{gfmFootnoteCallString:Dv,gfmFootnoteCall:Pv,gfmFootnoteDefinitionLabelString:zv,gfmFootnoteDefinition:Fv}}}function $v(e){let i=!1;return e&&e.firstLineBlank&&(i=!0),{handlers:{footnoteDefinition:r,footnoteReference:mm},unsafe:[{character:"[",inConstruct:["label","phrasing","reference"]}]};function r(l,s,c,u){const f=c.createTracker(u);let p=f.move("[^");const m=c.enter("footnoteDefinition"),y=c.enter("label");return p+=f.move(c.safe(c.associationId(l),{before:p,after:"]"})),y(),p+=f.move("]:"),l.children&&l.children.length>0&&(f.shift(4),p+=f.move((i?` -`:" ")+c.indentLines(c.containerFlow(l,f.current()),i?gm:Hv))),m(),p}}function Hv(e,i,r){return i===0?e:gm(e,i,r)}function gm(e,i,r){return(r?"":" ")+e}const jv=["autolink","destinationLiteral","destinationRaw","reference","titleQuote","titleApostrophe"];hm.peek=qv;function Gv(){return{canContainEols:["delete"],enter:{strikethrough:Wv},exit:{strikethrough:Vv}}}function Kv(){return{unsafe:[{character:"~",inConstruct:"phrasing",notInConstruct:jv}],handlers:{delete:hm}}}function Wv(e){this.enter({type:"delete",children:[]},e)}function Vv(e){this.exit(e)}function hm(e,i,r,l){const s=r.createTracker(l),c=r.enter("strikethrough");let u=s.move("~~");return u+=r.containerPhrasing(e,{...s.current(),before:u,after:"~"}),u+=s.move("~~"),c(),u}function qv(){return"~"}function Yv(e){return e.length}function Qv(e,i){const r=i||{},l=(r.align||[]).concat(),s=r.stringLength||Yv,c=[],u=[],f=[],p=[];let m=0,y=-1;for(;++ym&&(m=e[y].length);++Sp[S])&&(p[S]=P)}N.push(L)}u[y]=N,f[y]=O}let h=-1;if(typeof l=="object"&&"length"in l)for(;++hp[h]&&(p[h]=L),E[h]=L),b[h]=P}u.splice(1,0,b),f.splice(1,0,E),y=-1;const w=[];for(;++y "),c.shift(2);const u=r.indentLines(r.containerFlow(e,c.current()),Jv);return s(),u}function Jv(e,i,r){return">"+(r?"":" ")+e}function ek(e,i){return ap(e,i.inConstruct,!0)&&!ap(e,i.notInConstruct,!1)}function ap(e,i,r){if(typeof i=="string"&&(i=[i]),!i||i.length===0)return r;let l=-1;for(;++lu&&(u=c):c=1,s=l+i.length,l=r.indexOf(i,s);return u}function nk(e,i){return!!(i.options.fences===!1&&e.value&&!e.lang&&/[^ \r\n]/.test(e.value)&&!/^[\t ]*(?:[\r\n]|$)|(?:^|[\r\n])[\t ]*$/.test(e.value))}function rk(e){const i=e.options.fence||"`";if(i!=="`"&&i!=="~")throw new Error("Cannot serialize code with `"+i+"` for `options.fence`, expected `` ` `` or `~`");return i}function ik(e,i,r,l){const s=rk(r),c=e.value||"",u=s==="`"?"GraveAccent":"Tilde";if(nk(e,r)){const h=r.enter("codeIndented"),b=r.indentLines(c,ok);return h(),b}const f=r.createTracker(l),p=s.repeat(Math.max(tk(c,s)+1,3)),m=r.enter("codeFenced");let y=f.move(p);if(e.lang){const h=r.enter(`codeFencedLang${u}`);y+=f.move(r.safe(e.lang,{before:y,after:" ",encode:["`"],...f.current()})),h()}if(e.lang&&e.meta){const h=r.enter(`codeFencedMeta${u}`);y+=f.move(" "),y+=f.move(r.safe(e.meta,{before:y,after:` -`,encode:["`"],...f.current()})),h()}return y+=f.move(` -`),c&&(y+=f.move(c+` -`)),y+=f.move(p),m(),y}function ok(e,i,r){return(r?"":" ")+e}function Gu(e){const i=e.options.quote||'"';if(i!=='"'&&i!=="'")throw new Error("Cannot serialize title with `"+i+"` for `options.quote`, expected `\"`, or `'`");return i}function lk(e,i,r,l){const s=Gu(r),c=s==='"'?"Quote":"Apostrophe",u=r.enter("definition");let f=r.enter("label");const p=r.createTracker(l);let m=p.move("[");return m+=p.move(r.safe(r.associationId(e),{before:m,after:"]",...p.current()})),m+=p.move("]: "),f(),!e.url||/[\0- \u007F]/.test(e.url)?(f=r.enter("destinationLiteral"),m+=p.move("<"),m+=p.move(r.safe(e.url,{before:m,after:">",...p.current()})),m+=p.move(">")):(f=r.enter("destinationRaw"),m+=p.move(r.safe(e.url,{before:m,after:e.title?" ":` -`,...p.current()}))),f(),e.title&&(f=r.enter(`title${c}`),m+=p.move(" "+s),m+=p.move(r.safe(e.title,{before:m,after:s,...p.current()})),m+=p.move(s),f()),u(),m}function ak(e){const i=e.options.emphasis||"*";if(i!=="*"&&i!=="_")throw new Error("Cannot serialize emphasis with `"+i+"` for `options.emphasis`, expected `*`, or `_`");return i}function To(e){return"&#x"+e.toString(16).toUpperCase()+";"}function ea(e,i,r){const l=Ii(e),s=Ii(i);return l===void 0?s===void 0?r==="_"?{inside:!0,outside:!0}:{inside:!1,outside:!1}:s===1?{inside:!0,outside:!0}:{inside:!1,outside:!0}:l===1?s===void 0?{inside:!1,outside:!1}:s===1?{inside:!0,outside:!0}:{inside:!1,outside:!1}:s===void 0?{inside:!1,outside:!1}:s===1?{inside:!0,outside:!1}:{inside:!1,outside:!1}}ym.peek=sk;function ym(e,i,r,l){const s=ak(r),c=r.enter("emphasis"),u=r.createTracker(l),f=u.move(s);let p=u.move(r.containerPhrasing(e,{after:s,before:f,...u.current()}));const m=p.charCodeAt(0),y=ea(l.before.charCodeAt(l.before.length-1),m,s);y.inside&&(p=To(m)+p.slice(1));const h=p.charCodeAt(p.length-1),b=ea(l.after.charCodeAt(0),h,s);b.inside&&(p=p.slice(0,-1)+To(h));const E=u.move(s);return c(),r.attentionEncodeSurroundingInfo={after:b.outside,before:y.outside},f+p+E}function sk(e,i,r){return r.options.emphasis||"*"}function uk(e,i){let r=!1;return sa(e,function(l){if("value"in l&&/\r?\n|\r/.test(l.value)||l.type==="break")return r=!0,ku}),!!((!e.depth||e.depth<3)&&Pu(e)&&(i.options.setext||r))}function ck(e,i,r,l){const s=Math.max(Math.min(6,e.depth||1),1),c=r.createTracker(l);if(uk(e,r)){const y=r.enter("headingSetext"),h=r.enter("phrasing"),b=r.containerPhrasing(e,{...c.current(),before:` -`,after:` -`});return h(),y(),b+` -`+(s===1?"=":"-").repeat(b.length-(Math.max(b.lastIndexOf("\r"),b.lastIndexOf(` -`))+1))}const u="#".repeat(s),f=r.enter("headingAtx"),p=r.enter("phrasing");c.move(u+" ");let m=r.containerPhrasing(e,{before:"# ",after:` -`,...c.current()});return/^[\t ]/.test(m)&&(m=To(m.charCodeAt(0))+m.slice(1)),m=m?u+" "+m:u,r.options.closeAtx&&(m+=" "+u),p(),f(),m}bm.peek=dk;function bm(e){return e.value||""}function dk(){return"<"}Em.peek=fk;function Em(e,i,r,l){const s=Gu(r),c=s==='"'?"Quote":"Apostrophe",u=r.enter("image");let f=r.enter("label");const p=r.createTracker(l);let m=p.move("![");return m+=p.move(r.safe(e.alt,{before:m,after:"]",...p.current()})),m+=p.move("]("),f(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(f=r.enter("destinationLiteral"),m+=p.move("<"),m+=p.move(r.safe(e.url,{before:m,after:">",...p.current()})),m+=p.move(">")):(f=r.enter("destinationRaw"),m+=p.move(r.safe(e.url,{before:m,after:e.title?" ":")",...p.current()}))),f(),e.title&&(f=r.enter(`title${c}`),m+=p.move(" "+s),m+=p.move(r.safe(e.title,{before:m,after:s,...p.current()})),m+=p.move(s),f()),m+=p.move(")"),u(),m}function fk(){return"!"}_m.peek=pk;function _m(e,i,r,l){const s=e.referenceType,c=r.enter("imageReference");let u=r.enter("label");const f=r.createTracker(l);let p=f.move("![");const m=r.safe(e.alt,{before:p,after:"]",...f.current()});p+=f.move(m+"]["),u();const y=r.stack;r.stack=[],u=r.enter("reference");const h=r.safe(r.associationId(e),{before:p,after:"]",...f.current()});return u(),r.stack=y,c(),s==="full"||!m||m!==h?p+=f.move(h+"]"):s==="shortcut"?p=p.slice(0,-1):p+=f.move("]"),p}function pk(){return"!"}vm.peek=mk;function vm(e,i,r){let l=e.value||"",s="`",c=-1;for(;new RegExp("(^|[^`])"+s+"([^`]|$)").test(l);)s+="`";for(/[^ \r\n]/.test(l)&&(/^[ \r\n]/.test(l)&&/[ \r\n]$/.test(l)||/^`|`$/.test(l))&&(l=" "+l+" ");++c\u007F]/.test(e.url))}wm.peek=gk;function wm(e,i,r,l){const s=Gu(r),c=s==='"'?"Quote":"Apostrophe",u=r.createTracker(l);let f,p;if(km(e,r)){const y=r.stack;r.stack=[],f=r.enter("autolink");let h=u.move("<");return h+=u.move(r.containerPhrasing(e,{before:h,after:">",...u.current()})),h+=u.move(">"),f(),r.stack=y,h}f=r.enter("link"),p=r.enter("label");let m=u.move("[");return m+=u.move(r.containerPhrasing(e,{before:m,after:"](",...u.current()})),m+=u.move("]("),p(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(p=r.enter("destinationLiteral"),m+=u.move("<"),m+=u.move(r.safe(e.url,{before:m,after:">",...u.current()})),m+=u.move(">")):(p=r.enter("destinationRaw"),m+=u.move(r.safe(e.url,{before:m,after:e.title?" ":")",...u.current()}))),p(),e.title&&(p=r.enter(`title${c}`),m+=u.move(" "+s),m+=u.move(r.safe(e.title,{before:m,after:s,...u.current()})),m+=u.move(s),p()),m+=u.move(")"),f(),m}function gk(e,i,r){return km(e,r)?"<":"["}xm.peek=hk;function xm(e,i,r,l){const s=e.referenceType,c=r.enter("linkReference");let u=r.enter("label");const f=r.createTracker(l);let p=f.move("[");const m=r.containerPhrasing(e,{before:p,after:"]",...f.current()});p+=f.move(m+"]["),u();const y=r.stack;r.stack=[],u=r.enter("reference");const h=r.safe(r.associationId(e),{before:p,after:"]",...f.current()});return u(),r.stack=y,c(),s==="full"||!m||m!==h?p+=f.move(h+"]"):s==="shortcut"?p=p.slice(0,-1):p+=f.move("]"),p}function hk(){return"["}function Ku(e){const i=e.options.bullet||"*";if(i!=="*"&&i!=="+"&&i!=="-")throw new Error("Cannot serialize items with `"+i+"` for `options.bullet`, expected `*`, `+`, or `-`");return i}function yk(e){const i=Ku(e),r=e.options.bulletOther;if(!r)return i==="*"?"-":"*";if(r!=="*"&&r!=="+"&&r!=="-")throw new Error("Cannot serialize items with `"+r+"` for `options.bulletOther`, expected `*`, `+`, or `-`");if(r===i)throw new Error("Expected `bullet` (`"+i+"`) and `bulletOther` (`"+r+"`) to be different");return r}function bk(e){const i=e.options.bulletOrdered||".";if(i!=="."&&i!==")")throw new Error("Cannot serialize items with `"+i+"` for `options.bulletOrdered`, expected `.` or `)`");return i}function Sm(e){const i=e.options.rule||"*";if(i!=="*"&&i!=="-"&&i!=="_")throw new Error("Cannot serialize rules with `"+i+"` for `options.rule`, expected `*`, `-`, or `_`");return i}function Ek(e,i,r,l){const s=r.enter("list"),c=r.bulletCurrent;let u=e.ordered?bk(r):Ku(r);const f=e.ordered?u==="."?")":".":yk(r);let p=i&&r.bulletLastUsed?u===r.bulletLastUsed:!1;if(!e.ordered){const y=e.children?e.children[0]:void 0;if((u==="*"||u==="-")&&y&&(!y.children||!y.children[0])&&r.stack[r.stack.length-1]==="list"&&r.stack[r.stack.length-2]==="listItem"&&r.stack[r.stack.length-3]==="list"&&r.stack[r.stack.length-4]==="listItem"&&r.indexStack[r.indexStack.length-1]===0&&r.indexStack[r.indexStack.length-2]===0&&r.indexStack[r.indexStack.length-3]===0&&(p=!0),Sm(r)===u&&y){let h=-1;for(;++h-1?i.start:1)+(r.options.incrementListMarker===!1?0:i.children.indexOf(e))+c);let u=c.length+1;(s==="tab"||s==="mixed"&&(i&&i.type==="list"&&i.spread||e.spread))&&(u=Math.ceil(u/4)*4);const f=r.createTracker(l);f.move(c+" ".repeat(u-c.length)),f.shift(u);const p=r.enter("listItem"),m=r.indentLines(r.containerFlow(e,f.current()),y);return p(),m;function y(h,b,E){return b?(E?"":" ".repeat(u))+h:(E?c:c+" ".repeat(u-c.length))+h}}function kk(e,i,r,l){const s=r.enter("paragraph"),c=r.enter("phrasing"),u=r.containerPhrasing(e,l);return c(),s(),u}const wk=Oo(["break","delete","emphasis","footnote","footnoteReference","image","imageReference","inlineCode","inlineMath","link","linkReference","mdxJsxTextElement","mdxTextExpression","strong","text","textDirective"]);function xk(e,i,r,l){return(e.children.some(function(u){return wk(u)})?r.containerPhrasing:r.containerFlow).call(r,e,l)}function Sk(e){const i=e.options.strong||"*";if(i!=="*"&&i!=="_")throw new Error("Cannot serialize strong with `"+i+"` for `options.strong`, expected `*`, or `_`");return i}Nm.peek=Nk;function Nm(e,i,r,l){const s=Sk(r),c=r.enter("strong"),u=r.createTracker(l),f=u.move(s+s);let p=u.move(r.containerPhrasing(e,{after:s,before:f,...u.current()}));const m=p.charCodeAt(0),y=ea(l.before.charCodeAt(l.before.length-1),m,s);y.inside&&(p=To(m)+p.slice(1));const h=p.charCodeAt(p.length-1),b=ea(l.after.charCodeAt(0),h,s);b.inside&&(p=p.slice(0,-1)+To(h));const E=u.move(s+s);return c(),r.attentionEncodeSurroundingInfo={after:b.outside,before:y.outside},f+p+E}function Nk(e,i,r){return r.options.strong||"*"}function Tk(e,i,r,l){return r.safe(e.value,l)}function Ck(e){const i=e.options.ruleRepetition||3;if(i<3)throw new Error("Cannot serialize rules with repetition `"+i+"` for `options.ruleRepetition`, expected `3` or more");return i}function Ak(e,i,r){const l=(Sm(r)+(r.options.ruleSpaces?" ":"")).repeat(Ck(r));return r.options.ruleSpaces?l.slice(0,-1):l}const Tm={blockquote:Zv,break:sp,code:ik,definition:lk,emphasis:ym,hardBreak:sp,heading:ck,html:bm,image:Em,imageReference:_m,inlineCode:vm,link:wm,linkReference:xm,list:Ek,listItem:vk,paragraph:kk,root:xk,strong:Nm,text:Tk,thematicBreak:Ak};function Rk(){return{enter:{table:Ok,tableData:up,tableHeader:up,tableRow:Mk},exit:{codeText:Lk,table:Ik,tableData:cu,tableHeader:cu,tableRow:cu}}}function Ok(e){const i=e._align;this.enter({type:"table",align:i.map(function(r){return r==="none"?null:r}),children:[]},e),this.data.inTable=!0}function Ik(e){this.exit(e),this.data.inTable=void 0}function Mk(e){this.enter({type:"tableRow",children:[]},e)}function cu(e){this.exit(e)}function up(e){this.enter({type:"tableCell",children:[]},e)}function Lk(e){let i=this.resume();this.data.inTable&&(i=i.replace(/\\([\\|])/g,Dk));const r=this.stack[this.stack.length-1];r.type,r.value=i,this.exit(e)}function Dk(e,i){return i==="|"?i:e}function Pk(e){const i=e||{},r=i.tableCellPadding,l=i.tablePipeAlign,s=i.stringLength,c=r?" ":"|";return{unsafe:[{character:"\r",inConstruct:"tableCell"},{character:` -`,inConstruct:"tableCell"},{atBreak:!0,character:"|",after:"[ :-]"},{character:"|",inConstruct:"tableCell"},{atBreak:!0,character:":",after:"-"},{atBreak:!0,character:"-",after:"[:|-]"}],handlers:{inlineCode:b,table:u,tableCell:p,tableRow:f}};function u(E,w,N,O){return m(y(E,N,O),E.align)}function f(E,w,N,O){const S=h(E,N,O),L=m([S]);return L.slice(0,L.indexOf(` -`))}function p(E,w,N,O){const S=N.enter("tableCell"),L=N.enter("phrasing"),P=N.containerPhrasing(E,{...O,before:c,after:c});return L(),S(),P}function m(E,w){return Qv(E,{align:w,alignDelimiters:l,padding:r,stringLength:s})}function y(E,w,N){const O=E.children;let S=-1;const L=[],P=w.enter("table");for(;++S0&&!r&&(e[e.length-1][1]._gfmAutolinkLiteralWalkedInto=!0),r}const ew={tokenize:sw,partial:!0};function tw(){return{document:{91:{name:"gfmFootnoteDefinition",tokenize:ow,continuation:{tokenize:lw},exit:aw}},text:{91:{name:"gfmFootnoteCall",tokenize:iw},93:{name:"gfmPotentialFootnoteCall",add:"after",tokenize:nw,resolveTo:rw}}}}function nw(e,i,r){const l=this;let s=l.events.length;const c=l.parser.gfmFootnotes||(l.parser.gfmFootnotes=[]);let u;for(;s--;){const p=l.events[s][1];if(p.type==="labelImage"){u=p;break}if(p.type==="gfmFootnoteCall"||p.type==="labelLink"||p.type==="label"||p.type==="image"||p.type==="link")break}return f;function f(p){if(!u||!u._balanced)return r(p);const m=Cn(l.sliceSerialize({start:u.end,end:l.now()}));return m.codePointAt(0)!==94||!c.includes(m.slice(1))?r(p):(e.enter("gfmFootnoteCallLabelMarker"),e.consume(p),e.exit("gfmFootnoteCallLabelMarker"),i(p))}}function rw(e,i){let r=e.length;for(;r--;)if(e[r][1].type==="labelImage"&&e[r][0]==="enter"){e[r][1];break}e[r+1][1].type="data",e[r+3][1].type="gfmFootnoteCallLabelMarker";const l={type:"gfmFootnoteCall",start:Object.assign({},e[r+3][1].start),end:Object.assign({},e[e.length-1][1].end)},s={type:"gfmFootnoteCallMarker",start:Object.assign({},e[r+3][1].end),end:Object.assign({},e[r+3][1].end)};s.end.column++,s.end.offset++,s.end._bufferIndex++;const c={type:"gfmFootnoteCallString",start:Object.assign({},s.end),end:Object.assign({},e[e.length-1][1].start)},u={type:"chunkString",contentType:"string",start:Object.assign({},c.start),end:Object.assign({},c.end)},f=[e[r+1],e[r+2],["enter",l,i],e[r+3],e[r+4],["enter",s,i],["exit",s,i],["enter",c,i],["enter",u,i],["exit",u,i],["exit",c,i],e[e.length-2],e[e.length-1],["exit",l,i]];return e.splice(r,e.length-r+1,...f),e}function iw(e,i,r){const l=this,s=l.parser.gfmFootnotes||(l.parser.gfmFootnotes=[]);let c=0,u;return f;function f(h){return e.enter("gfmFootnoteCall"),e.enter("gfmFootnoteCallLabelMarker"),e.consume(h),e.exit("gfmFootnoteCallLabelMarker"),p}function p(h){return h!==94?r(h):(e.enter("gfmFootnoteCallMarker"),e.consume(h),e.exit("gfmFootnoteCallMarker"),e.enter("gfmFootnoteCallString"),e.enter("chunkString").contentType="string",m)}function m(h){if(c>999||h===93&&!u||h===null||h===91||et(h))return r(h);if(h===93){e.exit("chunkString");const b=e.exit("gfmFootnoteCallString");return s.includes(Cn(l.sliceSerialize(b)))?(e.enter("gfmFootnoteCallLabelMarker"),e.consume(h),e.exit("gfmFootnoteCallLabelMarker"),e.exit("gfmFootnoteCall"),i):r(h)}return et(h)||(u=!0),c++,e.consume(h),h===92?y:m}function y(h){return h===91||h===92||h===93?(e.consume(h),c++,m):m(h)}}function ow(e,i,r){const l=this,s=l.parser.gfmFootnotes||(l.parser.gfmFootnotes=[]);let c,u=0,f;return p;function p(w){return e.enter("gfmFootnoteDefinition")._container=!0,e.enter("gfmFootnoteDefinitionLabel"),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(w),e.exit("gfmFootnoteDefinitionLabelMarker"),m}function m(w){return w===94?(e.enter("gfmFootnoteDefinitionMarker"),e.consume(w),e.exit("gfmFootnoteDefinitionMarker"),e.enter("gfmFootnoteDefinitionLabelString"),e.enter("chunkString").contentType="string",y):r(w)}function y(w){if(u>999||w===93&&!f||w===null||w===91||et(w))return r(w);if(w===93){e.exit("chunkString");const N=e.exit("gfmFootnoteDefinitionLabelString");return c=Cn(l.sliceSerialize(N)),e.enter("gfmFootnoteDefinitionLabelMarker"),e.consume(w),e.exit("gfmFootnoteDefinitionLabelMarker"),e.exit("gfmFootnoteDefinitionLabel"),b}return et(w)||(f=!0),u++,e.consume(w),w===92?h:y}function h(w){return w===91||w===92||w===93?(e.consume(w),u++,y):y(w)}function b(w){return w===58?(e.enter("definitionMarker"),e.consume(w),e.exit("definitionMarker"),s.includes(c)||s.push(c),We(e,E,"gfmFootnoteDefinitionWhitespace")):r(w)}function E(w){return i(w)}}function lw(e,i,r){return e.check(Ro,i,e.attempt(ew,i,r))}function aw(e){e.exit("gfmFootnoteDefinition")}function sw(e,i,r){const l=this;return We(e,s,"gfmFootnoteDefinitionIndent",5);function s(c){const u=l.events[l.events.length-1];return u&&u[1].type==="gfmFootnoteDefinitionIndent"&&u[2].sliceSerialize(u[1],!0).length===4?i(c):r(c)}}function uw(e){let r=(e||{}).singleTilde;const l={name:"strikethrough",tokenize:c,resolveAll:s};return r==null&&(r=!0),{text:{126:l},insideSpan:{null:[l]},attentionMarkers:{null:[126]}};function s(u,f){let p=-1;for(;++p1?p(w):(u.consume(w),h++,E);if(h<2&&!r)return p(w);const O=u.exit("strikethroughSequenceTemporary"),S=Ii(w);return O._open=!S||S===2&&!!N,O._close=!N||N===2&&!!S,f(w)}}}class cw{constructor(){this.map=[]}add(i,r,l){dw(this,i,r,l)}consume(i){if(this.map.sort(function(c,u){return c[0]-u[0]}),this.map.length===0)return;let r=this.map.length;const l=[];for(;r>0;)r-=1,l.push(i.slice(this.map[r][0]+this.map[r][1]),this.map[r][2]),i.length=this.map[r][0];l.push(i.slice()),i.length=0;let s=l.pop();for(;s;){for(const c of s)i.push(c);s=l.pop()}this.map.length=0}}function dw(e,i,r,l){let s=0;if(!(r===0&&l.length===0)){for(;s-1;){const Q=l.events[j][1].type;if(Q==="lineEnding"||Q==="linePrefix")j--;else break}const U=j>-1?l.events[j][1].type:null,J=U==="tableHead"||U==="tableRow"?M:p;return J===M&&l.parser.lazy[l.now().line]?r(A):J(A)}function p(A){return e.enter("tableHead"),e.enter("tableRow"),m(A)}function m(A){return A===124||(u=!0,c+=1),y(A)}function y(A){return A===null?r(A):Te(A)?c>1?(c=0,l.interrupt=!0,e.exit("tableRow"),e.enter("lineEnding"),e.consume(A),e.exit("lineEnding"),E):r(A):Ue(A)?We(e,y,"whitespace")(A):(c+=1,u&&(u=!1,s+=1),A===124?(e.enter("tableCellDivider"),e.consume(A),e.exit("tableCellDivider"),u=!0,y):(e.enter("data"),h(A)))}function h(A){return A===null||A===124||et(A)?(e.exit("data"),y(A)):(e.consume(A),A===92?b:h)}function b(A){return A===92||A===124?(e.consume(A),h):h(A)}function E(A){return l.interrupt=!1,l.parser.lazy[l.now().line]?r(A):(e.enter("tableDelimiterRow"),u=!1,Ue(A)?We(e,w,"linePrefix",l.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(A):w(A))}function w(A){return A===45||A===58?O(A):A===124?(u=!0,e.enter("tableCellDivider"),e.consume(A),e.exit("tableCellDivider"),N):X(A)}function N(A){return Ue(A)?We(e,O,"whitespace")(A):O(A)}function O(A){return A===58?(c+=1,u=!0,e.enter("tableDelimiterMarker"),e.consume(A),e.exit("tableDelimiterMarker"),S):A===45?(c+=1,S(A)):A===null||Te(A)?q(A):X(A)}function S(A){return A===45?(e.enter("tableDelimiterFiller"),L(A)):X(A)}function L(A){return A===45?(e.consume(A),L):A===58?(u=!0,e.exit("tableDelimiterFiller"),e.enter("tableDelimiterMarker"),e.consume(A),e.exit("tableDelimiterMarker"),P):(e.exit("tableDelimiterFiller"),P(A))}function P(A){return Ue(A)?We(e,q,"whitespace")(A):q(A)}function q(A){return A===124?w(A):A===null||Te(A)?!u||s!==c?X(A):(e.exit("tableDelimiterRow"),e.exit("tableHead"),i(A)):X(A)}function X(A){return r(A)}function M(A){return e.enter("tableRow"),le(A)}function le(A){return A===124?(e.enter("tableCellDivider"),e.consume(A),e.exit("tableCellDivider"),le):A===null||Te(A)?(e.exit("tableRow"),i(A)):Ue(A)?We(e,le,"whitespace")(A):(e.enter("data"),de(A))}function de(A){return A===null||A===124||et(A)?(e.exit("data"),le(A)):(e.consume(A),A===92?K:de)}function K(A){return A===92||A===124?(e.consume(A),de):de(A)}}function gw(e,i){let r=-1,l=!0,s=0,c=[0,0,0,0],u=[0,0,0,0],f=!1,p=0,m,y,h;const b=new cw;for(;++rr[2]+1){const w=r[2]+1,N=r[3]-r[2]-1;e.add(w,N,[])}}e.add(r[3]+1,0,[["exit",h,i]])}return s!==void 0&&(c.end=Object.assign({},Ai(i.events,s)),e.add(s,0,[["exit",c,i]]),c=void 0),c}function dp(e,i,r,l,s){const c=[],u=Ai(i.events,r);s&&(s.end=Object.assign({},u),c.push(["exit",s,i])),l.end=Object.assign({},u),c.push(["exit",l,i]),e.add(r+1,0,c)}function Ai(e,i){const r=e[i],l=r[0]==="enter"?"start":"end";return r[1][l]}const hw={name:"tasklistCheck",tokenize:bw};function yw(){return{text:{91:hw}}}function bw(e,i,r){const l=this;return s;function s(p){return l.previous!==null||!l._gfmTasklistFirstContentOfListItem?r(p):(e.enter("taskListCheck"),e.enter("taskListCheckMarker"),e.consume(p),e.exit("taskListCheckMarker"),c)}function c(p){return et(p)?(e.enter("taskListCheckValueUnchecked"),e.consume(p),e.exit("taskListCheckValueUnchecked"),u):p===88||p===120?(e.enter("taskListCheckValueChecked"),e.consume(p),e.exit("taskListCheckValueChecked"),u):r(p)}function u(p){return p===93?(e.enter("taskListCheckMarker"),e.consume(p),e.exit("taskListCheckMarker"),e.exit("taskListCheck"),f):r(p)}function f(p){return Te(p)?i(p):Ue(p)?e.check({tokenize:Ew},i,r)(p):r(p)}}function Ew(e,i,r){return We(e,l,"whitespace");function l(s){return s===null?r(s):i(s)}}function _w(e){return Kp([Kk(),tw(),uw(e),pw(),yw()])}const vw={};function kw(e){const i=this,r=e||vw,l=i.data(),s=l.micromarkExtensions||(l.micromarkExtensions=[]),c=l.fromMarkdownExtensions||(l.fromMarkdownExtensions=[]),u=l.toMarkdownExtensions||(l.toMarkdownExtensions=[]);s.push(_w(r)),c.push($k()),u.push(Hk(r))}const fp=(function(e,i,r){const l=Oo(r);if(!e||!e.type||!e.children)throw new Error("Expected parent node");if(typeof i=="number"){if(i<0||i===Number.POSITIVE_INFINITY)throw new Error("Expected positive finite number as index")}else if(i=e.children.indexOf(i),i<0)throw new Error("Expected child node or index");for(;++im&&(m=y):y&&(m!==void 0&&m>-1&&p.push(` -`.repeat(m)||" "),m=-1,p.push(y))}return p.join("")}function zm(e,i,r){return e.type==="element"?Rw(e,i,r):e.type==="text"?r.whitespace==="normal"?Fm(e,r):Ow(e):[]}function Rw(e,i,r){const l=Bm(e,r),s=e.children||[];let c=-1,u=[];if(Cw(e))return u;let f,p;for(Tu(e)||hp(e)&&fp(i,e,hp)?p=` -`:Tw(e)?(f=2,p=2):Pm(e)&&(f=1,p=1);++c]+>")+")",f={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},m={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+"\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"+"|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},y={className:"number",variants:[{begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)"},{begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)"}],relevance:0},h={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(m,{className:"string"}),{className:"string",begin:/<.*?>/},r,e.C_BLOCK_COMMENT_MODE]},b={className:"title",begin:i.optional(s)+e.IDENT_RE,relevance:0},E=i.optional(s)+e.IDENT_RE+"\\s*\\(",w=["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],N=["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],O=["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","flat_map","flat_set","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"],S=["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"],q={type:N,keyword:w,literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:O},X={className:"function.dispatch",relevance:0,keywords:{_hint:S},begin:i.concat(/\b/,`(?!${w.join("|")})`,e.IDENT_RE,i.lookahead(/(<[^<>]+>|)\s*\(/))},M=[X,h,f,r,e.C_BLOCK_COMMENT_MODE,y,m],le={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:q,contains:M.concat([{begin:/\(/,end:/\)/,keywords:q,contains:M.concat(["self"]),relevance:0}]),relevance:0},de={className:"function",begin:"("+u+"[\\*&\\s]+)+"+E,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:q,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:l,keywords:q,relevance:0},{begin:E,returnBegin:!0,contains:[b],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[m,y]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:q,relevance:0,contains:[r,e.C_BLOCK_COMMENT_MODE,m,y,f,{begin:/\(/,end:/\)/,keywords:q,relevance:0,contains:["self",r,e.C_BLOCK_COMMENT_MODE,m,y,f]}]},f,r,e.C_BLOCK_COMMENT_MODE,h]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:q,illegal:"",keywords:q,contains:["self",f]},{begin:e.IDENT_RE+"::",keywords:q},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:"keyword",3:"title.class"}}])}}function zw(e){const i={type:["boolean","byte","word","String"],built_in:["KeyboardController","MouseController","SoftwareSerial","EthernetServer","EthernetClient","LiquidCrystal","RobotControl","GSMVoiceCall","EthernetUDP","EsploraTFT","HttpClient","RobotMotor","WiFiClient","GSMScanner","FileSystem","Scheduler","GSMServer","YunClient","YunServer","IPAddress","GSMClient","GSMModem","Keyboard","Ethernet","Console","GSMBand","Esplora","Stepper","Process","WiFiUDP","GSM_SMS","Mailbox","USBHost","Firmata","PImage","Client","Server","GSMPIN","FileIO","Bridge","Serial","EEPROM","Stream","Mouse","Audio","Servo","File","Task","GPRS","WiFi","Wire","TFT","GSM","SPI","SD"],_hints:["setup","loop","runShellCommandAsynchronously","analogWriteResolution","retrieveCallingNumber","printFirmwareVersion","analogReadResolution","sendDigitalPortPair","noListenOnLocalhost","readJoystickButton","setFirmwareVersion","readJoystickSwitch","scrollDisplayRight","getVoiceCallStatus","scrollDisplayLeft","writeMicroseconds","delayMicroseconds","beginTransmission","getSignalStrength","runAsynchronously","getAsynchronously","listenOnLocalhost","getCurrentCarrier","readAccelerometer","messageAvailable","sendDigitalPorts","lineFollowConfig","countryNameWrite","runShellCommand","readStringUntil","rewindDirectory","readTemperature","setClockDivider","readLightSensor","endTransmission","analogReference","detachInterrupt","countryNameRead","attachInterrupt","encryptionType","readBytesUntil","robotNameWrite","readMicrophone","robotNameRead","cityNameWrite","userNameWrite","readJoystickY","readJoystickX","mouseReleased","openNextFile","scanNetworks","noInterrupts","digitalWrite","beginSpeaker","mousePressed","isActionDone","mouseDragged","displayLogos","noAutoscroll","addParameter","remoteNumber","getModifiers","keyboardRead","userNameRead","waitContinue","processInput","parseCommand","printVersion","readNetworks","writeMessage","blinkVersion","cityNameRead","readMessage","setDataMode","parsePacket","isListening","setBitOrder","beginPacket","isDirectory","motorsWrite","drawCompass","digitalRead","clearScreen","serialEvent","rightToLeft","setTextSize","leftToRight","requestFrom","keyReleased","compassRead","analogWrite","interrupts","WiFiServer","disconnect","playMelody","parseFloat","autoscroll","getPINUsed","setPINUsed","setTimeout","sendAnalog","readSlider","analogRead","beginWrite","createChar","motorsStop","keyPressed","tempoWrite","readButton","subnetMask","debugPrint","macAddress","writeGreen","randomSeed","attachGPRS","readString","sendString","remotePort","releaseAll","mouseMoved","background","getXChange","getYChange","answerCall","getResult","voiceCall","endPacket","constrain","getSocket","writeJSON","getButton","available","connected","findUntil","readBytes","exitValue","readGreen","writeBlue","startLoop","IPAddress","isPressed","sendSysex","pauseMode","gatewayIP","setCursor","getOemKey","tuneWrite","noDisplay","loadImage","switchPIN","onRequest","onReceive","changePIN","playFile","noBuffer","parseInt","overflow","checkPIN","knobRead","beginTFT","bitClear","updateIR","bitWrite","position","writeRGB","highByte","writeRed","setSpeed","readBlue","noStroke","remoteIP","transfer","shutdown","hangCall","beginSMS","endWrite","attached","maintain","noCursor","checkReg","checkPUK","shiftOut","isValid","shiftIn","pulseIn","connect","println","localIP","pinMode","getIMEI","display","noBlink","process","getBand","running","beginSD","drawBMP","lowByte","setBand","release","bitRead","prepare","pointTo","readRed","setMode","noFill","remove","listen","stroke","detach","attach","noTone","exists","buffer","height","bitSet","circle","config","cursor","random","IRread","setDNS","endSMS","getKey","micros","millis","begin","print","write","ready","flush","width","isPIN","blink","clear","press","mkdir","rmdir","close","point","yield","image","BSSID","click","delay","read","text","move","peek","beep","rect","line","open","seek","fill","size","turn","stop","home","find","step","tone","sqrt","RSSI","SSID","end","bit","tan","cos","sin","pow","map","abs","max","min","get","run","put"],literal:["DIGITAL_MESSAGE","FIRMATA_STRING","ANALOG_MESSAGE","REPORT_DIGITAL","REPORT_ANALOG","INPUT_PULLUP","SET_PIN_MODE","INTERNAL2V56","SYSTEM_RESET","LED_BUILTIN","INTERNAL1V1","SYSEX_START","INTERNAL","EXTERNAL","DEFAULT","OUTPUT","INPUT","HIGH","LOW"]},r=Pw(e),l=r.keywords;return l.type=[...l.type,...i.type],l.literal=[...l.literal,...i.literal],l.built_in=[...l.built_in,...i.built_in],l._hints=i._hints,r.name="Arduino",r.aliases=["ino"],r.supersetOf="cpp",r}function Fw(e){const i=e.regex,r={},l={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[r]}]};Object.assign(r,{className:"variable",variants:[{begin:i.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},l]});const s={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},c=e.inherit(e.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),u={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},f={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,r,s]};s.contains.push(f);const p={match:/\\"/},m={className:"string",begin:/'/,end:/'/},y={match:/\\'/},h={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,r]},b=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],E=e.SHEBANG({binary:`(${b.join("|")})`,relevance:10}),w={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},N=["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],O=["true","false"],S={match:/(\/[a-z._-]+)+/},L=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],P=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias"],q=["autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp"],X=["chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"];return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:N,literal:O,built_in:[...L,...P,"set","shopt",...q,...X]},contains:[E,e.SHEBANG(),w,h,c,u,S,f,p,m,y,r]}}function Bw(e){const i=e.regex,r=e.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),l="decltype\\(auto\\)",s="[a-zA-Z_]\\w*::",u="("+l+"|"+i.optional(s)+"[a-zA-Z_]\\w*"+i.optional("<[^<>]+>")+")",f={className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{match:/\batomic_[a-z]{3,6}\b/}]},m={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+"\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"+"|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},y={className:"number",variants:[{match:/\b(0b[01']+)/},{match:/(-?)\b([\d']+(\.[\d']*)?|\.[\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)/},{match:/(-?)\b(0[xX][a-fA-F0-9]+(?:'[a-fA-F0-9]+)*(?:\.[a-fA-F0-9]*(?:'[a-fA-F0-9]*)*)?(?:[pP][-+]?[0-9]+)?(l|L)?(u|U)?)/},{match:/(-?)\b\d+(?:'\d+)*(?:\.\d*(?:'\d*)*)?(?:[eE][-+]?\d+)?/}],relevance:0},h={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef elifdef elifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(m,{className:"string"}),{className:"string",begin:/<.*?>/},r,e.C_BLOCK_COMMENT_MODE]},b={className:"title",begin:i.optional(s)+e.IDENT_RE,relevance:0},E=i.optional(s)+e.IDENT_RE+"\\s*\\(",O={keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","typeof","typeof_unqual","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"],type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_BitInt","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal96","_Decimal128","_Decimal64x","_Decimal128x","_Float16","_Float32","_Float64","_Float128","_Float32x","_Float64x","_Float128x","const","static","constexpr","complex","bool","imaginary"],literal:"true false NULL",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr"},S=[h,f,r,e.C_BLOCK_COMMENT_MODE,y,m],L={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:O,contains:S.concat([{begin:/\(/,end:/\)/,keywords:O,contains:S.concat(["self"]),relevance:0}]),relevance:0},P={begin:"("+u+"[\\*&\\s]+)+"+E,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:O,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:l,keywords:O,relevance:0},{begin:E,returnBegin:!0,contains:[e.inherit(b,{className:"title.function"})],relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:O,relevance:0,contains:[r,e.C_BLOCK_COMMENT_MODE,m,y,f,{begin:/\(/,end:/\)/,keywords:O,relevance:0,contains:["self",r,e.C_BLOCK_COMMENT_MODE,m,y,f]}]},f,r,e.C_BLOCK_COMMENT_MODE,h]};return{name:"C",aliases:["h"],keywords:O,disableAutodetect:!0,illegal:"=]/,contains:[{beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:h,strings:m,keywords:O}}}function Uw(e){const i=e.regex,r=e.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),l="decltype\\(auto\\)",s="[a-zA-Z_]\\w*::",u="(?!struct)("+l+"|"+i.optional(s)+"[a-zA-Z_]\\w*"+i.optional("<[^<>]+>")+")",f={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},m={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+"\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"+"|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},y={className:"number",variants:[{begin:"[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)"},{begin:"[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)"}],relevance:0},h={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(m,{className:"string"}),{className:"string",begin:/<.*?>/},r,e.C_BLOCK_COMMENT_MODE]},b={className:"title",begin:i.optional(s)+e.IDENT_RE,relevance:0},E=i.optional(s)+e.IDENT_RE+"\\s*\\(",w=["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],N=["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],O=["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","flat_map","flat_set","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"],S=["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"],q={type:N,keyword:w,literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:O},X={className:"function.dispatch",relevance:0,keywords:{_hint:S},begin:i.concat(/\b/,`(?!${w.join("|")})`,e.IDENT_RE,i.lookahead(/(<[^<>]+>|)\s*\(/))},M=[X,h,f,r,e.C_BLOCK_COMMENT_MODE,y,m],le={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:q,contains:M.concat([{begin:/\(/,end:/\)/,keywords:q,contains:M.concat(["self"]),relevance:0}]),relevance:0},de={className:"function",begin:"("+u+"[\\*&\\s]+)+"+E,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:q,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:l,keywords:q,relevance:0},{begin:E,returnBegin:!0,contains:[b],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[m,y]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:q,relevance:0,contains:[r,e.C_BLOCK_COMMENT_MODE,m,y,f,{begin:/\(/,end:/\)/,keywords:q,relevance:0,contains:["self",r,e.C_BLOCK_COMMENT_MODE,m,y,f]}]},f,r,e.C_BLOCK_COMMENT_MODE,h]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:q,illegal:"",keywords:q,contains:["self",f]},{begin:e.IDENT_RE+"::",keywords:q},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:"keyword",3:"title.class"}}])}}function $w(e){const i=["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"],r=["public","private","protected","static","internal","protected","abstract","async","extern","override","unsafe","virtual","new","sealed","partial"],l=["default","false","null","true"],s=["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"],c=["add","alias","and","ascending","args","async","await","by","descending","dynamic","equals","file","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","record","remove","required","scoped","select","set","unmanaged","value|0","var","when","where","with","yield"],u={keyword:s.concat(c),built_in:i,literal:l},f=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),p={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9'_]+|(\\b[\\d'_]+(\\.[\\d'_]*)?|\\.[\\d'_]+)([eE][-+]?[\\d'_]+)?)"}],relevance:0},m={className:"string",begin:/"""("*)(?!")(.|\n)*?"""\1/,relevance:1},y={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},h=e.inherit(y,{illegal:/\n/}),b={className:"subst",begin:/\{/,end:/\}/,keywords:u},E=e.inherit(b,{illegal:/\n/}),w={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},e.BACKSLASH_ESCAPE,E]},N={className:"string",begin:/\$@"/,end:'"',contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},b]},O=e.inherit(N,{illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},E]});b.contains=[N,w,y,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,p,e.C_BLOCK_COMMENT_MODE],E.contains=[O,w,h,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,p,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];const S={variants:[m,N,w,y,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},L={begin:"<",end:">",contains:[{beginKeywords:"in out"},f]},P=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",q={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:u,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:""},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{keyword:"if else elif endif define undef warning error line region endregion pragma checksum"}},S,p,{beginKeywords:"class interface",relevance:0,end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},f,L,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[f,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[f,L,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+P+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:u,contains:[{beginKeywords:r.join(" "),relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,contains:[e.TITLE_MODE,L],relevance:0},{match:/\(\)/},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:u,relevance:0,contains:[S,p,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},q]}}const Hw=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},UNICODE_RANGE:{scope:"number",begin:/\b[Uu]\+[0-9A-Fa-f][0-9A-Fa-f?]{0,4}(-[0-9A-Fa-f][0-9A-Fa-f]{0,4})?/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),jw=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],Gw=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],Kw=[...jw,...Gw],Ww=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),Vw=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),qw=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),Yw=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","unicode-range","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function Qw(e){const i=e.regex,r=Hw(e),l={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},s="and or not only",c=/@-?\w[\w]*(-\w+)*/,u="[a-zA-Z-][a-zA-Z0-9_-]*",f=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[r.BLOCK_COMMENT,l,r.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\."+u,relevance:0},r.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+Vw.join("|")+")"},{begin:":(:)?("+qw.join("|")+")"}]},r.CSS_VARIABLE,{className:"attribute",begin:"\\b("+Yw.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[r.BLOCK_COMMENT,r.HEXCOLOR,r.IMPORTANT,r.CSS_NUMBER_MODE,r.UNICODE_RANGE,...f,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...f,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},r.FUNCTION_DISPATCH]},{begin:i.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:c},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:s,attribute:Ww.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...f,r.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+Kw.join("|")+")\\b"}]}}function Xw(e){const i=e.regex;return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,match:i.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^@@ +-\d+ +\+\d+,\d+ +@@/,/^@@ +-\d+,\d+ +\+\d+ +@@/,/^@@ +-\d+ +\+\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)},{className:"comment",variants:[{begin:i.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/,end:/$/}]}}function Zw(e){const c={keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"],type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"],literal:["true","false","iota","nil"],built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"]};return{name:"Go",aliases:["golang"],keywords:c,illegal:"Um(e,i,r-1))}function tx(e){const i=e.regex,r="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",l=r+Um("(?:<"+r+"~~~(?:\\s*,\\s*"+r+"~~~)*>)?",/~~~/g,2),p={keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits","goto","when"],literal:["false","true","null"],type:["char","boolean","long","float","int","byte","short","double"],built_in:["super","this"]},m={className:"meta",begin:"@"+r,contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},y={className:"params",begin:/\(/,end:/\)/,keywords:p,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0};return{name:"Java",aliases:["jsp"],keywords:p,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{begin:/import java\.[a-z]+\./,keywords:"import",relevance:2},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/,className:"string",contains:[e.BACKSLASH_ESCAPE]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,r],className:{1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{begin:[i.concat(/(?!else)/,r),/\s+/,r,/\s+/,/=(?!=)/],className:{1:"type",3:"variable",5:"operator"}},{begin:[/record/,/\s+/,r],className:{1:"keyword",3:"title.class"},contains:[y,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"new throw return else",relevance:0},{begin:["(?:"+l+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{2:"title.function"},keywords:p,contains:[{className:"params",begin:/\(/,end:/\)/,keywords:p,relevance:0,contains:[m,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,yp,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},yp,m]}}const bp="[A-Za-z$_][0-9A-Za-z$_]*",nx=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],rx=["true","false","null","undefined","NaN","Infinity"],$m=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],Hm=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],jm=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],ix=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],ox=[].concat(jm,$m,Hm);function lx(e){const i=e.regex,r=(V,{after:ae})=>{const v="",end:""},c=/<[A-Za-z0-9\\._:-]+\s*\/>/,u={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(V,ae)=>{const v=V[0].length+V.index,R=V.input[v];if(R==="<"||R===","){ae.ignoreMatch();return}R===">"&&(r(V,{after:v})||ae.ignoreMatch());let $;const k=V.input.substring(v);if($=k.match(/^\s*=/)){ae.ignoreMatch();return}if(($=k.match(/^\s+extends\s+/))&&$.index===0){ae.ignoreMatch();return}}},f={$pattern:bp,keyword:nx,literal:rx,built_in:ox,"variable.language":ix},p="[0-9](_?[0-9])*",m=`\\.(${p})`,y="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",h={className:"number",variants:[{begin:`(\\b(${y})((${m})|\\.)?|(${m}))[eE][+-]?(${p})\\b`},{begin:`\\b(${y})\\b((${m})\\b|\\.)?|(${m})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},b={className:"subst",begin:"\\$\\{",end:"\\}",keywords:f,contains:[]},E={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,b],subLanguage:"xml"}},w={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,b],subLanguage:"css"}},N={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,b],subLanguage:"graphql"}},O={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,b]},L={className:"comment",variants:[e.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:l+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},P=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,E,w,N,O,{match:/\$\d+/},h];b.contains=P.concat({begin:/\{/,end:/\}/,keywords:f,contains:["self"].concat(P)});const q=[].concat(L,b.contains),X=q.concat([{begin:/(\s*)\(/,end:/\)/,keywords:f,contains:["self"].concat(q)}]),M={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:f,contains:X},le={variants:[{match:[/class/,/\s+/,l,/\s+/,/extends/,/\s+/,i.concat(l,"(",i.concat(/\./,l),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,l],scope:{1:"keyword",3:"title.class"}}]},de={relevance:0,match:i.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...$m,...Hm]}},K={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},A={variants:[{match:[/function/,/\s+/,l,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[M],illegal:/%/},j={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function U(V){return i.concat("(?!",V.join("|"),")")}const J={match:i.concat(/\b/,U([...jm,"super","import","await"].map(V=>`${V}\\s*\\(`)),l,i.lookahead(/\s*\(/)),className:"title.function",relevance:0},Q={begin:i.concat(/\./,i.lookahead(i.concat(l,/(?![0-9A-Za-z$_(])/))),end:l,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},G={match:[/get|set/,/\s+/,l,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},M]},se="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",z={match:[/const|var|let/,/\s+/,l,/\s*/,/=\s*/,/(async\s*)?/,i.lookahead(se)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[M]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:f,exports:{PARAMS_CONTAINS:X,CLASS_REFERENCE:de},illegal:/#(?![$_A-Za-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),K,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,E,w,N,O,L,{match:/\$\d+/},h,de,{scope:"attr",match:l+i.lookahead(":"),relevance:0},z,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[L,e.REGEXP_MODE,{className:"function",begin:se,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:f,contains:X}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:s.begin,end:s.end},{match:c},{begin:u.begin,"on:begin":u.isTrulyOpeningTag,end:u.end}],subLanguage:"xml",contains:[{begin:u.begin,end:u.end,skip:!0,contains:["self"]}]}]},A,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[M,e.inherit(e.TITLE_MODE,{begin:l,className:"title.function"})]},{match:/\.\.\./,relevance:0},Q,{match:"\\$"+l,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[M]},J,j,le,G,{match:/\$[(.]/}]}}const ax="([-+]?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)|NaN|[-+]?Infinity",sx={scope:"number",match:ax,relevance:0};function ux(e){const i={className:"attr",begin:/(("(\\.|[^\\"\r\n])*")|('(\\.|[^\\'\r\n])*'))(?=\s*:)/,relevance:1.01},r={match:/[{}[\],:]/,className:"punctuation",relevance:0},l=["true","false","null"],s={scope:"literal",beginKeywords:l.join(" ")};return{name:"JSON",aliases:["jsonc","json5"],keywords:{literal:l},contains:[i,r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,s,sx,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}var Oi="[0-9](_*[0-9])*",Vl=`\\.(${Oi})`,ql="[0-9a-fA-F](_*[0-9a-fA-F])*",cx={className:"number",variants:[{begin:`(\\b(${Oi})((${Vl})|\\.)?|(${Vl}))[eE][+-]?(${Oi})[fFdD]?\\b`},{begin:`\\b(${Oi})((${Vl})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${Vl})[fFdD]?\\b`},{begin:`\\b(${Oi})[fFdD]\\b`},{begin:`\\b0[xX]((${ql})\\.?|(${ql})?\\.(${ql}))[pP][+-]?(${Oi})[fFdD]?\\b`},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${ql})[lL]?\\b`},{begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}],relevance:0};function dx(e){const i={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},r={className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},l={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},s={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},c={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},u={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[c,s]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,c,s]}]};s.contains.push(u);const f={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},p={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(u,{className:"string"}),"self"]}]},m=cx,y=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),h={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},b=h;return b.variants[1].contains=[h],h.variants[1].contains=[b],{name:"Kotlin",aliases:["kt","kts"],keywords:i,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,y,r,l,f,p,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:i,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[h,e.C_LINE_COMMENT_MODE,y],relevance:0},e.C_LINE_COMMENT_MODE,y,f,p,u,e.C_NUMBER_MODE]},y]},{begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/,excludeBegin:!0,returnEnd:!0},f,p]},u,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:` -`},m]}}const fx=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},UNICODE_RANGE:{scope:"number",begin:/\b[Uu]\+[0-9A-Fa-f][0-9A-Fa-f?]{0,4}(-[0-9A-Fa-f][0-9A-Fa-f]{0,4})?/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),px=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],mx=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],gx=[...px,...mx],hx=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),Gm=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),Km=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),yx=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","unicode-range","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse(),bx=Gm.concat(Km).sort().reverse();function Ex(e){const i=fx(e),r=bx,l="and or not only",s="[\\w-]+",c="("+s+"|@\\{"+s+"\\})",u=[],f=[],p=function(P){return{className:"string",begin:"~?"+P+".*?"+P}},m=function(P,q,X){return{className:P,begin:q,relevance:X}},y={$pattern:/[a-z-]+/,keyword:l,attribute:hx.join(" ")},h={begin:"\\(",end:"\\)",contains:f,keywords:y,relevance:0};f.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,p("'"),p('"'),i.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},i.UNICODE_RANGE,i.HEXCOLOR,h,m("variable","@@?"+s,10),m("variable","@\\{"+s+"\\}"),m("built_in","~?`[^`]*?`"),{className:"attribute",begin:s+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0},i.IMPORTANT,{beginKeywords:"and not"},i.FUNCTION_DISPATCH);const b=f.concat({begin:/\{/,end:/\}/,contains:u}),E={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(f)},w={begin:c+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/},i.CSS_VARIABLE,{className:"attribute",begin:"\\b("+yx.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:f}}]},N={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",keywords:y,returnEnd:!0,contains:f,relevance:0}},O={className:"variable",variants:[{begin:"@"+s+"\\s*:",relevance:15},{begin:"@"+s}],starts:{end:"[;}]",returnEnd:!0,contains:b}},S={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:c,end:/\{/}],returnBegin:!0,returnEnd:!0,illegal:`[<='$"]`,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,E,m("keyword","all\\b"),m("variable","@\\{"+s+"\\}"),{begin:"\\b("+gx.join("|")+")\\b",className:"selector-tag"},i.CSS_NUMBER_MODE,m("selector-tag",c,0),m("selector-id","#"+c),m("selector-class","\\."+c,0),m("selector-tag","&",0),i.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",begin:":("+Gm.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+Km.join("|")+")"},{begin:/\(/,end:/\)/,relevance:0,contains:b},{begin:"!important"},i.FUNCTION_DISPATCH]},L={begin:s+`:(:)?(${r.join("|")})`,returnBegin:!0,contains:[S]};return u.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,N,O,L,w,S,E,i.FUNCTION_DISPATCH),{name:"Less",case_insensitive:!0,illegal:`[=>'/<($"]`,contains:u}}function _x(e){const i="\\[=*\\[",r="\\]=*\\]",l={begin:i,end:r,contains:["self"]},s=[e.COMMENT("--(?!"+i+")","$"),e.COMMENT("--"+i,r,{contains:[l],relevance:10})];return{name:"Lua",aliases:["pluto"],keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:s.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:s}].concat(s)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:i,end:r,contains:[l],relevance:5}])}}function vx(e){const i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%",subLanguage:"xml",relevance:0},l={begin:"^[-\\*]{3,}",end:"$"},s={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},c={className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},u={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},f=/[A-Za-z][A-Za-z0-9+.-]*/,p={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:i.concat(/\[.+?\]\(/,f,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},m={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},y={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},h=e.inherit(m,{contains:[]}),b=e.inherit(y,{contains:[]});m.contains.push(b),y.contains.push(h);let E=[r,p];return[m,y,h,b].forEach(S=>{S.contains=S.contains.concat(E)}),E=E.concat(m,y),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:E},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:E}]}]},r,c,m,y,{className:"quote",begin:"^>\\s+",contains:E,end:"$"},s,l,p,u,{scope:"literal",match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}function wx(e){const i={className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},r=/[a-zA-Z@][a-zA-Z0-9_]*/,f={"variable.language":["this","super"],$pattern:r,keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"],literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"],built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"],type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"]},p={$pattern:r,keyword:["@interface","@class","@protocol","@implementation"]};return{name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"],keywords:f,illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+p.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:p,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}function xx(e){const i=e.regex,r=["abs","accept","alarm","and","atan2","bind","binmode","bless","break","caller","chdir","chmod","chomp","chop","chown","chr","chroot","class","close","closedir","connect","continue","cos","crypt","dbmclose","dbmopen","defined","delete","die","do","dump","each","else","elsif","endgrent","endhostent","endnetent","endprotoent","endpwent","endservent","eof","eval","exec","exists","exit","exp","fcntl","field","fileno","flock","for","foreach","fork","format","formline","getc","getgrent","getgrgid","getgrnam","gethostbyaddr","gethostbyname","gethostent","getlogin","getnetbyaddr","getnetbyname","getnetent","getpeername","getpgrp","getpriority","getprotobyname","getprotobynumber","getprotoent","getpwent","getpwnam","getpwuid","getservbyname","getservbyport","getservent","getsockname","getsockopt","given","glob","gmtime","goto","grep","gt","hex","if","index","int","ioctl","join","keys","kill","last","lc","lcfirst","length","link","listen","local","localtime","log","lstat","lt","ma","map","method","mkdir","msgctl","msgget","msgrcv","msgsnd","my","ne","next","no","not","oct","open","opendir","or","ord","our","pack","package","pipe","pop","pos","print","printf","prototype","push","q|0","qq","quotemeta","qw","qx","rand","read","readdir","readline","readlink","readpipe","recv","redo","ref","rename","require","reset","return","reverse","rewinddir","rindex","rmdir","say","scalar","seek","seekdir","select","semctl","semget","semop","send","setgrent","sethostent","setnetent","setpgrp","setpriority","setprotoent","setpwent","setservent","setsockopt","shift","shmctl","shmget","shmread","shmwrite","shutdown","sin","sleep","socket","socketpair","sort","splice","split","sprintf","sqrt","srand","stat","state","study","sub","substr","symlink","syscall","sysopen","sysread","sysseek","system","syswrite","tell","telldir","tie","tied","time","times","tr","truncate","uc","ucfirst","umask","undef","unless","unlink","unpack","unshift","untie","until","use","utime","values","vec","wait","waitpid","wantarray","warn","when","while","write","x|0","xor","y|0"],l=/[dualxmsipngr]{0,12}/,s={$pattern:/[\w.]+/,keyword:r.join(" ")},c={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:s},u={begin:/->\{/,end:/\}/},f={scope:"attr",match:/\s+:\s*\w+(\s*\(.*?\))?/},p={scope:"variable",variants:[{begin:/\$\d/},{begin:i.concat(/[$%@](?!")(\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])")},{begin:/[$%@](?!")[^\s\w{=]|\$=/,relevance:0}],contains:[f]},m={className:"number",variants:[{match:/0?\.[0-9][0-9_]+\b/},{match:/\bv?(0|[1-9][0-9_]*(\.[0-9_]+)?|[1-9][0-9_]*)\b/},{match:/\b0[0-7][0-7_]*\b/},{match:/\b0x[0-9a-fA-F][0-9a-fA-F_]*\b/},{match:/\b0b[0-1][0-1_]*\b/}],relevance:0},y=[e.BACKSLASH_ESCAPE,c,p],h=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],b=(N,O,S="\\1")=>{const L=S==="\\1"?S:i.concat(S,O);return i.concat(i.concat("(?:",N,")"),O,/(?:\\.|[^\\\/])*?/,L,/(?:\\.|[^\\\/])*?/,S,l)},E=(N,O,S)=>i.concat(i.concat("(?:",N,")"),O,/(?:\\.|[^\\\/])*?/,S,l),w=[p,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{endsWithParent:!0}),u,{className:"string",contains:y,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{begin:"-?\\w+\\s*=>",relevance:0}]},m,{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{begin:b("s|tr|y",i.either(...h,{capture:!0}))},{begin:b("s|tr|y","\\(","\\)")},{begin:b("s|tr|y","\\[","\\]")},{begin:b("s|tr|y","\\{","\\}")}],relevance:2},{className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{begin:E("(?:m|qr)?",/\//,/\//)},{begin:E("m|qr",i.either(...h,{capture:!0}),/\1/)},{begin:E("m|qr",/\(/,/\)/)},{begin:E("m|qr",/\[/,/\]/)},{begin:E("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub method",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE,f]},{className:"class",beginKeywords:"class",end:"[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE,f,m]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return c.contains=w,u.contains=w,{name:"Perl",aliases:["pl","pm"],keywords:s,contains:w}}function Sx(e){const i=e.regex,r=/(?![A-Za-z0-9])(?![$])/,l=i.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,r),s=i.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,r),c=i.concat(/[A-Z]+/,r),u={scope:"variable",match:"\\$+"+l},f={scope:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{begin:/\?>/}]},p={scope:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},m=e.inherit(e.APOS_STRING_MODE,{illegal:null}),y=e.inherit(e.QUOTE_STRING_MODE,{illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(p)}),h={begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/,contains:e.QUOTE_STRING_MODE.contains.concat(p),"on:begin":(Q,G)=>{G.data._beginMatch=Q[1]||Q[2]},"on:end":(Q,G)=>{G.data._beginMatch!==Q[1]&&G.ignoreMatch()}},b=e.END_SAME_AS_BEGIN({begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/}),E=`[ -]`,w={scope:"string",variants:[y,m,h,b]},N={scope:"number",variants:[{begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?"}],relevance:0},O=["false","null","true"],S=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],L=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],q={keyword:S,literal:(Q=>{const G=[];return Q.forEach(se=>{G.push(se),se.toLowerCase()===se?G.push(se.toUpperCase()):G.push(se.toLowerCase())}),G})(O),built_in:L},X=Q=>Q.map(G=>G.replace(/\|\d+$/,"")),M={variants:[{match:[/new/,i.concat(E,"+"),i.concat("(?!",X(L).join("\\b|"),"\\b)"),s],scope:{1:"keyword",4:"title.class"}}]},le=i.concat(l,"\\b(?!\\()"),de={variants:[{match:[i.concat(/::/,i.lookahead(/(?!class\b)/)),le],scope:{2:"variable.constant"}},{match:[/::/,/class/],scope:{2:"variable.language"}},{match:[s,i.concat(/::/,i.lookahead(/(?!class\b)/)),le],scope:{1:"title.class",3:"variable.constant"}},{match:[s,i.concat("::",i.lookahead(/(?!class\b)/))],scope:{1:"title.class"}},{match:[s,/::/,/class/],scope:{1:"title.class",3:"variable.language"}}]},K={scope:"attr",match:i.concat(l,i.lookahead(":"),i.lookahead(/(?!::)/))},A={relevance:0,begin:/\(/,end:/\)/,keywords:q,contains:[K,u,de,e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE,e.HASH_COMMENT_MODE,w,N,M]},j={relevance:0,match:[/\b/,i.concat("(?!fn\\b|function\\b|",X(S).join("\\b|"),"|",X(L).join("\\b|"),"\\b)"),l,i.concat(E,"*"),i.lookahead(/(?=\()/)],scope:{3:"title.function.invoke"},contains:[A]};A.contains.push(j);const U=[K,de,e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE,e.HASH_COMMENT_MODE,w,N,M],J={begin:i.concat(/#\[\s*\\?/,i.either(s,c)),beginScope:"meta",end:/]/,endScope:"meta",keywords:{literal:O,keyword:["new","array"]},contains:[{begin:/\[/,end:/]/,keywords:{literal:O,keyword:["new","array"]},contains:["self",...U]},...U,{scope:"meta",variants:[{match:s},{match:c}]}]};return{case_insensitive:!1,keywords:q,contains:[J,e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/,keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE,contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},f,{scope:"variable.language",match:/\$this\b/},u,j,de,{match:[/const/,/\s/,l],scope:{1:"keyword",3:"variable.constant"}},M,{scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:q,contains:["self",J,u,de,e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE,e.HASH_COMMENT_MODE,w,N]}]},{scope:"class",variants:[{beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait",illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{beginKeywords:"use",relevance:0,end:";",contains:[{match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},w,N]}}function Nx(e){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}function Tx(e){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}function Cx(e){const i=e.regex,r=new RegExp("[\\p{XID_Start}_]\\p{XID_Continue}*","u"),l=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],f={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:l,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},p={className:"meta",begin:/^(>>>|\.\.\.) /},m={className:"subst",begin:/\{/,end:/\}/,keywords:f,illegal:/#/},y={begin:/\{\{/,relevance:0},h={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,p],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,p],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,p,y,m]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,p,y,m]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,y,m]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,y,m]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},b="[0-9](_?[0-9])*",E=`(\\b(${b}))?\\.(${b})|\\b(${b})\\.`,w=`\\b|${l.join("|")}`,N={className:"number",relevance:0,variants:[{begin:`(\\b(${b})|(${E}))[eE][+-]?(${b})[jJ]?(?=${w})`},{begin:`(${E})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${w})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${w})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${w})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${w})`},{begin:`\\b(${b})[jJ](?=${w})`}]},O={className:"comment",begin:i.lookahead(/# type:/),end:/$/,keywords:f,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},S={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:f,contains:["self",p,N,h,e.HASH_COMMENT_MODE]}]};return m.contains=[h,N,p],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:f,illegal:/(<\/|\?)|=>/,contains:[p,N,{scope:"variable.language",match:/\bself\b/},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"},h,O,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,r],scope:{1:"keyword",3:"title.function"},contains:[S]},{variants:[{match:[/\bclass/,/\s+/,r,/\s*/,/\(\s*/,r,/\s*\)/]},{match:[/\bclass/,/\s+/,r]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[N,S,h]}]}}function Ax(e){return{aliases:["pycon"],contains:[{className:"meta.prompt",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}function Rx(e){const i=e.regex,r=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,l=i.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),s=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,c=i.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/);return{name:"R",keywords:{$pattern:r,keyword:"function if in break next repeat else for while",literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10",built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm"},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/,starts:{end:i.lookahead(i.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)),endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{scope:"variable",variants:[{match:r},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}]}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE],variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"',relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{1:"operator",2:"number"},match:[s,l]},{scope:{1:"operator",2:"number"},match:[/%[^%]*%/,l]},{scope:{1:"punctuation",2:"number"},match:[c,l]},{scope:{2:"number"},match:[/[^a-zA-Z0-9._]|^/,l]}]},{scope:{3:"operator"},match:[r,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:s},{match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:c},{begin:"`",end:"`",contains:[{begin:/\\./}]}]}}function Ox(e){const i=e.regex,r="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",l=i.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),s=i.concat(l,/(::\w+)*/),u={"variable.constant":["__FILE__","__LINE__","__ENCODING__"],"variable.language":["self","super"],keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield",...["include","extend","prepend","public","private","protected","raise","throw"]],built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"],literal:["true","false","nil"]},f={className:"doctag",begin:"@[A-Za-z]+"},p={begin:"#<",end:">"},m=[e.COMMENT("#","$",{contains:[f]}),e.COMMENT("^=begin","^=end",{contains:[f],relevance:10}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],y={className:"subst",begin:/#\{/,end:/\}/,keywords:u},h={className:"string",contains:[e.BACKSLASH_ESCAPE,y],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{begin:i.concat(/<<[-~]?'?/,i.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)),contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,y]})]}]},b="[1-9](_?[0-9])*|0",E="[0-9](_?[0-9])*",w={className:"number",relevance:0,variants:[{begin:`\\b(${b})(\\.(${E}))?([eE][+-]?(${E})|r)?i?\\b`},{begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{begin:"\\b0(_?[0-7])+r?i?\\b"}]},N={variants:[{match:/\(\)/},{className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0,keywords:u}]},M=[h,{variants:[{match:[/class\s+/,s,/\s+<\s+/,s]},{match:[/\b(class|module)\s+/,s]}],scope:{2:"title.class",4:"title.class.inherited"},keywords:u},{match:[/(include|extend)\s+/,s],scope:{2:"title.class"},keywords:u},{relevance:0,match:[s,/\.new[. (]/],scope:{1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},{relevance:0,match:l,scope:"title.class"},{match:[/def/,/\s+/,r],scope:{1:"keyword",3:"title.function"},contains:[N]},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[h,{begin:r}],relevance:0},w,{className:"variable",begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{className:"params",begin:/\|(?!=)/,end:/\|/,excludeBegin:!0,excludeEnd:!0,relevance:0,keywords:u},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,y],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(p,m),relevance:0}].concat(p,m);y.contains=M,N.contains=M;const A=[{begin:/^\s*=>/,starts:{end:"$",contains:M}},{className:"meta.prompt",begin:"^("+"[>?]>"+"|"+"[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]"+"|"+"(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>"+")(?=[ ])",starts:{end:"$",keywords:u,contains:M}}];return m.unshift(p),{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:u,illegal:/\/\*/,contains:[e.SHEBANG({binary:"ruby"})].concat(A).concat(m).concat(M)}}function Ix(e){const i=e.regex,r=/(r#)?/,l=i.concat(r,e.UNDERSCORE_IDENT_RE),s=i.concat(r,e.IDENT_RE),c={className:"title.function.invoke",relevance:0,begin:i.concat(/\b/,/(?!let|for|while|if|else|match\b)/,s,i.lookahead(/\s*\(/))},u="([ui](8|16|32|64|128|size)|f(32|64))?",f=["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","union","unsafe","unsized","use","virtual","where","while","yield"],p=["true","false","Some","None","Ok","Err"],m=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],y=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"];return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:y,keyword:f,literal:p,built_in:m},illegal:""},c]}}const Mx=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},UNICODE_RANGE:{scope:"number",begin:/\b[Uu]\+[0-9A-Fa-f][0-9A-Fa-f?]{0,4}(-[0-9A-Fa-f][0-9A-Fa-f]{0,4})?/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),Lx=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],Dx=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],Px=[...Lx,...Dx],zx=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),Fx=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),Bx=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),Ux=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","unicode-range","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function $x(e){const i=Mx(e),r=Bx,l=Fx,s="@[a-z-]+",c="and or not only",f={className:"variable",begin:"(\\$"+"[a-zA-Z-][a-zA-Z0-9_-]*"+")\\b",relevance:0};return{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i.CSS_NUMBER_MODE,{className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},i.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag",begin:"\\b("+Px.join("|")+")\\b",relevance:0},{className:"selector-pseudo",begin:":("+l.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+r.join("|")+")"},f,{begin:/\(/,end:/\)/,contains:[i.CSS_NUMBER_MODE]},i.CSS_VARIABLE,{className:"attribute",begin:"\\b("+Ux.join("|")+")\\b"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:/:/,end:/[;}{]/,relevance:0,contains:[i.BLOCK_COMMENT,f,i.HEXCOLOR,i.CSS_NUMBER_MODE,i.UNICODE_RANGE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i.IMPORTANT,i.FUNCTION_DISPATCH]},{begin:"@(page|font-face)",keywords:{$pattern:s,keyword:"@page @font-face"}},{begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/,keyword:c,attribute:zx.join(" ")},contains:[{begin:s,className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute"},f,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i.HEXCOLOR,i.CSS_NUMBER_MODE]},i.FUNCTION_DISPATCH]}}function Hx(e){return{name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta.prompt",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}}function jx(e){const i=e.regex,r=e.COMMENT("--","$"),l={scope:"string",variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},s={begin:/"/,end:/"/,contains:[{match:/""/}]},c=["true","false","unknown"],u=["double precision","large object","with timezone","without timezone"],f=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],p=["add","asc","collation","desc","final","first","last","view"],m=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],y=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],h=["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"],b=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],E=y,w=[...m,...p].filter(X=>!y.includes(X)),N={scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},O={scope:"operator",match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},S={match:i.concat(/\b/,i.either(...E),/\s*\(/),relevance:0,keywords:{built_in:E}};function L(X){return i.concat(/\b/,i.either(...X.map(M=>M.replace(/\s+/,"\\s+"))),/\b/)}const P={scope:"keyword",match:L(b),relevance:0};function q(X,{exceptions:M,when:le}={}){const de=le;return M=M||[],X.map(K=>K.match(/\|\d+$/)||M.includes(K)?K:de(K)?`${K}|0`:K)}return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:q(w,{when:X=>X.length<3}),literal:c,type:f,built_in:h},contains:[{scope:"type",match:L(u)},P,S,N,l,s,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,r,O]}}function Wm(e){return e?typeof e=="string"?e:e.source:null}function ko(e){return Xe("(?=",e,")")}function Xe(...e){return e.map(r=>Wm(r)).join("")}function Gx(e){const i=e[e.length-1];return typeof i=="object"&&i.constructor===Object?(e.splice(e.length-1,1),i):{}}function $t(...e){return"("+(Gx(e).capture?"":"?:")+e.map(l=>Wm(l)).join("|")+")"}const qu=e=>Xe(/\b/,e,/\w$/.test(e)?/\b/:/\B/),Kx=["Protocol","Type"].map(qu),Ep=["init","self"].map(qu),Wx=["Any","Self"],du=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","borrowing","break","case","catch","class","consume","consuming","continue","convenience","copy","default","defer","deinit","didSet","distributed","do","dynamic","each","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","macro","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","package","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],_p=["false","nil","true"],Vx=["assignment","associativity","higherThan","left","lowerThan","none","right"],qx=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning"],vp=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],Vm=$t(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),qm=$t(Vm,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),fu=Xe(Vm,qm,"*"),Ym=$t(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),ta=$t(Ym,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),Bn=Xe(Ym,ta,"*"),Yl=Xe(/[A-Z]/,ta,"*"),Yx=["attached","autoclosure",Xe(/convention\(/,$t("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","freestanding","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",Xe(/objc\(/,Bn,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","Sendable","testable","UIApplicationMain","unchecked","unknown","usableFromInline","warn_unqualified_access"],Qx=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"];function Xx(e){const i={match:/\s+/,relevance:0},r=e.COMMENT("/\\*","\\*/",{contains:["self"]}),l=[e.C_LINE_COMMENT_MODE,r],s={match:[/\./,$t(...Kx,...Ep)],className:{2:"keyword"}},c={match:Xe(/\./,$t(...du)),relevance:0},u=du.filter(Ke=>typeof Ke=="string").concat(["_|0"]),f=du.filter(Ke=>typeof Ke!="string").concat(Wx).map(qu),p={variants:[{className:"keyword",match:$t(...f,...Ep)}]},m={$pattern:$t(/\b\w+/,/#\w+/),keyword:u.concat(qx),literal:_p},y=[s,c,p],h={match:Xe(/\./,$t(...vp)),relevance:0},b={className:"built_in",match:Xe(/\b/,$t(...vp),/(?=\()/)},E=[h,b],w={match:/->/,relevance:0},N={className:"operator",relevance:0,variants:[{match:fu},{match:`\\.(\\.|${qm})+`}]},O=[w,N],S="([0-9]_*)+",L="([0-9a-fA-F]_*)+",P={className:"number",relevance:0,variants:[{match:`\\b(${S})(\\.(${S}))?([eE][+-]?(${S}))?\\b`},{match:`\\b0x(${L})(\\.(${L}))?([pP][+-]?(${S}))?\\b`},{match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},q=(Ke="")=>({className:"subst",variants:[{match:Xe(/\\/,Ke,/[0\\tnr"']/)},{match:Xe(/\\/,Ke,/u\{[0-9a-fA-F]{1,8}\}/)}]}),X=(Ke="")=>({className:"subst",match:Xe(/\\/,Ke,/[\t ]*(?:[\r\n]|\r\n)/)}),M=(Ke="")=>({className:"subst",label:"interpol",begin:Xe(/\\/,Ke,/\(/),end:/\)/}),le=(Ke="")=>({begin:Xe(Ke,/"""/),end:Xe(/"""/,Ke),contains:[q(Ke),X(Ke),M(Ke)]}),de=(Ke="")=>({begin:Xe(Ke,/"/),end:Xe(/"/,Ke),contains:[q(Ke),M(Ke)]}),K={className:"string",variants:[le(),le("#"),le("##"),le("###"),de(),de("#"),de("##"),de("###")]},A=[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0,contains:[e.BACKSLASH_ESCAPE]}],j={begin:/\/[^\s](?=[^/\n]*\/)/,end:/\//,contains:A},U=Ke=>{const Jt=Xe(Ke,/\//),an=Xe(/\//,Ke);return{begin:Jt,end:an,contains:[...A,{scope:"comment",begin:`#(?!.*${an})`,end:/$/}]}},J={scope:"regexp",variants:[U("###"),U("##"),U("#"),j]},Q={match:Xe(/`/,Bn,/`/)},G={className:"variable",match:/\$\d+/},se={className:"variable",match:`\\$${ta}+`},z=[Q,G,se],V={match:/(@|#(un)?)available/,scope:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:Qx,contains:[...O,P,K]}]}},ae={scope:"keyword",match:Xe(/@/,$t(...Yx),ko($t(/\(/,/\s+/)))},v={scope:"meta",match:Xe(/@/,Bn)},R=[V,ae,v],$={match:ko(/\b[A-Z]/),relevance:0,contains:[{className:"type",match:Xe(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,ta,"+")},{className:"type",match:Yl,relevance:0},{match:/[?!]+/,relevance:0},{match:/\.\.\./,relevance:0},{match:Xe(/\s+&\s+/,ko(Yl)),relevance:0}]},k={begin://,keywords:m,contains:[...l,...y,...R,w,$]};$.contains.push(k);const ke={match:Xe(Bn,/\s*:/),keywords:"_|0",relevance:0},Me={begin:/\(/,end:/\)/,relevance:0,keywords:m,contains:["self",ke,...l,J,...y,...E,...O,P,K,...z,...R,$]},we={begin://,keywords:"repeat each",contains:[...l,$]},$e={begin:$t(ko(Xe(Bn,/\s*:/)),ko(Xe(Bn,/\s+/,Bn,/\s*:/))),end:/:/,relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:Bn}]},De={begin:/\(/,end:/\)/,keywords:m,contains:[$e,...l,...y,...O,P,K,...R,$,Me],endsParent:!0,illegal:/["']/},Ge={match:[/(func|macro)/,/\s+/,$t(Q.match,Bn,fu)],className:{1:"keyword",3:"title.function"},contains:[we,De,i],illegal:[/\[/,/%/]},Ze={match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"},contains:[we,De,i],illegal:/\[|%/},Zt={match:[/operator/,/\s+/,fu],className:{1:"keyword",3:"title"}},rr={begin:[/precedencegroup/,/\s+/,Yl],className:{1:"keyword",3:"title"},contains:[$],keywords:[...Vx,..._p],end:/}/},An={match:[/class\b/,/\s+/,/func\b/,/\s+/,/\b[A-Za-z_][A-Za-z0-9_]*\b/],scope:{1:"keyword",3:"keyword",5:"title.function"}},Hn={match:[/class\b/,/\s+/,/var\b/],scope:{1:"keyword",3:"keyword"}},jn={begin:[/(struct|protocol|class|extension|enum|actor)/,/\s+/,Bn,/\s*/],beginScope:{1:"keyword",3:"title.class"},keywords:m,contains:[we,...y,{begin:/:/,end:/\{/,keywords:m,contains:[{scope:"title.class.inherited",match:Yl},...y],relevance:0}]};for(const Ke of K.variants){const Jt=Ke.contains.find(Rn=>Rn.label==="interpol");Jt.keywords=m;const an=[...y,...E,...O,P,K,...z];Jt.contains=[...an,{begin:/\(/,end:/\)/,contains:["self",...an]}]}return{name:"Swift",keywords:m,contains:[...l,Ge,Ze,An,Hn,jn,Zt,rr,{beginKeywords:"import",end:/$/,contains:[...l],relevance:0},J,...y,...E,...O,P,K,...z,...R,$,Me]}}const na="[A-Za-z$_][0-9A-Za-z$_]*",Qm=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],Xm=["true","false","null","undefined","NaN","Infinity"],Zm=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],Jm=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],eg=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],tg=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],ng=[].concat(eg,Zm,Jm);function Zx(e){const i=e.regex,r=(V,{after:ae})=>{const v="",end:""},c=/<[A-Za-z0-9\\._:-]+\s*\/>/,u={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(V,ae)=>{const v=V[0].length+V.index,R=V.input[v];if(R==="<"||R===","){ae.ignoreMatch();return}R===">"&&(r(V,{after:v})||ae.ignoreMatch());let $;const k=V.input.substring(v);if($=k.match(/^\s*=/)){ae.ignoreMatch();return}if(($=k.match(/^\s+extends\s+/))&&$.index===0){ae.ignoreMatch();return}}},f={$pattern:na,keyword:Qm,literal:Xm,built_in:ng,"variable.language":tg},p="[0-9](_?[0-9])*",m=`\\.(${p})`,y="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",h={className:"number",variants:[{begin:`(\\b(${y})((${m})|\\.)?|(${m}))[eE][+-]?(${p})\\b`},{begin:`\\b(${y})\\b((${m})\\b|\\.)?|(${m})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},b={className:"subst",begin:"\\$\\{",end:"\\}",keywords:f,contains:[]},E={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,b],subLanguage:"xml"}},w={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,b],subLanguage:"css"}},N={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,b],subLanguage:"graphql"}},O={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,b]},L={className:"comment",variants:[e.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:l+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},P=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,E,w,N,O,{match:/\$\d+/},h];b.contains=P.concat({begin:/\{/,end:/\}/,keywords:f,contains:["self"].concat(P)});const q=[].concat(L,b.contains),X=q.concat([{begin:/(\s*)\(/,end:/\)/,keywords:f,contains:["self"].concat(q)}]),M={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:f,contains:X},le={variants:[{match:[/class/,/\s+/,l,/\s+/,/extends/,/\s+/,i.concat(l,"(",i.concat(/\./,l),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,l],scope:{1:"keyword",3:"title.class"}}]},de={relevance:0,match:i.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...Zm,...Jm]}},K={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},A={variants:[{match:[/function/,/\s+/,l,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[M],illegal:/%/},j={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function U(V){return i.concat("(?!",V.join("|"),")")}const J={match:i.concat(/\b/,U([...eg,"super","import","await"].map(V=>`${V}\\s*\\(`)),l,i.lookahead(/\s*\(/)),className:"title.function",relevance:0},Q={begin:i.concat(/\./,i.lookahead(i.concat(l,/(?![0-9A-Za-z$_(])/))),end:l,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},G={match:[/get|set/,/\s+/,l,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},M]},se="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",z={match:[/const|var|let/,/\s+/,l,/\s*/,/=\s*/,/(async\s*)?/,i.lookahead(se)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[M]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:f,exports:{PARAMS_CONTAINS:X,CLASS_REFERENCE:de},illegal:/#(?![$_A-Za-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),K,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,E,w,N,O,L,{match:/\$\d+/},h,de,{scope:"attr",match:l+i.lookahead(":"),relevance:0},z,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[L,e.REGEXP_MODE,{className:"function",begin:se,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:f,contains:X}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:s.begin,end:s.end},{match:c},{begin:u.begin,"on:begin":u.isTrulyOpeningTag,end:u.end}],subLanguage:"xml",contains:[{begin:u.begin,end:u.end,skip:!0,contains:["self"]}]}]},A,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[M,e.inherit(e.TITLE_MODE,{begin:l,className:"title.function"})]},{match:/\.\.\./,relevance:0},Q,{match:"\\$"+l,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[M]},J,j,le,G,{match:/\$[(.]/}]}}function Jx(e){const i=e.regex,r=Zx(e),l=na,s=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],c={begin:[/namespace/,/\s+/,e.IDENT_RE],beginScope:{1:"keyword",3:"title.class"}},u={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:s},contains:[r.exports.CLASS_REFERENCE]},f={className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/},p=["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"],m={$pattern:na,keyword:Qm.concat(p),literal:Xm,built_in:ng.concat(s),"variable.language":tg},y={className:"meta",begin:"@"+l},h=(N,O,S)=>{const L=N.contains.findIndex(P=>P.label===O);if(L===-1)throw new Error("can not find mode to replace");N.contains.splice(L,1,S)};Object.assign(r.keywords,m),r.exports.PARAMS_CONTAINS.push(y);const b=r.contains.find(N=>N.scope==="attr"),E=Object.assign({},b,{match:i.concat(l,i.lookahead(/\s*\?:/))});r.exports.PARAMS_CONTAINS.push([r.exports.CLASS_REFERENCE,b,E]),r.contains=r.contains.concat([y,c,u,E]),h(r,"shebang",e.SHEBANG()),h(r,"use_strict",f);const w=r.contains.find(N=>N.label==="func.def");return w.relevance=0,Object.assign(r,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),r}function eS(e){const i=e.regex,r={className:"string",begin:/"(""|[^/n])"C\b/},l={className:"string",begin:/"/,end:/"/,illegal:/\n/,contains:[{begin:/""/}]},s=/\d{1,2}\/\d{1,2}\/\d{4}/,c=/\d{4}-\d{1,2}-\d{1,2}/,u=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,f=/\d{1,2}(:\d{1,2}){1,2}/,p={className:"literal",variants:[{begin:i.concat(/# */,i.either(c,s),/ *#/)},{begin:i.concat(/# */,f,/ *#/)},{begin:i.concat(/# */,u,/ *#/)},{begin:i.concat(/# */,i.either(c,s),/ +/,i.either(u,f),/ *#/)}]},m={className:"number",relevance:0,variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},y={className:"label",begin:/^\w+:/},h=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}]}),b=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]});return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0,classNameAliases:{label:"symbol"},keywords:{keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield",built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort",type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort",literal:"true false nothing"},illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[r,l,p,m,y,h,b,{className:"meta",begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/,end:/$/,keywords:{keyword:"const disable else elseif enable end externalsource if region then"},contains:[b]}]}}function tS(e){e.regex;const i=e.COMMENT(/\(;/,/;\)/);i.contains.push("self");const r=e.COMMENT(/;;/,/$/),l=["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"],s={begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword",3:"title.function"}},c={className:"variable",begin:/\$[\w_]+/},u={match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},f={className:"number",relevance:0,match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/},p={match:/(i32|i64|f32|f64)(?!\.)/,className:"type"},m={className:"keyword",match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/};return{name:"WebAssembly",keywords:{$pattern:/[\w.]+/,keyword:l},contains:[r,i,{match:[/(?:offset|align)/,/\s*/,/=/],className:{1:"keyword",3:"operator"}},c,u,s,e.QUOTE_STRING_MODE,p,m,f]}}function nS(e){const i=e.regex,r=i.concat(/[\p{L}_]/u,i.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),l=/[\p{L}0-9._:-]+/u,s={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},c={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},u=e.inherit(c,{begin:/\(/,end:/\)/}),f=e.inherit(e.APOS_STRING_MODE,{className:"string"}),p=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),m={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[c,p,f,u,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[c,u,p,f]}]}]},e.COMMENT(//,{relevance:10}),{begin://,relevance:10},s,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[p]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[m],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[m],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:i.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:r,relevance:0,starts:m}]},{className:"tag",begin:i.concat(/<\//,i.lookahead(i.concat(r,/>/))),contains:[{className:"name",begin:r,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}function rS(e){const i="true false yes no null",r="[\\w#;/?:@&=+$,.~*'()[\\]]+",l={className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},s={className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},c={className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:"char.escape",relevance:0}]},u={className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,s]},f=e.inherit(u,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),b={className:"number",begin:"\\b"+"[0-9]{4}(-[0-9][0-9]){0,2}"+"([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?"+"(\\.[0-9]*)?"+"([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?"+"\\b"},E={end:",",endsWithParent:!0,excludeEnd:!0,keywords:i,relevance:0},w={begin:/\{/,end:/\}/,contains:[E],illegal:"\\n",relevance:0},N={begin:"\\[",end:"\\]",contains:[E],illegal:"\\n",relevance:0},O=[l,{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+r},{className:"type",begin:"!<"+r+">"},{className:"type",begin:"!"+r},{className:"type",begin:"!!"+r},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:i,keywords:{literal:i}},b,{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},w,N,c,u],S=[...O];return S.pop(),S.push(f),E.contains=S,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:O}}const iS={arduino:zw,bash:Fw,c:Bw,cpp:Uw,csharp:$w,css:Qw,diff:Xw,go:Zw,graphql:Jw,ini:ex,java:tx,javascript:lx,json:ux,kotlin:dx,less:Ex,lua:_x,makefile:vx,markdown:kx,objectivec:wx,perl:xx,php:Sx,"php-template":Nx,plaintext:Tx,python:Cx,"python-repl":Ax,r:Rx,ruby:Ox,rust:Ix,scss:$x,shell:Hx,sql:jx,swift:Xx,typescript:Jx,vbnet:eS,wasm:tS,xml:nS,yaml:rS};var pu,kp;function oS(){if(kp)return pu;kp=1;function e(T){return T instanceof Map?T.clear=T.delete=T.set=function(){throw new Error("map is read-only")}:T instanceof Set&&(T.add=T.clear=T.delete=function(){throw new Error("set is read-only")}),Object.freeze(T),Object.getOwnPropertyNames(T).forEach(Y=>{const fe=T[Y],Re=typeof fe;(Re==="object"||Re==="function")&&!Object.isFrozen(fe)&&e(fe)}),T}class i{constructor(Y){Y.data===void 0&&(Y.data={}),this.data=Y.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function r(T){return T.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function l(T,...Y){const fe=Object.create(null);for(const Re in T)fe[Re]=T[Re];return Y.forEach(function(Re){for(const rt in Re)fe[rt]=Re[rt]}),fe}const s="",c=T=>!!T.scope,u=(T,{prefix:Y})=>{if(T.startsWith("language:"))return T.replace("language:","language-");if(T.includes(".")){const fe=T.split(".");return[`${Y}${fe.shift()}`,...fe.map((Re,rt)=>`${Re}${"_".repeat(rt+1)}`)].join(" ")}return`${Y}${T}`};class f{constructor(Y,fe){this.buffer="",this.classPrefix=fe.classPrefix,Y.walk(this)}addText(Y){this.buffer+=r(Y)}openNode(Y){if(!c(Y))return;const fe=u(Y.scope,{prefix:this.classPrefix});this.span(fe)}closeNode(Y){c(Y)&&(this.buffer+=s)}value(){return this.buffer}span(Y){this.buffer+=``}}const p=(T={})=>{const Y={children:[]};return Object.assign(Y,T),Y};class m{constructor(){this.rootNode=p(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(Y){this.top.children.push(Y)}openNode(Y){const fe=p({scope:Y});this.add(fe),this.stack.push(fe)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(Y){return this.constructor._walk(Y,this.rootNode)}static _walk(Y,fe){return typeof fe=="string"?Y.addText(fe):fe.children&&(Y.openNode(fe),fe.children.forEach(Re=>this._walk(Y,Re)),Y.closeNode(fe)),Y}static _collapse(Y){typeof Y!="string"&&Y.children&&(Y.children.every(fe=>typeof fe=="string")?Y.children=[Y.children.join("")]:Y.children.forEach(fe=>{m._collapse(fe)}))}}class y extends m{constructor(Y){super(),this.options=Y}addText(Y){Y!==""&&this.add(Y)}startScope(Y){this.openNode(Y)}endScope(){this.closeNode()}__addSublanguage(Y,fe){const Re=Y.root;fe&&(Re.scope=`language:${fe}`),this.add(Re)}toHTML(){return new f(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}}function h(T){return T?typeof T=="string"?T:T.source:null}function b(T){return N("(?=",T,")")}function E(T){return N("(?:",T,")*")}function w(T){return N("(?:",T,")?")}function N(...T){return T.map(fe=>h(fe)).join("")}function O(T){const Y=T[T.length-1];return typeof Y=="object"&&Y.constructor===Object?(T.splice(T.length-1,1),Y):{}}function S(...T){return"("+(O(T).capture?"":"?:")+T.map(Re=>h(Re)).join("|")+")"}function L(T){return new RegExp(T.toString()+"|").exec("").length-1}function P(T,Y){const fe=T&&T.exec(Y);return fe&&fe.index===0}const q=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function X(T,{joinWith:Y}){let fe=0;return T.map(Re=>{fe+=1;const rt=fe;let lt=h(Re),he="";for(;lt.length>0;){const me=q.exec(lt);if(!me){he+=lt;break}he+=lt.substring(0,me.index),lt=lt.substring(me.index+me[0].length),me[0][0]==="\\"&&me[1]?he+="\\"+String(Number(me[1])+rt):(he+=me[0],me[0]==="("&&fe++)}return he}).map(Re=>`(${Re})`).join(Y)}const M=/\b\B/,le="[a-zA-Z]\\w*",de="[a-zA-Z_]\\w*",K="\\b\\d+(\\.\\d+)?",A="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",j="\\b(0b[01]+)",U="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",J=(T={})=>{const Y=/^#![ ]*\//;return T.binary&&(T.begin=N(Y,/.*\b/,T.binary,/\b.*/)),l({scope:"meta",begin:Y,end:/$/,relevance:0,"on:begin":(fe,Re)=>{fe.index!==0&&Re.ignoreMatch()}},T)},Q={begin:"\\\\[\\s\\S]",relevance:0},G={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[Q]},se={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[Q]},z={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},V=function(T,Y,fe={}){const Re=l({scope:"comment",begin:T,end:Y,contains:[]},fe);Re.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});const rt=S("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return Re.contains.push({begin:N(/[ ]+/,"(",rt,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),Re},ae=V("//","$"),v=V("/\\*","\\*/"),R=V("#","$"),$={scope:"number",begin:K,relevance:0},k={scope:"number",begin:A,relevance:0},ke={scope:"number",begin:j,relevance:0},Me={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[Q,{begin:/\[/,end:/\]/,relevance:0,contains:[Q]}]},we={scope:"title",begin:le,relevance:0},$e={scope:"title",begin:de,relevance:0},De={begin:"\\.\\s*"+de,relevance:0};var Ze=Object.freeze({__proto__:null,APOS_STRING_MODE:G,BACKSLASH_ESCAPE:Q,BINARY_NUMBER_MODE:ke,BINARY_NUMBER_RE:j,COMMENT:V,C_BLOCK_COMMENT_MODE:v,C_LINE_COMMENT_MODE:ae,C_NUMBER_MODE:k,C_NUMBER_RE:A,END_SAME_AS_BEGIN:function(T){return Object.assign(T,{"on:begin":(Y,fe)=>{fe.data._beginMatch=Y[1]},"on:end":(Y,fe)=>{fe.data._beginMatch!==Y[1]&&fe.ignoreMatch()}})},HASH_COMMENT_MODE:R,IDENT_RE:le,MATCH_NOTHING_RE:M,METHOD_GUARD:De,NUMBER_MODE:$,NUMBER_RE:K,PHRASAL_WORDS_MODE:z,QUOTE_STRING_MODE:se,REGEXP_MODE:Me,RE_STARTERS_RE:U,SHEBANG:J,TITLE_MODE:we,UNDERSCORE_IDENT_RE:de,UNDERSCORE_TITLE_MODE:$e});function Zt(T,Y){T.input[T.index-1]==="."&&Y.ignoreMatch()}function rr(T,Y){T.className!==void 0&&(T.scope=T.className,delete T.className)}function An(T,Y){Y&&T.beginKeywords&&(T.begin="\\b("+T.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",T.__beforeBegin=Zt,T.keywords=T.keywords||T.beginKeywords,delete T.beginKeywords,T.relevance===void 0&&(T.relevance=0))}function Hn(T,Y){Array.isArray(T.illegal)&&(T.illegal=S(...T.illegal))}function jn(T,Y){if(T.match){if(T.begin||T.end)throw new Error("begin & end are not supported with match");T.begin=T.match,delete T.match}}function Ke(T,Y){T.relevance===void 0&&(T.relevance=1)}const Jt=(T,Y)=>{if(!T.beforeMatch)return;if(T.starts)throw new Error("beforeMatch cannot be used with starts");const fe=Object.assign({},T);Object.keys(T).forEach(Re=>{delete T[Re]}),T.keywords=fe.keywords,T.begin=N(fe.beforeMatch,b(fe.begin)),T.starts={relevance:0,contains:[Object.assign(fe,{endsParent:!0})]},T.relevance=0,delete fe.beforeMatch},an=["of","and","for","in","not","or","if","then","parent","list","value"],Rn="keyword";function bn(T,Y,fe=Rn){const Re=Object.create(null);return typeof T=="string"?rt(fe,T.split(" ")):Array.isArray(T)?rt(fe,T):Object.keys(T).forEach(function(lt){Object.assign(Re,bn(T[lt],Y,lt))}),Re;function rt(lt,he){Y&&(he=he.map(me=>me.toLowerCase())),he.forEach(function(me){const xe=me.split("|");Re[xe[0]]=[lt,On(xe[0],xe[1])]})}}function On(T,Y){return Y?Number(Y):Tr(T)?0:1}function Tr(T){return an.includes(T.toLowerCase())}const Cr={},sn=T=>{console.error(T)},Ar=(T,...Y)=>{console.log(`WARN: ${T}`,...Y)},W=(T,Y)=>{Cr[`${T}/${Y}`]||(console.log(`Deprecated as of ${T}. ${Y}`),Cr[`${T}/${Y}`]=!0)},oe=new Error;function Ce(T,Y,{key:fe}){let Re=0;const rt=T[fe],lt={},he={};for(let me=1;me<=Y.length;me++)he[me+Re]=rt[me],lt[me+Re]=!0,Re+=L(Y[me-1]);T[fe]=he,T[fe]._emit=lt,T[fe]._multi=!0}function Pe(T){if(Array.isArray(T.begin)){if(T.skip||T.excludeBegin||T.returnBegin)throw sn("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),oe;if(typeof T.beginScope!="object"||T.beginScope===null)throw sn("beginScope must be object"),oe;Ce(T,T.begin,{key:"beginScope"}),T.begin=X(T.begin,{joinWith:""})}}function He(T){if(Array.isArray(T.end)){if(T.skip||T.excludeEnd||T.returnEnd)throw sn("skip, excludeEnd, returnEnd not compatible with endScope: {}"),oe;if(typeof T.endScope!="object"||T.endScope===null)throw sn("endScope must be object"),oe;Ce(T,T.end,{key:"endScope"}),T.end=X(T.end,{joinWith:""})}}function _t(T){T.scope&&typeof T.scope=="object"&&T.scope!==null&&(T.beginScope=T.scope,delete T.scope)}function En(T){_t(T),typeof T.beginScope=="string"&&(T.beginScope={_wrap:T.beginScope}),typeof T.endScope=="string"&&(T.endScope={_wrap:T.endScope}),Pe(T),He(T)}function jt(T){function Y(he,me){return new RegExp(h(he),"m"+(T.case_insensitive?"i":"")+(T.unicodeRegex?"u":"")+(me?"g":""))}class fe{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(me,xe){xe.position=this.position++,this.matchIndexes[this.matchAt]=xe,this.regexes.push([xe,me]),this.matchAt+=L(me)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);const me=this.regexes.map(xe=>xe[1]);this.matcherRe=Y(X(me,{joinWith:"|"}),!0),this.lastIndex=0}exec(me){this.matcherRe.lastIndex=this.lastIndex;const xe=this.matcherRe.exec(me);if(!xe)return null;const yt=xe.findIndex((In,or)=>or>0&&In!==void 0),tt=this.matchIndexes[yt];return xe.splice(0,yt),Object.assign(xe,tt)}}class Re{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(me){if(this.multiRegexes[me])return this.multiRegexes[me];const xe=new fe;return this.rules.slice(me).forEach(([yt,tt])=>xe.addRule(yt,tt)),xe.compile(),this.multiRegexes[me]=xe,xe}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(me,xe){this.rules.push([me,xe]),xe.type==="begin"&&this.count++}exec(me){const xe=this.getMatcher(this.regexIndex);xe.lastIndex=this.lastIndex;let yt=xe.exec(me);if(this.resumingScanAtSamePosition()&&!(yt&&yt.index===this.lastIndex)){const tt=this.getMatcher(0);tt.lastIndex=this.lastIndex+1,yt=tt.exec(me)}return yt&&(this.regexIndex+=yt.position+1,this.regexIndex===this.count&&this.considerAll()),yt}}function rt(he){const me=new Re;return he.contains.forEach(xe=>me.addRule(xe.begin,{rule:xe,type:"begin"})),he.terminatorEnd&&me.addRule(he.terminatorEnd,{type:"end"}),he.illegal&&me.addRule(he.illegal,{type:"illegal"}),me}function lt(he,me){const xe=he;if(he.isCompiled)return xe;[rr,jn,En,Jt].forEach(tt=>tt(he,me)),T.compilerExtensions.forEach(tt=>tt(he,me)),he.__beforeBegin=null,[An,Hn,Ke].forEach(tt=>tt(he,me)),he.isCompiled=!0;let yt=null;return typeof he.keywords=="object"&&he.keywords.$pattern&&(he.keywords=Object.assign({},he.keywords),yt=he.keywords.$pattern,delete he.keywords.$pattern),yt=yt||/\w+/,he.keywords&&(he.keywords=bn(he.keywords,T.case_insensitive)),xe.keywordPatternRe=Y(yt,!0),me&&(he.begin||(he.begin=/\B|\b/),xe.beginRe=Y(xe.begin),!he.end&&!he.endsWithParent&&(he.end=/\B|\b/),he.end&&(xe.endRe=Y(xe.end)),xe.terminatorEnd=h(xe.end)||"",he.endsWithParent&&me.terminatorEnd&&(xe.terminatorEnd+=(he.end?"|":"")+me.terminatorEnd)),he.illegal&&(xe.illegalRe=Y(he.illegal)),he.contains||(he.contains=[]),he.contains=[].concat(...he.contains.map(function(tt){return Gn(tt==="self"?he:tt)})),he.contains.forEach(function(tt){lt(tt,xe)}),he.starts&<(he.starts,me),xe.matcher=rt(xe),xe}if(T.compilerExtensions||(T.compilerExtensions=[]),T.contains&&T.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return T.classNameAliases=l(T.classNameAliases||{}),lt(T)}function _n(T){return T?T.endsWithParent||_n(T.starts):!1}function Gn(T){return T.variants&&!T.cachedVariants&&(T.cachedVariants=T.variants.map(function(Y){return l(T,{variants:null},Y)})),T.cachedVariants?T.cachedVariants:_n(T)?l(T,{starts:T.starts?l(T.starts):null}):Object.isFrozen(T)?l(T):T}var vt="11.11.2";class un extends Error{constructor(Y,fe){super(Y),this.name="HTMLInjectionError",this.html=fe}}const Ct=r,ei=l,ti=Symbol("nomatch"),ir=7,Kn=function(T){const Y=Object.create(null),fe=Object.create(null),Re=[];let rt=!0;const lt="Could not find the language '{}', did you forget to load/include a language module?",he={disableAutodetect:!0,name:"Plain text",contains:[]};let me={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:y};function xe(re){return me.noHighlightRe.test(re)}function yt(re){let ve=re.className+" ";ve+=re.parentNode?re.parentNode.className:"";const ze=me.languageDetectRe.exec(ve);if(ze){const Be=vn(ze[1]);return Be||(Ar(lt.replace("{}",ze[1])),Ar("Falling back to no-highlight mode for this block.",re)),Be?ze[1]:"no-highlight"}return ve.split(/\s+/).find(Be=>xe(Be)||vn(Be))}function tt(re,ve,ze){let Be="",mt="";typeof ve=="object"?(Be=re,ze=ve.ignoreIllegals,mt=ve.language):(W("10.7.0","highlight(lang, code, ...args) has been deprecated."),W("10.7.0",`Please use highlight(code, options) instead. -https://github.com/highlightjs/highlight.js/issues/2277`),mt=re,Be=ve),ze===void 0&&(ze=!0);const ut={code:Be,language:mt};Or("before:highlight",ut);const Mn=ut.result?ut.result:In(ut.language,ut.code,ze);return Mn.code=ut.code,Or("after:highlight",Mn),Mn}function In(re,ve,ze,Be){const mt=Object.create(null);function ut(ue,ge){return ue.keywords[ge]}function Mn(){if(!Ie.keywords){gt.addText(Qe);return}let ue=0;Ie.keywordPatternRe.lastIndex=0;let ge=Ie.keywordPatternRe.exec(Qe),Ae="";for(;ge;){Ae+=Qe.substring(ue,ge.index);const je=cn.case_insensitive?ge[0].toLowerCase():ge[0],ft=ut(Ie,je);if(ft){const[xt,ma]=ft;if(gt.addText(Ae),Ae="",mt[je]=(mt[je]||0)+1,mt[je]<=ir&&(Lr+=ma),xt.startsWith("_"))Ae+=ge[0];else{const Uo=cn.classNameAliases[xt]||xt;Ft(ge[0],Uo)}}else Ae+=ge[0];ue=Ie.keywordPatternRe.lastIndex,ge=Ie.keywordPatternRe.exec(Qe)}Ae+=Qe.substring(ue),gt.addText(Ae)}function ii(){if(Qe==="")return;let ue=null;if(typeof Ie.subLanguage=="string"){if(!Y[Ie.subLanguage]){gt.addText(Qe);return}ue=In(Ie.subLanguage,Qe,!0,Ui[Ie.subLanguage]),Ui[Ie.subLanguage]=ue._top}else ue=Rr(Qe,Ie.subLanguage.length?Ie.subLanguage:null);Ie.relevance>0&&(Lr+=ue.relevance),gt.__addSublanguage(ue._emitter,ue.language)}function zt(){Ie.subLanguage!=null?ii():Mn(),Qe=""}function Ft(ue,ge){ue!==""&&(gt.startScope(ge),gt.addText(ue),gt.endScope())}function Ir(ue,ge){let Ae=1;const je=ge.length-1;for(;Ae<=je;){if(!ue._emit[Ae]){Ae++;continue}const ft=cn.classNameAliases[ue[Ae]]||ue[Ae],xt=ge[Ae];ft?Ft(xt,ft):(Qe=xt,Mn(),Qe=""),Ae++}}function lr(ue,ge){return ue.scope&&typeof ue.scope=="string"&>.openNode(cn.classNameAliases[ue.scope]||ue.scope),ue.beginScope&&(ue.beginScope._wrap?(Ft(Qe,cn.classNameAliases[ue.beginScope._wrap]||ue.beginScope._wrap),Qe=""):ue.beginScope._multi&&(Ir(ue.beginScope,ge),Qe="")),Ie=Object.create(ue,{parent:{value:Ie}}),Ie}function Mr(ue,ge,Ae){let je=P(ue.endRe,Ae);if(je){if(ue["on:end"]){const ft=new i(ue);ue["on:end"](ge,ft),ft.isMatchIgnored&&(je=!1)}if(je){for(;ue.endsParent&&ue.parent;)ue=ue.parent;return ue}}if(ue.endsWithParent)return Mr(ue.parent,ge,Ae)}function fa(ue){return Ie.matcher.regexIndex===0?(Qe+=ue[0],1):(ur=!0,0)}function pa(ue){const ge=ue[0],Ae=ue.rule,je=new i(Ae),ft=[Ae.__beforeBegin,Ae["on:begin"]];for(const xt of ft)if(xt&&(xt(ue,je),je.isMatchIgnored))return fa(ge);return Ae.skip?Qe+=ge:(Ae.excludeBegin&&(Qe+=ge),zt(),!Ae.returnBegin&&!Ae.excludeBegin&&(Qe=ge)),lr(Ae,ue),Ae.returnBegin?0:ge.length}function Fi(ue){const ge=ue[0],Ae=ve.substring(ue.index),je=Mr(Ie,ue,Ae);if(!je)return ti;const ft=Ie;Ie.endScope&&Ie.endScope._wrap?(zt(),Ft(ge,Ie.endScope._wrap)):Ie.endScope&&Ie.endScope._multi?(zt(),Ir(Ie.endScope,ue)):ft.skip?Qe+=ge:(ft.returnEnd||ft.excludeEnd||(Qe+=ge),zt(),ft.excludeEnd&&(Qe=ge));do Ie.scope&>.closeNode(),!Ie.skip&&!Ie.subLanguage&&(Lr+=Ie.relevance),Ie=Ie.parent;while(Ie!==je.parent);return je.starts&&lr(je.starts,ue),ft.returnEnd?0:ge.length}function Bo(){const ue=[];for(let ge=Ie;ge!==cn;ge=ge.parent)ge.scope&&ue.unshift(ge.scope);ue.forEach(ge=>gt.openNode(ge))}let ar={};function sr(ue,ge){const Ae=ge&&ge[0];if(Qe+=ue,Ae==null)return zt(),0;if(ar.type==="begin"&&ge.type==="end"&&ar.index===ge.index&&Ae===""){if(Qe+=ve.slice(ge.index,ge.index+1),!rt){const je=new Error(`0 width match regex (${re})`);throw je.languageName=re,je.badRule=ar.rule,je}return 1}if(ar=ge,ge.type==="begin")return pa(ge);if(ge.type==="illegal"&&!ze){const je=new Error('Illegal lexeme "'+Ae+'" for mode "'+(Ie.scope||"")+'"');throw je.mode=Ie,je}else if(ge.type==="end"){const je=Fi(ge);if(je!==ti)return je}if(ge.type==="illegal"&&Ae==="")return ge.index===ve.length||(Qe+=` -`),1;if(Dr>1e5&&Dr>ge.index*3)throw new Error("potential infinite loop, way more iterations than matches");return Qe+=Ae,Ae.length}const cn=vn(re);if(!cn)throw sn(lt.replace("{}",re)),new Error('Unknown language: "'+re+'"');const Bi=jt(cn);let Ve="",Ie=Be||Bi;const Ui={},gt=new me.__emitter(me);Bo();let Qe="",Lr=0,Ln=0,Dr=0,ur=!1;try{if(cn.__emitTokens)cn.__emitTokens(ve,gt);else{for(Ie.matcher.considerAll();;){Dr++,ur?ur=!1:Ie.matcher.considerAll(),Ie.matcher.lastIndex=Ln;const ue=Ie.matcher.exec(ve);if(!ue)break;const ge=ve.substring(Ln,ue.index),Ae=sr(ge,ue);Ln=ue.index+Ae}sr(ve.substring(Ln))}return gt.finalize(),Ve=gt.toHTML(),{language:re,value:Ve,relevance:Lr,illegal:!1,_emitter:gt,_top:Ie}}catch(ue){if(ue.message&&ue.message.includes("Illegal"))return{language:re,value:Ct(ve),illegal:!0,relevance:0,_illegalBy:{message:ue.message,index:Ln,context:ve.slice(Ln-100,Ln+100),mode:ue.mode,resultSoFar:Ve},_emitter:gt};if(rt)return{language:re,value:Ct(ve),illegal:!1,relevance:0,errorRaised:ue,_emitter:gt,_top:Ie};throw ue}}function or(re){const ve={value:Ct(re),illegal:!1,relevance:0,_top:he,_emitter:new me.__emitter(me)};return ve._emitter.addText(re),ve}function Rr(re,ve){ve=ve||me.languages||Object.keys(Y);const ze=or(re),Be=ve.filter(vn).filter(Fo).map(zt=>In(zt,re,!1));Be.unshift(ze);const mt=Be.sort((zt,Ft)=>{if(zt.relevance!==Ft.relevance)return Ft.relevance-zt.relevance;if(zt.language&&Ft.language){if(vn(zt.language).supersetOf===Ft.language)return 1;if(vn(Ft.language).supersetOf===zt.language)return-1}return 0}),[ut,Mn]=mt,ii=ut;return ii.secondBest=Mn,ii}function ua(re,ve,ze){const Be=ve&&fe[ve]||ze;re.classList.add("hljs"),re.classList.add(`language-${Be}`)}function Di(re){let ve=null;const ze=yt(re);if(xe(ze))return;if(Or("before:highlightElement",{el:re,language:ze}),re.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",re);return}if(re.children.length>0&&(me.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(re)),me.throwUnescapedHTML))throw new un("One of your code blocks includes unescaped HTML.",re.innerHTML);ve=re;const Be=ve.textContent,mt=ze?tt(Be,{language:ze,ignoreIllegals:!0}):Rr(Be);re.innerHTML=mt.value,re.dataset.highlighted="yes",ua(re,ze,mt.language),re.result={language:mt.language,re:mt.relevance,relevance:mt.relevance},mt.secondBest&&(re.secondBest={language:mt.secondBest.language,relevance:mt.secondBest.relevance}),Or("after:highlightElement",{el:re,result:mt,text:Be})}function ca(re){me=ei(me,re)}const Vn=()=>{ni(),W("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function Mo(){ni(),W("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let Pi=!1;function ni(){function re(){ni()}if(document.readyState==="loading"){Pi||window.addEventListener("DOMContentLoaded",re,!1),Pi=!0;return}document.querySelectorAll(me.cssSelector).forEach(Di)}function Lo(re,ve){let ze=null;try{ze=ve(T)}catch(Be){if(sn("Language definition for '{}' could not be registered.".replace("{}",re)),rt)sn(Be);else throw Be;ze=he}ze.name||(ze.name=re),Y[re]=ze,ze.rawDefinition=ve.bind(null,T),ze.aliases&&zo(ze.aliases,{languageName:re})}function Do(re){delete Y[re];for(const ve of Object.keys(fe))fe[ve]===re&&delete fe[ve]}function Po(){return Object.keys(Y)}function vn(re){return re=(re||"").toLowerCase(),Y[re]||Y[fe[re]]}function zo(re,{languageName:ve}){typeof re=="string"&&(re=[re]),re.forEach(ze=>{fe[ze.toLowerCase()]=ve})}function Fo(re){const ve=vn(re);return ve&&!ve.disableAutodetect}function st(re){re["before:highlightBlock"]&&!re["before:highlightElement"]&&(re["before:highlightElement"]=ve=>{re["before:highlightBlock"](Object.assign({block:ve.el},ve))}),re["after:highlightBlock"]&&!re["after:highlightElement"]&&(re["after:highlightElement"]=ve=>{re["after:highlightBlock"](Object.assign({block:ve.el},ve))})}function da(re){st(re),Re.push(re)}function zi(re){const ve=Re.indexOf(re);ve!==-1&&Re.splice(ve,1)}function Or(re,ve){const ze=re;Re.forEach(function(Be){Be[ze]&&Be[ze](ve)})}function ri(re){return W("10.7.0","highlightBlock will be removed entirely in v12.0"),W("10.7.0","Please use highlightElement now."),Di(re)}Object.assign(T,{highlight:tt,highlightAuto:Rr,highlightAll:ni,highlightElement:Di,highlightBlock:ri,configure:ca,initHighlighting:Vn,initHighlightingOnLoad:Mo,registerLanguage:Lo,unregisterLanguage:Do,listLanguages:Po,getLanguage:vn,registerAliases:zo,autoDetection:Fo,inherit:ei,addPlugin:da,removePlugin:zi}),T.debugMode=function(){rt=!1},T.safeMode=function(){rt=!0},T.versionString=vt,T.regex={concat:N,lookahead:b,either:S,optional:w,anyNumberOfTimes:E};for(const re in Ze)typeof Ze[re]=="object"&&e(Ze[re]);return Object.assign(T,Ze),T},Wn=Kn({});return Wn.newInstance=()=>Kn({}),pu=Wn,Wn.HighlightJS=Wn,Wn.default=Wn,pu}var lS=oS();const aS=Co(lS),wp={},sS="hljs-";function uS(e){const i=aS.newInstance();return e&&c(e),{highlight:r,highlightAuto:l,listLanguages:s,register:c,registerAlias:u,registered:f};function r(p,m,y){const h=y||wp,b=typeof h.prefix=="string"?h.prefix:sS;if(!i.getLanguage(p))throw new Error("Unknown language: `"+p+"` is not registered");i.configure({__emitter:cS,classPrefix:b});const E=i.highlight(m,{ignoreIllegals:!0,language:p});if(E.errorRaised)throw new Error("Could not highlight with `Highlight.js`",{cause:E.errorRaised});const w=E._emitter.root,N=w.data;return N.language=E.language,N.relevance=E.relevance,w}function l(p,m){const h=(m||wp).subset||s();let b=-1,E=0,w;for(;++bE&&(E=O.data.relevance,w=O)}return w||{type:"root",children:[],data:{language:void 0,relevance:E}}}function s(){return i.listLanguages()}function c(p,m){if(typeof p=="string")i.registerLanguage(p,m);else{let y;for(y in p)Object.hasOwn(p,y)&&i.registerLanguage(y,p[y])}}function u(p,m){if(typeof p=="string")i.registerAliases(typeof m=="string"?m:[...m],{languageName:p});else{let y;for(y in p)if(Object.hasOwn(p,y)){const h=p[y];i.registerAliases(typeof h=="string"?h:[...h],{languageName:y})}}}function f(p){return!!i.getLanguage(p)}}class cS{constructor(i){this.options=i,this.root={type:"root",children:[],data:{language:void 0,relevance:0}},this.stack=[this.root]}addText(i){if(i==="")return;const r=this.stack[this.stack.length-1],l=r.children[r.children.length-1];l&&l.type==="text"?l.value+=i:r.children.push({type:"text",value:i})}startScope(i){this.openNode(String(i))}endScope(){this.closeNode()}__addSublanguage(i,r){const l=this.stack[this.stack.length-1],s=i.root.children;r?l.children.push({type:"element",tagName:"span",properties:{className:[r]},children:s}):l.children.push(...s)}openNode(i){const r=this,l=i.split(".").map(function(u,f){return f?u+"_".repeat(f):r.options.classPrefix+u}),s=this.stack[this.stack.length-1],c={type:"element",tagName:"span",properties:{className:l},children:[]};s.children.push(c),this.stack.push(c)}closeNode(){this.stack.pop()}finalize(){}toHTML(){return""}}const dS={};function fS(e){const i=e||dS,r=i.aliases,l=i.detect||!1,s=i.languages||iS,c=i.plainText,u=i.prefix,f=i.subset;let p="hljs";const m=uS(s);if(r&&m.registerAlias(r),u){const y=u.indexOf("-");p=y===-1?u:u.slice(0,y)}return function(y,h){sa(y,"element",function(b,E,w){if(b.tagName!=="code"||!w||w.type!=="element"||w.tagName!=="pre")return;const N=pS(b);if(N===!1||!N&&!l||N&&c&&c.includes(N))return;Array.isArray(b.properties.className)||(b.properties.className=[]),b.properties.className.includes(p)||b.properties.className.unshift(p);const O=Aw(b,{whitespace:"pre"});let S;try{S=N?m.highlight(N,O,{prefix:u}):m.highlightAuto(O,{prefix:u,subset:f})}catch(L){const P=L;if(N&&/Unknown language/.test(P.message)){h.message("Cannot highlight as `"+N+"`, it’s not registered",{ancestors:[w,b],cause:P,place:b.position,ruleId:"missing-language",source:"rehype-highlight"});return}throw P}!N&&S.data&&S.data.language&&b.properties.className.push("language-"+S.data.language),S.children.length>0&&(b.children=S.children)})}}function pS(e){const i=e.properties.className;let r=-1;if(!Array.isArray(i))return;let l;for(;++rtypeof r=="string"):[]}catch{return[]}}function hS(e){if(!e.files)return[];try{const i=JSON.parse(e.files);return Array.isArray(i)?i.flatMap(r=>{const l=r;return typeof(l==null?void 0:l.name)!="string"||typeof(l==null?void 0:l.content)!="string"?[]:[{name:l.name,content:l.content}]}):[]}catch{return[]}}function yS({message:e,toolEvents:i=[],modelLabel:r="qwen3"}){const[l,s]=ce.useState(!1),c=e.role==="user",u=gS(e),f=hS(e);return H.jsxs("div",{className:`msg ${c?"msg-user":"msg-assistant"}`,children:[H.jsx("div",{className:"msg-role",children:c?"du":r}),!c&&e.thinking&&e.thinking.length>0&&H.jsxs("div",{className:`thinking ${l?"open":""}`,children:[H.jsxs("button",{className:"thinking-toggle",onClick:()=>s(p=>!p),children:[H.jsx("span",{className:`caret ${l?"rotated":""}`,children:"▸"}),e.content===""&&l===!1?"denkt nach …":`Denkprozess (${e.thinking.length.toLocaleString("de-DE")} Zeichen)`]}),l&&H.jsx("pre",{className:"thinking-body",children:e.thinking})]}),i.length>0&&H.jsx("div",{className:"tool-events",children:i.map((p,m)=>H.jsxs("div",{className:`tool-event ${p.ok===!1?"failed":""}`,children:[H.jsx("span",{className:"tool-icon",children:p.ok===void 0?"⋯":p.ok?"✓":"✗"}),H.jsx("code",{children:p.name}),H.jsx("span",{className:"tool-args",title:p.args,children:p.args}),p.durationMs!==void 0&&H.jsxs("span",{className:"tool-time",children:[p.durationMs," ms"]})]},m))}),u.length>0&&H.jsx("div",{className:"msg-images",children:u.map((p,m)=>H.jsx("img",{src:`data:${mS(p)};base64,${p}`,alt:`Anhang ${m+1}`,loading:"lazy"},m))}),f.length>0&&H.jsx("div",{className:"msg-files",children:f.map(p=>H.jsxs("span",{className:"file-chip",title:`${p.content.length.toLocaleString("de-DE")} Zeichen`,children:["📄 ",p.name," · ",Math.max(1,Math.round(p.content.length/1024))," kB"]},p.name))}),c?e.content?H.jsx("div",{className:"msg-content user-content",children:e.content}):null:H.jsx("div",{className:"msg-content markdown",children:H.jsx(uv,{remarkPlugins:[kw],rehypePlugins:[fS],children:e.content||"▍"})})]})}const xp=4,Sp=6*1024*1024,mu=["image/png","image/jpeg","image/gif","image/webp"],Np=4,ra=1e5,Tp=10*1024*1024,gu=[".txt",".json",".md",".markdown",".csv",".tsv",".log",".xml",".yaml",".yml",".toml",".ini",".cfg",".conf",".sql",".sh",".bash",".zsh",".py",".js",".mjs",".cjs",".jsx",".ts",".tsx",".css",".scss",".html",".htm",".svg",".rs",".go",".java",".kt",".rb",".php",".c",".h",".cpp",".hpp",".cs",".swift",".diff",".patch"],rg=["application/pdf"],Cu=[".pdf"],Cp=["application/json","application/xml","application/yaml","application/x-sh"];function bS(e){return new Promise((i,r)=>{const l=new FileReader;l.onerror=()=>r(new Error(`${e.name} konnte nicht gelesen werden`)),l.onload=()=>{const s=String(l.result),c=s.indexOf(",");i({id:`${e.name}-${e.size}-${Date.now()}-${Math.random()}`,base64:s.slice(c+1),dataUrl:s,name:e.name||"Bild"})},l.readAsDataURL(e)})}async function ES(e){const i="."+(e.name.split(".").pop()??"").toLowerCase();if(rg.includes(e.type)||Cu.includes(i)){if(e.size>Tp)throw new Error(`${e.name}: größer als ${Math.round(Tp/1024/1024)} MB`);const l=await new Promise((c,u)=>{const f=new FileReader;f.onerror=()=>u(new Error(`${e.name} konnte nicht gelesen werden`)),f.onload=()=>c(String(f.result)),f.readAsDataURL(e)}),s=l.indexOf(",");return{id:`${e.name}-${e.size}-${Date.now()}-${Math.random()}`,name:e.name||"PDF",content:l.slice(s+1),bytes:e.size,encoding:"base64"}}const r=await e.text();if(r.length===0)throw new Error(`${e.name} ist leer`);if(r.length>ra)throw new Error(`${e.name}: größer als ${Math.round(ra/1e3)} kB Text`);if(/[\x00-\x08\x0B\x0C\x0E-\x1F]/.test(r.slice(0,2e3)))throw new Error(`${e.name}: wirkt binär — nur Textdateien`);return{id:`${e.name}-${e.size}-${Date.now()}-${Math.random()}`,name:e.name||"Datei",content:r,bytes:e.size,encoding:"text"}}function _S({streaming:e,disabled:i,recording:r,transcribing:l,injectedText:s,modelLabel:c="qwen3",onInjected:u,onSend:f,onAbort:p,onMicToggle:m}){const[y,h]=ce.useState(""),[b,E]=ce.useState([]),[w,N]=ce.useState([]),[O,S]=ce.useState(null),[L,P]=ce.useState(!1),q=ce.useRef(null),X=ce.useRef(null);ce.useEffect(()=>{s!=null&&(h(s),u(),requestAnimationFrame(()=>{var K,A;(K=q.current)==null||K.focus(),(A=q.current)==null||A.setSelectionRange(s.length,s.length)}))},[s,u]);const M=async K=>{S(null);const A=[],j=[];for(const U of K){const J="."+(U.name.split(".").pop()??"").toLowerCase();if(mu.includes(U.type)){if(U.size>Sp){S(`${U.name}: größer als ${Sp/1024/1024} MB`);continue}A.push(U)}else if(U.type.startsWith("text/")||Cp.includes(U.type)||rg.includes(U.type)||gu.includes(J)||Cu.includes(J)){if(U.size>ra*2){S(`${U.name}: größer als ${Math.round(ra*2/1e3)} kB`);continue}j.push(U)}else S(`${U.name||"Datei"}: nur Bilder (PNG, JPEG, GIF, WebP) oder Textdateien`)}try{if(A.length){const U=await Promise.all(A.map(bS));E(J=>{const Q=xp-J.length;return U.length>Q&&S(`Maximal ${xp} Bilder pro Nachricht`),[...J,...U.slice(0,Math.max(Q,0))]})}if(j.length){const U=await Promise.all(j.map(ES));N(J=>{const Q=Np-J.length;return U.length>Q&&S(`Maximal ${Np} Dateien pro Nachricht`),[...J,...U.slice(0,Math.max(Q,0))]})}}catch(U){S(U instanceof Error?U.message:"Datei konnte nicht gelesen werden")}},le=()=>{const K=y.trim();!K&&b.length===0&&w.length===0||e||i||(f(K,b.map(A=>A.base64),w.map(A=>({name:A.name,content:A.content,encoding:A.encoding==="base64"?"base64":void 0}))),h(""),E([]),N([]),S(null),requestAnimationFrame(()=>{var A;return(A=q.current)==null?void 0:A.focus()}))},de=(y.trim().length>0||b.length>0||w.length>0)&&!i;return H.jsxs("div",{className:`composer ${L?"dragging":""}`,onDragOver:K=>{i||(K.preventDefault(),P(!0))},onDragLeave:()=>P(!1),onDrop:K=>{i||(K.preventDefault(),P(!1),M([...K.dataTransfer.files]))},children:[(b.length>0||w.length>0||O)&&H.jsxs("div",{className:"attachments",children:[b.map(K=>H.jsxs("div",{className:"attachment",children:[H.jsx("img",{src:K.dataUrl,alt:K.name}),H.jsx("button",{className:"attachment-remove",onClick:()=>E(A=>A.filter(j=>j.id!==K.id)),title:`${K.name} entfernen`,children:"×"})]},K.id)),w.map(K=>H.jsxs("div",{className:"attachment attachment-file",children:[H.jsxs("span",{className:"attachment-file-name",children:["📄 ",K.name," · ",Math.max(1,Math.round(K.bytes/1024))," kB"]}),H.jsx("button",{className:"attachment-remove",onClick:()=>N(A=>A.filter(j=>j.id!==K.id)),title:`${K.name} entfernen`,children:"×"})]},K.id)),O&&H.jsx("span",{className:"attachment-error",children:O})]}),H.jsxs("div",{className:"composer-row",children:[H.jsx("button",{className:`btn-mic ${r?"recording":""} ${l?"transcribing":""}`,onClick:m,title:r?"Aufnahme stoppen & senden":l?"Transkribiere …":"Sprachnachricht aufnehmen",disabled:l||i,children:r?"●":l?"…":"🎙"}),H.jsx("button",{className:"btn-attach",onClick:()=>{var K;return(K=X.current)==null?void 0:K.click()},disabled:i,title:"Bild oder Textdatei anhängen (auch per Einfügen oder Drag & Drop)",children:"📎"}),H.jsx("input",{ref:X,type:"file",accept:[...mu,...gu,...Cu].join(","),multiple:!0,hidden:!0,onChange:K=>{M([...K.target.files??[]]),K.target.value=""}}),H.jsx("textarea",{ref:q,value:y,placeholder:r?"Ich höre zu … (zum Beenden nochmal auf das Mikro klicken)":i?"Keine Session aktiv — neuen Chat starten":`Nachricht an ${c} … (Enter = senden, Bild einfügen mit ⌘V)`,rows:1,disabled:i,onChange:K=>h(K.target.value),onPaste:K=>{const A=[...K.clipboardData.files].filter(j=>{const U="."+(j.name.split(".").pop()??"").toLowerCase();return mu.includes(j.type)||j.type.startsWith("text/")||Cp.includes(j.type)||gu.includes(U)});A.length&&(K.preventDefault(),M(A))},onKeyDown:K=>{K.key==="Enter"&&!K.shiftKey&&(K.preventDefault(),le())}}),e?H.jsx("button",{className:"btn-send stop",onClick:p,children:"■ Stop"}):H.jsx("button",{className:"btn-send",disabled:!de,onClick:le,children:"Senden ▸"})]})]})}const vS={fact:"Fakt",decision:"Entscheidung",preference:"Präferenz",entity:"Entität",open_question:"Offen"};function kS({sessionId:e,onClose:i}){const[r,l]=ce.useState(null),[s,c]=ce.useState(null),u=ce.useCallback(async()=>{try{const E=await(await fetch(`/api/sessions/${e}/memory`)).json();E.state&&l(E)}catch{l(null)}},[e]);ce.useEffect(()=>{u()},[u]);const f=async()=>{c("dream");try{await fetch(`/api/sessions/${e}/dream`,{method:"POST"}),await u()}finally{c(null)}},p=async()=>{c("rebuild");try{await fetch(`/api/sessions/${e}/memory/rebuild`,{method:"POST"}),await u()}finally{c(null)}},m=async b=>{await fetch(`/api/anchors/${b.id}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({pinned:!b.pinned})}),await u()},y=async b=>{await fetch(`/api/anchors/${b.id}`,{method:"DELETE"}),await u()},h=r?r.state.last_seq-r.state.last_dream_seq:0;return H.jsx("div",{className:"memory-overlay",onClick:i,children:H.jsxs("section",{className:"memory-panel",onClick:b=>b.stopPropagation(),children:[H.jsxs("header",{className:"memory-header",children:[H.jsxs("div",{children:[H.jsx("div",{className:"memory-title",children:"🧠 Gedächtnis"}),H.jsx("div",{className:"memory-stats",children:r?`${r.state.last_seq} Log-Schritte · ${r.state.dream_count}× geträumt · ${h} unkonsolidiert`:"lädt …"})]}),H.jsx("button",{className:"memory-close",onClick:i,title:"Schließen",children:"✕"})]}),H.jsxs("div",{className:"memory-actions",children:[H.jsx("button",{onClick:()=>void f(),disabled:s!==null,children:s==="dream"?"… träumt":"💤 Traumphase jetzt"}),H.jsx("button",{onClick:()=>void p(),disabled:s!==null,children:s==="rebuild"?"… faltet":"↻ Aus Log rekonstruieren"})]}),r&&r.anchors.length===0&&H.jsx("div",{className:"memory-empty",children:"Noch keine Ankerpunkte. Sie entstehen durch die Traumphase (automatisch nach Inaktivität oder Manual oben) oder wenn das Modell sich etwas mit „remember“ merkt."}),r==null?void 0:r.anchors.map(b=>H.jsxs("div",{className:"anchor-row"+(b.pinned?" pinned":""),children:[H.jsxs("div",{className:"anchor-body",children:[H.jsxs("div",{className:"anchor-kind",children:[vS[b.kind]??b.kind," · ",b.origin]}),H.jsx("div",{className:"anchor-text",children:b.text}),H.jsxs("div",{className:"anchor-meta",children:["Wichtigkeit ",(b.importance*100).toFixed(0)," % · ",b.hits,"× bestätigt"]}),H.jsx("div",{className:"anchor-bar",children:H.jsx("div",{className:"anchor-bar-fill",style:{width:`${Math.round(b.importance*100)}%`}})})]}),H.jsxs("div",{className:"anchor-actions",children:[H.jsx("button",{onClick:()=>void m(b),title:b.pinned?"Pin lösen (Decay möglich)":"Pinnen (vor Decay geschützt)",children:b.pinned?"★":"☆"}),H.jsx("button",{onClick:()=>void y(b),title:"Ankerpunkt löschen",children:"✕"})]})]},b.id))]})})}const Ap="oxagenttwo.voiceMode";function wS(){var Q,G,se;const e=Qh(),i=ce.useRef(null),[r,l]=ce.useState(!1),[s,c]=ce.useState(!1),[u,f]=ce.useState(null),[p,m]=ce.useState(()=>localStorage.getItem(Ap)==="1"),[y,h]=ce.useState([]),[b,E]=ce.useState([]);ce.useEffect(()=>{r&&e.options.provider==="openrouter"&&y.length===0&&fetch("/api/openrouter/models").then(z=>z.json()).then(z=>{z.ok&&z.models&&h(z.models)}).catch(()=>{}),r&&e.options.provider==="ollama"&&b.length===0&&fetch("/api/ollama/models").then(z=>z.json()).then(z=>{z.ok&&z.models&&E(z.models)}).catch(()=>{})},[r,e.options.provider,y.length,b.length]);const w=ce.useRef(p),N=ce.useRef(!1),O=ce.useRef(!1);N.current=e.streaming,w.current=p;const S=ce.useCallback(z=>{m(z),localStorage.setItem(Ap,z?"1":"0")},[]),L=Xh({onTranscript:z=>{w.current?(P.current.cancelSpeech(),X.current="",q.current.sendMessage(z)):f(z)},onQueueDrained:()=>{O.current&&(O.current=!1,w.current&&!N.current&&P.current.startRecording())}}),P=ce.useRef(L);P.current=L;const q=ce.useRef(e);q.current=e;const X=ce.useRef(""),M=ce.useRef({id:"",offset:0});ce.useEffect(()=>{const z=i.current;z&&(z.scrollTop=z.scrollHeight)},[e.messages]),ce.useEffect(()=>{if(!p)return;const z=[...e.messages].reverse().find(k=>k.role==="assistant");if(!z)return;M.current.id!==z.id&&(M.current={id:z.id,offset:0},X.current="");const V=z.content;if(V.length=40&&($=v.slice(0,ke))}else if(v.length>300){const k=Math.max(v.lastIndexOf(", "),v.lastIndexOf(" "));$=k>100?v.slice(0,k+1):v}$&&(X.current=v.slice($.length),L.enqueueSpeech($))});const le=ce.useRef(!1);ce.useEffect(()=>{if(le.current&&!e.streaming&&p){const z=X.current.trim();z&&(X.current="",L.enqueueSpeech(z)),(z||M.current.id)&&(O.current=!0)}le.current=e.streaming},[e.streaming,p,L]);const[de,K]=ce.useState([]);ce.useEffect(()=>{fetch("/api/tools").then(z=>z.json()).then(z=>K(z.tools??[])).catch(()=>K([]))},[]);const A=(e.options.provider==="openrouter"?e.options.openrouterModel.split("/").pop():e.options.model.replace(/:latest$/,""))??"qwen3",j=ce.useCallback((z,V=[],ae=[])=>{L.cancelSpeech(),X.current="",e.sendMessage(z,V,ae)},[e,L]),U=ce.useCallback(()=>{L.cancelSpeech(),X.current="",e.abort()},[e,L]),J=ce.useCallback(()=>{L.recording?L.stopRecording():(L.cancelSpeech(),L.startRecording())},[L]);return H.jsxs("div",{className:"app",children:[H.jsx(Zh,{sessions:e.sessions,activeId:e.activeId,onSelect:e.setActiveId,onNew:()=>void e.newSession(),onDelete:z=>void e.deleteSession(z)}),H.jsxs("main",{className:"main",children:[H.jsxs("header",{className:"topbar",children:[H.jsxs("div",{className:"model-badge",title:(Q=e.modelInfo)!=null&&Q.ok||(G=e.modelInfo)==null?void 0:G.error,children:[H.jsx("span",{className:`status-dot ${e.status==="open"?"on":"off"}`}),e.options.provider==="openrouter"?`☁ ${e.options.openrouterModel}`:(se=e.modelInfo)!=null&&se.ok?`${e.modelInfo.model} · ${e.modelInfo.parameterSize} · ${e.modelInfo.quantization}`:"Ollama offline"]}),H.jsxs("div",{className:"topbar-actions",children:[p&&(L.recording||L.transcribing||L.speaking)&&H.jsx("span",{className:"voice-state",children:L.recording?"● hört zu":L.transcribing?"… transkribiert":"🔊 spricht"}),H.jsx("button",{className:`btn-settings ${p?"toggled":""}`,onClick:()=>{p&&(L.cancelSpeech(),L.stopRecording()),S(!p)},title:"Sprachmodus: Antworten werden vorgelesen, danach wird automatisch wieder zugehört",children:p?"🔊 Stimme: an":"🔇 Stimme: aus"}),H.jsx("button",{className:"btn-settings",onClick:()=>c(z=>!z),disabled:!e.activeId,title:"Gedächtnis: Ankerpunkte, Traumphase, Log-Rekonstruktion",children:"🧠 Gedächtnis"}),H.jsx("button",{className:"btn-settings",onClick:()=>l(z=>!z),children:"⚙ Einstellungen"})]})]}),r&&H.jsxs("section",{className:"settings-panel",children:[H.jsxs("label",{className:"setting-row",children:[H.jsx("span",{children:"Modell"}),H.jsxs("select",{className:"provider-select",value:e.options.provider,onChange:z=>e.setOptions({provider:z.target.value}),children:[H.jsx("option",{value:"ollama",children:"Lokal: qwen3.5 (Ollama)"}),H.jsx("option",{value:"openrouter",children:"OpenRouter (Cloud)"})]})]}),e.options.provider==="openrouter"&&H.jsxs("label",{className:"setting-row column",children:[H.jsxs("span",{children:["OpenRouter-Modell (",y.length," verfügbar)"]}),H.jsx("input",{list:"or-models",value:e.options.openrouterModel,placeholder:"z. B. anthropic/claude-sonnet-4.5",onChange:z=>e.setOptions({openrouterModel:z.target.value})}),H.jsx("datalist",{id:"or-models",children:y.map(z=>H.jsxs("option",{value:z.id,children:[z.name," · ",z.promptPrice===0?"gratis":`$${z.promptPrice.toFixed(2)}/M`]},z.id))})]}),e.options.provider==="ollama"&&H.jsxs("label",{className:"setting-row",children:[H.jsx("span",{children:"Lokales Modell (Ollama)"}),H.jsxs("select",{className:"provider-select",value:b.some(z=>z.name===e.options.model)?e.options.model:"",onChange:z=>e.setOptions({model:z.target.value}),children:[!b.some(z=>z.name===e.options.model)&&H.jsxs("option",{value:"",children:[e.options.model," (nicht installiert)"]}),b.map(z=>H.jsxs("option",{value:z.name,children:[z.name,z.parameterSize?` · ${z.parameterSize}`:"",z.sizeGB?` · ${z.sizeGB} GB`:""]},z.name)),b.length===0&&H.jsx("option",{value:e.options.model,children:e.options.model})]})]}),e.options.provider==="ollama"&&H.jsxs("label",{className:"setting-row checkbox",children:[H.jsx("input",{type:"checkbox",checked:e.options.think,onChange:z=>e.setOptions({think:z.target.checked})}),H.jsx("span",{children:"Thinking-Mode (Modell denkt sichtbar vor der Antwort)"})]}),H.jsxs("label",{className:"setting-row checkbox",children:[H.jsx("input",{type:"checkbox",checked:e.options.tools,onChange:z=>e.setOptions({tools:z.target.checked})}),H.jsxs("span",{children:["Werkzeuge (",de.length>0?de.join(", "):"keine geladen",")"]})]}),H.jsxs("label",{className:"setting-row",children:[H.jsxs("span",{children:["Temperature: ",e.options.temperature.toFixed(2)]}),H.jsx("input",{type:"range",min:0,max:1.5,step:.05,value:e.options.temperature,onChange:z=>e.setOptions({temperature:Number(z.target.value)})})]}),H.jsxs("label",{className:"setting-row",children:[H.jsxs("span",{children:["Max. Tokens: ",e.options.numPredict]}),H.jsx("input",{type:"range",min:256,max:8192,step:256,value:e.options.numPredict,onChange:z=>e.setOptions({numPredict:Number(z.target.value)})})]}),H.jsxs("label",{className:"setting-row",children:[H.jsxs("span",{children:["Gedächtnis-Fenster: ",e.options.memorySteps," Schritte"]}),H.jsx("input",{type:"range",min:2,max:50,step:1,value:e.options.memorySteps,onChange:z=>e.setOptions({memorySteps:Number(z.target.value)})})]}),H.jsxs("label",{className:"setting-row checkbox",children:[H.jsx("input",{type:"checkbox",checked:e.options.memoryAnchors,onChange:z=>e.setOptions({memoryAnchors:z.target.checked})}),H.jsx("span",{children:"Ankerpunkte ins Modell einspielen (Gedächtnis als System-Kontext)"})]}),H.jsxs("label",{className:"setting-row checkbox",children:[H.jsx("input",{type:"checkbox",checked:e.options.dreamAuto,onChange:z=>e.setOptions({dreamAuto:z.target.checked})}),H.jsx("span",{children:"Auto-Traumphase (Konsolidierung nach 3 Min Inaktivität oder 10 Schritten)"})]}),H.jsxs("label",{className:"setting-row column",children:[H.jsx("span",{children:"System-Prompt"}),H.jsx("textarea",{rows:3,placeholder:"Optional: Verhalten des Modells steuern …",value:e.systemPrompt,onChange:z=>e.setSystemPrompt(z.target.value)})]})]}),s&&e.activeId&&H.jsx(kS,{sessionId:e.activeId,onClose:()=>c(!1)}),H.jsxs("div",{className:"messages",ref:i,children:[e.messages.length===0&&H.jsxs("div",{className:"welcome",children:[H.jsx("div",{className:"welcome-title",children:"▸ agenttwo-tools"}),H.jsx("p",{children:"Echtzeit-Chat mit lokalem Qwen3 über Ollama — per Tastatur oder Stimme (Whisper STT + Piper TTS, alles lokal)."}),H.jsx("p",{className:"hint",children:"🎙 für Sprachnachricht · 🔊 Stimme an für freihändigen Dialog"})]}),e.messages.map(z=>H.jsx(yS,{message:z,toolEvents:e.toolEvents[z.id],modelLabel:A},z.id))]}),L.error&&H.jsxs("div",{className:"voice-error",children:[L.error,H.jsx("button",{onClick:()=>L.setError(null),children:"✕"})]}),H.jsx(_S,{streaming:e.streaming,disabled:!e.activeId,recording:L.recording,transcribing:L.transcribing,injectedText:u,modelLabel:A,onInjected:()=>f(null),onSend:j,onAbort:U,onMicToggle:J})]})]})}Vh.createRoot(document.getElementById("root")).render(H.jsx(Uh.StrictMode,{children:H.jsx(wS,{})})); diff --git a/web/dist/assets/index-CXQcDbVB.css b/web/dist/assets/index-CXQcDbVB.css deleted file mode 100644 index c89f180..0000000 --- a/web/dist/assets/index-CXQcDbVB.css +++ /dev/null @@ -1,10 +0,0 @@ -pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! - Theme: GitHub Dark - Description: Dark theme as seen on github.com - Author: github.com - Maintainer: @Hirse - Updated: 2021-05-15 - - Outdated base version: https://github.com/primer/github-syntax-dark - Current colors taken from GitHub's CSS -*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}:root{--bg: #0a0f0c;--bg-panel: #0e1511;--bg-elevated: #121b15;--border: #1e2c23;--text: #d4e4d8;--text-dim: #7a9484;--accent: #3ddc84;--accent-dim: #2a9a5f;--accent-warm: #ffb454;--user-bg: #16241c;--mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace}*{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%}body{background:var(--bg);color:var(--text);font-family:var(--mono);font-size:14px;line-height:1.55}.app{display:flex;height:100%}.sidebar{width:250px;flex-shrink:0;background:var(--bg-panel);border-right:1px solid var(--border);display:flex;flex-direction:column}.sidebar-header{padding:16px 14px;border-bottom:1px solid var(--border)}.brand{font-weight:700;letter-spacing:.04em;color:var(--accent);margin-bottom:12px}.brand-prompt{animation:blink 1.2s steps(2) infinite}@keyframes blink{50%{opacity:.25}}.btn-new,.btn-settings,.btn-send{font-family:inherit;font-size:13px;background:transparent;color:var(--accent);border:1px solid var(--accent-dim);border-radius:6px;padding:7px 12px;cursor:pointer;transition:background .15s,border-color .15s}.btn-new{width:100%}.btn-new:hover,.btn-settings:hover{background:#3ddc8414;border-color:var(--accent)}.session-list{overflow-y:auto;flex:1;padding:8px}.empty-hint{color:var(--text-dim);padding:10px;font-size:13px}.session-item{display:flex;align-items:center;gap:6px;padding:8px 10px;border-radius:6px;cursor:pointer;color:var(--text-dim);margin-bottom:2px}.session-item:hover{background:var(--bg-elevated);color:var(--text)}.session-item.active{background:var(--user-bg);color:var(--accent)}.session-title{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px}.session-delete{background:none;border:none;color:var(--text-dim);cursor:pointer;opacity:0;font-size:12px}.session-item:hover .session-delete{opacity:1}.session-delete:hover{color:#ff6b6b}.main{flex:1;display:flex;flex-direction:column;min-width:0}.topbar{display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-bottom:1px solid var(--border);background:var(--bg-panel)}.model-badge{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text-dim)}.status-dot{width:8px;height:8px;border-radius:50%;background:#555}.status-dot.on{background:var(--accent);box-shadow:0 0 6px var(--accent)}.status-dot.off{background:#ff6b6b}.settings-panel{padding:14px 20px;border-bottom:1px solid var(--border);background:var(--bg-elevated);display:flex;flex-direction:column;gap:12px}.setting-row{display:flex;align-items:center;gap:14px;font-size:13px;color:var(--text-dim)}.setting-row.column{flex-direction:column;align-items:stretch}.setting-row input[type=range]{flex:1;accent-color:var(--accent)}.setting-row textarea,.provider-select,.settings-panel input[list]{font-family:inherit;background:var(--bg);border:1px solid var(--border);color:var(--text);border-radius:6px;padding:8px 10px}.setting-row textarea{resize:vertical}.provider-select{min-width:220px}.messages{flex:1;overflow-y:auto;padding:24px 20px;scroll-behavior:smooth}.welcome{max-width:640px;margin:80px auto;text-align:center;color:var(--text-dim)}.welcome-title{font-size:22px;color:var(--accent);margin-bottom:12px}.welcome .hint{margin-top:8px;font-size:13px}.msg{max-width:760px;margin:0 auto 20px}.msg-role{font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--text-dim);margin-bottom:6px}.msg-user .msg-role{color:var(--accent)}.user-content{background:var(--user-bg);border:1px solid var(--border);border-radius:10px;padding:12px 14px;white-space:pre-wrap;word-break:break-word}.markdown{word-break:break-word}.markdown p{margin:0 0 10px}.markdown p:last-child{margin-bottom:0}.markdown ul,.markdown ol{margin:0 0 10px 22px}.markdown li{margin-bottom:4px}.markdown h1,.markdown h2,.markdown h3{margin:16px 0 8px;color:var(--accent)}.markdown blockquote{border-left:3px solid var(--accent-dim);padding-left:12px;color:var(--text-dim);margin:0 0 10px}.markdown a{color:var(--accent)}.markdown table{border-collapse:collapse;margin-bottom:10px}.markdown th,.markdown td{border:1px solid var(--border);padding:5px 10px;font-size:13px}.markdown :not(pre)>code{background:var(--bg-elevated);border:1px solid var(--border);border-radius:4px;padding:1px 5px;font-size:13px;color:var(--accent-warm)}.markdown pre{background:var(--bg-panel);border:1px solid var(--border);border-radius:8px;padding:12px 14px;overflow-x:auto;margin-bottom:10px;font-size:13px}.thinking{margin-bottom:8px;border:1px dashed var(--border);border-radius:8px}.thinking-toggle{width:100%;text-align:left;background:none;border:none;font-family:inherit;font-size:12px;color:var(--text-dim);padding:8px 10px;cursor:pointer}.thinking-toggle:hover{color:var(--accent-warm)}.caret{display:inline-block;transition:transform .15s}.caret.rotated{transform:rotate(90deg)}.thinking-body{padding:4px 12px 10px;font-size:12.5px;color:var(--text-dim);white-space:pre-wrap;max-height:260px;overflow-y:auto}.composer{display:flex;gap:10px;padding:14px 20px 18px;border-top:1px solid var(--border);background:var(--bg-panel);align-items:stretch}.btn-mic{width:46px;flex-shrink:0;font-size:18px;background:transparent;border:1px solid var(--border);border-radius:8px;cursor:pointer;color:var(--text-dim);transition:border-color .15s,color .15s,box-shadow .15s}.btn-mic:hover:not(:disabled){border-color:var(--accent-dim);color:var(--accent)}.btn-mic.recording{border-color:#ff6b6b;color:#ff6b6b;animation:pulse 1.2s ease-in-out infinite}.btn-mic.transcribing{border-color:var(--accent-warm);color:var(--accent-warm)}@keyframes pulse{50%{box-shadow:0 0 0 5px #ff6b6b26}}.voice-state{font-size:12px;color:var(--accent-warm);white-space:nowrap}.topbar-actions{display:flex;align-items:center;gap:12px}.btn-settings.toggled{color:var(--accent-warm);border-color:var(--accent-warm)}.voice-error{display:flex;justify-content:space-between;align-items:center;gap:12px;margin:0 20px 8px;padding:8px 12px;font-size:13px;color:#ffb454;background:#ffb45414;border:1px solid rgba(255,180,84,.3);border-radius:8px}.voice-error button{background:none;border:none;color:inherit;cursor:pointer}.composer textarea{flex:1;resize:none;font-family:inherit;font-size:14px;background:var(--bg);border:1px solid var(--border);border-radius:8px;color:var(--text);padding:11px 14px;min-height:44px;max-height:180px}.composer textarea:focus{outline:none;border-color:var(--accent-dim)}.composer textarea::placeholder{color:#4d6355}.btn-send{min-width:96px;align-self:stretch}.btn-send:disabled{opacity:.4;cursor:not-allowed}.btn-send:not(:disabled):hover{background:#3ddc841a}.btn-send.stop{color:var(--accent-warm);border-color:var(--accent-warm)}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}::-webkit-scrollbar-track{background:transparent}.composer.dragging{outline:2px dashed var(--accent, #3fb950);outline-offset:-4px}.composer{flex-direction:column;align-items:stretch}.composer-row{display:flex;align-items:flex-end;gap:10px;width:100%}.attachments{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:0 0 8px}.attachment{position:relative;width:64px;height:64px}.attachment img{width:100%;height:100%;object-fit:cover;border-radius:6px;border:1px solid var(--border, #30363d)}.attachment-remove{position:absolute;top:-6px;right:-6px;width:20px;height:20px;line-height:18px;padding:0;border-radius:50%;border:1px solid var(--border, #30363d);background:var(--bg, #0d1117);color:var(--fg, #c9d1d9);cursor:pointer}.attachment-error{font-size:.85em;color:#f85149}.btn-attach{flex:0 0 auto;background:transparent;border:1px solid var(--border, #30363d);border-radius:8px;padding:8px 10px;cursor:pointer;color:inherit}.btn-attach:disabled{opacity:.4;cursor:default}.msg-images{display:flex;flex-wrap:wrap;gap:8px;margin:6px 0}.msg-images img{max-width:min(320px,100%);max-height:320px;border-radius:8px;border:1px solid var(--border, #30363d)}.tool-events{display:flex;flex-direction:column;gap:4px;margin:4px 0 10px}.tool-event{display:flex;align-items:center;gap:8px;font-size:.85em;padding:4px 10px;border-left:2px solid var(--accent, #3fb950);background:#3fb9500f;border-radius:0 4px 4px 0;color:var(--fg-dim, #8b949e)}.tool-event.failed{border-left-color:#f85149;background:#f851490f}.tool-event code{color:var(--fg, #c9d1d9);font-weight:600}.tool-args{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.75}.tool-time{flex:0 0 auto;opacity:.6;font-variant-numeric:tabular-nums}.memory-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#04080699;display:flex;align-items:center;justify-content:center;z-index:50}.memory-panel{width:min(660px,92vw);max-height:80vh;overflow-y:auto;background:var(--bg-panel);border:1px solid var(--border);border-radius:10px;padding:18px;display:flex;flex-direction:column;gap:10px}.memory-header{display:flex;justify-content:space-between;align-items:flex-start}.memory-title{color:var(--accent);font-weight:700;letter-spacing:.03em}.memory-stats{color:var(--text-dim);font-size:12px;margin-top:2px}.memory-close{background:transparent;border:none;color:var(--text-dim);font-size:15px;cursor:pointer}.memory-close:hover{color:var(--text)}.memory-actions{display:flex;gap:8px}.memory-actions button{font-family:inherit;font-size:12px;background:transparent;color:var(--accent);border:1px solid var(--accent-dim);border-radius:6px;padding:5px 10px;cursor:pointer}.memory-actions button:hover:not(:disabled){background:var(--user-bg)}.memory-actions button:disabled{opacity:.5;cursor:default}.memory-empty{color:var(--text-dim);font-size:13px;padding:14px;text-align:center;border:1px dashed var(--border);border-radius:8px}.anchor-row{display:flex;gap:10px;align-items:flex-start;padding:9px 12px;background:var(--bg-elevated);border:1px solid var(--border);border-radius:8px}.anchor-row.pinned{border-color:var(--accent-dim)}.anchor-body{flex:1;min-width:0}.anchor-kind{font-size:11px;color:var(--accent-warm);text-transform:uppercase;letter-spacing:.06em}.anchor-text{font-size:13px;margin-top:3px;overflow-wrap:anywhere}.anchor-meta{font-size:11px;color:var(--text-dim);margin-top:4px}.anchor-bar{height:3px;background:var(--border);border-radius:2px;margin-top:6px;overflow:hidden}.anchor-bar-fill{height:100%;background:var(--accent);border-radius:2px}.anchor-actions{display:flex;gap:2px;flex-shrink:0}.anchor-actions button{background:transparent;border:none;color:var(--text-dim);cursor:pointer;font-size:14px;padding:2px 4px}.anchor-actions button:hover{color:var(--accent)}.attachment-file{width:auto;min-width:120px;max-width:320px;height:auto;padding:8px 10px;border-radius:8px;background:var(--bg-elevated);border:1px solid var(--border);display:flex;align-items:center;gap:8px}.attachment-file-name{font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.msg-files{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}.file-chip{font-size:12px;color:var(--text-dim);background:var(--bg-elevated);border:1px solid var(--border);border-radius:6px;padding:3px 8px;max-width:320px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} diff --git a/web/dist/favicon.svg b/web/dist/favicon.svg deleted file mode 100644 index 349f2b7..0000000 --- a/web/dist/favicon.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/web/dist/index.html b/web/dist/index.html deleted file mode 100644 index c0d5ea9..0000000 --- a/web/dist/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - agenttwo-tools — qwen3 mit Vision - - - - -
- - diff --git a/web/src/App.tsx b/web/src/App.tsx index e5995f8..fc54d8a 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -5,6 +5,8 @@ import { Sidebar } from "./components/Sidebar"; import { ChatMessage } from "./components/ChatMessage"; import { Composer } from "./components/Composer"; import { MemoryPanel } from "./components/MemoryPanel"; +import { ToolConfirm } from "./components/ToolConfirm"; +import { StatsBar } from "./components/StatsBar"; import type { OpenRouterModel, OllamaModel } from "./types"; const VOICE_KEY = "oxagenttwo.voiceMode"; @@ -48,6 +50,22 @@ export default function App() { } }, [settingsOpen, chat.options.provider, orModels.length, ollamaModels.length]); + // Bei OpenRouter kennt nur der Client Preise und Kontextlänge — sie stehen + // in der Modellliste, nicht in der Antwort des Servers. + const activeOrModel = + chat.options.provider === "openrouter" + ? orModels.find((m) => m.id === chat.options.openrouterModel) + : undefined; + + const setModelPricing = chat.setModelPricing; + useEffect(() => { + setModelPricing( + activeOrModel + ? { prompt: activeOrModel.promptPrice, completion: activeOrModel.completionPrice } + : null, + ); + }, [activeOrModel, setModelPricing]); + const voiceModeRef = useRef(voiceMode); const streamingRef = useRef(false); const awaitingDrainRef = useRef(false); @@ -434,6 +452,10 @@ export default function App() { ))} + {chat.toolConfirm && ( + + )} + {voice.error && (
{voice.error} @@ -441,6 +463,13 @@ export default function App() {
)} + + 1) parts.push(`${stats.rounds} Runden`); + } + + const window = stats?.contextLength ?? contextLength; + const used = stats?.promptTokens ?? 0; + const fill = window && used ? Math.min(1, used / window) : null; + + if (parts.length === 0 && totals.responses === 0) return null; + + return ( +
+ {parts.length > 0 && ( + {parts.join(" · ")} + )} + + {fill !== null && window && ( + 0.9 ? "tight" : ""}`} + title={`Prompt der letzten Antwort gegen das tatsächlich genutzte Kontextfenster (${nf.format(window)} Tokens). Darüber hinaus wird vorne abgeschnitten.`} + > + + + + {nf.format(used)} / {nf.format(window)} + + )} + + {totals.responses > 0 && ( + + Σ {nf.format(totals.promptTokens)} ↑ {nf.format(totals.responseTokens)} ↓ + {totals.costUsd > 0 && + ` · $${totals.costUsd.toLocaleString("de-DE", { maximumFractionDigits: 4 })}`} + + )} +
+ ); +} diff --git a/web/src/components/ToolConfirm.tsx b/web/src/components/ToolConfirm.tsx new file mode 100644 index 0000000..aa61f3f --- /dev/null +++ b/web/src/components/ToolConfirm.tsx @@ -0,0 +1,71 @@ +import type { ToolConfirmRequest, ToolDecision } from "../types"; + +/** Kurzer Satz, was dieser Aufruf tatsächlich tut — pro Werkzeug. */ +const WHAT_HAPPENS: Record = { + read_webpage: "Diese Adresse wird von deinem Rechner abgerufen — inklusive allem, was in der URL steht.", + remember: "Dieser Punkt landet dauerhaft im Gedächtnis und geht künftig in jeden Chat mit ein.", +}; + +/** Argumente als lesbare Zeilen; unlesbares JSON fällt auf den Rohtext zurück. */ +function argLines(args: string): [string, string][] { + try { + const parsed: unknown = JSON.parse(args); + if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) { + return Object.entries(parsed as Record).map(([k, v]) => [ + k, + typeof v === "string" ? v : JSON.stringify(v), + ]); + } + } catch { + /* unten als Rohtext */ + } + return [["", args]]; +} + +export function ToolConfirm({ + request, + onDecide, +}: { + request: ToolConfirmRequest; + onDecide: (id: string, decision: ToolDecision) => void; +}) { + return ( +
+
+ + + Das Modell möchte {request.name} ausführen + +
+ +
+ {argLines(request.args).map(([key, value], i) => ( +
+ {key &&
{key}
} +
{value}
+
+ ))} +
+ + {WHAT_HAPPENS[request.name] && ( +

{WHAT_HAPPENS[request.name]}

+ )} + +
+ + + +
+
+ ); +} diff --git a/web/src/styles.css b/web/src/styles.css index bdd1fbf..c1b676a 100644 --- a/web/src/styles.css +++ b/web/src/styles.css @@ -896,3 +896,161 @@ body { text-overflow: ellipsis; white-space: nowrap; } + +/* --- Werkzeug-Freigabe --- */ +.tool-confirm { + margin: 0 16px 10px; + padding: 12px 14px; + border: 1px solid var(--accent-warm); + border-radius: 8px; + background: rgba(255, 180, 84, 0.07); + display: flex; + flex-direction: column; + gap: 10px; +} + +.tool-confirm-head { + display: flex; + align-items: center; + gap: 8px; + font-size: 0.9em; +} + +.tool-confirm-mark { + color: var(--accent-warm); +} + +.tool-confirm-head code { + color: var(--accent-warm); + font-weight: 600; +} + +.tool-confirm-args { + display: flex; + flex-direction: column; + gap: 4px; + max-height: 160px; + overflow-y: auto; + padding: 8px 10px; + border-radius: 6px; + background: var(--bg); + font-size: 0.85em; +} + +.tool-confirm-arg { + display: flex; + gap: 8px; +} + +.tool-confirm-arg dt { + flex: 0 0 auto; + color: var(--text-dim); +} + +.tool-confirm-arg dd { + flex: 1 1 auto; + /* Umbrechen statt abschneiden: eine gekürzte URL wäre wertlos zum Prüfen. */ + overflow-wrap: anywhere; +} + +.tool-confirm-hint { + font-size: 0.82em; + color: var(--text-dim); +} + +.tool-confirm-actions { + display: flex; + gap: 8px; + flex-wrap: wrap; +} + +.btn-decide { + padding: 6px 14px; + border-radius: 6px; + border: 1px solid var(--border); + background: var(--bg-elevated); + color: var(--text); + font-family: var(--mono); + font-size: 0.85em; + cursor: pointer; +} + +.btn-decide:hover { + border-color: var(--text-dim); +} + +.btn-decide.allow { + border-color: var(--accent-dim); + color: var(--accent); +} + +.btn-decide.allow:hover { + background: rgba(61, 220, 132, 0.1); +} + +.btn-decide.always { + color: var(--text-dim); +} + +.btn-decide.deny:hover { + border-color: #f85149; + color: #f85149; +} + +.btn-decide:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; +} + +/* --- Statistik-Leiste --- */ +.stats-bar { + display: flex; + align-items: center; + gap: 14px; + flex-wrap: wrap; + padding: 5px 18px; + border-top: 1px solid var(--border); + font-size: 0.76em; + color: var(--text-dim); + font-variant-numeric: tabular-nums; +} + +.stats-run.streaming { + color: var(--accent); +} + +.stats-context { + display: flex; + align-items: center; + gap: 6px; + cursor: help; +} + +.stats-meter { + width: 54px; + height: 4px; + border-radius: 2px; + background: var(--border); + overflow: hidden; +} + +.stats-meter-fill { + display: block; + height: 100%; + background: var(--accent-dim); + transition: width 0.3s ease; +} + +.stats-context.tight { + color: var(--accent-warm); +} + +.stats-context.tight .stats-meter-fill { + background: var(--accent-warm); +} + +.stats-totals { + margin-left: auto; + cursor: help; + opacity: 0.75; +} diff --git a/web/src/types.ts b/web/src/types.ts index 0895fc0..730c39f 100644 --- a/web/src/types.ts +++ b/web/src/types.ts @@ -31,6 +31,44 @@ export interface ToolEvent { durationMs?: number; } +/** + * Rückfrage des Servers, bevor ein Werkzeug mit Außenwirkung läuft. + * `args` ist das vollständige JSON — bei read_webpage steckt darin die URL, + * die der Rechner sonst ungefragt abrufen würde. + */ +export interface ToolConfirmRequest { + id: string; + messageId: string; + name: string; + args: string; +} + +export type ToolDecision = "allow" | "always" | "deny"; + +/** Messwerte einer Antwort, wie der Server sie nach `done` schickt. */ +export interface ChatStats { + messageId: string; + model: string; + provider: "ollama" | "openrouter"; + promptTokens: number; + responseTokens: number; + ttftMs: number | null; + evalMs: number; + totalMs: number; + rounds: number; + /** Effektives Kontextfenster; bei OpenRouter aus der Modellliste ergänzt. */ + contextLength?: number; +} + +/** Aufsummiert über den Chat. Lebt im Browser und ist nach Reload weg. */ +export interface SessionTotals { + promptTokens: number; + responseTokens: number; + responses: number; + /** Geschätzte Kosten in USD; nur bei OpenRouter mit bekannten Preisen. */ + costUsd: number; +} + export interface ChatOptions { model: string; think: boolean; @@ -90,7 +128,9 @@ export interface OpenRouterModel { id: string; name: string; contextLength: number; + /** Preis je 1 Mio. Tokens in USD. */ promptPrice: number; + completionPrice: number; } export interface ModelInfo { diff --git a/web/src/useChat.ts b/web/src/useChat.ts index d4c4340..969077f 100644 --- a/web/src/useChat.ts +++ b/web/src/useChat.ts @@ -1,6 +1,15 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { ChatSocket } from "./socket"; -import type { ChatOptions, Message, Session , ToolEvent } from "./types"; +import type { + ChatOptions, + ChatStats, + Message, + Session, + SessionTotals, + ToolConfirmRequest, + ToolDecision, + ToolEvent, +} from "./types"; export type ConnStatus = "connecting" | "open" | "closed"; export interface ModelInfo { @@ -46,6 +55,21 @@ export function useChat() { const [messages, setMessages] = useState([]); const [streaming, setStreaming] = useState(false); const [toolEvents, setToolEvents] = useState>({}); + // Der Server fragt Werkzeuge einzeln und nacheinander an; die Queue ist die + // Absicherung für den Fall, dass doch zwei Antworten parallel laufen. + const [toolConfirms, setToolConfirms] = useState([]); + const [stats, setStats] = useState(null); + // Während des Streamens gibt es noch keine exakten Zahlen: der Server meldet + // sie erst am Ende. Bis dahin zählt die Leiste die eingehenden Chunks als + // Näherung und misst die Zeit ab dem ersten Token. + const [live, setLive] = useState<{ tokens: number; startedAt: number } | null>(null); + const [totals, setTotals] = useState({ + promptTokens: 0, + responseTokens: 0, + responses: 0, + costUsd: 0, + }); + const priceRef = useRef<{ prompt: number; completion: number } | null>(null); const [options, setOptionsState] = useState(loadOptions); const [systemPrompt, setSystemPromptState] = useState( () => localStorage.getItem(SYSTEM_KEY) ?? "", @@ -83,6 +107,11 @@ export function useChat() { ); } else if (t === "token") { const text = data.text as string; + setLive((cur) => + cur + ? { ...cur, tokens: cur.tokens + 1 } + : { tokens: 1, startedAt: Date.now() }, + ); setMessages((prev) => prev.map((m) => m.id === data.messageId ? { ...m, content: m.content + text } : m, @@ -112,9 +141,42 @@ export function useChat() { ); return { ...prev, [data.messageId as string]: updated }; }); + } else if (t === "stats") { + const s = data as unknown as ChatStats; + setStats(s); + setLive(null); + setTotals((prev) => { + const price = priceRef.current; + const cost = + s.provider === "openrouter" && price + ? (s.promptTokens * price.prompt + s.responseTokens * price.completion) / + 1_000_000 + : 0; + return { + promptTokens: prev.promptTokens + s.promptTokens, + responseTokens: prev.responseTokens + s.responseTokens, + responses: prev.responses + 1, + costUsd: prev.costUsd + cost, + }; + }); + } else if (t === "tool-confirm") { + setToolConfirms((prev) => [ + ...prev, + { + id: data.id as string, + messageId: data.messageId as string, + name: data.name as string, + args: data.args as string, + }, + ]); } else if (t === "done" || t === "error") { streamingRef.current = false; setStreaming(false); + setLive(null); + // Der Server hat jede offene Rückfrage bereits selbst entschieden. + setToolConfirms((prev) => + prev.filter((c) => c.messageId !== (data.messageId as string)), + ); } else if (t === "sessions-changed" || t === "session-deleted") { void refreshSessions(); } @@ -184,6 +246,8 @@ export function useChat() { } streamingRef.current = true; setStreaming(true); + setLive(null); + setStats(null); socketRef.current?.send({ type: "chat", sessionId: activeId, @@ -199,6 +263,12 @@ export function useChat() { const abort = useCallback(() => { socketRef.current?.send({ type: "abort" }); + setToolConfirms([]); + }, []); + + const decideToolConfirm = useCallback((id: string, decision: ToolDecision) => { + socketRef.current?.send({ type: "tool-confirm-reply", id, decision }); + setToolConfirms((prev) => prev.filter((c) => c.id !== id)); }, []); const newSession = useCallback(async () => { @@ -226,6 +296,14 @@ export function useChat() { messages, streaming, toolEvents, + toolConfirm: toolConfirms[0] ?? null, + decideToolConfirm, + stats, + live, + totals, + setModelPricing: (p: { prompt: number; completion: number } | null) => { + priceRef.current = p; + }, sendMessage, abort, newSession,