From 21faa2f1632527e50a9e41dbf0e19de15ef63980 Mon Sep 17 00:00:00 2001 From: Toni Nowak Date: Thu, 16 Jul 2026 22:33:07 +0200 Subject: [PATCH 01/12] feat: reasoning_traces staging storage + schema v40 (U1) Brain-scoped reasoning_traces staging buffer mirroring the tool_events pattern, for the reasoning-training mining pipeline (run 007 Faza 1). - sqlite_schema: SCHEMA_VERSION 39->40, (39,40) migration + SCHEMA base block - surrealdb/schema: DEFINE TABLE reasoning_traces SCHEMAFULL + fields/indexes - SQLiteReasoningTracesMixin + SurrealDBReasoningTracesMixin (dedup by trace_hash: SQLite UNIQUE + INSERT OR IGNORE, SurrealDB pre-filter SELECT) - base.py graceful no-op defaults; InMemoryStorage functional impl; wired into SQLiteStorage / SurrealDBStorage - tests: real-DB SQLite + mock SurrealDB mixin (live-verified on SurrealDB v3.2.0) --- src/surreal_memory/storage/base.py | 63 ++++ src/surreal_memory/storage/memory_store.py | 128 ++++++++ .../storage/sqlite_reasoning_traces.py | 272 +++++++++++++++++ src/surreal_memory/storage/sqlite_schema.py | 50 ++- src/surreal_memory/storage/sqlite_store.py | 2 + .../storage/surrealdb/reasoning_traces.py | 288 ++++++++++++++++++ .../storage/surrealdb/schema.py | 21 ++ src/surreal_memory/storage/surrealdb/store.py | 2 + tests/unit/test_reasoning_traces_storage.py | 238 +++++++++++++++ tests/unit/test_surrealdb_reasoning_traces.py | 229 ++++++++++++++ 10 files changed, 1292 insertions(+), 1 deletion(-) create mode 100644 src/surreal_memory/storage/sqlite_reasoning_traces.py create mode 100644 src/surreal_memory/storage/surrealdb/reasoning_traces.py create mode 100644 tests/unit/test_reasoning_traces_storage.py create mode 100644 tests/unit/test_surrealdb_reasoning_traces.py diff --git a/src/surreal_memory/storage/base.py b/src/surreal_memory/storage/base.py index a963ac21..0c0727e8 100755 --- a/src/surreal_memory/storage/base.py +++ b/src/surreal_memory/storage/base.py @@ -1213,6 +1213,69 @@ async def get_tool_events_for_mining( """ return [] + # ---- Reasoning traces (staging buffer; graceful no-op defaults) ---- + + async def insert_reasoning_traces( + self, + brain_id: str, + traces: list[dict[str, Any]], + ) -> int: + """Insert reasoning traces into the staging buffer (dedup by trace_hash). + + Default: no reasoning-trace storage → 0 inserted. Backends that buffer + reasoning traces (SQLite, SurrealDB, in-memory) override this. + """ + return 0 + + async def get_unprocessed_reasoning_traces( + self, + brain_id: str, + limit: int = 200, + model: str | None = None, + ) -> list[dict[str, Any]]: + """Return unprocessed reasoning traces (oldest first). Default: empty.""" + return [] + + async def mark_reasoning_traces_processed( + self, + brain_id: str, + trace_ids: list[Any], + ) -> None: + """Mark reasoning traces as processed by id. Default: no-op.""" + return None + + async def set_trace_categories( + self, + brain_id: str, + categories: dict[Any, str], + ) -> None: + """Set category labels on reasoning traces. Default: no-op.""" + return None + + async def prune_reasoning_traces( + self, + brain_id: str, + keep_days: int = 90, + ) -> int: + """Delete processed reasoning traces older than keep_days. Default: 0.""" + return 0 + + async def cap_reasoning_traces( + self, + brain_id: str, + max_total: int = 20_000, + ) -> int: + """Enforce a per-brain cap on reasoning traces. Default: 0.""" + return 0 + + async def get_reasoning_stats(self, brain_id: str) -> dict[str, Any]: + """Aggregate reasoning-trace stats. Default: empty aggregates.""" + return {"by_model": {}, "by_category": {}, "total": 0, "unprocessed": 0} + + async def get_reasoning_trace_models(self, brain_id: str) -> list[str]: + """Return DISTINCT model names present in reasoning_traces. Default: empty.""" + return [] + async def add_retrieval_trace(self, trace: RetrievalTrace) -> str: """Persist a retrieval trace. Returns the trace ID.""" raise NotImplementedError diff --git a/src/surreal_memory/storage/memory_store.py b/src/surreal_memory/storage/memory_store.py index e7744c54..458d191f 100755 --- a/src/surreal_memory/storage/memory_store.py +++ b/src/surreal_memory/storage/memory_store.py @@ -49,6 +49,8 @@ def __init__(self) -> None: self._brains: dict[str, Brain] = {} self._co_activations: dict[str, list[dict[str, Any]]] = defaultdict(list) self._action_events: dict[str, list[dict[str, Any]]] = defaultdict(list) + self._reasoning_traces: dict[str, list[dict[str, Any]]] = defaultdict(list) + self._reasoning_trace_seq: dict[str, int] = defaultdict(int) self._retrieval_traces: dict[str, list[RetrievalTrace]] = defaultdict(list) self._versions: dict[str, dict[str, tuple[BrainVersion, str]]] = defaultdict(dict) self._review_schedules: dict[str, dict[str, Any]] = defaultdict(dict) @@ -826,6 +828,132 @@ async def get_tool_events_for_mining( async def mark_events_processed(self, brain_id: str, event_ids: list[int]) -> None: """Mark events as processed (no-op for in-memory storage).""" + # ========== Reasoning Traces (in-memory staging buffer) ========== + + async def insert_reasoning_traces(self, brain_id: str, traces: list[dict[str, Any]]) -> int: + """Insert reasoning traces into the in-memory buffer (dedup by trace_hash).""" + if not traces: + return 0 + existing = {r["trace_hash"] for r in self._reasoning_traces[brain_id]} + now = utcnow().isoformat() + inserted = 0 + for tr in traces: + trace_hash = str(tr.get("trace_hash", "")) + if not trace_hash or trace_hash in existing: + continue + existing.add(trace_hash) + self._reasoning_trace_seq[brain_id] += 1 + content = str(tr.get("content", "")) + raw_chars = tr.get("content_chars") + content_chars = int(raw_chars) if raw_chars is not None else len(content) + self._reasoning_traces[brain_id].append( + { + "id": self._reasoning_trace_seq[brain_id], + "trace_hash": trace_hash, + "model": tr.get("model", ""), + "session_id": tr.get("session_id", ""), + "project": tr.get("project", ""), + "task_context": str(tr.get("task_context", ""))[:500], + "content": content, + "content_chars": content_chars, + "category": tr.get("category", ""), + "processed": False, + "created_at": tr.get("created_at", now), + "ingested_at": now, + } + ) + inserted += 1 + return inserted + + async def get_unprocessed_reasoning_traces( + self, brain_id: str, limit: int = 200, model: str | None = None + ) -> list[dict[str, Any]]: + """Return unprocessed reasoning traces (oldest first), optional model filter.""" + rows = [ + r + for r in self._reasoning_traces[brain_id] + if not r["processed"] and (model is None or r["model"] == model) + ] + rows.sort(key=lambda r: str(r["created_at"])) + fields = ( + "id", + "trace_hash", + "model", + "session_id", + "project", + "task_context", + "content", + "content_chars", + "category", + "created_at", + ) + return [{k: r[k] for k in fields} for r in rows[: min(int(limit), 10000)]] + + async def mark_reasoning_traces_processed(self, brain_id: str, trace_ids: list[Any]) -> None: + """Mark reasoning traces as processed by row id.""" + ids = set(trace_ids) + for r in self._reasoning_traces[brain_id]: + if r["id"] in ids: + r["processed"] = True + + async def set_trace_categories(self, brain_id: str, categories: dict[Any, str]) -> None: + """Set category labels on reasoning traces (id -> category).""" + for r in self._reasoning_traces[brain_id]: + if r["id"] in categories: + r["category"] = categories[r["id"]] + + async def prune_reasoning_traces(self, brain_id: str, keep_days: int = 90) -> int: + """Delete processed reasoning traces older than keep_days.""" + cutoff = (utcnow() - timedelta(days=keep_days)).isoformat() + rows = self._reasoning_traces[brain_id] + kept = [r for r in rows if not (r["processed"] and str(r["created_at"]) < cutoff)] + deleted = len(rows) - len(kept) + self._reasoning_traces[brain_id] = kept + return deleted + + async def cap_reasoning_traces(self, brain_id: str, max_total: int = 20_000) -> int: + """Enforce a per-brain cap by deleting oldest processed traces.""" + rows = self._reasoning_traces[brain_id] + if len(rows) <= max_total: + return 0 + excess = len(rows) - max_total + processed_sorted = sorted( + (r for r in rows if r["processed"]), key=lambda r: str(r["created_at"]) + ) + victims = {r["id"] for r in processed_sorted[:excess]} + kept = [r for r in rows if r["id"] not in victims] + deleted = len(rows) - len(kept) + self._reasoning_traces[brain_id] = kept + return deleted + + async def get_reasoning_stats(self, brain_id: str) -> dict[str, Any]: + """Aggregate reasoning-trace stats: per model, per category, totals.""" + by_model: dict[str, dict[str, Any]] = {} + by_category: dict[str, int] = {} + for r in self._reasoning_traces[brain_id]: + model = r["model"] + entry = by_model.setdefault( + model, {"trace_count": 0, "unprocessed": 0, "last_trace_at": ""} + ) + entry["trace_count"] += 1 + if not r["processed"]: + entry["unprocessed"] += 1 + if str(r["created_at"]) > str(entry["last_trace_at"]): + entry["last_trace_at"] = r["created_at"] + by_category[r["category"]] = by_category.get(r["category"], 0) + 1 + total = sum(m["trace_count"] for m in by_model.values()) + unprocessed = sum(m["unprocessed"] for m in by_model.values()) + return { + "by_model": by_model, + "by_category": by_category, + "total": total, + "unprocessed": unprocessed, + } + + async def get_reasoning_trace_models(self, brain_id: str) -> list[str]: + """Return DISTINCT model names in reasoning_traces (sorted).""" + return sorted({r["model"] for r in self._reasoning_traces[brain_id] if r["model"]}) + # ========== Cleanup ========== async def clear(self, brain_id: str) -> None: diff --git a/src/surreal_memory/storage/sqlite_reasoning_traces.py b/src/surreal_memory/storage/sqlite_reasoning_traces.py new file mode 100644 index 00000000..d0135a03 --- /dev/null +++ b/src/surreal_memory/storage/sqlite_reasoning_traces.py @@ -0,0 +1,272 @@ +"""SQLite mixin for reasoning-trace storage (staging buffer for reasoning mining). + +Parity with the SQLite ``tool_events`` staging table, but for reasoning traces +mined from model ``thinking`` blocks. Rows are brain-scoped and deduplicated by +``trace_hash`` via UNIQUE(brain_id, trace_hash) + ``INSERT OR IGNORE``, so +re-ingesting an already-seen trace is a no-op. The consolidation +``PROCESS_REASONING_TRACES`` strategy ingests transcripts into this table; +``LEARN_REASONING`` later distills unprocessed rows into reasoning patterns. +""" + +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING, Any + +from surreal_memory.utils.timeutils import utcnow + +if TYPE_CHECKING: + import aiosqlite + +logger = logging.getLogger(__name__) + +# Cap per brain to prevent unbounded growth (config default max_traces_total). +_MAX_TRACES_PER_BRAIN = 20_000 + +# task_context is truncated to keep the staging table compact (plan: <=500). +_MAX_TASK_CONTEXT = 500 + + +class SQLiteReasoningTracesMixin: + """Mixin providing CRUD for the ``reasoning_traces`` table.""" + + def _ensure_conn(self) -> aiosqlite.Connection: + raise NotImplementedError + + def _ensure_read_conn(self) -> aiosqlite.Connection: + raise NotImplementedError + + def _get_brain_id(self) -> str: + raise NotImplementedError + + async def insert_reasoning_traces( + self, + brain_id: str, + traces: list[dict[str, Any]], + ) -> int: + """Insert reasoning traces into the staging table (dedup by trace_hash). + + Uses ``INSERT OR IGNORE`` against UNIQUE(brain_id, trace_hash), so + re-ingesting the same trace is a no-op. + + Args: + brain_id: Brain context. + traces: Dicts with keys: trace_hash, model, session_id, project, + task_context, content, content_chars (optional), category + (optional), created_at (optional ISO string). + + Returns: + Number of rows actually inserted (excludes ignored duplicates). + """ + if not traces: + return 0 + conn = self._ensure_conn() + now = utcnow().isoformat() + inserted = 0 + for tr in traces: + trace_hash = str(tr.get("trace_hash", "")) + if not trace_hash: + # A hashless trace cannot be deduped — skip (parity with the + # SurrealDB / in-memory backends, which also drop empty hashes). + continue + content = str(tr.get("content", "")) + raw_chars = tr.get("content_chars") + content_chars = int(raw_chars) if raw_chars is not None else len(content) + cursor = await conn.execute( + """INSERT OR IGNORE INTO reasoning_traces + (brain_id, trace_hash, model, session_id, project, + task_context, content, content_chars, category, + processed, created_at, ingested_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?, ?)""", + ( + brain_id, + trace_hash, + tr.get("model", ""), + tr.get("session_id", ""), + tr.get("project", ""), + str(tr.get("task_context", ""))[:_MAX_TASK_CONTEXT], + content, + content_chars, + tr.get("category", ""), + tr.get("created_at", now), + now, + ), + ) + if cursor.rowcount and cursor.rowcount > 0: + inserted += 1 + await conn.commit() + return inserted + + async def get_unprocessed_reasoning_traces( + self, + brain_id: str, + limit: int = 200, + model: str | None = None, + ) -> list[dict[str, Any]]: + """Get unprocessed reasoning traces (oldest first) for distillation. + + Optionally filter by ``model`` so the distiller can batch per model. + """ + conn = self._ensure_read_conn() + safe_limit = min(int(limit), 10000) + query = ( + "SELECT id, trace_hash, model, session_id, project, task_context," + " content, content_chars, category, created_at" + " FROM reasoning_traces WHERE brain_id = ? AND processed = 0" + ) + params: list[Any] = [brain_id] + if model: + query += " AND model = ?" + params.append(model) + query += " ORDER BY created_at ASC LIMIT ?" + params.append(safe_limit) + results: list[dict[str, Any]] = [] + async with conn.execute(query, params) as cursor: + async for row in cursor: + results.append( + { + "id": row["id"], + "trace_hash": row["trace_hash"], + "model": row["model"], + "session_id": row["session_id"], + "project": row["project"], + "task_context": row["task_context"], + "content": row["content"], + "content_chars": row["content_chars"], + "category": row["category"], + "created_at": row["created_at"], + } + ) + return results + + async def mark_reasoning_traces_processed( + self, + brain_id: str, + trace_ids: list[Any], + ) -> None: + """Mark reasoning traces as processed by row id.""" + if not trace_ids: + return + conn = self._ensure_conn() + placeholders = ",".join("?" for _ in trace_ids) + # Table/column names are hardcoded — only placeholders are interpolated. + await conn.execute( + "UPDATE reasoning_traces SET processed = 1 " + f"WHERE brain_id = ? AND id IN ({placeholders})", + [brain_id, *trace_ids], + ) + await conn.commit() + + async def set_trace_categories( + self, + brain_id: str, + categories: dict[Any, str], + ) -> None: + """Set the category label on reasoning traces (id -> category).""" + if not categories: + return + conn = self._ensure_conn() + for trace_id, category in categories.items(): + await conn.execute( + "UPDATE reasoning_traces SET category = ? WHERE brain_id = ? AND id = ?", + (category, brain_id, trace_id), + ) + await conn.commit() + + async def prune_reasoning_traces( + self, + brain_id: str, + keep_days: int = 90, + ) -> int: + """Delete processed traces older than keep_days. Returns rows deleted.""" + from datetime import timedelta + + conn = self._ensure_conn() + cutoff = (utcnow() - timedelta(days=keep_days)).isoformat() + cursor = await conn.execute( + "DELETE FROM reasoning_traces WHERE brain_id = ? AND processed = 1 AND created_at < ?", + (brain_id, cutoff), + ) + deleted = cursor.rowcount + await conn.commit() + return deleted + + async def cap_reasoning_traces( + self, + brain_id: str, + max_total: int = _MAX_TRACES_PER_BRAIN, + ) -> int: + """Enforce max traces per brain by deleting oldest processed rows.""" + conn = self._ensure_conn() + async with conn.execute( + "SELECT COUNT(*) as cnt FROM reasoning_traces WHERE brain_id = ?", + (brain_id,), + ) as cursor: + row = await cursor.fetchone() + total = row["cnt"] if row else 0 + + if total <= max_total: + return 0 + + excess = total - max_total + cursor = await conn.execute( + """DELETE FROM reasoning_traces WHERE brain_id = ? AND id IN ( + SELECT id FROM reasoning_traces WHERE brain_id = ? AND processed = 1 + ORDER BY created_at ASC LIMIT ? + )""", + (brain_id, brain_id, excess), + ) + deleted = cursor.rowcount + await conn.commit() + return deleted + + async def get_reasoning_stats(self, brain_id: str) -> dict[str, Any]: + """Aggregate reasoning-trace stats: per model, per category, totals.""" + conn = self._ensure_read_conn() + + by_model: dict[str, dict[str, Any]] = {} + async with conn.execute( + """SELECT model, COUNT(*) as cnt, + SUM(CASE WHEN processed = 0 THEN 1 ELSE 0 END) as unproc, + MAX(created_at) as last_at + FROM reasoning_traces WHERE brain_id = ? + GROUP BY model""", + (brain_id,), + ) as cursor: + async for row in cursor: + by_model[row["model"]] = { + "trace_count": row["cnt"], + "unprocessed": row["unproc"], + "last_trace_at": row["last_at"], + } + + by_category: dict[str, int] = {} + async with conn.execute( + "SELECT category, COUNT(*) as cnt FROM reasoning_traces " + "WHERE brain_id = ? GROUP BY category", + (brain_id,), + ) as cursor: + async for row in cursor: + by_category[row["category"]] = row["cnt"] + + total = sum(m["trace_count"] for m in by_model.values()) + unprocessed = sum(m["unprocessed"] for m in by_model.values()) + return { + "by_model": by_model, + "by_category": by_category, + "total": total, + "unprocessed": unprocessed, + } + + async def get_reasoning_trace_models(self, brain_id: str) -> list[str]: + """Return DISTINCT model names present in reasoning_traces (sorted).""" + conn = self._ensure_read_conn() + results: list[str] = [] + async with conn.execute( + "SELECT DISTINCT model FROM reasoning_traces WHERE brain_id = ? ORDER BY model ASC", + (brain_id,), + ) as cursor: + async for row in cursor: + if row["model"]: + results.append(row["model"]) + return results diff --git a/src/surreal_memory/storage/sqlite_schema.py b/src/surreal_memory/storage/sqlite_schema.py index 47dc8427..33840cb5 100755 --- a/src/surreal_memory/storage/sqlite_schema.py +++ b/src/surreal_memory/storage/sqlite_schema.py @@ -11,7 +11,7 @@ logger = logging.getLogger(__name__) # Schema version for migrations -SCHEMA_VERSION = 39 +SCHEMA_VERSION = 40 # ── Migrations ────────────────────────────────────────────────────── # Each entry maps (from_version -> to_version) with a list of SQL statements. @@ -665,6 +665,32 @@ "CREATE INDEX IF NOT EXISTS idx_retrieval_traces_created " "ON retrieval_traces(brain_id, created_at)", ], + (39, 40): [ + # Reasoning traces: staging buffer for reasoning-trace mining (run 007). + "CREATE TABLE IF NOT EXISTS reasoning_traces (" + " id INTEGER PRIMARY KEY AUTOINCREMENT," + " brain_id TEXT NOT NULL," + " trace_hash TEXT NOT NULL," + " model TEXT NOT NULL DEFAULT ''," + " session_id TEXT NOT NULL DEFAULT ''," + " project TEXT NOT NULL DEFAULT ''," + " task_context TEXT NOT NULL DEFAULT ''," + " content TEXT NOT NULL DEFAULT ''," + " content_chars INTEGER NOT NULL DEFAULT 0," + " category TEXT NOT NULL DEFAULT ''," + " processed INTEGER NOT NULL DEFAULT 0," + " created_at TEXT NOT NULL," + " ingested_at TEXT NOT NULL," + " UNIQUE (brain_id, trace_hash)," + " FOREIGN KEY (brain_id) REFERENCES brains(id) ON DELETE CASCADE" + ")", + "CREATE INDEX IF NOT EXISTS idx_reasoning_traces_model " + "ON reasoning_traces(brain_id, model)", + "CREATE INDEX IF NOT EXISTS idx_reasoning_traces_processed " + "ON reasoning_traces(brain_id, processed)", + "CREATE INDEX IF NOT EXISTS idx_reasoning_traces_created " + "ON reasoning_traces(brain_id, created_at)", + ], } @@ -1339,4 +1365,26 @@ async def run_migrations(conn: aiosqlite.Connection, current_version: int) -> in PRIMARY KEY (brain_id, entity_type, prefix) ); CREATE INDEX IF NOT EXISTS idx_merkle_hashes_brain ON merkle_hashes(brain_id, entity_type); + +-- Reasoning traces (staging buffer for reasoning-trace mining) [schema v40] +CREATE TABLE IF NOT EXISTS reasoning_traces ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + brain_id TEXT NOT NULL, + trace_hash TEXT NOT NULL, + model TEXT NOT NULL DEFAULT '', + session_id TEXT NOT NULL DEFAULT '', + project TEXT NOT NULL DEFAULT '', + task_context TEXT NOT NULL DEFAULT '', + content TEXT NOT NULL DEFAULT '', + content_chars INTEGER NOT NULL DEFAULT 0, + category TEXT NOT NULL DEFAULT '', + processed INTEGER NOT NULL DEFAULT 0, + created_at TEXT NOT NULL, + ingested_at TEXT NOT NULL, + UNIQUE (brain_id, trace_hash), + FOREIGN KEY (brain_id) REFERENCES brains(id) ON DELETE CASCADE +); +CREATE INDEX IF NOT EXISTS idx_reasoning_traces_model ON reasoning_traces(brain_id, model); +CREATE INDEX IF NOT EXISTS idx_reasoning_traces_processed ON reasoning_traces(brain_id, processed); +CREATE INDEX IF NOT EXISTS idx_reasoning_traces_created ON reasoning_traces(brain_id, created_at); """ diff --git a/src/surreal_memory/storage/sqlite_store.py b/src/surreal_memory/storage/sqlite_store.py index ba7fba73..a033b168 100755 --- a/src/surreal_memory/storage/sqlite_store.py +++ b/src/surreal_memory/storage/sqlite_store.py @@ -36,6 +36,7 @@ from surreal_memory.storage.sqlite_merkle import SQLiteMerkleMixin from surreal_memory.storage.sqlite_neurons import SQLiteNeuronMixin from surreal_memory.storage.sqlite_projects import SQLiteProjectMixin +from surreal_memory.storage.sqlite_reasoning_traces import SQLiteReasoningTracesMixin from surreal_memory.storage.sqlite_retrieval_trace import SQLiteRetrievalTraceMixin from surreal_memory.storage.sqlite_reviews import SQLiteReviewsMixin from surreal_memory.storage.sqlite_schema import ( @@ -81,6 +82,7 @@ class SQLiteStorage( SQLiteDriftMixin, SQLiteEntityRefsMixin, SQLiteSourcesMixin, + SQLiteReasoningTracesMixin, SQLiteToolEventsMixin, SQLiteTrainingFilesMixin, SQLiteMerkleMixin, diff --git a/src/surreal_memory/storage/surrealdb/reasoning_traces.py b/src/surreal_memory/storage/surrealdb/reasoning_traces.py new file mode 100644 index 00000000..9bff5189 --- /dev/null +++ b/src/surreal_memory/storage/surrealdb/reasoning_traces.py @@ -0,0 +1,288 @@ +"""SurrealDB mixin for reasoning-trace storage. + +Parity with the SQLite ``reasoning_traces`` staging table. Rows are brain-scoped +and deduplicated by ``trace_hash`` (globally unique = sha256(session:uuid:index)). +SurrealDB has no cheap UNIQUE-on-insert story here, so dedup is done by a +pre-filter SELECT (consolidation is single-threaded per brain), mirroring the +SQLite ``INSERT OR IGNORE`` semantics. ``trace_hash`` doubles as the natural key +returned as ``id`` so ``mark_reasoning_traces_processed`` / ``set_trace_categories`` +filter by a plain string field instead of juggling SurrealDB record ids (mirrors +the ``event_id`` approach in the tool-events mixin). +""" + +from __future__ import annotations + +import uuid +from datetime import datetime, timedelta +from typing import Any + +from surreal_memory.utils.timeutils import utcnow + +# Cap per brain to prevent unbounded growth (config default max_traces_total). +_MAX_TRACES_PER_BRAIN = 20_000 + +# task_context is truncated to keep the staging table compact (plan: <=500). +_MAX_TASK_CONTEXT = 500 + + +def _iso(val: Any) -> str: + """Return an ISO-8601 string; callers parse created_at via fromisoformat.""" + if isinstance(val, datetime): + return val.isoformat() + return str(val) if val is not None else "" + + +def _as_datetime(val: Any) -> datetime: + if isinstance(val, datetime): + return val + if isinstance(val, str) and val: + try: + return datetime.fromisoformat(val.replace("Z", "+00:00")) + except ValueError: + return utcnow() + return utcnow() + + +class SurrealDBReasoningTracesMixin: + """Reasoning-trace CRUD backed by the ``reasoning_traces`` table.""" + + def _ensure_conn(self) -> Any: + raise NotImplementedError + + def _get_brain_id(self) -> str: + raise NotImplementedError + + async def _query(self, sql: str, **params: Any) -> list[dict[str, Any]]: + raise NotImplementedError + + async def insert_reasoning_traces( + self, + brain_id: str, + traces: list[dict[str, Any]], + ) -> int: + """Insert reasoning traces (dedup by trace_hash via pre-filter SELECT).""" + if not traces: + return 0 + # Deduplicate the incoming batch by trace_hash (keep first). + by_hash: dict[str, dict[str, Any]] = {} + for tr in traces: + h = str(tr.get("trace_hash", "")) + if h and h not in by_hash: + by_hash[h] = tr + if not by_hash: + return 0 + existing = await self._query( + "SELECT trace_hash FROM reasoning_traces " + "WHERE brain_id = $bid AND trace_hash IN $hashes", + bid=brain_id, + hashes=list(by_hash.keys()), + ) + seen = {r.get("trace_hash") for r in existing} + conn = self._ensure_conn() + now = utcnow() + inserted = 0 + for h, tr in by_hash.items(): + if h in seen: + continue + content = str(tr.get("content", "")) + raw_chars = tr.get("content_chars") + content_chars = int(raw_chars) if raw_chars is not None else len(content) + await conn.insert( + "reasoning_traces", + { + "id": str(uuid.uuid4()).replace("-", "_"), + "trace_hash": h, + "brain_id": brain_id, + "model": tr.get("model", ""), + "session_id": tr.get("session_id", ""), + "project": tr.get("project", ""), + "task_context": str(tr.get("task_context", ""))[:_MAX_TASK_CONTEXT], + "content": content, + "content_chars": content_chars, + "category": tr.get("category", ""), + "processed": False, + "created_at": _as_datetime(tr.get("created_at")), + "ingested_at": now, + }, + ) + inserted += 1 + return inserted + + async def get_unprocessed_reasoning_traces( + self, + brain_id: str, + limit: int = 200, + model: str | None = None, + ) -> list[dict[str, Any]]: + """Get unprocessed reasoning traces (oldest first), optional model filter.""" + safe_limit = min(int(limit), 10000) + sql = ( + "SELECT trace_hash, model, session_id, project, task_context," + " content, content_chars, category, created_at" + " FROM reasoning_traces WHERE brain_id = $bid AND processed = false" + ) + params: dict[str, Any] = {"bid": brain_id} + if model: + sql += " AND model = $model" + params["model"] = model + sql += f" ORDER BY created_at ASC LIMIT {safe_limit}" + rows = await self._query(sql, **params) + return [ + { + "id": r.get("trace_hash"), + "trace_hash": r.get("trace_hash"), + "model": r.get("model", ""), + "session_id": r.get("session_id", ""), + "project": r.get("project", ""), + "task_context": r.get("task_context", ""), + "content": r.get("content", ""), + "content_chars": r.get("content_chars", 0), + "category": r.get("category", ""), + "created_at": _iso(r.get("created_at")), + } + for r in rows + ] + + async def mark_reasoning_traces_processed( + self, + brain_id: str, + trace_ids: list[Any], + ) -> None: + """Mark reasoning traces as processed by their trace_hash.""" + if not trace_ids: + return + await self._query( + "UPDATE reasoning_traces SET processed = true " + "WHERE brain_id = $bid AND trace_hash IN $ids", + bid=brain_id, + ids=[str(t) for t in trace_ids], + ) + + async def set_trace_categories( + self, + brain_id: str, + categories: dict[Any, str], + ) -> None: + """Set the category label on reasoning traces (trace_hash -> category).""" + if not categories: + return + for trace_id, category in categories.items(): + await self._query( + "UPDATE reasoning_traces SET category = $cat " + "WHERE brain_id = $bid AND trace_hash = $id", + bid=brain_id, + cat=category, + id=str(trace_id), + ) + + async def prune_reasoning_traces( + self, + brain_id: str, + keep_days: int = 90, + ) -> int: + """Delete processed traces older than keep_days; return rows deleted.""" + cutoff = utcnow() - timedelta(days=keep_days) + rows = await self._query( + "SELECT count() AS c FROM reasoning_traces" + " WHERE brain_id = $bid AND processed = true AND created_at < $cutoff GROUP ALL", + bid=brain_id, + cutoff=cutoff, + ) + deleted = int(rows[0]["c"]) if rows else 0 + await self._query( + "DELETE reasoning_traces" + " WHERE brain_id = $bid AND processed = true AND created_at < $cutoff", + bid=brain_id, + cutoff=cutoff, + ) + return deleted + + async def cap_reasoning_traces( + self, + brain_id: str, + max_total: int = _MAX_TRACES_PER_BRAIN, + ) -> int: + """Enforce max traces per brain by deleting oldest processed rows.""" + rows = await self._query( + "SELECT count() AS c FROM reasoning_traces WHERE brain_id = $bid GROUP ALL", + bid=brain_id, + ) + total = int(rows[0]["c"]) if rows else 0 + if total <= max_total: + return 0 + excess = total - max_total + # NB: SurrealDB v3.2.0 requires every ORDER BY field to appear in the + # SELECT projection, so created_at is projected even though only + # trace_hash is consumed below. + victims = await self._query( + "SELECT trace_hash, created_at FROM reasoning_traces" + " WHERE brain_id = $bid AND processed = true" + f" ORDER BY created_at ASC LIMIT {int(excess)}", + bid=brain_id, + ) + ids = [r.get("trace_hash") for r in victims if r.get("trace_hash")] + if not ids: + return 0 + await self._query( + "DELETE reasoning_traces WHERE brain_id = $bid AND trace_hash IN $ids", + bid=brain_id, + ids=ids, + ) + return len(ids) + + async def get_reasoning_stats(self, brain_id: str) -> dict[str, Any]: + """Aggregate reasoning-trace stats: per model, per category, totals. + + ``last_trace_at`` is fetched per model with an ORDER BY ... LIMIT 1 + rather than a datetime aggregate, keeping the SurrealQL unambiguous. + """ + model_rows = await self._query( + "SELECT model, count() AS cnt FROM reasoning_traces" + " WHERE brain_id = $bid GROUP BY model", + bid=brain_id, + ) + unproc_rows = await self._query( + "SELECT model, count() AS cnt FROM reasoning_traces" + " WHERE brain_id = $bid AND processed = false GROUP BY model", + bid=brain_id, + ) + unproc_by_model = {r.get("model", ""): int(r.get("cnt", 0) or 0) for r in unproc_rows} + + by_model: dict[str, dict[str, Any]] = {} + for r in model_rows: + name = r.get("model", "") + latest = await self._query( + "SELECT created_at FROM reasoning_traces" + " WHERE brain_id = $bid AND model = $model" + " ORDER BY created_at DESC LIMIT 1", + bid=brain_id, + model=name, + ) + by_model[name] = { + "trace_count": int(r.get("cnt", 0) or 0), + "unprocessed": unproc_by_model.get(name, 0), + "last_trace_at": _iso(latest[0].get("created_at")) if latest else "", + } + + cat_rows = await self._query( + "SELECT category, count() AS cnt FROM reasoning_traces" + " WHERE brain_id = $bid GROUP BY category", + bid=brain_id, + ) + by_category = {r.get("category", ""): int(r.get("cnt", 0) or 0) for r in cat_rows} + total = sum(m["trace_count"] for m in by_model.values()) + unprocessed = sum(m["unprocessed"] for m in by_model.values()) + return { + "by_model": by_model, + "by_category": by_category, + "total": total, + "unprocessed": unprocessed, + } + + async def get_reasoning_trace_models(self, brain_id: str) -> list[str]: + """Return DISTINCT model names present in reasoning_traces (sorted).""" + rows = await self._query( + "SELECT model FROM reasoning_traces WHERE brain_id = $bid GROUP BY model", + bid=brain_id, + ) + return sorted({r.get("model", "") for r in rows if r.get("model")}) diff --git a/src/surreal_memory/storage/surrealdb/schema.py b/src/surreal_memory/storage/surrealdb/schema.py index 8464c3ec..52725527 100755 --- a/src/surreal_memory/storage/surrealdb/schema.py +++ b/src/surreal_memory/storage/surrealdb/schema.py @@ -430,6 +430,27 @@ DEFINE INDEX idx_tevt_unproc ON tool_events FIELDS brain_id, processed; DEFINE INDEX idx_tevt_eventid ON tool_events FIELDS brain_id, event_id; DEFINE INDEX idx_tevt_time ON tool_events FIELDS brain_id, created_at; + +-- Reasoning traces (staging buffer for reasoning-trace mining / distillation) +DEFINE TABLE reasoning_traces SCHEMAFULL; +DEFINE FIELD id ON reasoning_traces TYPE string; +DEFINE FIELD trace_hash ON reasoning_traces TYPE string; +DEFINE FIELD brain_id ON reasoning_traces TYPE string; +DEFINE FIELD model ON reasoning_traces TYPE string DEFAULT ''; +DEFINE FIELD session_id ON reasoning_traces TYPE string DEFAULT ''; +DEFINE FIELD project ON reasoning_traces TYPE string DEFAULT ''; +DEFINE FIELD task_context ON reasoning_traces TYPE string DEFAULT ''; +DEFINE FIELD content ON reasoning_traces TYPE string DEFAULT ''; +DEFINE FIELD content_chars ON reasoning_traces TYPE int DEFAULT 0; +DEFINE FIELD category ON reasoning_traces TYPE string DEFAULT ''; +DEFINE FIELD processed ON reasoning_traces TYPE bool DEFAULT false; +DEFINE FIELD created_at ON reasoning_traces TYPE datetime DEFAULT time::now(); +DEFINE FIELD ingested_at ON reasoning_traces TYPE datetime DEFAULT time::now(); +DEFINE INDEX idx_rtr_brain ON reasoning_traces FIELDS brain_id; +DEFINE INDEX idx_rtr_hash ON reasoning_traces FIELDS brain_id, trace_hash; +DEFINE INDEX idx_rtr_model ON reasoning_traces FIELDS brain_id, model; +DEFINE INDEX idx_rtr_unproc ON reasoning_traces FIELDS brain_id, processed; +DEFINE INDEX idx_rtr_time ON reasoning_traces FIELDS brain_id, created_at; """ diff --git a/src/surreal_memory/storage/surrealdb/store.py b/src/surreal_memory/storage/surrealdb/store.py index c5c14810..c3a9d9fb 100755 --- a/src/surreal_memory/storage/surrealdb/store.py +++ b/src/surreal_memory/storage/surrealdb/store.py @@ -30,6 +30,7 @@ from surreal_memory.storage.surrealdb.keyword_entity import SurrealDBKeywordEntityMixin from surreal_memory.storage.surrealdb.maturation import SurrealDBMaturationMixin from surreal_memory.storage.surrealdb.projects import SurrealDBProjectsMixin +from surreal_memory.storage.surrealdb.reasoning_traces import SurrealDBReasoningTracesMixin from surreal_memory.storage.surrealdb.retrieval_trace import SurrealDBRetrievalTraceMixin from surreal_memory.storage.surrealdb.review_schedules import SurrealDBReviewSchedulesMixin from surreal_memory.storage.surrealdb.schema import ensure_schema @@ -351,6 +352,7 @@ class SurrealDBStorage( SurrealDBCompressionMixin, SurrealDBActivityMixin, SurrealDBDepthPriorsMixin, + SurrealDBReasoningTracesMixin, SurrealDBToolEventsMixin, NeuralStorage, ): diff --git a/tests/unit/test_reasoning_traces_storage.py b/tests/unit/test_reasoning_traces_storage.py new file mode 100644 index 00000000..33c911d4 --- /dev/null +++ b/tests/unit/test_reasoning_traces_storage.py @@ -0,0 +1,238 @@ +"""Tests for the SQLite reasoning_traces staging storage (run 007, schema v40). + +Mirrors test_tool_memory.py: exercises a real in-process SQLiteStorage against a +temporary DB (no mocks), covering insert/dedup, unprocessed retrieval + model +filter, mark-processed, category tagging, prune/cap retention, and stats. +""" + +from __future__ import annotations + +from datetime import timedelta +from pathlib import Path + +import pytest + +from surreal_memory.storage.sqlite_store import SQLiteStorage +from surreal_memory.utils.timeutils import utcnow + +BRAIN = "test-brain" + + +@pytest.fixture +async def storage(tmp_path: Path) -> SQLiteStorage: + """Initialized SQLiteStorage (schema v40) with a test brain.""" + store = SQLiteStorage(tmp_path / "test.db") + await store.initialize() + await store._ensure_conn().execute( + "INSERT OR IGNORE INTO brains (id, name, config, created_at, updated_at) " + "VALUES (?, ?, ?, ?, ?)", + (BRAIN, "test", "{}", "2026-01-01T00:00:00", "2026-01-01T00:00:00"), + ) + await store._ensure_conn().commit() + store.set_brain(BRAIN) + return store + + +def _trace( + trace_hash: str = "h1", + model: str = "claude-fable-5", + *, + session_id: str = "s1", + project: str = "proj", + task_context: str = "ctx", + content: str = "restate goal then verify", + content_chars: int | None = None, + category: str = "", + created_at: str = "2026-03-01T10:00:00", +) -> dict: + d = { + "trace_hash": trace_hash, + "model": model, + "session_id": session_id, + "project": project, + "task_context": task_context, + "content": content, + "category": category, + "created_at": created_at, + } + if content_chars is not None: + d["content_chars"] = content_chars + return d + + +async def test_migration_created_reasoning_traces_table(storage: SQLiteStorage) -> None: + """The v40 migration/SCHEMA creates the reasoning_traces table.""" + async with storage._ensure_read_conn().execute( + "SELECT name FROM sqlite_master WHERE type='table' AND name='reasoning_traces'" + ) as cur: + row = await cur.fetchone() + assert row is not None + + +async def test_insert_returns_count_and_dedups_within_batch(storage: SQLiteStorage) -> None: + n = await storage.insert_reasoning_traces( + BRAIN, + [_trace("h1"), _trace("h2"), _trace("h1", content="dup")], + ) + assert n == 2 # h1 inserted once (OR IGNORE on the duplicate), h2 once + + +async def test_insert_is_idempotent_across_calls(storage: SQLiteStorage) -> None: + assert await storage.insert_reasoning_traces(BRAIN, [_trace("h1")]) == 1 + assert await storage.insert_reasoning_traces(BRAIN, [_trace("h1")]) == 0 + + +async def test_empty_insert_returns_zero(storage: SQLiteStorage) -> None: + assert await storage.insert_reasoning_traces(BRAIN, []) == 0 + + +async def test_get_unprocessed_orders_oldest_first_and_limits(storage: SQLiteStorage) -> None: + await storage.insert_reasoning_traces( + BRAIN, + [ + _trace("h3", created_at="2026-03-03T00:00:00"), + _trace("h1", created_at="2026-03-01T00:00:00"), + _trace("h2", created_at="2026-03-02T00:00:00"), + ], + ) + rows = await storage.get_unprocessed_reasoning_traces(BRAIN, limit=2) + assert [r["trace_hash"] for r in rows] == ["h1", "h2"] + + +async def test_get_unprocessed_model_filter(storage: SQLiteStorage) -> None: + await storage.insert_reasoning_traces( + BRAIN, + [ + _trace("h1", model="claude-fable-5"), + _trace("h2", model="claude-sonnet-5"), + _trace("h3", model="claude-fable-5"), + ], + ) + rows = await storage.get_unprocessed_reasoning_traces(BRAIN, model="claude-fable-5") + assert {r["trace_hash"] for r in rows} == {"h1", "h3"} + + +async def test_mark_processed_excludes_from_unprocessed(storage: SQLiteStorage) -> None: + await storage.insert_reasoning_traces(BRAIN, [_trace("h1"), _trace("h2")]) + rows = await storage.get_unprocessed_reasoning_traces(BRAIN) + ids = [r["id"] for r in rows] + await storage.mark_reasoning_traces_processed(BRAIN, [ids[0]]) + remaining = await storage.get_unprocessed_reasoning_traces(BRAIN) + assert len(remaining) == 1 + assert remaining[0]["id"] == ids[1] + + +async def test_set_trace_categories(storage: SQLiteStorage) -> None: + await storage.insert_reasoning_traces(BRAIN, [_trace("h1"), _trace("h2")]) + rows = await storage.get_unprocessed_reasoning_traces(BRAIN) + ids = {r["trace_hash"]: r["id"] for r in rows} + await storage.set_trace_categories(BRAIN, {ids["h1"]: "debugging", ids["h2"]: "planning"}) + stats = await storage.get_reasoning_stats(BRAIN) + assert stats["by_category"].get("debugging") == 1 + assert stats["by_category"].get("planning") == 1 + + +async def test_task_context_truncated_to_500(storage: SQLiteStorage) -> None: + await storage.insert_reasoning_traces(BRAIN, [_trace("h1", task_context="x" * 600)]) + rows = await storage.get_unprocessed_reasoning_traces(BRAIN) + assert len(rows[0]["task_context"]) == 500 + + +async def test_content_chars_defaults_to_len(storage: SQLiteStorage) -> None: + await storage.insert_reasoning_traces( + BRAIN, [_trace("h1", content="abcde", content_chars=None)] + ) + rows = await storage.get_unprocessed_reasoning_traces(BRAIN) + assert rows[0]["content_chars"] == 5 + + +async def test_prune_deletes_only_old_processed(storage: SQLiteStorage) -> None: + await storage.insert_reasoning_traces( + BRAIN, + [ + _trace("old_proc", created_at="2000-01-01T00:00:00"), + _trace("old_unproc", created_at="2000-01-01T00:00:00"), + _trace("recent_proc", created_at=(utcnow() - timedelta(days=1)).isoformat()), + ], + ) + rows = await storage.get_unprocessed_reasoning_traces(BRAIN) + by_hash = {r["trace_hash"]: r["id"] for r in rows} + await storage.mark_reasoning_traces_processed( + BRAIN, [by_hash["old_proc"], by_hash["recent_proc"]] + ) + deleted = await storage.prune_reasoning_traces(BRAIN, keep_days=90) + assert deleted == 1 # only old_proc (processed AND old) + stats = await storage.get_reasoning_stats(BRAIN) + assert stats["total"] == 2 + + +async def test_cap_deletes_oldest_processed_beyond_max(storage: SQLiteStorage) -> None: + traces = [_trace(f"h{i}", created_at=f"2026-03-{i:02d}T00:00:00") for i in range(1, 6)] + await storage.insert_reasoning_traces(BRAIN, traces) + rows = await storage.get_unprocessed_reasoning_traces(BRAIN) + await storage.mark_reasoning_traces_processed(BRAIN, [r["id"] for r in rows]) + deleted = await storage.cap_reasoning_traces(BRAIN, max_total=2) + assert deleted == 3 + stats = await storage.get_reasoning_stats(BRAIN) + assert stats["total"] == 2 # the 2 newest survive + + +async def test_get_reasoning_stats_shapes(storage: SQLiteStorage) -> None: + await storage.insert_reasoning_traces( + BRAIN, + [ + _trace("h1", model="claude-fable-5", created_at="2026-03-01T00:00:00"), + _trace("h2", model="claude-fable-5", created_at="2026-03-05T00:00:00"), + _trace("h3", model="claude-sonnet-5", created_at="2026-03-02T00:00:00"), + ], + ) + rows = await storage.get_unprocessed_reasoning_traces(BRAIN, model="claude-sonnet-5") + await storage.mark_reasoning_traces_processed(BRAIN, [rows[0]["id"]]) + stats = await storage.get_reasoning_stats(BRAIN) + assert stats["total"] == 3 + assert stats["unprocessed"] == 2 + assert stats["by_model"]["claude-fable-5"]["trace_count"] == 2 + assert stats["by_model"]["claude-fable-5"]["unprocessed"] == 2 + assert stats["by_model"]["claude-fable-5"]["last_trace_at"] == "2026-03-05T00:00:00" + assert stats["by_model"]["claude-sonnet-5"]["unprocessed"] == 0 + + +async def test_get_reasoning_trace_models_distinct_sorted(storage: SQLiteStorage) -> None: + await storage.insert_reasoning_traces( + BRAIN, + [ + _trace("h1", model="claude-sonnet-5"), + _trace("h2", model="claude-fable-5"), + _trace("h3", model="claude-fable-5"), + ], + ) + assert await storage.get_reasoning_trace_models(BRAIN) == [ + "claude-fable-5", + "claude-sonnet-5", + ] + + +async def test_traces_are_brain_scoped(storage: SQLiteStorage) -> None: + await storage._ensure_conn().execute( + "INSERT OR IGNORE INTO brains (id, name, config, created_at, updated_at) " + "VALUES (?, ?, ?, ?, ?)", + ("other", "other", "{}", "2026-01-01T00:00:00", "2026-01-01T00:00:00"), + ) + await storage._ensure_conn().commit() + await storage.insert_reasoning_traces(BRAIN, [_trace("h1")]) + await storage.insert_reasoning_traces("other", [_trace("h1")]) + assert (await storage.get_reasoning_stats(BRAIN))["total"] == 1 + assert (await storage.get_reasoning_stats("other"))["total"] == 1 + + +async def test_content_chars_explicit_zero_preserved(storage: SQLiteStorage) -> None: + await storage.insert_reasoning_traces(BRAIN, [_trace("h1", content="abcde", content_chars=0)]) + rows = await storage.get_unprocessed_reasoning_traces(BRAIN) + assert rows[0]["content_chars"] == 0 + + +async def test_empty_trace_hash_is_skipped(storage: SQLiteStorage) -> None: + n = await storage.insert_reasoning_traces(BRAIN, [_trace(""), _trace("h1")]) + assert n == 1 + rows = await storage.get_unprocessed_reasoning_traces(BRAIN) + assert [r["trace_hash"] for r in rows] == ["h1"] diff --git a/tests/unit/test_surrealdb_reasoning_traces.py b/tests/unit/test_surrealdb_reasoning_traces.py new file mode 100644 index 00000000..455b14a1 --- /dev/null +++ b/tests/unit/test_surrealdb_reasoning_traces.py @@ -0,0 +1,229 @@ +"""Unit tests for the SurrealDB reasoning-traces mixin (no live DB required). + +Mirrors test_surrealdb_tool_events.py: a fake store routes ``_query`` by SQL +fragment and records inserts/updates/deletes, so the mixin's SurrealQL and +mapping logic are verified without a running SurrealDB. Live-engine behaviour is +covered separately by the real-db test runner. +""" + +from __future__ import annotations + +from typing import Any + +from surreal_memory.storage.surrealdb.reasoning_traces import SurrealDBReasoningTracesMixin + + +class _RTStore(SurrealDBReasoningTracesMixin): + """Routes _query by SQL fragment; records inserts and mutating queries.""" + + def __init__(self, **cfg: Any) -> None: + self.cfg = cfg + self.inserts: list[tuple[str, dict[str, Any]]] = [] + self.queries: list[tuple[str, dict[str, Any]]] = [] + + def _get_brain_id(self) -> str: + return "default" + + def _ensure_conn(self) -> Any: + store = self + + class _Conn: + async def insert(self, table: str, data: dict[str, Any]) -> None: + store.inserts.append((table, data)) + + return _Conn() + + async def _query(self, sql: str, **params: Any) -> list[dict[str, Any]]: + self.queries.append((sql, params)) + c = self.cfg + if sql.startswith("UPDATE reasoning_traces SET processed = true"): + return [] + if sql.startswith("UPDATE reasoning_traces SET category"): + return [] + if sql.startswith("DELETE reasoning_traces"): + return [] + if ( + sql.startswith("SELECT trace_hash FROM reasoning_traces") + and "trace_hash IN $hashes" in sql + ): + return [{"trace_hash": h} for h in c.get("existing", [])] + if "processed = true" in sql and "ORDER BY created_at ASC" in sql: + return [{"trace_hash": h} for h in c.get("cap_victims", [])] + if "processed = false" in sql and "ORDER BY created_at ASC" in sql: + rows = list(c.get("unprocessed", [])) + if params.get("model"): + rows = [r for r in rows if r.get("model") == params["model"]] + return rows + if "processed = true AND created_at < $cutoff GROUP ALL" in sql: + return [{"c": c.get("prune_count", 0)}] + if "count() AS c FROM reasoning_traces WHERE brain_id = $bid GROUP ALL" in sql: + return [{"c": c.get("total", 0)}] + if "AND processed = false GROUP BY model" in sql: + return c.get("unproc_groups", []) + if "count() AS cnt FROM reasoning_traces WHERE brain_id = $bid GROUP BY model" in sql: + return c.get("model_groups", []) + if "ORDER BY created_at DESC LIMIT 1" in sql: + return c.get("latest", {}).get(params.get("model"), []) + if "GROUP BY category" in sql: + return c.get("cat_groups", []) + if sql.startswith( + "SELECT model FROM reasoning_traces WHERE brain_id = $bid GROUP BY model" + ): + return c.get("distinct_models", []) + return [] + + +def _tr(trace_hash: str, model: str = "claude-fable-5", **kw: Any) -> dict[str, Any]: + base = { + "trace_hash": trace_hash, + "model": model, + "session_id": "s1", + "project": "proj", + "task_context": "ctx", + "content": "restate goal then verify", + "created_at": "2026-03-01T10:00:00", + } + base.update(kw) + return base + + +async def test_insert_skips_existing_and_batch_dupes() -> None: + store = _RTStore(existing=["h2"]) + n = await store.insert_reasoning_traces( + "default", [_tr("h1"), _tr("h2"), _tr("h1", content="dup"), _tr("h3")] + ) + # h2 already exists; h1 duplicated in batch (inserted once); h3 new. + assert n == 2 + inserted_hashes = {data["trace_hash"] for _, data in store.inserts} + assert inserted_hashes == {"h1", "h3"} + for table, data in store.inserts: + assert table == "reasoning_traces" + assert data["processed"] is False + assert data["brain_id"] == "default" + + +async def test_insert_empty_returns_zero() -> None: + store = _RTStore() + assert await store.insert_reasoning_traces("default", []) == 0 + assert store.inserts == [] + + +async def test_insert_truncates_task_context_and_computes_chars() -> None: + store = _RTStore() + await store.insert_reasoning_traces( + "default", [_tr("h1", task_context="x" * 600, content="abcde")] + ) + data = store.inserts[0][1] + assert len(data["task_context"]) == 500 + assert data["content_chars"] == 5 + + +async def test_get_unprocessed_maps_rows_and_filters_model() -> None: + unprocessed = [ + {"trace_hash": "h1", "model": "claude-fable-5", "content": "c1", "created_at": "t1"}, + {"trace_hash": "h2", "model": "claude-sonnet-5", "content": "c2", "created_at": "t2"}, + ] + store = _RTStore(unprocessed=unprocessed) + rows = await store.get_unprocessed_reasoning_traces("default", model="claude-fable-5") + assert len(rows) == 1 + assert rows[0]["id"] == "h1" + assert rows[0]["trace_hash"] == "h1" + # limit is interpolated into the SQL + assert any("LIMIT" in sql for sql, _ in store.queries) + + +async def test_mark_processed_issues_update_by_trace_hash() -> None: + store = _RTStore() + await store.mark_reasoning_traces_processed("default", ["h1", "h2"]) + upd = [ + q for q in store.queries if q[0].startswith("UPDATE reasoning_traces SET processed = true") + ] + assert upd and upd[0][1]["ids"] == ["h1", "h2"] + + +async def test_mark_processed_empty_noop() -> None: + store = _RTStore() + await store.mark_reasoning_traces_processed("default", []) + assert store.queries == [] + + +async def test_set_categories_updates_per_hash() -> None: + store = _RTStore() + await store.set_trace_categories("default", {"h1": "debugging", "h2": "planning"}) + cat_updates = [ + q for q in store.queries if q[0].startswith("UPDATE reasoning_traces SET category") + ] + assert len(cat_updates) == 2 + seen = {(q[1]["id"], q[1]["cat"]) for q in cat_updates} + assert seen == {("h1", "debugging"), ("h2", "planning")} + + +async def test_prune_returns_count_and_deletes() -> None: + store = _RTStore(prune_count=3) + deleted = await store.prune_reasoning_traces("default", keep_days=90) + assert deleted == 3 + assert any(q[0].startswith("DELETE reasoning_traces") for q in store.queries) + + +async def test_cap_deletes_oldest_excess() -> None: + store = _RTStore(total=5, cap_victims=["h1", "h2", "h3"]) + deleted = await store.cap_reasoning_traces("default", max_total=2) + assert deleted == 3 + dels = [q for q in store.queries if q[0].startswith("DELETE reasoning_traces")] + assert dels and dels[0][1]["ids"] == ["h1", "h2", "h3"] + + +async def test_cap_noop_when_under_limit() -> None: + store = _RTStore(total=2) + assert await store.cap_reasoning_traces("default", max_total=5) == 0 + assert not any(q[0].startswith("DELETE reasoning_traces") for q in store.queries) + + +async def test_get_reasoning_stats_assembles_all_sections() -> None: + store = _RTStore( + model_groups=[ + {"model": "claude-fable-5", "cnt": 2}, + {"model": "claude-sonnet-5", "cnt": 1}, + ], + unproc_groups=[{"model": "claude-fable-5", "cnt": 2}], + latest={ + "claude-fable-5": [{"created_at": "2026-03-05T00:00:00"}], + "claude-sonnet-5": [{"created_at": "2026-03-02T00:00:00"}], + }, + cat_groups=[{"category": "debugging", "cnt": 1}, {"category": "planning", "cnt": 2}], + ) + stats = await store.get_reasoning_stats("default") + assert stats["total"] == 3 + assert stats["unprocessed"] == 2 + assert stats["by_model"]["claude-fable-5"]["trace_count"] == 2 + assert stats["by_model"]["claude-fable-5"]["unprocessed"] == 2 + assert stats["by_model"]["claude-fable-5"]["last_trace_at"] == "2026-03-05T00:00:00" + assert stats["by_model"]["claude-sonnet-5"]["unprocessed"] == 0 + assert stats["by_category"] == {"debugging": 1, "planning": 2} + + +async def test_get_reasoning_trace_models_distinct_sorted_nonempty() -> None: + store = _RTStore( + distinct_models=[ + {"model": "claude-sonnet-5"}, + {"model": "claude-fable-5"}, + {"model": ""}, + ] + ) + assert await store.get_reasoning_trace_models("default") == [ + "claude-fable-5", + "claude-sonnet-5", + ] + + +async def test_insert_preserves_explicit_content_chars_zero() -> None: + store = _RTStore() + await store.insert_reasoning_traces("default", [_tr("h1", content="abcde", content_chars=0)]) + assert store.inserts[0][1]["content_chars"] == 0 + + +async def test_insert_skips_empty_trace_hash() -> None: + store = _RTStore() + n = await store.insert_reasoning_traces("default", [_tr(""), _tr("h1")]) + assert n == 1 + assert {data["trace_hash"] for _, data in store.inserts} == {"h1"} From a330262c14b66d9455284c31b76edc29d96faa23 Mon Sep 17 00:00:00 2001 From: Toni Nowak Date: Thu, 16 Jul 2026 23:17:29 +0200 Subject: [PATCH 02/12] feat: ReasoningTrainingConfig + TOML/env wiring (U2) Add the frozen ReasoningTrainingConfig dataclass (mining + injection settings, opt-in/off by default) to UnifiedConfig, with config.toml + env support (run 007 Faza 2). - ReasoningTrainingConfig (all plan fields: mining/injection toggles, mining_models globs, injection_map target->source, categories, trace/scan/retention/cap limits, distiller + confidence knobs, redact_secrets) - load: [reasoning_training] TOML section + [reasoning_training.injection_map] subtable, env overrides SURREAL_MEMORY_REASONING_{MINING,INJECTION,MODELS,INJECTION_MAP} - save: emits the section incl. injection_map subtable; adds _sanitize_toml_glob so glob model names (claude-opus-*) survive serialization (the strict _sanitize_toml_str would drop the '*') - tests: defaults, from/to_dict roundtrip, min_confidence clamp, injection_map dict/list forms, TOML glob+injection_map roundtrip, env overrides, empty-env no-op --- src/surreal_memory/unified_config.py | 224 +++++++++++++++++++++++++++ tests/unit/test_unified_config.py | 107 +++++++++++++ 2 files changed, 331 insertions(+) diff --git a/src/surreal_memory/unified_config.py b/src/surreal_memory/unified_config.py index 56da25d1..1e5008e7 100755 --- a/src/surreal_memory/unified_config.py +++ b/src/surreal_memory/unified_config.py @@ -1063,6 +1063,189 @@ def from_dict(cls, data: dict[str, Any]) -> ToolMemoryConfig: ) +# Model names / injection globs may contain glob metacharacters (``*``/``?``/ +# ``[]``) that the stricter _TOML_SAFE_STRING rejects. This variant allows them +# while still blocking quotes/backslashes/control chars (TOML-injection safe). +_TOML_SAFE_GLOB = re.compile(r"^[a-zA-Z0-9_\-\./ *?\[\]]*$") + + +def _sanitize_toml_glob(value: str) -> str: + """Sanitize a model-name / glob string for safe TOML serialization.""" + if not isinstance(value, str): + return "" + cleaned = value.strip()[:_TOML_STR_MAX_LEN] + if not _TOML_SAFE_GLOB.match(cleaned): + return "" + return cleaned + + +_DEFAULT_REASONING_CATEGORIES: tuple[str, ...] = ( + "debugging", + "planning", + "implementation", + "refactoring", + "research", + "verification", + "architecture", + "data-analysis", +) + + +@dataclass(frozen=True) +class ReasoningTrainingConfig: + """Reasoning-training configuration (mining reasoning traces + injection). + + Opt-in and privacy-preserving: mining and injection are both OFF by default. + Mirrors the tool-memory pipeline but for model ``thinking`` blocks — mined + traces are distilled into ReasoningBank patterns and optionally injected into + other models' sessions per ``injection_map``. + """ + + mining_enabled: bool = False # opt-in (privacy): reads no transcripts until True + injection_enabled: bool = False # opt-in: inject learned strategies into sessions + # Glob patterns of source models to mine; () = all models with non-empty thinking. + mining_models: tuple[str, ...] = () + # target_glob -> source_model (one source per target in v1). + injection_map: tuple[tuple[str, str], ...] = () + categories: tuple[str, ...] = _DEFAULT_REASONING_CATEGORIES + min_trace_chars: int = 200 + max_trace_chars: int = 20_000 + max_traces_per_scan: int = 500 + scan_lookback_days: int = 30 # 0 = full backfill + retention_days: int = 90 + max_traces_total: int = 20_000 + min_cluster_support: int = 3 + max_patterns_per_run: int = 10 + min_confidence: float = 0.2 + min_patterns_per_category: int = 3 + injection_max_patterns: int = 5 + injection_max_chars: int = 4000 + distill_use_llm: bool = False + redact_secrets: bool = True + + def to_dict(self) -> dict[str, Any]: + return { + "mining_enabled": self.mining_enabled, + "injection_enabled": self.injection_enabled, + "mining_models": list(self.mining_models), + "injection_map": dict(self.injection_map), + "categories": list(self.categories), + "min_trace_chars": self.min_trace_chars, + "max_trace_chars": self.max_trace_chars, + "max_traces_per_scan": self.max_traces_per_scan, + "scan_lookback_days": self.scan_lookback_days, + "retention_days": self.retention_days, + "max_traces_total": self.max_traces_total, + "min_cluster_support": self.min_cluster_support, + "max_patterns_per_run": self.max_patterns_per_run, + "min_confidence": self.min_confidence, + "min_patterns_per_category": self.min_patterns_per_category, + "injection_max_patterns": self.injection_max_patterns, + "injection_max_chars": self.injection_max_chars, + "distill_use_llm": self.distill_use_llm, + "redact_secrets": self.redact_secrets, + } + + @classmethod + def from_dict(cls, data: dict[str, Any]) -> ReasoningTrainingConfig: + def _int(key: str, default: int, lo: int, hi: int) -> int: + try: + return max(lo, min(int(data.get(key, default)), hi)) + except (ValueError, TypeError): + return default + + models_raw = data.get("mining_models", []) + if isinstance(models_raw, (list, tuple)): + mining_models = tuple(str(m)[:128] for m in models_raw[:100] if str(m).strip()) + else: + mining_models = () + + map_raw = data.get("injection_map", {}) + injection_pairs: list[tuple[str, str]] = [] + if isinstance(map_raw, dict): + for target, source in map_raw.items(): + t, s = str(target).strip(), str(source).strip() + if t and s: + injection_pairs.append((t[:128], s[:128])) + elif isinstance(map_raw, (list, tuple)): + for item in map_raw: + if isinstance(item, (list, tuple)) and len(item) == 2: + t, s = str(item[0]).strip(), str(item[1]).strip() + if t and s: + injection_pairs.append((t[:128], s[:128])) + + cats_raw = data.get("categories") + if isinstance(cats_raw, (list, tuple)) and cats_raw: + categories = tuple(str(c)[:64] for c in cats_raw[:50] if str(c).strip()) + else: + categories = _DEFAULT_REASONING_CATEGORIES + + try: + min_confidence = max(0.0, min(float(data.get("min_confidence", 0.2)), 1.0)) + except (ValueError, TypeError): + min_confidence = 0.2 + + return cls( + mining_enabled=bool(data.get("mining_enabled", False)), + injection_enabled=bool(data.get("injection_enabled", False)), + mining_models=mining_models, + injection_map=tuple(injection_pairs), + categories=categories, + min_trace_chars=_int("min_trace_chars", 200, 0, 1_000_000), + max_trace_chars=_int("max_trace_chars", 20_000, 1, 10_000_000), + max_traces_per_scan=_int("max_traces_per_scan", 500, 1, 1_000_000), + scan_lookback_days=_int("scan_lookback_days", 30, 0, 100_000), + retention_days=_int("retention_days", 90, 1, 100_000), + max_traces_total=_int("max_traces_total", 20_000, 1, 100_000_000), + min_cluster_support=_int("min_cluster_support", 3, 1, 100_000), + max_patterns_per_run=_int("max_patterns_per_run", 10, 1, 100_000), + min_confidence=min_confidence, + min_patterns_per_category=_int("min_patterns_per_category", 3, 1, 100_000), + injection_max_patterns=_int("injection_max_patterns", 5, 1, 1000), + injection_max_chars=_int("injection_max_chars", 4000, 1, 1_000_000), + distill_use_llm=bool(data.get("distill_use_llm", False)), + redact_secrets=bool(data.get("redact_secrets", True)), + ) + + +def _load_reasoning_settings(data: dict[str, Any]) -> ReasoningTrainingConfig: + """Build ReasoningTrainingConfig from config.toml, letting env vars override. + + Env precedence (env wins over config.toml, config.toml wins over defaults): + SURREAL_MEMORY_REASONING_MINING -> mining_enabled (truthy parse) + SURREAL_MEMORY_REASONING_INJECTION -> injection_enabled (truthy parse) + SURREAL_MEMORY_REASONING_MODELS -> mining_models (comma-separated globs) + SURREAL_MEMORY_REASONING_INJECTION_MAP -> injection_map ("target=source,..." pairs) + """ + base = ReasoningTrainingConfig.from_dict(data) + overrides: dict[str, Any] = {} + + env_mining = _env_truthy(os.environ.get("SURREAL_MEMORY_REASONING_MINING")) + if env_mining is not None: + overrides["mining_enabled"] = env_mining + + env_injection = _env_truthy(os.environ.get("SURREAL_MEMORY_REASONING_INJECTION")) + if env_injection is not None: + overrides["injection_enabled"] = env_injection + + env_models = os.environ.get("SURREAL_MEMORY_REASONING_MODELS") + if env_models is not None and env_models.strip(): + overrides["mining_models"] = tuple(m.strip() for m in env_models.split(",") if m.strip()) + + env_map = os.environ.get("SURREAL_MEMORY_REASONING_INJECTION_MAP") + if env_map is not None and env_map.strip(): + pairs: list[tuple[str, str]] = [] + for chunk in env_map.split(","): + target, sep, source = chunk.partition("=") + if sep and target.strip() and source.strip(): + pairs.append((target.strip(), source.strip())) + overrides["injection_map"] = tuple(pairs) + + if overrides: + return dataclasses.replace(base, **overrides) + return base + + @dataclass(frozen=True) class TelegramConfig: """Telegram backup integration configuration. @@ -1469,6 +1652,9 @@ class UnifiedConfig: # Retrieval-trace telemetry (schema v9, opt-in; neutral default = off) trace: TraceConfig = field(default_factory=TraceConfig) + # Reasoning-training (mining reasoning traces + injection; opt-in, off by default) + reasoning_training: ReasoningTrainingConfig = field(default_factory=ReasoningTrainingConfig) + # CLI preferences json_output: bool = False default_depth: int | None = None @@ -1566,12 +1752,48 @@ def load(cls, config_path: Path | None = None) -> UnifiedConfig: response=ResponseConfig.from_dict(data.get("response", {})), budget=BudgetRetrievalConfig.from_dict(data.get("budget", {})), trace=TraceConfig.from_dict(data.get("trace", {})), + reasoning_training=_load_reasoning_settings(data.get("reasoning_training", {})), json_output=data.get("cli", {}).get("json_output", False), default_depth=data.get("cli", {}).get("default_depth"), default_max_tokens=data.get("cli", {}).get("default_max_tokens", 500), version=data.get("version", "1.0"), ) + def _reasoning_toml_lines(self) -> list[str]: + """Render the [reasoning_training] TOML section (+ injection_map subtable).""" + rt = self.reasoning_training + models = ", ".join(f'"{g}"' for m in rt.mining_models if (g := _sanitize_toml_glob(m))) + cats = ", ".join(f'"{g}"' for c in rt.categories if (g := _sanitize_toml_glob(c))) + lines = [ + "# Reasoning-training (mining reasoning traces + injection; opt-in, off by default)", + "[reasoning_training]", + f"mining_enabled = {'true' if rt.mining_enabled else 'false'}", + f"injection_enabled = {'true' if rt.injection_enabled else 'false'}", + f"mining_models = [{models}]", + f"categories = [{cats}]", + f"min_trace_chars = {rt.min_trace_chars}", + f"max_trace_chars = {rt.max_trace_chars}", + f"max_traces_per_scan = {rt.max_traces_per_scan}", + f"scan_lookback_days = {rt.scan_lookback_days}", + f"retention_days = {rt.retention_days}", + f"max_traces_total = {rt.max_traces_total}", + f"min_cluster_support = {rt.min_cluster_support}", + f"max_patterns_per_run = {rt.max_patterns_per_run}", + f"min_confidence = {rt.min_confidence}", + f"min_patterns_per_category = {rt.min_patterns_per_category}", + f"injection_max_patterns = {rt.injection_max_patterns}", + f"injection_max_chars = {rt.injection_max_chars}", + f"distill_use_llm = {'true' if rt.distill_use_llm else 'false'}", + f"redact_secrets = {'true' if rt.redact_secrets else 'false'}", + "[reasoning_training.injection_map]", + ] + for target, source in rt.injection_map: + gk = _sanitize_toml_glob(target) + gv = _sanitize_toml_glob(source) + if gk and gv: + lines.append(f'"{gk}" = "{gv}"') + return lines + def save(self) -> None: """Save configuration to TOML file (atomic write via temp+rename).""" import tempfile @@ -1785,6 +2007,8 @@ def save(self) -> None: f"retention_days = {self.trace.retention_days}", f"max_traces = {self.trace.max_traces}", "", + *self._reasoning_toml_lines(), + "", "# CLI preferences", "[cli]", f"json_output = {'true' if self.json_output else 'false'}", diff --git a/tests/unit/test_unified_config.py b/tests/unit/test_unified_config.py index 91589109..bdba714f 100755 --- a/tests/unit/test_unified_config.py +++ b/tests/unit/test_unified_config.py @@ -9,6 +9,7 @@ from surreal_memory.cli.config import _sync_brain_to_toml from surreal_memory.unified_config import ( _MIN_LEGACY_DB_BYTES, + ReasoningTrainingConfig, UnifiedConfig, _migrate_legacy_db, _read_current_brain_from_toml, @@ -527,3 +528,109 @@ def test_emits_only_once(self, monkeypatch, caplog): uc._warn_missing_surreal_pass() warnings = [r for r in caplog.records if "SURREALDB_PASS" in r.message] assert len(warnings) == 1 + + +class TestReasoningTrainingConfig: + """Tests for the [reasoning_training] config section (mining + injection).""" + + _ENV_VARS = ( + "SURREAL_MEMORY_REASONING_MINING", + "SURREAL_MEMORY_REASONING_INJECTION", + "SURREAL_MEMORY_REASONING_MODELS", + "SURREAL_MEMORY_REASONING_INJECTION_MAP", + ) + + def _clear_env(self, monkeypatch: pytest.MonkeyPatch) -> None: + for var in self._ENV_VARS: + monkeypatch.delenv(var, raising=False) + + def test_defaults_are_opt_in_off(self) -> None: + rt = ReasoningTrainingConfig() + assert rt.mining_enabled is False + assert rt.injection_enabled is False + assert rt.mining_models == () + assert rt.injection_map == () + assert "debugging" in rt.categories + assert "data-analysis" in rt.categories + assert rt.min_confidence == 0.2 + assert rt.redact_secrets is True + + def test_from_dict_to_dict_roundtrip(self) -> None: + rt = ReasoningTrainingConfig( + mining_enabled=True, + injection_enabled=True, + mining_models=("claude-fable-*",), + injection_map=(("claude-opus-*", "claude-fable-5"),), + min_confidence=0.5, + max_traces_total=1234, + ) + assert ReasoningTrainingConfig.from_dict(rt.to_dict()) == rt + + def test_from_dict_clamps_min_confidence(self) -> None: + assert ReasoningTrainingConfig.from_dict({"min_confidence": 5}).min_confidence == 1.0 + assert ReasoningTrainingConfig.from_dict({"min_confidence": -1}).min_confidence == 0.0 + + def test_from_dict_injection_map_dict_and_list_forms(self) -> None: + from_dict = ReasoningTrainingConfig.from_dict( + {"injection_map": {"claude-opus-*": "claude-fable-5"}} + ) + assert from_dict.injection_map == (("claude-opus-*", "claude-fable-5"),) + # Malformed list entries (wrong arity) are dropped; valid pairs kept. + from_list = ReasoningTrainingConfig.from_dict({"injection_map": [["a", "b"], ["bad"]]}) + assert from_list.injection_map == (("a", "b"),) + + def test_toml_roundtrip_preserves_globs_and_injection_map( + self, tmp_data_dir: Path, monkeypatch: pytest.MonkeyPatch + ) -> None: + self._clear_env(monkeypatch) + rt = ReasoningTrainingConfig( + mining_enabled=True, + injection_enabled=True, + mining_models=("claude-fable-*", "glm-5.2"), + injection_map=(("claude-opus-*", "claude-fable-5"),), + min_confidence=0.35, + scan_lookback_days=0, + ) + UnifiedConfig(data_dir=tmp_data_dir, current_brain="default", reasoning_training=rt).save() + reloaded = UnifiedConfig.load(config_path=tmp_data_dir / "config.toml") + + got = reloaded.reasoning_training + assert got.mining_enabled is True + assert got.injection_enabled is True + # Globs survive save/load (would be silently dropped by _sanitize_toml_str). + assert got.mining_models == ("claude-fable-*", "glm-5.2") + assert got.injection_map == (("claude-opus-*", "claude-fable-5"),) + assert got.min_confidence == 0.35 + assert got.scan_lookback_days == 0 + + def test_env_overrides_toml(self, tmp_data_dir: Path, monkeypatch: pytest.MonkeyPatch) -> None: + self._clear_env(monkeypatch) + UnifiedConfig(data_dir=tmp_data_dir, current_brain="default").save() # mining off + monkeypatch.setenv("SURREAL_MEMORY_REASONING_MINING", "true") + monkeypatch.setenv("SURREAL_MEMORY_REASONING_INJECTION", "1") + monkeypatch.setenv("SURREAL_MEMORY_REASONING_MODELS", "claude-fable-*, glm-5.2") + monkeypatch.setenv( + "SURREAL_MEMORY_REASONING_INJECTION_MAP", + "claude-opus-*=claude-fable-5, claude-haiku-*=glm-5.2", + ) + cfg = UnifiedConfig.load(config_path=tmp_data_dir / "config.toml") + + assert cfg.reasoning_training.mining_enabled is True + assert cfg.reasoning_training.injection_enabled is True + assert cfg.reasoning_training.mining_models == ("claude-fable-*", "glm-5.2") + assert cfg.reasoning_training.injection_map == ( + ("claude-opus-*", "claude-fable-5"), + ("claude-haiku-*", "glm-5.2"), + ) + + def test_empty_env_does_not_override( + self, tmp_data_dir: Path, monkeypatch: pytest.MonkeyPatch + ) -> None: + self._clear_env(monkeypatch) + rt = ReasoningTrainingConfig(mining_enabled=True, mining_models=("x-*",)) + UnifiedConfig(data_dir=tmp_data_dir, current_brain="default", reasoning_training=rt).save() + monkeypatch.setenv("SURREAL_MEMORY_REASONING_MODELS", "") # empty → ignored + cfg = UnifiedConfig.load(config_path=tmp_data_dir / "config.toml") + + assert cfg.reasoning_training.mining_enabled is True + assert cfg.reasoning_training.mining_models == ("x-*",) From 497a855d522d20afb357f6c4ec25820ad9a3c79b Mon Sep 17 00:00:00 2001 From: Toni Nowak Date: Fri, 17 Jul 2026 10:11:08 +0200 Subject: [PATCH 03/12] feat: reasoning_miner + PROCESS_REASONING_TRACES consolidation (U3) Mine model thinking blocks from ~/.claude transcripts into the reasoning_traces staging table, driven by consolidation (run 007 Faza 3). - engine/reasoning_miner.py: scan_transcripts (path-guarded to ~/.claude, incremental last_line resume, trace_hash dedup, model normalize/denylist/glob, /opus skip, min/max char gating) + ingest_reasoning_traces - privacy: redaction-before-stage of BOTH thinking content AND user task_context via a reasoning-tuned pattern set (min_severity=2 + Bearer/prose/vendor-key patterns); opt-in (mining_enabled) only; signatures never stored - consolidation: PROCESS_REASONING_TRACES strategy (tier 1, guarded by mining_enabled + dry_run, excluded from scheduled defaults like LEARN_HABITS) + ConsolidationReport.reasoning_traces_ingested - per-line size cap before json.loads (crafted-transcript DoS guard) - tests: 21 miner/consolidation cases; live-verified against SurrealDB v3.2.0 --- src/surreal_memory/engine/consolidation.py | 52 +++ src/surreal_memory/engine/reasoning_miner.py | 429 +++++++++++++++++++ tests/unit/test_reasoning_miner.py | 379 ++++++++++++++++ 3 files changed, 860 insertions(+) create mode 100644 src/surreal_memory/engine/reasoning_miner.py create mode 100644 tests/unit/test_reasoning_miner.py diff --git a/src/surreal_memory/engine/consolidation.py b/src/surreal_memory/engine/consolidation.py index b0623da9..59fae119 100755 --- a/src/surreal_memory/engine/consolidation.py +++ b/src/surreal_memory/engine/consolidation.py @@ -48,6 +48,7 @@ class ConsolidationStrategy(StrEnum): COMPRESS = "compress" LIFECYCLE = "lifecycle" PROCESS_TOOL_EVENTS = "process_tool_events" + PROCESS_REASONING_TRACES = "process_reasoning_traces" ESSENCE_BACKFILL = "essence_backfill" DETECT_DRIFT = "detect_drift" REPLAY = "replay" # Hippocampal replay: LTP/LTD on recent fibers @@ -113,6 +114,7 @@ class ConsolidationReport: tokens_saved: int = 0 neurons_reactivated: int = 0 essences_generated: int = 0 + reasoning_traces_ingested: int = 0 merge_details: list[MergeDetail] = field(default_factory=list) dry_run: bool = False extra: dict[str, Any] = field(default_factory=dict) @@ -212,6 +214,7 @@ class ConsolidationEngine: ConsolidationStrategy.LEARN_HABITS, ConsolidationStrategy.DEDUP, ConsolidationStrategy.PROCESS_TOOL_EVENTS, + ConsolidationStrategy.PROCESS_REASONING_TRACES, } ), frozenset( @@ -286,6 +289,9 @@ async def _run_strategy( ConsolidationStrategy.PROCESS_TOOL_EVENTS: lambda: self._process_tool_events( report, dry_run ), + ConsolidationStrategy.PROCESS_REASONING_TRACES: lambda: self._process_reasoning_traces( + report, dry_run + ), ConsolidationStrategy.DETECT_DRIFT: lambda: self._detect_drift(report, dry_run), ConsolidationStrategy.ESSENCE_BACKFILL: lambda: self._essence_backfill(report, dry_run), ConsolidationStrategy.REPLAY: lambda: self._replay(report, dry_run), @@ -1871,6 +1877,52 @@ async def _process_tool_events( result.synapses_created, ) + async def _process_reasoning_traces( + self, + report: ConsolidationReport, + dry_run: bool, + ) -> None: + """Mine reasoning traces from transcripts into the staging table. + + Scans ~/.claude transcripts for model thinking blocks and stages them + (redacted) via reasoning_miner. Only runs when + reasoning_training.mining_enabled is set (opt-in for privacy). Mirrors + PROCESS_TOOL_EVENTS and is likewise excluded from scheduled defaults. + """ + import logging as _logging + + from surreal_memory.unified_config import UnifiedConfig + + _logger = _logging.getLogger(__name__) + + brain_id = self._storage.current_brain_id + if not brain_id: + _logger.debug("PROCESS_REASONING_TRACES skipped: no brain context") + return + + try: + config = UnifiedConfig.load() + except Exception: + _logger.debug("PROCESS_REASONING_TRACES skipped: config load failed", exc_info=True) + return + + if not config.reasoning_training.mining_enabled: + return + + if dry_run: + _logger.debug("PROCESS_REASONING_TRACES skipped: dry_run mode") + return + + from surreal_memory.engine.reasoning_miner import ingest_reasoning_traces + + result = await ingest_reasoning_traces(self._storage, brain_id, config) + report.reasoning_traces_ingested = result.traces_ingested + if result.traces_ingested > 0: + _logger.debug( + "PROCESS_REASONING_TRACES: ingested %d reasoning traces", + result.traces_ingested, + ) + async def _detect_drift(self, report: ConsolidationReport, dry_run: bool) -> None: """Run semantic drift detection to find tag synonyms/aliases.""" _logger = logging.getLogger(__name__) diff --git a/src/surreal_memory/engine/reasoning_miner.py b/src/surreal_memory/engine/reasoning_miner.py new file mode 100644 index 00000000..e303fd54 --- /dev/null +++ b/src/surreal_memory/engine/reasoning_miner.py @@ -0,0 +1,429 @@ +"""Reasoning-trace miner: scan Claude Code transcripts for model ``thinking``. + +Mirrors the tool-events ingest pipeline, but reads reasoning (``thinking``) +blocks out of ``~/.claude/projects/*/*.jsonl`` transcripts into the +``reasoning_traces`` staging table. Runs inside consolidation (strategy +``PROCESS_REASONING_TRACES``), never on the hooks' hot path. + +Privacy: mining is opt-in (``reasoning_training.mining_enabled``); thinking text +is redacted via ``safety.sensitive.auto_redact_content`` BEFORE it is staged. +Deduplicated by ``trace_hash = sha256(sessionId:uuid:block_index)``; an +incremental scan-state file skips unchanged transcripts. +""" + +from __future__ import annotations + +import hashlib +import json +import logging +import re +import time +from dataclasses import dataclass +from datetime import UTC +from fnmatch import fnmatch +from functools import lru_cache +from pathlib import Path +from typing import TYPE_CHECKING, Any + +from surreal_memory.safety.sensitive import ( + SensitivePattern, + SensitiveType, + auto_redact_content, + get_default_patterns, +) +from surreal_memory.utils.timeutils import utcnow + +if TYPE_CHECKING: + from datetime import datetime + + from surreal_memory.storage.base import NeuralStorage + from surreal_memory.unified_config import ReasoningTrainingConfig, UnifiedConfig + +logger = logging.getLogger(__name__) + +# Models whose thinking blocks are empty (signature-only) — never a mining +# source. opus-4.8 is already excluded by the non-empty-thinking filter; this is +# a belt-and-suspenders prefix denylist (see run 007 BINDING CORRECTION #5). +_MODELS_WITHOUT_THINKING = ("claude-opus-4-8",) + +# The synthetic attribution used for non-model turns — never mine it. +_SYNTHETIC_MODEL = "" + +_TASK_CONTEXT_MAX = 400 +_DATE_SUFFIX = re.compile(r"-\d{8}$") + +# Skip absurdly large transcript lines before json.loads (crafted/corrupted +# transcript DoS guard). Normal entries (even with big tool_results) are well +# under this; a single reasoning trace is capped far lower by max_trace_chars. +_MAX_LINE_CHARS = 1_000_000 + + +@lru_cache(maxsize=1) +def _reasoning_redaction_patterns() -> tuple[SensitivePattern, ...]: + """Default redaction patterns plus prose / vendor-token patterns. + + Reasoning ``thinking`` is free-form narration (paraphrased configs, curl + commands, error output), so the ``key=value``-anchored defaults miss Bearer + headers and bare vendor keys. These extra severity-3 patterns close that gap. + """ + extra = ( + SensitivePattern( + name="Bearer Token (prose)", + pattern=r"(?i)bearer\s+[A-Za-z0-9._\-]{16,}", + type=SensitiveType.TOKEN, + description="Bearer token in narrative prose", + severity=3, + ), + SensitivePattern( + name="OpenAI Secret Key", + # \b anchor avoids matching "sk-" mid-word (task-, desk-, risk-, disk-…). + pattern=r"\bsk-(?:proj-)?[A-Za-z0-9_\-]{16,}", + type=SensitiveType.API_KEY, + description="OpenAI-style secret key", + severity=3, + ), + SensitivePattern( + name="GitHub Token", + pattern=r"gh[pousr]_[A-Za-z0-9]{20,}", + type=SensitiveType.TOKEN, + description="GitHub personal/OAuth token", + severity=3, + ), + SensitivePattern( + name="Slack Token", + pattern=r"xox[baprs]-[A-Za-z0-9\-]{10,}", + type=SensitiveType.TOKEN, + description="Slack token", + severity=3, + ), + SensitivePattern( + name="Google API Key", + pattern=r"AIza[0-9A-Za-z_\-]{16,}", + type=SensitiveType.API_KEY, + description="Google API key", + severity=3, + ), + SensitivePattern( + name="AWS Access Key ID (standalone)", + pattern=r"\bAKIA[0-9A-Z]{16}\b", + type=SensitiveType.AWS_KEY, + description="AWS access key id", + severity=3, + ), + ) + return get_default_patterns() + extra + + +def _redact(text: str, config: ReasoningTrainingConfig) -> str: + """Redact secrets from *text* when ``config.redact_secrets`` is set. + + Uses ``min_severity=2`` (so JWTs, which are severity 2, are caught) with the + reasoning-specific pattern set. Applied to BOTH thinking content and the + user-prompt ``task_context`` before anything is staged. + """ + if not config.redact_secrets: + return text + redacted, _matches, _orig_hash = auto_redact_content( + text, min_severity=2, patterns=list(_reasoning_redaction_patterns()) + ) + return redacted + + +def normalize_model(model: str) -> str: + """Canonicalize a model id by stripping a trailing ``-YYYYMMDD`` date suffix. + + ``claude-haiku-4-5-20251001`` -> ``claude-haiku-4-5``. Keeps mining, + distillation and injection agreeing on one canonical model name. + """ + return _DATE_SUFFIX.sub("", model.strip()) + + +def _is_denylisted(model: str) -> bool: + return any(model.startswith(prefix) for prefix in _MODELS_WITHOUT_THINKING) + + +def _model_matches(model: str, patterns: tuple[str, ...]) -> bool: + """Return True if *model* matches any glob in *patterns* (empty = all).""" + if not patterns: + return True + return any(fnmatch(model, pattern) for pattern in patterns) + + +def _extract_user_text(entry: dict[str, Any]) -> str: + """Extract plain user prompt text from a transcript entry (best-effort).""" + message = entry.get("message") + source = message if isinstance(message, dict) else entry + content = source.get("content") + if isinstance(content, str): + return content + if isinstance(content, list): + parts = [ + item.get("text", "") + for item in content + if isinstance(item, dict) and item.get("type") == "text" and item.get("text") + ] + return "\n".join(parts) + return "" + + +def _project_from_path(jsonl: Path) -> str: + """Derive a readable project name from the transcript's parent directory.""" + return jsonl.parent.name + + +def _now_ts(now: datetime | None) -> float: + if now is None: + return time.time() + aware = now if now.tzinfo is not None else now.replace(tzinfo=UTC) + return aware.timestamp() + + +def _load_scan_state(state_path: Path | None) -> dict[str, dict[str, Any]]: + if state_path is None or not state_path.exists(): + return {} + try: + data = json.loads(state_path.read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError): + return {} + return data if isinstance(data, dict) else {} + + +def _save_scan_state(state_path: Path | None, state: dict[str, dict[str, Any]]) -> None: + if state_path is None: + return + try: + state_path.parent.mkdir(parents=True, exist_ok=True) + state_path.write_text(json.dumps(state), encoding="utf-8") + except OSError: + logger.debug("reasoning scan-state write failed: %s", state_path, exc_info=True) + + +@dataclass +class ReasoningIngestResult: + """Outcome of a reasoning-trace ingest pass.""" + + traces_ingested: int = 0 + traces_scanned: int = 0 + + +def scan_transcripts( + config: ReasoningTrainingConfig, + *, + state_path: Path | None = None, + claude_dir: Path | None = None, + now: datetime | None = None, +) -> list[dict[str, Any]]: + """Scan ``~/.claude/projects/*/*.jsonl`` for mineable reasoning traces. + + Returns staging-ready dicts (trace_hash, model, session_id, project, + task_context, content, content_chars, created_at). Honors the config's + model globs, char limits, per-scan cap, lookback window and redaction flag, + and updates the incremental scan-state file. + + The per-scan cap is a soft target: a file is always scanned whole (so its + recorded state never hides un-returned traces), and scanning simply stops + after the running total reaches ``max_traces_per_scan``. + """ + claude_root = (claude_dir or (Path.home() / ".claude")).resolve() + projects_dir = claude_root / "projects" + if not projects_dir.is_dir(): + return [] + + now_ts = _now_ts(now) + cutoff_ts = ( + now_ts - config.scan_lookback_days * 86400 if config.scan_lookback_days > 0 else None + ) + fallback_created = (now or utcnow()).isoformat() + + state = _load_scan_state(state_path) + traces: list[dict[str, Any]] = [] + seen_hashes: set[str] = set() + + for jsonl in sorted(projects_dir.glob("*/*.jsonl")): + resolved = jsonl.resolve() + # Path-escape guard: never read outside ~/.claude (symlink / traversal). + if not resolved.is_relative_to(claude_root): + continue + try: + st = resolved.stat() + except OSError: + continue + # Lookback window: skip transcripts untouched within scan_lookback_days. + if cutoff_ts is not None and st.st_mtime < cutoff_ts: + continue + key = str(resolved) + prev = state.get(key, {}) + # Incremental: skip files whose size+mtime are unchanged since last scan. + if prev.get("size") == st.st_size and prev.get("mtime") == st.st_mtime: + continue + # Resume after the last processed line on append-only growth; otherwise + # (shrunk / rewritten / edited-in-place) rescan from the top — trace_hash + # dedup keeps any re-emitted traces harmless at insert time. + start_line = int(prev.get("last_line", 0)) if st.st_size > int(prev.get("size", 0)) else 0 + + file_traces, line_count = _scan_file( + resolved, config, seen_hashes, fallback_created, start_line=start_line + ) + traces.extend(file_traces) + state[key] = {"mtime": st.st_mtime, "size": st.st_size, "last_line": line_count} + if len(traces) >= config.max_traces_per_scan: + break + + _save_scan_state(state_path, state) + return traces + + +def _scan_file( + resolved: Path, + config: ReasoningTrainingConfig, + seen_hashes: set[str], + fallback_created: str, + *, + start_line: int = 0, +) -> tuple[list[dict[str, Any]], int]: + """Scan a single transcript file. Returns (traces, line_count). + + ``start_line`` resumes after an already-processed prefix (append-only + growth), so a resumed scan does not re-emit traces from earlier passes. + """ + project = _project_from_path(resolved) + out: list[dict[str, Any]] = [] + prev_user_text = "" + line_count = start_line + try: + with resolved.open(encoding="utf-8", errors="replace") as f: + for idx, raw in enumerate(f, start=1): + line_count = idx + if idx <= start_line: + continue + if len(raw) > _MAX_LINE_CHARS: + continue + raw = raw.strip() + if not raw: + continue + try: + entry = json.loads(raw) + except json.JSONDecodeError: + continue + if not isinstance(entry, dict): + continue + etype = entry.get("type") + if etype == "user": + # Redact the user prompt before it becomes task_context — it + # can contain pasted secrets just like thinking content. + prev_user_text = _redact(_extract_user_text(entry)[:_TASK_CONTEXT_MAX], config) + continue + if etype != "assistant": + continue + out.extend( + _traces_from_assistant( + entry, config, seen_hashes, project, prev_user_text, fallback_created + ) + ) + except OSError: + logger.debug("reasoning transcript read failed: %s", resolved, exc_info=True) + return out, line_count + + +def _traces_from_assistant( + entry: dict[str, Any], + config: ReasoningTrainingConfig, + seen_hashes: set[str], + project: str, + task_context: str, + fallback_created: str, +) -> list[dict[str, Any]]: + message = entry.get("message") + if not isinstance(message, dict): + return [] + model = normalize_model(str(message.get("model") or "")) + if not model or model == _SYNTHETIC_MODEL or _is_denylisted(model): + return [] + if not _model_matches(model, config.mining_models): + return [] + content = message.get("content") + if not isinstance(content, list): + return [] + session_id = str(entry.get("sessionId") or "") + uuid_ = str(entry.get("uuid") or "") + created_at = str(entry.get("timestamp") or fallback_created) + out: list[dict[str, Any]] = [] + for block_index, block in enumerate(content): + trace = _build_trace( + block, + block_index, + config, + model=model, + session_id=session_id, + uuid_=uuid_, + project=project, + task_context=task_context, + created_at=created_at, + seen_hashes=seen_hashes, + ) + if trace is not None: + out.append(trace) + return out + + +def _build_trace( + block: Any, + block_index: int, + config: ReasoningTrainingConfig, + *, + model: str, + session_id: str, + uuid_: str, + project: str, + task_context: str, + created_at: str, + seen_hashes: set[str], +) -> dict[str, Any] | None: + if not isinstance(block, dict) or block.get("type") != "thinking": + return None + thinking = block.get("thinking") + if not isinstance(thinking, str) or not thinking.strip(): + return None + if len(thinking) < config.min_trace_chars: + return None + trace_hash = hashlib.sha256(f"{session_id}:{uuid_}:{block_index}".encode()).hexdigest() + if trace_hash in seen_hashes: + return None + seen_hashes.add(trace_hash) + text = _redact(thinking[: config.max_trace_chars], config) + return { + "trace_hash": trace_hash, + "model": model, + "session_id": session_id, + "project": project, + "task_context": task_context, + "content": text, + "content_chars": len(text), + "created_at": created_at, + } + + +async def ingest_reasoning_traces( + storage: NeuralStorage, + brain_id: str, + config: UnifiedConfig, + *, + claude_dir: Path | None = None, + state_path: Path | None = None, + now: datetime | None = None, +) -> ReasoningIngestResult: + """Scan transcripts and insert new reasoning traces into staging. + + The scan-state file lives under ``config.data_dir`` unless overridden. + """ + resolved_state = state_path or (config.data_dir / "reasoning_scan_state.json") + traces = scan_transcripts( + config.reasoning_training, + state_path=resolved_state, + claude_dir=claude_dir, + now=now, + ) + if not traces: + return ReasoningIngestResult(traces_ingested=0, traces_scanned=0) + ingested = await storage.insert_reasoning_traces(brain_id, traces) + return ReasoningIngestResult(traces_ingested=ingested, traces_scanned=len(traces)) diff --git a/tests/unit/test_reasoning_miner.py b/tests/unit/test_reasoning_miner.py new file mode 100644 index 00000000..bd6451c4 --- /dev/null +++ b/tests/unit/test_reasoning_miner.py @@ -0,0 +1,379 @@ +"""Tests for engine/reasoning_miner.py — transcript scanning + ingest. + +Uses synthetic JSONL transcript fixtures under a temporary ``.claude`` dir (no +real thinking text). Covers dedup, model glob filter, truncation, ```` +and opus (empty/denylisted) skipping, min-length gating, secret redaction, +task_context capture, model normalization, incremental scan-state, and the +async ingest path against InMemoryStorage. +""" + +from __future__ import annotations + +import json +from datetime import UTC, datetime +from pathlib import Path + +from surreal_memory.engine.reasoning_miner import ( + ingest_reasoning_traces, + normalize_model, + scan_transcripts, +) +from surreal_memory.storage.memory_store import InMemoryStorage +from surreal_memory.unified_config import ReasoningTrainingConfig, UnifiedConfig + +_NOW = datetime(2026, 3, 1, 12, 0, 0, tzinfo=UTC) + + +def _cfg(**kw: object) -> ReasoningTrainingConfig: + base: dict[str, object] = { + "mining_enabled": True, + "min_trace_chars": 10, + "max_trace_chars": 10_000, + "scan_lookback_days": 0, + } + base.update(kw) + return ReasoningTrainingConfig(**base) # type: ignore[arg-type] + + +def _assistant( + thinking: str, + *, + model: str = "claude-fable-5", + session: str = "s1", + uuid: str = "u1", + timestamp: str = "2026-03-01T10:00:00Z", + extra_blocks: list | None = None, +) -> dict: + blocks: list = [{"type": "thinking", "thinking": thinking, "signature": "sig"}] + if extra_blocks: + blocks = extra_blocks + return { + "type": "assistant", + "sessionId": session, + "uuid": uuid, + "cwd": "/home/x/proj", + "timestamp": timestamp, + "message": {"model": model, "role": "assistant", "content": blocks}, + } + + +def _user(text: str, *, session: str = "s1", uuid: str = "u0") -> dict: + return { + "type": "user", + "sessionId": session, + "uuid": uuid, + "message": {"role": "user", "content": [{"type": "text", "text": text}]}, + } + + +def _write_transcript( + claude_dir: Path, entries: list[dict], *, slug: str = "proj-a", name: str = "t.jsonl" +) -> Path: + d = claude_dir / "projects" / slug + d.mkdir(parents=True, exist_ok=True) + p = d / name + p.write_text("\n".join(json.dumps(e) for e in entries) + "\n", encoding="utf-8") + return p + + +def _scan(claude_dir: Path, cfg: ReasoningTrainingConfig, state: Path) -> list[dict]: + return scan_transcripts(cfg, state_path=state, claude_dir=claude_dir, now=_NOW) + + +def test_normalize_model_strips_date_suffix() -> None: + assert normalize_model("claude-haiku-4-5-20251001") == "claude-haiku-4-5" + assert normalize_model("claude-fable-5") == "claude-fable-5" + assert normalize_model(" claude-sonnet-5 ") == "claude-sonnet-5" + + +def test_scan_extracts_thinking_with_task_context(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + _write_transcript( + claude, + [ + _user("please fix the failing test in module X"), + _assistant("restate the goal, decompose, then verify the edge cases carefully"), + ], + ) + traces = _scan(claude, _cfg(), tmp_path / "state.json") + assert len(traces) == 1 + tr = traces[0] + assert tr["model"] == "claude-fable-5" + assert "verify the edge cases" in tr["content"] + assert tr["task_context"] == "please fix the failing test in module X" + assert tr["session_id"] == "s1" + assert len(tr["trace_hash"]) == 64 + assert tr["created_at"] == "2026-03-01T10:00:00Z" + + +def test_dedup_identical_entries(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + entry = _assistant("a fairly long reasoning trace about verification", uuid="dup") + _write_transcript(claude, [entry, entry]) # same session:uuid:block_index + traces = _scan(claude, _cfg(), tmp_path / "state.json") + assert len(traces) == 1 + + +def test_incremental_state_skips_unchanged(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + state = tmp_path / "state.json" + _write_transcript(claude, [_assistant("a long enough reasoning trace here")]) + assert len(_scan(claude, _cfg(), state)) == 1 + # Second scan, file unchanged → skipped entirely. + assert _scan(claude, _cfg(), state) == [] + + +def test_incremental_state_rescans_changed(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + state = tmp_path / "state.json" + p = _write_transcript(claude, [_assistant("first reasoning trace long enough", uuid="a")]) + assert len(_scan(claude, _cfg(), state)) == 1 + # Append a new entry → file changes → rescan yields only the NEW trace (dedup). + with p.open("a", encoding="utf-8") as f: + f.write(json.dumps(_assistant("second reasoning trace long enough", uuid="b")) + "\n") + traces = _scan(claude, _cfg(), state) + assert len(traces) == 1 + assert "second reasoning" in traces[0]["content"] + + +def test_model_glob_filter(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + _write_transcript( + claude, + [ + _assistant("fable reasoning trace long enough", model="claude-fable-5", uuid="a"), + _assistant("sonnet reasoning trace long enough", model="claude-sonnet-5", uuid="b"), + ], + ) + traces = _scan(claude, _cfg(mining_models=("claude-fable-*",)), tmp_path / "state.json") + assert [t["model"] for t in traces] == ["claude-fable-5"] + + +def test_synthetic_and_opus_are_skipped(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + _write_transcript( + claude, + [ + _assistant("synthetic reasoning trace long enough", model="", uuid="a"), + _assistant("opus reasoning trace long enough", model="claude-opus-4-8", uuid="b"), + _assistant("fable reasoning trace long enough", model="claude-fable-5", uuid="c"), + ], + ) + traces = _scan(claude, _cfg(), tmp_path / "state.json") + assert [t["model"] for t in traces] == ["claude-fable-5"] + + +def test_empty_thinking_skipped(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + _write_transcript(claude, [_assistant(" ", uuid="a")]) # opus-style empty thinking + assert _scan(claude, _cfg(), tmp_path / "state.json") == [] + + +def test_min_trace_chars_gate(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + _write_transcript(claude, [_assistant("short", uuid="a")]) + assert _scan(claude, _cfg(min_trace_chars=50), tmp_path / "state.json") == [] + + +def test_truncation_to_max_chars(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + _write_transcript(claude, [_assistant("x" * 500, uuid="a")]) + traces = _scan(claude, _cfg(max_trace_chars=100), tmp_path / "state.json") + assert len(traces[0]["content"]) == 100 + assert traces[0]["content_chars"] == 100 + + +def test_secret_redaction_before_staging(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + secret = "password = hunter2supersecret" # noqa: S105 — synthetic test secret + thinking = f"first I reason about the config, then note that {secret}, then continue" + _write_transcript(claude, [_assistant(thinking, uuid="a")]) + + redacted = _scan(claude, _cfg(redact_secrets=True), tmp_path / "s1.json") + assert "hunter2supersecret" not in redacted[0]["content"] + assert "[REDACTED]" in redacted[0]["content"] + + kept = _scan(claude, _cfg(redact_secrets=False), tmp_path / "s2.json") + assert "hunter2supersecret" in kept[0]["content"] + + +def test_task_context_is_redacted(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + _write_transcript( + claude, + [ + _user("my config has password = topsecret123 in it, help"), + _assistant("reasoning about the config problem in detail here"), + ], + ) + traces = _scan(claude, _cfg(redact_secrets=True), tmp_path / "state.json") + assert "topsecret123" not in traces[0]["task_context"] + assert "[REDACTED]" in traces[0]["task_context"] + + +def test_content_redacts_bearer_jwt_and_vendor_keys(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + jwt = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.abc123def456ghi" + bearer_tok = "abcdefghijklmnop12345" + openai_key = "sk-proj-ABCDEFGHIJKLMNOP1234" + thinking = ( + f"I inspect the request; it sends Authorization: Bearer {bearer_tok} " + f"and a jwt {jwt} and an openai key {openai_key} to the API endpoint" + ) + _write_transcript(claude, [_assistant(thinking, uuid="a")]) + content = _scan(claude, _cfg(redact_secrets=True), tmp_path / "state.json")[0]["content"] + assert bearer_tok not in content + assert jwt not in content + assert openai_key not in content + assert "[REDACTED]" in content + + +def test_redaction_does_not_mangle_benign_hyphenated_prose(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + # "task-"/"disk-" contain the substring "sk-" but must NOT be redacted. + thinking = "the task-queue-processor-v2-implementation refactors the disk-cache-layer module" + _write_transcript(claude, [_assistant(thinking, uuid="a")]) + content = _scan(claude, _cfg(redact_secrets=True), tmp_path / "state.json")[0]["content"] + assert "[REDACTED]" not in content + assert "task-queue-processor-v2-implementation" in content + + +def test_model_normalization_applied(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + _write_transcript( + claude, + [_assistant("dated model reasoning trace", model="claude-haiku-4-5-20251001", uuid="a")], + ) + traces = _scan(claude, _cfg(), tmp_path / "state.json") + assert traces[0]["model"] == "claude-haiku-4-5" + + +def test_files_outside_projects_glob_ignored(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + (claude / "projects").mkdir(parents=True, exist_ok=True) + # A jsonl directly under .claude (not projects/*/) must not be scanned. + (claude / "stray.jsonl").write_text( + json.dumps(_assistant("stray reasoning trace long enough", uuid="a")) + "\n", + encoding="utf-8", + ) + assert _scan(claude, _cfg(), tmp_path / "state.json") == [] + + +def test_max_traces_per_scan_soft_cap(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + entries = [ + _assistant(f"reasoning trace number {i} long enough", uuid=f"u{i}") for i in range(5) + ] + _write_transcript(claude, entries) + traces = _scan(claude, _cfg(max_traces_per_scan=3), tmp_path / "state.json") + # Whole file is scanned (no mid-file loss); cap only stops scanning MORE files. + assert len(traces) == 5 + + +async def test_ingest_reasoning_traces_into_storage(tmp_path: Path) -> None: + claude = tmp_path / ".claude" + _write_transcript( + claude, + [ + _user("do the thing"), + _assistant("reasoning trace one long enough", model="claude-fable-5", uuid="a"), + _assistant("reasoning trace two long enough", model="claude-sonnet-5", uuid="b"), + ], + ) + storage = InMemoryStorage() + storage.set_brain("b1") + cfg = UnifiedConfig( + data_dir=tmp_path / ".surrealmemory", + current_brain="default", + reasoning_training=_cfg(), + ) + result = await ingest_reasoning_traces( + storage, "b1", cfg, claude_dir=claude, state_path=tmp_path / "state.json", now=_NOW + ) + assert result.traces_ingested == 2 + assert result.traces_scanned == 2 + stats = await storage.get_reasoning_stats("b1") + assert stats["total"] == 2 + assert set(stats["by_model"]) == {"claude-fable-5", "claude-sonnet-5"} + + +def _fake_unified_config(tmp_path: Path, *, mining_enabled: bool) -> UnifiedConfig: + return UnifiedConfig( + data_dir=tmp_path / ".surrealmemory", + current_brain="default", + reasoning_training=_cfg(mining_enabled=mining_enabled), + ) + + +async def test_consolidation_skips_when_mining_disabled(tmp_path, monkeypatch) -> None: + from surreal_memory.engine.consolidation import ConsolidationEngine, ConsolidationStrategy + + fake = _fake_unified_config(tmp_path, mining_enabled=False) + monkeypatch.setattr(UnifiedConfig, "load", staticmethod(lambda config_path=None: fake)) + calls = {"n": 0} + + async def _spy_ingest(*a, **k): # pragma: no cover - must NOT be reached + calls["n"] += 1 + from surreal_memory.engine.reasoning_miner import ReasoningIngestResult + + return ReasoningIngestResult(traces_ingested=9) + + monkeypatch.setattr( + "surreal_memory.engine.reasoning_miner.ingest_reasoning_traces", _spy_ingest + ) + + storage = InMemoryStorage() + storage.set_brain("b1") + report = await ConsolidationEngine(storage).run( + [ConsolidationStrategy.PROCESS_REASONING_TRACES] + ) + assert report.reasoning_traces_ingested == 0 + assert calls["n"] == 0 # guard short-circuits before invoking the miner + + +async def test_consolidation_ingests_when_enabled(tmp_path, monkeypatch) -> None: + from surreal_memory.engine.consolidation import ConsolidationEngine, ConsolidationStrategy + from surreal_memory.engine.reasoning_miner import ReasoningIngestResult + + fake = _fake_unified_config(tmp_path, mining_enabled=True) + monkeypatch.setattr(UnifiedConfig, "load", staticmethod(lambda config_path=None: fake)) + + async def _fake_ingest(storage, brain_id, config, **k): + return ReasoningIngestResult(traces_ingested=3, traces_scanned=3) + + monkeypatch.setattr( + "surreal_memory.engine.reasoning_miner.ingest_reasoning_traces", _fake_ingest + ) + + storage = InMemoryStorage() + storage.set_brain("b1") + report = await ConsolidationEngine(storage).run( + [ConsolidationStrategy.PROCESS_REASONING_TRACES] + ) + assert report.reasoning_traces_ingested == 3 + + +async def test_consolidation_dry_run_skips_ingest(tmp_path, monkeypatch) -> None: + from surreal_memory.engine.consolidation import ConsolidationEngine, ConsolidationStrategy + + fake = _fake_unified_config(tmp_path, mining_enabled=True) + monkeypatch.setattr(UnifiedConfig, "load", staticmethod(lambda config_path=None: fake)) + calls = {"n": 0} + + async def _spy_ingest(*a, **k): # pragma: no cover - must NOT be reached + calls["n"] += 1 + from surreal_memory.engine.reasoning_miner import ReasoningIngestResult + + return ReasoningIngestResult(traces_ingested=9) + + monkeypatch.setattr( + "surreal_memory.engine.reasoning_miner.ingest_reasoning_traces", _spy_ingest + ) + + storage = InMemoryStorage() + storage.set_brain("b1") + report = await ConsolidationEngine(storage).run( + [ConsolidationStrategy.PROCESS_REASONING_TRACES], dry_run=True + ) + assert report.reasoning_traces_ingested == 0 + assert calls["n"] == 0 From b261cea5c51312446aa6a955b6adcce11b26231e Mon Sep 17 00:00:00 2001 From: Toni Nowak Date: Fri, 17 Jul 2026 11:24:24 +0200 Subject: [PATCH 04/12] feat: reasoning_distiller + LEARN_REASONING consolidation (U4) Distill staged reasoning_traces into ReasoningBank pattern fibers (run 007 Faza 4), driven by consolidation's SUMMARIZE tier. - engine/reasoning_distiller.py: segment thinking into ~12 closed-vocabulary reasoning moves; classify category (bge-m3 seed-centroid cosine, keyword fallback, "other" excluded from coverage); cluster within (model, category) by cosine>=0.83 (embeddings) or move-set Jaccard>=0.6 (fallback) via UnionFind; build a ReasoningBank pattern (title/description=medoid/strategy=LCS moves) and materialize a fiber(_reasoning_pattern) + CONCEPT neuron + EFFECTIVE_FOR synapse, idempotent by a trace-set _reasoning_signature; reasoning_coverage(). - fully fail-soft: provider down -> keyword classification + move-set clustering. - consolidation: LEARN_REASONING strategy (SUMMARIZE tier, guarded by mining_enabled + dry_run, excluded from scheduled defaults) + handler wrapped in try/except + ConsolidationReport.reasoning_patterns_learned (+summary lines). - tests: 16 cases incl. cap-conservation, signature-collision, fail-soft embedder-raises; live-verified materialization on SurrealDB v3.2.0. --- src/surreal_memory/engine/consolidation.py | 62 +- .../engine/reasoning_distiller.py | 620 ++++++++++++++++++ tests/unit/test_reasoning_distiller.py | 325 +++++++++ 3 files changed, 1006 insertions(+), 1 deletion(-) create mode 100644 src/surreal_memory/engine/reasoning_distiller.py create mode 100644 tests/unit/test_reasoning_distiller.py diff --git a/src/surreal_memory/engine/consolidation.py b/src/surreal_memory/engine/consolidation.py index 59fae119..c2cfcaea 100755 --- a/src/surreal_memory/engine/consolidation.py +++ b/src/surreal_memory/engine/consolidation.py @@ -49,6 +49,7 @@ class ConsolidationStrategy(StrEnum): LIFECYCLE = "lifecycle" PROCESS_TOOL_EVENTS = "process_tool_events" PROCESS_REASONING_TRACES = "process_reasoning_traces" + LEARN_REASONING = "learn_reasoning" ESSENCE_BACKFILL = "essence_backfill" DETECT_DRIFT = "detect_drift" REPLAY = "replay" # Hippocampal replay: LTP/LTD on recent fibers @@ -115,6 +116,7 @@ class ConsolidationReport: neurons_reactivated: int = 0 essences_generated: int = 0 reasoning_traces_ingested: int = 0 + reasoning_patterns_learned: int = 0 merge_details: list[MergeDetail] = field(default_factory=list) dry_run: bool = False extra: dict[str, Any] = field(default_factory=dict) @@ -141,6 +143,8 @@ def summary(self) -> str: f" Memories promoted: {self.memories_promoted}", f" Fibers compressed: {self.fibers_compressed}", f" Tokens saved: {self.tokens_saved}", + f" Reasoning traces ingested: {self.reasoning_traces_ingested}", + f" Reasoning patterns learned: {self.reasoning_patterns_learned}", f" Duration: {self.duration_ms:.1f}ms", ] if self.merge_details: @@ -232,6 +236,7 @@ class ConsolidationEngine: ConsolidationStrategy.INFER, ConsolidationStrategy.SCHEMA, ConsolidationStrategy.ESSENCE_BACKFILL, + ConsolidationStrategy.LEARN_REASONING, } ), frozenset( @@ -292,6 +297,7 @@ async def _run_strategy( ConsolidationStrategy.PROCESS_REASONING_TRACES: lambda: self._process_reasoning_traces( report, dry_run ), + ConsolidationStrategy.LEARN_REASONING: lambda: self._learn_reasoning(report, dry_run), ConsolidationStrategy.DETECT_DRIFT: lambda: self._detect_drift(report, dry_run), ConsolidationStrategy.ESSENCE_BACKFILL: lambda: self._essence_backfill(report, dry_run), ConsolidationStrategy.REPLAY: lambda: self._replay(report, dry_run), @@ -1915,7 +1921,11 @@ async def _process_reasoning_traces( from surreal_memory.engine.reasoning_miner import ingest_reasoning_traces - result = await ingest_reasoning_traces(self._storage, brain_id, config) + try: + result = await ingest_reasoning_traces(self._storage, brain_id, config) + except Exception: + _logger.debug("PROCESS_REASONING_TRACES: ingest failed (non-critical)", exc_info=True) + return report.reasoning_traces_ingested = result.traces_ingested if result.traces_ingested > 0: _logger.debug( @@ -1923,6 +1933,56 @@ async def _process_reasoning_traces( result.traces_ingested, ) + async def _learn_reasoning( + self, + report: ConsolidationReport, + dry_run: bool, + ) -> None: + """Distill staged reasoning traces into ReasoningBank pattern fibers. + + Runs in the SUMMARIZE tier (after PROCESS_REASONING_TRACES ingest). Only + runs when reasoning_training.mining_enabled is set; excluded from + scheduled defaults (like PROCESS_REASONING_TRACES / LEARN_HABITS). + """ + import logging as _logging + + from surreal_memory.unified_config import UnifiedConfig + + _logger = _logging.getLogger(__name__) + + brain_id = self._storage.current_brain_id + if not brain_id: + _logger.debug("LEARN_REASONING skipped: no brain context") + return + + try: + config = UnifiedConfig.load() + except Exception: + _logger.debug("LEARN_REASONING skipped: config load failed", exc_info=True) + return + + if not config.reasoning_training.mining_enabled: + return + + if dry_run: + _logger.debug("LEARN_REASONING skipped: dry_run mode") + return + + from surreal_memory.engine.reasoning_distiller import distill_reasoning_patterns + + try: + result = await distill_reasoning_patterns(self._storage, brain_id, config) + except Exception: + _logger.debug("LEARN_REASONING: distillation failed (non-critical)", exc_info=True) + return + report.reasoning_patterns_learned = result.patterns_learned + if result.patterns_learned > 0: + _logger.debug( + "LEARN_REASONING: learned %d reasoning patterns from %d traces", + result.patterns_learned, + result.traces_processed, + ) + async def _detect_drift(self, report: ConsolidationReport, dry_run: bool) -> None: """Run semantic drift detection to find tag synonyms/aliases.""" _logger = logging.getLogger(__name__) diff --git a/src/surreal_memory/engine/reasoning_distiller.py b/src/surreal_memory/engine/reasoning_distiller.py new file mode 100644 index 00000000..7323cc48 --- /dev/null +++ b/src/surreal_memory/engine/reasoning_distiller.py @@ -0,0 +1,620 @@ +"""Reasoning distiller: staged reasoning_traces -> ReasoningBank patterns. + +Heuristic (no-LLM) distillation, run inside consolidation (strategy +``LEARN_REASONING``, SUMMARIZE tier, after ``PROCESS_REASONING_TRACES`` ingest): + + batch unprocessed traces per model + -> segment each thinking into ~12 closed-vocabulary reasoning "moves" + -> classify a category (bge-m3 embedding vs seed centroids; keyword fallback) + -> cluster within (model, category) by cosine (embeddings) or move-set Jaccard + -> for each cluster >= min_cluster_support: build a ReasoningBank pattern + (title / description / strategy / confidence / frequency) and materialize + it as a fiber (_reasoning_pattern) + CONCEPT neuron + EFFECTIVE_FOR synapse + -> mark traces processed; prune + cap the staging table. + +Fully fail-soft: with the embedding provider DOWN, classification falls back to +keywords and clustering to move-set Jaccard, so distillation still produces +patterns (never raises on a missing provider). +""" + +from __future__ import annotations + +import hashlib +import logging +import math +import os +import re +from collections import Counter +from dataclasses import dataclass +from typing import TYPE_CHECKING, Any + +from surreal_memory.core.fiber import Fiber +from surreal_memory.core.neuron import Neuron, NeuronType +from surreal_memory.core.synapse import Direction, Synapse, SynapseType +from surreal_memory.engine.clustering import UnionFind + +if TYPE_CHECKING: + from surreal_memory.engine.embedding.provider import EmbeddingProvider + from surreal_memory.storage.base import NeuralStorage + from surreal_memory.unified_config import ReasoningTrainingConfig, UnifiedConfig + +logger = logging.getLogger(__name__) + +_CLUSTER_COSINE = 0.83 +_CATEGORY_COS_THRESHOLD = 0.35 +_MOVE_JACCARD = 0.6 +_CLASSIFY_CHARS = 500 +_BATCH_PER_MODEL = 200 + +# ── Reasoning moves (closed vocabulary; regex discourse markers) ────────────── +_REASONING_MOVES: dict[str, re.Pattern[str]] = { + "restate-goal": re.compile( + r"(?i)\b(the goal is|the task is|i need to|we need to|objective is)\b" + ), + "decompose": re.compile( + r"(?i)\b(break (this|it) down|decompose|sub-?problem|break into|the steps are)\b" + ), + "hypothesize": re.compile( + r"(?i)\b(hypothes\w*|i suspect|maybe|might be|could be|perhaps|likely because)\b" + ), + "gather-evidence": re.compile( + r"(?i)\b(let me (check|look|read|grep)|looking at|the evidence|i see that|the code shows|confirmed that)\b" + ), + "verify": re.compile(r"(?i)\b(verify|confirm|double-?check|make sure|ensure that|validate)\b"), + "test-first": re.compile( + r"(?i)\b(write a test|test first|failing test|red test|tdd|add a test)\b" + ), + "check-edge-cases": re.compile( + r"(?i)\b(edge case|corner case|what if|boundary|off by one|empty (list|input)|null case|none case)\b" + ), + "backtrack": re.compile( + r"(?i)\b(actually|wait|let me reconsider|scratch that|on second thought|rethink|hold on)\b" + ), + "compare-alternatives": re.compile( + r"(?i)\b(option [a-z0-9]|alternative|versus|vs\.?|instead of|trade-?off|on the other hand|compared to)\b" + ), + "plan-steps": re.compile( + r"(?i)\b(my plan|the approach|step \d|next,? i|i'?ll (start|do|then)|let me first)\b" + ), + "self-correct": re.compile( + r"(?i)\b(i was wrong|correction|that'?s incorrect|my mistake|got it wrong|oops)\b" + ), + "summarize-decision": re.compile( + r"(?i)\b(in summary|to summarize|conclusion|so i'?ll|decided to|the decision|therefore)\b" + ), +} + +# ── Category classification: seed descriptions (embeddings) + keyword fallback ─ +_CATEGORY_SEEDS: dict[str, str] = { + "debugging": "debugging errors, root cause analysis, stack traces, fixing bugs and failures", + "planning": "planning steps, breaking down a task, deciding the approach and order of actions", + "implementation": "implementing code, writing functions, adding a feature, coding the solution", + "refactoring": "refactoring, cleaning up and restructuring code, improving readability, no behavior change", + "research": "researching, reading documentation, exploring the codebase, understanding how something works", + "verification": "verifying and testing, confirming correctness, checking outputs and edge cases", + "architecture": "architecture and system design, module boundaries, data flow, design decisions", + "data-analysis": "analyzing data, computing statistics, aggregating metrics, interpreting results", +} +_CATEGORY_KEYWORDS: dict[str, tuple[str, ...]] = { + "debugging": ( + "bug", + "error", + "exception", + "stack trace", + "root cause", + "traceback", + "crash", + "failing", + "debug", + ), + "refactoring": ( + "refactor", + "clean up", + "rename", + "restructure", + "simplify", + "extract", + "dead code", + "tidy up", + ), + "verification": ( + "verify", + "test", + "confirm", + "validate", + "assert", + "make sure", + "edge case", + "double-check", + ), + "architecture": ( + "architecture", + "design", + "module", + "boundary", + "data flow", + "interface", + "layer", + "component", + ), + "data-analysis": ( + "analyze", + "statistics", + "metric", + "aggregate", + "distribution", + "compute", + "measure", + ), + "research": ( + "read", + "documentation", + "docs", + "explore", + "investigate", + "grep", + "find out", + "look up", + ), + "planning": ("plan", "approach", "steps", "strategy", "break down", "sequence", "outline"), + "implementation": ( + "implement", + "write the", + "add a", + "function", + "build", + "create the", + "feature", + "method", + ), +} +# Keyword-fallback precedence (specific -> generic). +_CATEGORY_ORDER: tuple[str, ...] = ( + "debugging", + "refactoring", + "verification", + "architecture", + "data-analysis", + "research", + "planning", + "implementation", +) + +_OTHER = "other" + + +def _has_keyword(content_lower: str, keyword: str) -> bool: + """Whole-word (single token) / substring (phrase) keyword match.""" + if " " in keyword or "-" in keyword: + return keyword in content_lower + return re.search(rf"\b{re.escape(keyword)}\b", content_lower) is not None + + +def _cosine(a: list[float], b: list[float]) -> float: + dot = sum(x * y for x, y in zip(a, b, strict=False)) + norm_a = math.sqrt(sum(x * x for x in a)) + norm_b = math.sqrt(sum(x * x for x in b)) + if norm_a == 0.0 or norm_b == 0.0: + return 0.0 + return dot / (norm_a * norm_b) + + +def segment_moves(text: str) -> list[str]: + """Return the reasoning moves present in *text*, in closed-vocabulary order.""" + if not text: + return [] + return [move for move, pattern in _REASONING_MOVES.items() if pattern.search(text)] + + +def _classify_by_vector(vec: list[float], seeds: dict[str, list[float]]) -> str: + best_cat, best_sim = _OTHER, _CATEGORY_COS_THRESHOLD + for cat, cvec in seeds.items(): + sim = _cosine(vec, cvec) + if sim >= best_sim: + best_sim, best_cat = sim, cat + return best_cat + + +def _classify_by_keywords(text: str, categories: tuple[str, ...]) -> str: + low = text.lower() + for cat in _CATEGORY_ORDER: + if cat not in categories: + continue + if any(_has_keyword(low, kw) for kw in _CATEGORY_KEYWORDS.get(cat, ())): + return cat + return _OTHER + + +def _lcs_two(a: list[str], b: list[str]) -> list[str]: + m, n = len(a), len(b) + dp = [[0] * (n + 1) for _ in range(m + 1)] + for i in range(m - 1, -1, -1): + for j in range(n - 1, -1, -1): + dp[i][j] = dp[i + 1][j + 1] + 1 if a[i] == b[j] else max(dp[i + 1][j], dp[i][j + 1]) + out: list[str] = [] + i = j = 0 + while i < m and j < n: + if a[i] == b[j]: + out.append(a[i]) + i += 1 + j += 1 + elif dp[i + 1][j] >= dp[i][j + 1]: + i += 1 + else: + j += 1 + return out + + +def _lcs_all(seqs: list[list[str]]) -> list[str]: + seqs = [s for s in seqs if s] + if not seqs: + return [] + acc = seqs[0] + for s in seqs[1:]: + acc = _lcs_two(acc, s) + if not acc: + break + return acc + + +def _medoid_index(vectors: list[list[float]]) -> int: + best_i, best_score = 0, -2.0 + for i in range(len(vectors)): + score = sum(_cosine(vectors[i], vectors[j]) for j in range(len(vectors)) if j != i) + if score > best_score: + best_score, best_i = score, i + return best_i + + +def _cluster( + vectors: list[list[float]] | None, + moves: list[list[str]], +) -> list[list[int]]: + """Cluster items by cosine (vectors) or move-set Jaccard (fallback).""" + n = len(moves) + uf = UnionFind(n) + for i in range(n): + for j in range(i + 1, n): + if vectors is not None: + if _cosine(vectors[i], vectors[j]) >= _CLUSTER_COSINE: + uf.union(i, j) + else: + a, b = set(moves[i]), set(moves[j]) + union = a | b + if union and len(a & b) / len(union) >= _MOVE_JACCARD: + uf.union(i, j) + return list(uf.groups().values()) + + +def _build_pattern( + cluster_traces: list[dict[str, Any]], + cluster_vectors: list[list[float]] | None, + cluster_moves: list[list[str]], + model: str, + category: str, + traces_in_category: int, +) -> dict[str, Any]: + size = len(cluster_traces) + if cluster_vectors: + mi = _medoid_index(cluster_vectors) + else: + mi = max(range(size), key=lambda i: len(str(cluster_traces[i].get("content", "")))) + medoid_content = str(cluster_traces[mi].get("content", "")) + + move_counts = Counter(m for moves in cluster_moves for m in moves) + top_moves = [m for m, _ in move_counts.most_common(3)] + title = f"{category}: " + ", ".join(top_moves) if top_moves else category + + lcs = _lcs_all(cluster_moves) + strategy_moves = " -> ".join(lcs) if lcs else " -> ".join(top_moves) + strategy = f"Moves: {strategy_moves}\n{medoid_content[:400]}"[:600] + + confidence = min(1.0, size / traces_in_category) if traces_in_category else 0.0 + # Signature keys on the cluster's exact trace set (not the display title) so + # two distinct clusters that share the same top-moves title never collide. + trace_key = ",".join(sorted(str(t.get("trace_hash", "")) for t in cluster_traces)) + signature = hashlib.sha256(f"{model}:{category}:{trace_key}".encode()).hexdigest() + return { + "model": model, + "category": category, + "title": title, + "description": medoid_content[:200], + "strategy": strategy, + "confidence": round(confidence, 4), + "frequency": size, + "signature": signature, + } + + +async def _find_or_create_concept( + storage: NeuralStorage, content: str, metadata: dict[str, Any] | None = None +) -> str: + existing = await storage.find_neurons(content_exact=content, limit=1) + if existing: + return existing[0].id + neuron = Neuron.create(type=NeuronType.CONCEPT, content=content, metadata=metadata or {}) + await storage.add_neuron(neuron) + return neuron.id + + +async def _materialize_pattern( + storage: NeuralStorage, + pattern: dict[str, Any], + existing_sigs: set[str], +) -> bool: + """Create a fiber + CONCEPT neuron + EFFECTIVE_FOR synapse for *pattern*. + + Idempotent by ``_reasoning_signature``: returns False (no-op) if the pattern + was already materialized. + """ + sig = pattern["signature"] + if sig in existing_sigs: + return False + + category_nid = await _find_or_create_concept( + storage, f"reasoning_category:{pattern['category']}", {"_reasoning_category_concept": True} + ) + pattern_nid = await _find_or_create_concept( + storage, pattern["title"], {"_reasoning_pattern_concept": True} + ) + + existing_syn = await storage.get_synapses( + source_id=pattern_nid, target_id=category_nid, type=SynapseType.EFFECTIVE_FOR + ) + if existing_syn: + synapse_id = existing_syn[0].id + else: + synapse = Synapse.create( + source_id=pattern_nid, + target_id=category_nid, + type=SynapseType.EFFECTIVE_FOR, + weight=min(1.0, float(pattern["confidence"])), + direction=Direction.UNIDIRECTIONAL, + ) + await storage.add_synapse(synapse) + synapse_id = synapse.id + + fiber = Fiber.create( + neuron_ids={pattern_nid, category_nid}, + synapse_ids={synapse_id}, + anchor_neuron_id=pattern_nid, + pathway=[pattern_nid, category_nid], + summary=pattern["title"], + tags=set(), + metadata={ + "_reasoning_pattern": True, + "_source_model": pattern["model"], + "_reasoning_category": pattern["category"], + "_reasoning_title": pattern["title"], + "_reasoning_description": pattern["description"], + "_reasoning_strategy": pattern["strategy"], + "_reasoning_frequency": pattern["frequency"], + "_reasoning_confidence": pattern["confidence"], + "_reasoning_signature": sig, + }, + ) + await storage.add_fiber(fiber) + return True + + +def _get_embedder() -> EmbeddingProvider | None: + """Best-effort LOCAL embedding provider; None if unavailable (fail-soft). + + Mirrors the stop-hook pattern: only a local Ollama or a loopback + OpenAI-compatible endpoint (llamastash bge-m3) is used, so distillation stays + local + fast and never blocks on a remote/heavy provider. Any failure -> None + and the caller falls back to keyword classification + move-set clustering. + """ + try: + from surreal_memory.engine.semantic_discovery import _auto_detect_provider + + provider_name, model_name = _auto_detect_provider() + except Exception: + logger.debug("reasoning distiller: no embedding provider detected", exc_info=True) + return None + + try: + endpoint = os.environ.get("SURREAL_MEMORY_EMBEDDING_ENDPOINT", "") + is_local = any(host in endpoint for host in ("127.0.0.1", "localhost", "::1")) + if provider_name == "ollama": + from surreal_memory.engine.embedding.ollama_embedding import OllamaEmbedding + + return OllamaEmbedding(model=model_name) + if provider_name in ("openai", "openrouter") and is_local: + from surreal_memory.engine.embedding.openai_embedding import OpenAIEmbedding + + return OpenAIEmbedding(model=model_name) + except Exception: + logger.debug("reasoning distiller: embedding provider construction failed", exc_info=True) + return None + + +async def _seed_centroids( + embedder: EmbeddingProvider, categories: tuple[str, ...] +) -> dict[str, list[float]] | None: + try: + descriptions = [_CATEGORY_SEEDS.get(c, c) for c in categories] + vectors = await embedder.embed_batch(descriptions) + return {c: list(v) for c, v in zip(categories, vectors, strict=False)} + except Exception: + logger.debug("reasoning distiller: seed embedding failed", exc_info=True) + return None + + +async def _embed_texts( + embedder: EmbeddingProvider | None, texts: list[str] +) -> list[list[float]] | None: + if embedder is None or not texts: + return None + try: + return [list(v) for v in await embedder.embed_batch(texts)] + except Exception: + logger.debug("reasoning distiller: trace embedding failed", exc_info=True) + return None + + +@dataclass +class DistillResult: + """Outcome of a distillation pass.""" + + patterns_learned: int = 0 + traces_processed: int = 0 + models_seen: int = 0 + + +async def _process_model_batch( + storage: NeuralStorage, + brain_id: str, + rt: ReasoningTrainingConfig, + model: str, + traces: list[dict[str, Any]], + embedder: EmbeddingProvider | None, + seeds: dict[str, list[float]] | None, + existing_sigs: set[str], + budget: int, +) -> tuple[int, list[Any]]: + """Distill one model's trace batch. Returns (patterns_created, consumed_ids). + + ``consumed_ids`` are the traces safe to mark processed: ``other`` traces, + under-support categories, and every category fully clustered before the + ``budget`` (remaining max_patterns_per_run) ran out. A category left + unreached — or cut off mid-cluster — by the cap is NOT consumed, so the next + run revisits it (already-materialized patterns are skipped by signature). + """ + clf_texts = [ + f"{t.get('task_context', '')} {str(t.get('content', ''))[:_CLASSIFY_CHARS]}".strip() + for t in traces + ] + moves_list = [segment_moves(str(t.get("content", ""))) for t in traces] + vectors = await _embed_texts(embedder, clf_texts) + categories = [ + _classify_by_vector(vectors[i], seeds) + if (vectors is not None and seeds) + else _classify_by_keywords(clf_texts[i], rt.categories) + for i in range(len(traces)) + ] + await storage.set_trace_categories( + brain_id, {t["id"]: categories[i] for i, t in enumerate(traces)} + ) + + consumed: list[Any] = [traces[i]["id"] for i, c in enumerate(categories) if c == _OTHER] + by_category: dict[str, list[int]] = {} + for i, cat in enumerate(categories): + if cat != _OTHER: + by_category.setdefault(cat, []).append(i) + + created = 0 + for category, idxs in by_category.items(): + if created >= budget: + break # cap reached before this category → leave its traces unprocessed + if len(idxs) < rt.min_cluster_support: + consumed.extend(traces[i]["id"] for i in idxs) # too few to cluster; done + continue + sub_vectors = [vectors[i] for i in idxs] if vectors is not None else None + sub_moves = [moves_list[i] for i in idxs] + sub_traces = [traces[i] for i in idxs] + capped_mid_category = False + for local_cluster in _cluster(sub_vectors, sub_moves): + if len(local_cluster) < rt.min_cluster_support: + continue + if created >= budget: + capped_mid_category = True + break + cluster_traces = [sub_traces[k] for k in local_cluster] + cluster_vecs = [sub_vectors[k] for k in local_cluster] if sub_vectors else None + cluster_moves = [sub_moves[k] for k in local_cluster] + pattern = _build_pattern( + cluster_traces, cluster_vecs, cluster_moves, model, category, len(idxs) + ) + if await _materialize_pattern(storage, pattern, existing_sigs): + existing_sigs.add(pattern["signature"]) + created += 1 + if capped_mid_category: + break # do NOT consume this category's traces — revisit next run + consumed.extend(traces[i]["id"] for i in idxs) + return created, consumed + + +async def distill_reasoning_patterns( + storage: NeuralStorage, + brain_id: str, + config: UnifiedConfig, + *, + embedder: EmbeddingProvider | None = None, +) -> DistillResult: + """Distill unprocessed reasoning traces into ReasoningBank pattern fibers. + + ``storage`` must already be on ``brain_id`` (graph writes use the current + brain). Marks only the consumed traces processed, then prunes/caps staging. + """ + rt = config.reasoning_training + embedder = embedder or _get_embedder() + seeds = await _seed_centroids(embedder, rt.categories) if embedder is not None else None + + existing = await storage.find_fibers(metadata_key="_reasoning_pattern", limit=5000) + existing_sigs = { + str(f.metadata.get("_reasoning_signature")) + for f in existing + if f.metadata.get("_reasoning_signature") + } + + patterns_created = 0 + processed_ids: list[Any] = [] + models = await storage.get_reasoning_trace_models(brain_id) + + for model in models: + budget = rt.max_patterns_per_run - patterns_created + if budget <= 0: + break + traces = await storage.get_unprocessed_reasoning_traces( + brain_id, limit=rt.max_traces_per_scan, model=model + ) + traces = traces[:_BATCH_PER_MODEL] # one bounded batch per model per run + if not traces: + continue + created, consumed = await _process_model_batch( + storage, brain_id, rt, model, traces, embedder, seeds, existing_sigs, budget + ) + patterns_created += created + processed_ids.extend(consumed) + + if processed_ids: + await storage.mark_reasoning_traces_processed(brain_id, processed_ids) + await storage.prune_reasoning_traces(brain_id, rt.retention_days) + await storage.cap_reasoning_traces(brain_id, rt.max_traces_total) + + return DistillResult( + patterns_learned=patterns_created, + traces_processed=len(processed_ids), + models_seen=len(models), + ) + + +async def reasoning_coverage( + storage: NeuralStorage, + model: str, + config: UnifiedConfig, +) -> dict[str, Any]: + """Per-category coverage for *model*. + + A category is covered iff it has >= ``min_patterns_per_category`` pattern + fibers with ``_source_model == model`` and confidence >= ``min_confidence``. + ``coverage_percent`` = covered / len(categories) * 100 (``other`` excluded — + it is never in ``categories``). ``storage`` must be on the target brain. + """ + rt = config.reasoning_training + fibers = await storage.find_fibers(metadata_key="_reasoning_pattern", limit=5000) + counts: dict[str, int] = dict.fromkeys(rt.categories, 0) + for f in fibers: + md = f.metadata + if md.get("_source_model") != model: + continue + if float(md.get("_reasoning_confidence", 0.0)) < rt.min_confidence: + continue + cat = md.get("_reasoning_category") + if cat in counts: + counts[cat] += 1 + covered = {c: counts[c] >= rt.min_patterns_per_category for c in rt.categories} + n_covered = sum(1 for v in covered.values() if v) + percent = (n_covered / len(rt.categories) * 100.0) if rt.categories else 0.0 + return {"by_category": counts, "covered": covered, "coverage_percent": round(percent, 1)} diff --git a/tests/unit/test_reasoning_distiller.py b/tests/unit/test_reasoning_distiller.py new file mode 100644 index 00000000..13f0d651 --- /dev/null +++ b/tests/unit/test_reasoning_distiller.py @@ -0,0 +1,325 @@ +"""Tests for engine/reasoning_distiller.py — heuristic distillation. + +Runs against InMemoryStorage with the embedding provider forced OFF (the +`no_embedder` fixture), exercising the fail-soft keyword-classification + +move-set-Jaccard-clustering path (D5). Covers move segmentation, keyword +classification, clustering/pattern materialization, idempotency, mark-processed, +coverage math, and the LEARN_REASONING consolidation handler. +""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +from surreal_memory.engine.reasoning_distiller import ( + DistillResult, + _classify_by_keywords, + distill_reasoning_patterns, + reasoning_coverage, + segment_moves, +) +from surreal_memory.storage.memory_store import InMemoryStorage +from surreal_memory.unified_config import ReasoningTrainingConfig, UnifiedConfig + +BRAIN = "b1" + + +@pytest.fixture +def no_embedder(monkeypatch: pytest.MonkeyPatch) -> None: + """Force the fail-soft (no embedding provider) path — keyword + Jaccard.""" + monkeypatch.setattr("surreal_memory.engine.reasoning_distiller._get_embedder", lambda: None) + + +def _ucfg(tmp_path: Path, **rt_kw: object) -> UnifiedConfig: + base: dict[str, object] = { + "mining_enabled": True, + "min_cluster_support": 2, + "min_patterns_per_category": 1, + "min_confidence": 0.2, + "max_patterns_per_run": 10, + } + base.update(rt_kw) + return UnifiedConfig( + data_dir=tmp_path / ".surrealmemory", + current_brain="default", + reasoning_training=ReasoningTrainingConfig(**base), # type: ignore[arg-type] + ) + + +async def _seed(storage: InMemoryStorage, model: str, contents: list[str]) -> None: + traces = [ + { + "trace_hash": f"{model}-{i}", + "model": model, + "session_id": "s", + "project": "p", + "task_context": "", + "content": c, + "content_chars": len(c), + "created_at": "2026-03-01T00:00:00", + } + for i, c in enumerate(contents) + ] + await storage.insert_reasoning_traces(BRAIN, traces) + + +# 3 debugging traces sharing the move-set {restate-goal, gather-evidence, verify}. +_DEBUG_TRACES = [ + "I need to fix this. Let me check the error traceback. I verify the bug is gone.", + "I need to look at this. Let me check the exception. Verify the crash is fixed.", + "I need to resolve it. Let me check the failing traceback. I verify the error.", +] + + +def test_segment_moves_detects_closed_vocab() -> None: + moves = segment_moves("I need to fix it. Let me check the logs. Then I verify the result.") + assert "restate-goal" in moves + assert "gather-evidence" in moves + assert "verify" in moves + assert segment_moves("") == [] + + +def test_classify_by_keywords_and_other() -> None: + cats = ReasoningTrainingConfig().categories + assert _classify_by_keywords("hit an error with a traceback", cats) == "debugging" + assert _classify_by_keywords("let me refactor and clean up this module", cats) == "refactoring" + assert _classify_by_keywords("zzz qwerty plugh foobar nothing here", cats) == "other" + + +async def test_distill_creates_pattern_fiber(tmp_path: Path, no_embedder: None) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _seed(storage, "claude-fable-5", _DEBUG_TRACES) + + result = await distill_reasoning_patterns(storage, BRAIN, _ucfg(tmp_path)) + assert isinstance(result, DistillResult) + assert result.patterns_learned == 1 + assert result.traces_processed == 3 + + fibers = await storage.find_fibers(metadata_key="_reasoning_pattern", limit=100) + assert len(fibers) == 1 + md = fibers[0].metadata + assert md["_reasoning_pattern"] is True + assert md["_source_model"] == "claude-fable-5" + assert md["_reasoning_category"] == "debugging" + assert md["_reasoning_frequency"] == 3 + assert md["_reasoning_confidence"] == 1.0 + assert md["_reasoning_signature"] + # CONCEPT neuron for the category + EFFECTIVE_FOR synapse exist. + cat_neuron = await storage.find_neurons(content_exact="reasoning_category:debugging", limit=1) + assert cat_neuron + + +async def test_distill_is_idempotent(tmp_path: Path, no_embedder: None) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _seed(storage, "claude-fable-5", _DEBUG_TRACES) + first = await distill_reasoning_patterns(storage, BRAIN, _ucfg(tmp_path)) + assert first.patterns_learned == 1 + # Second pass: traces already processed → nothing new. + second = await distill_reasoning_patterns(storage, BRAIN, _ucfg(tmp_path)) + assert second.patterns_learned == 0 + assert second.traces_processed == 0 + fibers = await storage.find_fibers(metadata_key="_reasoning_pattern", limit=100) + assert len(fibers) == 1 + + +async def test_distill_marks_traces_processed(tmp_path: Path, no_embedder: None) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _seed(storage, "claude-fable-5", _DEBUG_TRACES) + await distill_reasoning_patterns(storage, BRAIN, _ucfg(tmp_path)) + remaining = await storage.get_unprocessed_reasoning_traces(BRAIN, model="claude-fable-5") + assert remaining == [] + + +async def test_below_min_cluster_support_no_pattern(tmp_path: Path, no_embedder: None) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _seed(storage, "claude-fable-5", _DEBUG_TRACES[:1]) # only 1 trace, support=2 + result = await distill_reasoning_patterns(storage, BRAIN, _ucfg(tmp_path)) + assert result.patterns_learned == 0 + # The trace is still marked processed (considered, just not clustered). + assert result.traces_processed == 1 + + +async def test_other_category_not_distilled(tmp_path: Path, no_embedder: None) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _seed(storage, "claude-fable-5", ["qwerty plugh foobar", "zzz nothing", "blah blah"]) + result = await distill_reasoning_patterns(storage, BRAIN, _ucfg(tmp_path)) + assert result.patterns_learned == 0 + + +async def test_reasoning_coverage_math(tmp_path: Path, no_embedder: None) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _seed(storage, "claude-fable-5", _DEBUG_TRACES) + cfg = _ucfg(tmp_path) + await distill_reasoning_patterns(storage, BRAIN, cfg) + + cov = await reasoning_coverage(storage, "claude-fable-5", cfg) + assert cov["by_category"]["debugging"] == 1 + assert cov["covered"]["debugging"] is True + assert cov["coverage_percent"] == round(1 / len(cfg.reasoning_training.categories) * 100, 1) + # A different model has no coverage. + cov_other = await reasoning_coverage(storage, "claude-sonnet-5", cfg) + assert cov_other["coverage_percent"] == 0.0 + + +async def test_coverage_respects_min_patterns_bar(tmp_path: Path, no_embedder: None) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _seed(storage, "claude-fable-5", _DEBUG_TRACES) + await distill_reasoning_patterns(storage, BRAIN, _ucfg(tmp_path)) + # Require 5 patterns/category — the single pattern is below the bar. + strict = _ucfg(tmp_path, min_patterns_per_category=5) + cov = await reasoning_coverage(storage, "claude-fable-5", strict) + assert cov["by_category"]["debugging"] == 1 # still counted + assert cov["covered"]["debugging"] is False # but below the coverage bar + assert cov["coverage_percent"] == 0.0 + + +class _FakeEmbedder: + """Deterministic one-hot-by-category embedder for the embedding code path.""" + + async def embed(self, text: str) -> list[float]: + return _fake_vec(text) + + async def embed_batch(self, texts: list[str]) -> list[list[float]]: + return [_fake_vec(t) for t in texts] + + +def _fake_vec(text: str) -> list[float]: + cats = ReasoningTrainingConfig().categories + cat = _classify_by_keywords(text, cats) + vec = [0.0] * (len(cats) + 1) + vec[cats.index(cat) if cat in cats else len(cats)] = 1.0 + return vec + + +async def test_distill_uses_embedding_path(tmp_path: Path) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _seed(storage, "claude-fable-5", _DEBUG_TRACES) + # Explicit embedder -> exercises _seed_centroids / _embed_texts / + # _classify_by_vector / cosine clustering / medoid (no live provider needed). + result = await distill_reasoning_patterns( + storage, BRAIN, _ucfg(tmp_path), embedder=_FakeEmbedder() + ) + assert result.patterns_learned == 1 + fibers = await storage.find_fibers(metadata_key="_reasoning_pattern", limit=100) + assert fibers[0].metadata["_reasoning_category"] == "debugging" + + +def test_backtrack_and_hypothesize_moves_match() -> None: + moves = segment_moves("Actually, I was wrong. My hypothesis is that the bug is here.") + assert "backtrack" in moves + assert "hypothesize" in moves + + +class _RaisingEmbedder: + async def embed(self, text: str) -> list[float]: + raise RuntimeError("provider down") + + async def embed_batch(self, texts: list[str]) -> list[list[float]]: + raise RuntimeError("provider down") + + +async def test_fail_soft_when_embedder_raises(tmp_path: Path) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _seed(storage, "claude-fable-5", _DEBUG_TRACES) + # An embedder that raises must not break distillation — it falls back to + # keyword classification + move-set clustering (D5). + result = await distill_reasoning_patterns( + storage, BRAIN, _ucfg(tmp_path), embedder=_RaisingEmbedder() + ) + assert result.patterns_learned == 1 + + +async def test_cap_marks_only_consumed_traces(tmp_path: Path, no_embedder: None) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + contents = ( + ["I need to fix the error bug. Let me check the traceback."] * 2 + + ["I need to refactor and clean up. Let me check the code."] * 2 + + ["I need to design the module architecture boundary. Let me check it."] * 2 + + ["I need to read the documentation docs. Let me check them."] * 2 + ) + await _seed(storage, "claude-fable-5", contents) + result = await distill_reasoning_patterns( + storage, BRAIN, _ucfg(tmp_path, max_patterns_per_run=2) + ) + assert result.patterns_learned == 2 + # Only the 2 fully-clustered categories are marked processed; the 2 categories + # the cap never reached keep their traces for the next run (no silent loss). + assert result.traces_processed == 4 + remaining = await storage.get_unprocessed_reasoning_traces( + BRAIN, model="claude-fable-5", limit=100 + ) + assert len(remaining) == 4 + + +async def test_distinct_clusters_same_top_moves_not_dropped( + tmp_path: Path, no_embedder: None +) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + a = "I need to fix the bug. Let me check the error. I verify it." + b = ( + "I need to fix the bug. Let me check the error. I verify. " + "What if the edge case? Actually, wait. Instead of option 1." + ) + await _seed(storage, "claude-fable-5", [a, a, b, b]) + result = await distill_reasoning_patterns(storage, BRAIN, _ucfg(tmp_path)) + # Two distinct clusters (Jaccard 0.5) sharing the same top-3-moves title must + # NOT collide on signature — both materialize. + assert result.patterns_learned == 2 + fibers = await storage.find_fibers(metadata_key="_reasoning_pattern", limit=100) + assert len(fibers) == 2 + assert len({f.metadata["_reasoning_signature"] for f in fibers}) == 2 + + +# ── Consolidation LEARN_REASONING handler ──────────────────────────────────── + + +async def test_consolidation_learn_reasoning_runs(tmp_path: Path, monkeypatch) -> None: + from surreal_memory.engine.consolidation import ConsolidationEngine, ConsolidationStrategy + + fake = _ucfg(tmp_path, mining_enabled=True) + monkeypatch.setattr(UnifiedConfig, "load", staticmethod(lambda config_path=None: fake)) + + async def _fake_distill(storage, brain_id, config, **k): + return DistillResult(patterns_learned=4, traces_processed=12) + + monkeypatch.setattr( + "surreal_memory.engine.reasoning_distiller.distill_reasoning_patterns", _fake_distill + ) + storage = InMemoryStorage() + storage.set_brain(BRAIN) + report = await ConsolidationEngine(storage).run([ConsolidationStrategy.LEARN_REASONING]) + assert report.reasoning_patterns_learned == 4 + + +async def test_consolidation_learn_reasoning_guard_disabled(tmp_path: Path, monkeypatch) -> None: + from surreal_memory.engine.consolidation import ConsolidationEngine, ConsolidationStrategy + + fake = _ucfg(tmp_path, mining_enabled=False) + monkeypatch.setattr(UnifiedConfig, "load", staticmethod(lambda config_path=None: fake)) + calls = {"n": 0} + + async def _spy(*a, **k): # pragma: no cover - must NOT run + calls["n"] += 1 + return DistillResult(patterns_learned=9) + + monkeypatch.setattr( + "surreal_memory.engine.reasoning_distiller.distill_reasoning_patterns", _spy + ) + storage = InMemoryStorage() + storage.set_brain(BRAIN) + report = await ConsolidationEngine(storage).run([ConsolidationStrategy.LEARN_REASONING]) + assert report.reasoning_patterns_learned == 0 + assert calls["n"] == 0 From 48229687a44a13ff5cf83788c8b7eb0275762f7d Mon Sep 17 00:00:00 2001 From: Toni Nowak Date: Fri, 17 Jul 2026 12:43:53 +0200 Subject: [PATCH 05/12] feat: reasoning_injection + session_start (U5) engine/reasoning_injection.py: resolve_active_model fallback chain (payload -> transcript tail -> env -> ~/.claude/settings.json -> default, alias-expanded, date-normalized) and build_injection_context (injection_map glob/default match, source-model pattern fibers ranked by confidence*frequency, <=2/category + injection_max_patterns + char budget, markdown block) plus session-scoped idempotency markers. hooks/session_start.py: append the reasoning block after the memories block, opt-in via reasoning_training.injection_enabled, exception-isolated per block. unified_config._get_surrealdb_storage: reuse the cached instance only when its _conn is live, else reinitialize (mirrors the SQLite cache) so the memories block closing shared storage no longer leaves the reasoning block a dead handle. Security: transcript_path (untrusted hook stdin) is allowlisted to ~/.claude via resolve()+is_relative_to; stat/read faults degrade to the fallback chain. Truncation of the bounded pattern-fiber fetch is warned, not silent. --- .../engine/reasoning_injection.py | 277 +++++++++++++++ src/surreal_memory/hooks/session_start.py | 80 +++-- src/surreal_memory/unified_config.py | 6 +- tests/unit/test_hook_session_start.py | 82 +++++ tests/unit/test_reasoning_injection.py | 316 ++++++++++++++++++ tests/unit/test_surrealdb_brain_lookup.py | 51 +++ 6 files changed, 788 insertions(+), 24 deletions(-) create mode 100644 src/surreal_memory/engine/reasoning_injection.py create mode 100644 tests/unit/test_reasoning_injection.py diff --git a/src/surreal_memory/engine/reasoning_injection.py b/src/surreal_memory/engine/reasoning_injection.py new file mode 100644 index 00000000..1b2845ab --- /dev/null +++ b/src/surreal_memory/engine/reasoning_injection.py @@ -0,0 +1,277 @@ +"""Reasoning-strategy injection: pick the target model, build the prompt block. + +Pure, testable logic used by the SessionStart hook (and, from run 007 Faza 5b, +the UserPromptSubmit hook): + +- ``resolve_active_model(hook_input)`` — SessionStart payloads carry no ``model`` + field, so resolve it via a fallback chain (payload → transcript tail → + env → ~/.claude/settings.json → "default"). +- ``build_injection_context(storage, model, config)`` — map the active model to a + source model via ``injection_map`` (glob, first-match, "default" fallback), + pull that source's ReasoningBank pattern fibers, and render a compact markdown + block ("## Reasoning strategies (learned from )"). +- session-scoped idempotency markers so SessionStart + UserPromptSubmit inject at + most once per session. +""" + +from __future__ import annotations + +import json +import logging +import os +import re +import time +from fnmatch import fnmatch +from pathlib import Path +from typing import TYPE_CHECKING, Any + +from surreal_memory.engine.reasoning_miner import normalize_model + +if TYPE_CHECKING: + from surreal_memory.storage.base import NeuralStorage + from surreal_memory.unified_config import UnifiedConfig + +logger = logging.getLogger(__name__) + +_SYNTHETIC_MODEL = "" +_MAX_PER_CATEGORY = 2 +_MARKER_MAX_AGE_S = 7 * 86400 # prune injection markers older than 7 days +_TRANSCRIPT_TAIL_LINES = 300 +# Ceiling for the pattern-fiber fetch. Patterns are idempotent by +# _reasoning_signature (reasoning_distiller._materialize_pattern), so the +# population is bounded by distinct patterns and stays well under this; matches +# the distiller's own fetch limit. If it is ever hit, we warn rather than let a +# source model's patterns silently fall outside the window (the post-LIMIT +# metadata-filter failure mode documented in storage.find_fibers). +_PATTERN_FETCH_LIMIT = 5000 + +# Claude Code short model aliases -> canonical ids used across the reasoning +# pipeline. Full ids pass through ``normalize_model`` unchanged. +_MODEL_ALIASES: dict[str, str] = { + "sonnet": "claude-sonnet-5", + "opus": "claude-opus-4-8", + "opusplan": "claude-opus-4-8", + "haiku": "claude-haiku-4-5", + "fable": "claude-fable-5", +} + + +# ── Model resolution ───────────────────────────────────────────────────────── + + +def _model_from_transcript_tail(transcript_path: str) -> str: + """Return the last assistant turn's model from a JSONL transcript tail. + + ``transcript_path`` comes from untrusted hook stdin, so only transcripts + under ~/.claude are read (mirrors the pre_compact / stop path-allowlist + guard). Any stat/read error degrades to "" so the fallback chain continues. + """ + if not transcript_path: + return "" + try: + resolved = Path(transcript_path).resolve() + if not resolved.is_relative_to((Path.home() / ".claude").resolve()): + return "" + if not resolved.is_file(): + return "" + with resolved.open(encoding="utf-8", errors="replace") as f: + lines = f.readlines() + except OSError: + return "" + for raw in reversed(lines[-_TRANSCRIPT_TAIL_LINES:]): + raw = raw.strip() + if not raw: + continue + try: + entry = json.loads(raw) + except json.JSONDecodeError: + continue + if not isinstance(entry, dict) or entry.get("type") != "assistant": + continue + message = entry.get("message") + if not isinstance(message, dict): + continue + model = str(message.get("model") or "") + if model and model != _SYNTHETIC_MODEL: + return normalize_model(model) + return "" + + +def _model_from_settings() -> str: + """Return the model from ~/.claude/settings.json (alias-expanded).""" + try: + path = Path.home() / ".claude" / "settings.json" + if not path.exists(): + return "" + data = json.loads(path.read_text(encoding="utf-8") or "{}") + except (OSError, json.JSONDecodeError): + return "" + model = data.get("model") if isinstance(data, dict) else None + if not isinstance(model, str) or not model.strip(): + return "" + model = model.strip() + return _MODEL_ALIASES.get(model.lower(), normalize_model(model)) + + +def resolve_active_model(hook_input: dict[str, Any]) -> str: + """Resolve the active model for injection via a fallback chain. + + Order: (1) ``hook_input["model"]`` (future-proof), (2) last assistant + ``message.model`` from the transcript tail, (3) env + ``SMEM_REASONING_TARGET_MODEL`` / ``ANTHROPIC_MODEL``, (4) ~/.claude/ + settings.json ``model`` (alias-expanded), (5) ``"default"``. Results are + date-suffix-normalized so they agree with mining/distillation model names. + """ + payload_model = hook_input.get("model") + if isinstance(payload_model, str) and payload_model.strip(): + return _MODEL_ALIASES.get(payload_model.strip().lower(), normalize_model(payload_model)) + + from_transcript = _model_from_transcript_tail(str(hook_input.get("transcript_path") or "")) + if from_transcript: + return from_transcript + + for env_var in ("SMEM_REASONING_TARGET_MODEL", "ANTHROPIC_MODEL"): + value = os.environ.get(env_var) + if value and value.strip(): + return _MODEL_ALIASES.get(value.strip().lower(), normalize_model(value)) + + from_settings = _model_from_settings() + if from_settings: + return from_settings + + return "default" + + +# ── Injection context ──────────────────────────────────────────────────────── + + +def _resolve_source_model(model: str, injection_map: tuple[tuple[str, str], ...]) -> str | None: + """Map the active model to a source model via injection_map (glob first-match, + then the literal ``default`` key).""" + for target, source in injection_map: + if target != "default" and fnmatch(model, target): + return source + for target, source in injection_map: + if target == "default": + return source + return None + + +async def build_injection_context( + storage: NeuralStorage, + model: str, + config: UnifiedConfig, +) -> str: + """Render the reasoning-strategies markdown block for *model*, or "". + + Empty when injection is disabled, no injection_map entry matches, or the + mapped source model has no pattern fibers. ``storage`` must be on the target + brain (find_fibers uses the current brain). + """ + rt = config.reasoning_training + if not rt.injection_enabled: + return "" + source = _resolve_source_model(model, rt.injection_map) + if not source: + return "" + + fibers = await storage.find_fibers( + metadata_key="_reasoning_pattern", limit=_PATTERN_FETCH_LIMIT + ) + if len(fibers) >= _PATTERN_FETCH_LIMIT: + # Truncation would silently drop a model's patterns; surface it instead. + logger.warning( + "reasoning pattern-fiber fetch hit the %d-row ceiling; some '%s' " + "patterns may be missing from injection", + _PATTERN_FETCH_LIMIT, + source, + ) + candidates = [f for f in fibers if f.metadata.get("_source_model") == source] + if not candidates: + return "" + + def _rank(f: Any) -> float: + md = f.metadata + return float(md.get("_reasoning_confidence", 0.0)) * float( + md.get("_reasoning_frequency", 0.0) + ) + + candidates.sort(key=_rank, reverse=True) + + per_category: dict[str, int] = {} + chosen: list[Any] = [] + for f in candidates: + category = str(f.metadata.get("_reasoning_category", "")) + if per_category.get(category, 0) >= _MAX_PER_CATEGORY: + continue + per_category[category] = per_category.get(category, 0) + 1 + chosen.append(f) + if len(chosen) >= rt.injection_max_patterns: + break + if not chosen: + return "" + + header = f"## Reasoning strategies (learned from {source})" + parts = [header, ""] + total = len(header) + 1 + for i, f in enumerate(chosen, start=1): + md = f.metadata + title = str(md.get("_reasoning_title", "")).strip() + body = str(md.get("_reasoning_strategy") or md.get("_reasoning_description", "")).strip() + body = " ".join(body.split()) # collapse whitespace/newlines to one line + entry = f"{i}. **{title}** — {body}" if body else f"{i}. **{title}**" + # Always include the first entry; later ones respect the char budget. + if i > 1 and total + len(entry) + 1 > rt.injection_max_chars: + break + parts.append(entry) + total += len(entry) + 1 + return "\n".join(parts) + + +# ── Session idempotency markers ────────────────────────────────────────────── + + +def _marker_dir() -> Path: + # Honor SURREAL_MEMORY_DIR (matches hooks/post_tool_use._get_data_dir) so + # markers sit alongside the rest of the data dir and tests can redirect them. + custom = os.environ.get("SURREAL_MEMORY_DIR", "") + base = Path(custom) if custom else (Path.home() / ".surrealmemory") + return base / "reasoning_injected" + + +def _safe_session(session_id: str) -> str: + return re.sub(r"[^A-Za-z0-9_-]", "_", session_id)[:128] + + +def already_injected(session_id: str) -> bool: + """True if this session was already injected (marker present).""" + if not session_id: + return False + return (_marker_dir() / _safe_session(session_id)).exists() + + +def mark_injected(session_id: str) -> None: + """Record that this session has been injected; prune stale markers.""" + if not session_id: + return + directory = _marker_dir() + try: + directory.mkdir(parents=True, exist_ok=True) + (directory / _safe_session(session_id)).write_text("", encoding="utf-8") + except OSError: + logger.debug("reasoning injection marker write failed", exc_info=True) + return + _cleanup_markers(directory) + + +def _cleanup_markers(directory: Path) -> None: + cutoff = time.time() - _MARKER_MAX_AGE_S + try: + for marker in directory.iterdir(): + try: + if marker.is_file() and marker.stat().st_mtime < cutoff: + marker.unlink(missing_ok=True) + except OSError: + continue + except OSError: + logger.debug("reasoning injection marker cleanup failed", exc_info=True) diff --git a/src/surreal_memory/hooks/session_start.py b/src/surreal_memory/hooks/session_start.py index ba34a57d..62a5807e 100644 --- a/src/surreal_memory/hooks/session_start.py +++ b/src/surreal_memory/hooks/session_start.py @@ -81,6 +81,42 @@ def read_hook_input() -> dict[str, Any]: return {} +async def get_reasoning_injection(hook_input: dict[str, Any]) -> str: + """Build the reasoning-strategies context block for this session (or ""). + + Opt-in via reasoning_training.injection_enabled. Injects at most once per + session via a marker shared with the UserPromptSubmit hook. + """ + from surreal_memory.engine.reasoning_injection import ( + already_injected, + build_injection_context, + mark_injected, + resolve_active_model, + ) + from surreal_memory.unified_config import get_config, get_shared_storage + + config = get_config() + if not config.reasoning_training.injection_enabled: + return "" + session_id = str(hook_input.get("session_id") or "") + if already_injected(session_id): + return "" + + model = resolve_active_model(hook_input) + storage = await get_shared_storage(config.current_brain) + try: + block = await build_injection_context(storage, model, config) + finally: + try: + await storage.close() + except Exception: + logger.debug("storage.close() failed (non-fatal)", exc_info=True) + + if block: + mark_injected(session_id) + return block + + def main() -> None: """Entry point for SessionStart hook.""" logging.basicConfig(level=logging.WARNING, stream=sys.stderr) @@ -91,34 +127,32 @@ def main() -> None: from surreal_memory.hooks.project_context import derive_project_name project_name = derive_project_name(hook_input) - if not project_name: - print("[Surreal-Memory] No project resolved at session start", file=sys.stderr) # noqa: T201 - sys.exit(0) + sections: list[str] = [] + # Recent-memories block (scoped to the resolved project). + if project_name: + try: + memories = asyncio.run(get_recent_memories(project_name)) + except Exception: + memories = "" + print("[Surreal-Memory] Session start context load failed", file=sys.stderr) # noqa: T201 + if memories: + sections.append(f"## Recent Memories — project: {project_name}\n\n{memories}") + + # Reasoning-strategies block (opt-in; model-based, not project-scoped). try: - context_text = asyncio.run(get_recent_memories(project_name)) + reasoning = asyncio.run(get_reasoning_injection(hook_input)) except Exception: - print("[Surreal-Memory] Session start context load failed", file=sys.stderr) # noqa: T201 - sys.exit(0) # Never block Claude Code - - if not context_text: - print( # noqa: T201 - f"[Surreal-Memory] No memories to inject for project '{project_name}'", - file=sys.stderr, - ) - sys.exit(0) + reasoning = "" + print("[Surreal-Memory] Session start reasoning injection failed", file=sys.stderr) # noqa: T201 + if reasoning: + sections.append(reasoning) - count = context_text.count("\n") + 1 - print( # noqa: T201 - f"[Surreal-Memory] Injecting {count} memories for project '{project_name}'", - file=sys.stderr, - ) + if not sections: + print("[Surreal-Memory] No session-start context to inject", file=sys.stderr) # noqa: T201 + sys.exit(0) - response = { - "type": "context", - "content": f"## Recent Memories — project: {project_name}\n\n{context_text}", - } - print(json.dumps(response)) # noqa: T201 + print(json.dumps({"type": "context", "content": "\n\n".join(sections)})) # noqa: T201 if __name__ == "__main__": diff --git a/src/surreal_memory/unified_config.py b/src/surreal_memory/unified_config.py index 1e5008e7..64cbc438 100755 --- a/src/surreal_memory/unified_config.py +++ b/src/surreal_memory/unified_config.py @@ -2498,7 +2498,11 @@ async def _get_surrealdb_storage(config: UnifiedConfig, name: str) -> NeuralStor from surreal_memory.storage.surrealdb import SurrealDBStorage from surreal_memory.storage.surrealdb.connection import SurrealSettings - if _surrealdb_storage is not None: + # Reuse the cached instance only if its connection is still open. A prior + # caller may have close()d it (which nulls _conn but leaves this module-level + # reference set); returning it as-is would raise "not initialized" on first + # use. Mirror the SQLite cache's liveness check and reinitialize otherwise. + if _surrealdb_storage is not None and getattr(_surrealdb_storage, "_conn", None) is not None: _surrealdb_storage.set_brain(name) return _surrealdb_storage diff --git a/tests/unit/test_hook_session_start.py b/tests/unit/test_hook_session_start.py index 2b8521e0..655ecb09 100644 --- a/tests/unit/test_hook_session_start.py +++ b/tests/unit/test_hook_session_start.py @@ -143,3 +143,85 @@ def test_main_exits_silently_when_no_memories(capsys: pytest.CaptureFixture[str] assert exc_info.value.code == 0 captured = capsys.readouterr() assert captured.out.strip() == "" + + +_REASONING_BLOCK = "## Reasoning strategies (learned from claude-fable-5)\n\n1. **plan**" + + +def test_main_combines_memories_and_reasoning_blocks( + capsys: pytest.CaptureFixture[str], +) -> None: + """Both blocks present → main() emits one context with the memories block + followed by the reasoning block.""" + with ( + patch("sys.stdin", io.StringIO("{}")), + patch("surreal_memory.hooks.project_context.derive_project_name", return_value="proj"), + patch( + "surreal_memory.hooks.session_start.get_recent_memories", + new=AsyncMock(return_value="- mem bullet"), + ), + patch( + "surreal_memory.hooks.session_start.get_reasoning_injection", + new=AsyncMock(return_value=_REASONING_BLOCK), + ), + ): + main() + + response = json.loads(capsys.readouterr().out.strip()) + assert response["type"] == "context" + content = response["content"] + assert "## Recent Memories — project: proj" in content + assert "- mem bullet" in content + assert "## Reasoning strategies (learned from claude-fable-5)" in content + # Memories block comes before the reasoning block. + assert content.index("Recent Memories") < content.index("Reasoning strategies") + + +def test_main_reasoning_failure_isolated_from_memories( + capsys: pytest.CaptureFixture[str], +) -> None: + """A reasoning-block exception must not drop the memories block.""" + with ( + patch("sys.stdin", io.StringIO("{}")), + patch("surreal_memory.hooks.project_context.derive_project_name", return_value="proj"), + patch( + "surreal_memory.hooks.session_start.get_recent_memories", + new=AsyncMock(return_value="- mem bullet"), + ), + patch( + "surreal_memory.hooks.session_start.get_reasoning_injection", + new=AsyncMock(side_effect=RuntimeError("boom")), + ), + ): + main() + + captured = capsys.readouterr() + response = json.loads(captured.out.strip()) + assert "- mem bullet" in response["content"] + assert "Reasoning strategies" not in response["content"] + assert "reasoning injection failed" in captured.err.lower() + + +def test_main_memories_failure_isolated_from_reasoning( + capsys: pytest.CaptureFixture[str], +) -> None: + """A memories-block exception must not drop the reasoning block.""" + with ( + patch("sys.stdin", io.StringIO("{}")), + patch("surreal_memory.hooks.project_context.derive_project_name", return_value="proj"), + patch( + "surreal_memory.hooks.session_start.get_recent_memories", + new=AsyncMock(side_effect=RuntimeError("boom")), + ), + patch( + "surreal_memory.hooks.session_start.get_reasoning_injection", + new=AsyncMock(return_value=_REASONING_BLOCK), + ), + ): + main() + + captured = capsys.readouterr() + response = json.loads(captured.out.strip()) + assert "Reasoning strategies" in response["content"] + assert "Recent Memories" not in response["content"] + assert "context load failed" in captured.err.lower() diff --git a/tests/unit/test_reasoning_injection.py b/tests/unit/test_reasoning_injection.py new file mode 100644 index 00000000..1c2fd797 --- /dev/null +++ b/tests/unit/test_reasoning_injection.py @@ -0,0 +1,316 @@ +"""Tests for engine/reasoning_injection.py — model resolution + prompt block. + +Uses synthetic transcripts / settings.json (HOME redirected to tmp) and +InMemoryStorage seeded with pattern fibers. Covers the resolve_active_model +fallback chain, injection_map glob/default matching, per-category + max-patterns ++ char-budget selection, markdown format, and the session idempotency markers. +""" + +from __future__ import annotations + +import json +import logging +from pathlib import Path + +import pytest + +from surreal_memory.core.fiber import Fiber +from surreal_memory.core.neuron import Neuron, NeuronType +from surreal_memory.engine.reasoning_injection import ( + already_injected, + build_injection_context, + mark_injected, + resolve_active_model, +) +from surreal_memory.storage.memory_store import InMemoryStorage +from surreal_memory.unified_config import ReasoningTrainingConfig, UnifiedConfig + +BRAIN = "b1" +_ENV_MODEL_VARS = ("SMEM_REASONING_TARGET_MODEL", "ANTHROPIC_MODEL") + + +@pytest.fixture +def clean_env(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> Path: + """Redirect HOME to tmp (no settings.json) and clear model env vars.""" + monkeypatch.setenv("HOME", str(tmp_path)) + for var in _ENV_MODEL_VARS: + monkeypatch.delenv(var, raising=False) + return tmp_path + + +def _ucfg(tmp_path: Path, **rt_kw: object) -> UnifiedConfig: + base: dict[str, object] = { + "injection_enabled": True, + "injection_max_patterns": 5, + "injection_max_chars": 4000, + } + base.update(rt_kw) + return UnifiedConfig( + data_dir=tmp_path / ".surrealmemory", + current_brain="default", + reasoning_training=ReasoningTrainingConfig(**base), # type: ignore[arg-type] + ) + + +async def _add_pattern( + storage: InMemoryStorage, + model: str, + category: str, + title: str, + strategy: str, + confidence: float, + frequency: int, +) -> None: + neuron = Neuron.create(type=NeuronType.CONCEPT, content=title) + await storage.add_neuron(neuron) + fiber = Fiber.create( + neuron_ids={neuron.id}, + synapse_ids=set(), + anchor_neuron_id=neuron.id, + summary=title, + tags=set(), + metadata={ + "_reasoning_pattern": True, + "_source_model": model, + "_reasoning_category": category, + "_reasoning_title": title, + "_reasoning_strategy": strategy, + "_reasoning_confidence": confidence, + "_reasoning_frequency": frequency, + "_reasoning_signature": title, + }, + ) + await storage.add_fiber(fiber) + + +# ── resolve_active_model chain ─────────────────────────────────────────────── + + +def test_resolve_from_payload_model(clean_env: Path) -> None: + assert resolve_active_model({"model": "claude-sonnet-5-20250101"}) == "claude-sonnet-5" + + +def test_resolve_from_transcript_tail(clean_env: Path) -> None: + # Transcripts are only read from under ~/.claude (spoof guard). HOME is + # redirected to clean_env, so write the transcript there. + tp = clean_env / ".claude" / "projects" / "x" / "t.jsonl" + tp.parent.mkdir(parents=True, exist_ok=True) + tp.write_text( + json.dumps({"type": "user", "message": {"content": "hi"}}) + + "\n" + + json.dumps({"type": "assistant", "message": {"model": "claude-haiku-4-5-20251001"}}) + + "\n", + encoding="utf-8", + ) + assert resolve_active_model({"transcript_path": str(tp)}) == "claude-haiku-4-5" + + +def test_resolve_transcript_outside_claude_rejected(clean_env: Path) -> None: + # A transcript_path outside ~/.claude is untrusted (hook stdin is attacker- + # controllable) and ignored; resolution falls through to "default". + outside = clean_env / "outside.jsonl" + outside.write_text( + json.dumps({"type": "assistant", "message": {"model": "claude-opus-4-8"}}) + "\n", + encoding="utf-8", + ) + assert resolve_active_model({"transcript_path": str(outside)}) == "default" + + +def test_resolve_transcript_symlink_escape_rejected(clean_env: Path) -> None: + # A symlink UNDER ~/.claude that points outside it must also be rejected: + # resolve() canonicalizes through the symlink before the containment check, + # so this can't be bypassed with a symlink (only a literal path prefix check + # would be fooled). Guards against a future refactor to os.path.abspath. + outside = clean_env / "real.jsonl" + outside.write_text( + json.dumps({"type": "assistant", "message": {"model": "claude-opus-4-8"}}) + "\n", + encoding="utf-8", + ) + claude_dir = clean_env / ".claude" + claude_dir.mkdir(parents=True, exist_ok=True) + link = claude_dir / "sneaky.jsonl" + link.symlink_to(outside) + assert resolve_active_model({"transcript_path": str(link)}) == "default" + + +def test_resolve_from_env(clean_env: Path, monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("SMEM_REASONING_TARGET_MODEL", "claude-opus-4-8") + assert resolve_active_model({}) == "claude-opus-4-8" + + +def test_resolve_from_env_alias(clean_env: Path, monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("ANTHROPIC_MODEL", "sonnet") + assert resolve_active_model({}) == "claude-sonnet-5" + + +def test_resolve_from_settings_alias(clean_env: Path) -> None: + claude_dir = clean_env / ".claude" + claude_dir.mkdir(parents=True, exist_ok=True) + (claude_dir / "settings.json").write_text(json.dumps({"model": "opusplan"}), encoding="utf-8") + assert resolve_active_model({}) == "claude-opus-4-8" + + +def test_resolve_default_when_nothing_available(clean_env: Path) -> None: + assert resolve_active_model({}) == "default" + + +def test_resolve_precedence_payload_over_env( + clean_env: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + monkeypatch.setenv("SMEM_REASONING_TARGET_MODEL", "claude-haiku-4-5") + assert resolve_active_model({"model": "claude-opus-4-8"}) == "claude-opus-4-8" + + +# ── build_injection_context ────────────────────────────────────────────────── + + +async def test_build_block_renders_ranked(tmp_path: Path) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _add_pattern( + storage, "claude-fable-5", "planning", "planning: plan", "plan -> steps", 0.8, 2 + ) + await _add_pattern( + storage, "claude-fable-5", "debugging", "debugging: verify", "verify -> check", 1.0, 3 + ) + cfg = _ucfg(tmp_path, injection_map=(("claude-opus-*", "claude-fable-5"),)) + + block = await build_injection_context(storage, "claude-opus-4-8", cfg) + assert block.startswith("## Reasoning strategies (learned from claude-fable-5)") + assert "debugging: verify" in block + assert "planning: plan" in block + # Higher confidence*frequency ranks first. + assert block.index("debugging: verify") < block.index("planning: plan") + + +async def test_injection_disabled_returns_empty(tmp_path: Path) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _add_pattern(storage, "claude-fable-5", "debugging", "t", "s", 1.0, 3) + cfg = _ucfg( + tmp_path, injection_enabled=False, injection_map=(("claude-opus-*", "claude-fable-5"),) + ) + assert await build_injection_context(storage, "claude-opus-4-8", cfg) == "" + + +async def test_no_map_match_returns_empty(tmp_path: Path) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _add_pattern(storage, "claude-fable-5", "debugging", "t", "s", 1.0, 3) + cfg = _ucfg(tmp_path, injection_map=(("claude-haiku-*", "claude-fable-5"),)) + assert await build_injection_context(storage, "claude-opus-4-8", cfg) == "" + + +async def test_injection_map_default_key(tmp_path: Path) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _add_pattern(storage, "claude-fable-5", "debugging", "debugging: x", "s", 1.0, 3) + cfg = _ucfg( + tmp_path, + injection_map=(("claude-haiku-*", "nope"), ("default", "claude-fable-5")), + ) + block = await build_injection_context(storage, "claude-opus-4-8", cfg) + assert "learned from claude-fable-5" in block + + +async def test_source_without_patterns_returns_empty(tmp_path: Path) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _add_pattern(storage, "claude-fable-5", "debugging", "t", "s", 1.0, 3) + cfg = _ucfg(tmp_path, injection_map=(("claude-opus-*", "claude-sonnet-5"),)) + assert await build_injection_context(storage, "claude-opus-4-8", cfg) == "" + + +async def test_max_two_per_category(tmp_path: Path) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + for i in range(4): + await _add_pattern( + storage, "claude-fable-5", "debugging", f"debugging: {i}", "s", 1.0, 3 - i + ) + cfg = _ucfg(tmp_path, injection_map=(("claude-opus-*", "claude-fable-5"),)) + block = await build_injection_context(storage, "claude-opus-4-8", cfg) + # Only 2 of the 4 debugging patterns are injected. + assert block.count("debugging:") == 2 + + +async def test_injection_max_patterns_cap(tmp_path: Path) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _add_pattern(storage, "claude-fable-5", "debugging", "debugging: a", "s", 1.0, 3) + await _add_pattern(storage, "claude-fable-5", "planning", "planning: b", "s", 0.9, 3) + cfg = _ucfg( + tmp_path, injection_max_patterns=1, injection_map=(("claude-opus-*", "claude-fable-5"),) + ) + block = await build_injection_context(storage, "claude-opus-4-8", cfg) + assert "1. **" in block + assert "2. **" not in block + + +async def test_char_budget_limits_entries(tmp_path: Path) -> None: + storage = InMemoryStorage() + storage.set_brain(BRAIN) + long_strategy = "x" * 500 + await _add_pattern( + storage, "claude-fable-5", "debugging", "debugging: a", long_strategy, 1.0, 3 + ) + await _add_pattern(storage, "claude-fable-5", "planning", "planning: b", long_strategy, 0.9, 3) + cfg = _ucfg( + tmp_path, injection_max_chars=120, injection_map=(("claude-opus-*", "claude-fable-5"),) + ) + block = await build_injection_context(storage, "claude-opus-4-8", cfg) + # First entry always included; the second exceeds the tiny budget. + assert "1. **" in block + assert "2. **" not in block + + +async def test_build_block_warns_on_fetch_ceiling( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch, caplog: pytest.LogCaptureFixture +) -> None: + # When the pattern-fiber fetch hits its ceiling, a model's patterns could be + # truncated out; that must be a visible warning, not a silent empty injection. + from surreal_memory.engine import reasoning_injection as ri + + monkeypatch.setattr(ri, "_PATTERN_FETCH_LIMIT", 2) + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _add_pattern(storage, "claude-fable-5", "debugging", "debugging: a", "s", 1.0, 3) + await _add_pattern(storage, "claude-fable-5", "planning", "planning: b", "s", 0.9, 2) + cfg = _ucfg(tmp_path, injection_map=(("claude-opus-*", "claude-fable-5"),)) + + with caplog.at_level(logging.WARNING, logger="surreal_memory.engine.reasoning_injection"): + block = await build_injection_context(storage, "claude-opus-4-8", cfg) + + assert "ceiling" in caplog.text + assert block # still renders from whatever was fetched + + +# ── session idempotency markers ────────────────────────────────────────────── + + +def test_marker_roundtrip(clean_env: Path) -> None: + assert already_injected("sess-1") is False + mark_injected("sess-1") + assert already_injected("sess-1") is True + # Empty session id is a no-op and never "already injected". + assert already_injected("") is False + mark_injected("") + + +def test_marker_sanitizes_session_id(clean_env: Path) -> None: + mark_injected("../evil/../id") + marker_root = clean_env / ".surrealmemory" / "reasoning_injected" + assert marker_root.is_dir() + # No traversal escape — every marker stays directly under the marker root. + assert all(p.parent == marker_root for p in marker_root.iterdir()) + assert already_injected("../evil/../id") is True + + +def test_marker_dir_honors_env_override(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: + # SURREAL_MEMORY_DIR relocates the whole data dir; markers must follow it + # (matches hooks/post_tool_use._get_data_dir) rather than pinning ~/.surrealmemory. + data_dir = tmp_path / "custom-data" + monkeypatch.setenv("SURREAL_MEMORY_DIR", str(data_dir)) + mark_injected("sess-env") + assert (data_dir / "reasoning_injected" / "sess-env").exists() + assert already_injected("sess-env") is True diff --git a/tests/unit/test_surrealdb_brain_lookup.py b/tests/unit/test_surrealdb_brain_lookup.py index 6bffdf44..20092cba 100644 --- a/tests/unit/test_surrealdb_brain_lookup.py +++ b/tests/unit/test_surrealdb_brain_lookup.py @@ -154,3 +154,54 @@ async def test_surrealdb_bootstrap_creates_brain_with_deterministic_id( assert len(storage.saved) == 1 assert storage.saved[0].id == "my-brain.v2" # deterministic, not a UUID assert storage.brain_context == "my-brain.v2" + + +async def test_surrealdb_bootstrap_reinitializes_after_close(monkeypatch: Any) -> None: + # A previously close()d cached instance nulls _conn. The bootstrap must NOT + # return that dead handle (find_fibers would raise "not initialized") — it must + # reinitialize a fresh store. Regression for the session_start memories→reasoning + # double-open sequence: the memories block closes shared storage, so the reasoning + # block's get_shared_storage() must reconnect rather than reuse the closed handle. + class _ClosedStore: + _conn = None + + def set_brain(self, _name: str) -> None: # pragma: no cover - must not run + raise AssertionError("closed instance must not be reused") + + closed = _ClosedStore() + existing = Brain.create("my-brain.v2", brain_id="my-brain.v2") + fake = _make_fake_store(existing=None, found_by_name=existing) + monkeypatch.setattr(_surrealdb_pkg, "SurrealDBStorage", fake) + monkeypatch.setattr(unified_config, "_surrealdb_storage", closed) + + storage = await unified_config._get_surrealdb_storage(_fake_config(), "my-brain.v2") + + assert storage is not closed # reinitialized, not the dead handle + assert storage.brain_context == "my-brain.v2" + + +async def test_surrealdb_bootstrap_reuses_live_connection(monkeypatch: Any) -> None: + # A cached instance with a live _conn is returned as-is (no reinitialize); only + # set_brain runs to switch the brain context. Constructing SurrealDBStorage here + # would mean the liveness check wrongly fell through — so make that path fail loud. + class _LiveStore: + _conn = object() + + def __init__(self) -> None: + self.brain_context: str | None = None + + def set_brain(self, name: str) -> None: + self.brain_context = name + + live = _LiveStore() + + def _boom(**_kwargs: Any) -> Any: # pragma: no cover - must not run + raise AssertionError("must not reinitialize a cached store with a live _conn") + + monkeypatch.setattr(_surrealdb_pkg, "SurrealDBStorage", _boom) + monkeypatch.setattr(unified_config, "_surrealdb_storage", live) + + storage = await unified_config._get_surrealdb_storage(_fake_config(), "brain-3") + + assert storage is live # same instance, reused + assert live.brain_context == "brain-3" From 028ad9f5b1ac9e1ed488091526c645b6eb389e51 Mon Sep 17 00:00:00 2001 From: Toni Nowak Date: Fri, 17 Jul 2026 13:24:00 +0200 Subject: [PATCH 06/12] feat: user_prompt_submit reasoning hook + registrations (U6) hooks/user_prompt_submit.py: new UserPromptSubmit hook. From the 2nd prompt on, the active model is resolvable from the transcript tail, so this injects the model's learned reasoning strategies (opt-in via injection_enabled). Shares the once-per-session marker with SessionStart, so the two never double-inject; always exits 0 so it can never block the prompt. engine/reasoning_injection.get_reasoning_context: shared orchestrator (config guard -> already_injected short-circuit -> resolve_active_model -> open storage -> build_injection_context -> always close -> mark_injected), used by both hooks. session_start.get_reasoning_injection is now a thin delegate to it. Registration mirrors SessionStart: pyproject entry point smem-hook-user-prompt- submit + .claude-plugin/hooks/hooks.json UserPromptSubmit entry. (setup.py/ doctor.py wire only the original PreCompact/Stop/PostToolUse into settings.json; SessionStart-class hooks are plugin-manifest only, so U6 matches that.) Output contract fix (verified against the installed claude-code binary): context reaches the model ONLY via hookSpecificOutput.additionalContext. Both hooks now emit that envelope; the prior session_start {"type":"context","content"} form was JSON-parsed with no recognized field, so U5's SessionStart injection (and the memories block) were silently invisible to the model. Now fixed for both. --- .claude-plugin/hooks/hooks.json | 6 ++ pyproject.toml | 1 + .../engine/reasoning_injection.py | 37 ++++++++ src/surreal_memory/hooks/session_start.py | 50 ++++------- .../hooks/user_prompt_submit.py | 83 +++++++++++++++++ tests/unit/test_hook_session_start.py | 24 ++--- tests/unit/test_hook_user_prompt_submit.py | 88 +++++++++++++++++++ tests/unit/test_reasoning_injection.py | 52 +++++++++++ 8 files changed, 299 insertions(+), 42 deletions(-) create mode 100644 src/surreal_memory/hooks/user_prompt_submit.py create mode 100644 tests/unit/test_hook_user_prompt_submit.py diff --git a/.claude-plugin/hooks/hooks.json b/.claude-plugin/hooks/hooks.json index e75971d7..0fb4b5d4 100755 --- a/.claude-plugin/hooks/hooks.json +++ b/.claude-plugin/hooks/hooks.json @@ -23,6 +23,12 @@ "command": "smem-hook-session-start", "description": "Inject recent memories as context at the start of a new session", "timeout": 10 + }, + { + "event": "UserPromptSubmit", + "command": "smem-hook-user-prompt-submit", + "description": "Inject learned reasoning strategies for the active model (opt-in)", + "timeout": 10 } ] } diff --git a/pyproject.toml b/pyproject.toml index c59093c1..e32e8f53 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -146,6 +146,7 @@ smem-hook-pre-compact = "surreal_memory.hooks.pre_compact:main" smem-hook-stop = "surreal_memory.hooks.stop:main" smem-hook-post-tool-use = "surreal_memory.hooks.post_tool_use:main" smem-hook-session-start = "surreal_memory.hooks.session_start:main" +smem-hook-user-prompt-submit = "surreal_memory.hooks.user_prompt_submit:main" smem-hook-task-context = "surreal_memory.hooks.task_context:main" [tool.hatch.build.targets.sdist] diff --git a/src/surreal_memory/engine/reasoning_injection.py b/src/surreal_memory/engine/reasoning_injection.py index 1b2845ab..531c2d1b 100644 --- a/src/surreal_memory/engine/reasoning_injection.py +++ b/src/surreal_memory/engine/reasoning_injection.py @@ -228,6 +228,43 @@ def _rank(f: Any) -> float: return "\n".join(parts) +# ── Hook orchestration (shared by SessionStart + UserPromptSubmit) ──────────── + + +async def get_reasoning_context(hook_input: dict[str, Any]) -> str: + """Resolve the active model, build its reasoning block, mark the session. + + Shared by the SessionStart and UserPromptSubmit hooks. Opt-in via + reasoning_training.injection_enabled; injects at most once per session via the + marker (already_injected/mark_injected), so whichever hook fires first wins and + the other is a no-op. Storage is opened on the current brain and always closed. + Returns "" when injection is disabled, already done this session, or nothing + matched. + """ + from surreal_memory.unified_config import get_config, get_shared_storage + + config = get_config() + if not config.reasoning_training.injection_enabled: + return "" + session_id = str(hook_input.get("session_id") or "") + if already_injected(session_id): + return "" + + model = resolve_active_model(hook_input) + storage = await get_shared_storage(config.current_brain) + try: + block = await build_injection_context(storage, model, config) + finally: + try: + await storage.close() + except Exception: + logger.debug("reasoning storage.close() failed (non-fatal)", exc_info=True) + + if block: + mark_injected(session_id) + return block + + # ── Session idempotency markers ────────────────────────────────────────────── diff --git a/src/surreal_memory/hooks/session_start.py b/src/surreal_memory/hooks/session_start.py index 62a5807e..60102924 100644 --- a/src/surreal_memory/hooks/session_start.py +++ b/src/surreal_memory/hooks/session_start.py @@ -6,7 +6,7 @@ Usage as Claude Code hook: Reads JSON from stdin (may be empty for SessionStart). - Outputs {"type": "context", "content": ""} to stdout. + Outputs hookSpecificOutput JSON (hookEventName + additionalContext) to stdout. Status messages go to stderr. Usage standalone: @@ -84,37 +84,13 @@ def read_hook_input() -> dict[str, Any]: async def get_reasoning_injection(hook_input: dict[str, Any]) -> str: """Build the reasoning-strategies context block for this session (or ""). - Opt-in via reasoning_training.injection_enabled. Injects at most once per - session via a marker shared with the UserPromptSubmit hook. + Thin delegate to the shared engine orchestrator, which SessionStart and the + UserPromptSubmit hook both call. Opt-in via reasoning_training.injection_enabled; + injects at most once per session via a marker shared between the two hooks. """ - from surreal_memory.engine.reasoning_injection import ( - already_injected, - build_injection_context, - mark_injected, - resolve_active_model, - ) - from surreal_memory.unified_config import get_config, get_shared_storage + from surreal_memory.engine.reasoning_injection import get_reasoning_context - config = get_config() - if not config.reasoning_training.injection_enabled: - return "" - session_id = str(hook_input.get("session_id") or "") - if already_injected(session_id): - return "" - - model = resolve_active_model(hook_input) - storage = await get_shared_storage(config.current_brain) - try: - block = await build_injection_context(storage, model, config) - finally: - try: - await storage.close() - except Exception: - logger.debug("storage.close() failed (non-fatal)", exc_info=True) - - if block: - mark_injected(session_id) - return block + return await get_reasoning_context(hook_input) def main() -> None: @@ -152,7 +128,19 @@ def main() -> None: print("[Surreal-Memory] No session-start context to inject", file=sys.stderr) # noqa: T201 sys.exit(0) - print(json.dumps({"type": "context", "content": "\n\n".join(sections)})) # noqa: T201 + # Claude Code adds a SessionStart hook's context to the model ONLY via the + # hookSpecificOutput.additionalContext JSON field (a top-level {"type":"context"} + # is parsed as JSON but carries no recognized field, so nothing is injected). + print( # noqa: T201 + json.dumps( + { + "hookSpecificOutput": { + "hookEventName": "SessionStart", + "additionalContext": "\n\n".join(sections), + } + } + ) + ) if __name__ == "__main__": diff --git a/src/surreal_memory/hooks/user_prompt_submit.py b/src/surreal_memory/hooks/user_prompt_submit.py new file mode 100644 index 00000000..e2b83aa4 --- /dev/null +++ b/src/surreal_memory/hooks/user_prompt_submit.py @@ -0,0 +1,83 @@ +"""UserPromptSubmit hook: inject learned reasoning strategies into the prompt. + +SessionStart runs before any assistant turn exists, so the active model often +can't be resolved yet. From the second prompt on, the model is resolvable from +the transcript tail, so this hook injects model-appropriate reasoning strategies +that SessionStart may have missed. It shares the once-per-session marker with +SessionStart (whichever fires first wins), so the two never double-inject. + +Opt-in via reasoning_training.injection_enabled. + +Claude Code injects a UserPromptSubmit hook's context ONLY via the +``hookSpecificOutput.additionalContext`` JSON field on stdout (exit 0). Plain +stdout is echoed to the transcript but is NOT added to the model's context, so +the block is emitted inside that JSON envelope. + +Usage as Claude Code hook: + Reads JSON from stdin (session_id, transcript_path, cwd, prompt). + Emits the reasoning block as hookSpecificOutput JSON on stdout (or nothing). + Status messages go to stderr. Always exits 0 — never blocks the prompt. + +Usage standalone: + echo '{}' | python -m surreal_memory.hooks.user_prompt_submit +""" + +from __future__ import annotations + +import asyncio +import json +import logging +import sys +from typing import Any + +logger = logging.getLogger(__name__) + + +def read_hook_input() -> dict[str, Any]: + """Read Claude Code hook JSON from stdin (empty/malformed -> {}).""" + try: + raw = sys.stdin.read() + if not raw.strip(): + return {} + result: dict[str, Any] = json.loads(raw) + return result + except (json.JSONDecodeError, OSError): + return {} + + +def main() -> None: + """Entry point for the UserPromptSubmit hook.""" + logging.basicConfig(level=logging.WARNING, stream=sys.stderr) + + hook_input = read_hook_input() + + from surreal_memory.engine.reasoning_injection import get_reasoning_context + + try: + block = asyncio.run(get_reasoning_context(hook_input)) + except Exception: + block = "" + # Never block the prompt — degrade to no injection. + print("[Surreal-Memory] UserPromptSubmit reasoning injection failed", file=sys.stderr) # noqa: T201 + + if block: + # Context reaches the model ONLY through hookSpecificOutput.additionalContext + # (plain stdout is transcript-only for this event). + print( # noqa: T201 + json.dumps( + { + "hookSpecificOutput": { + "hookEventName": "UserPromptSubmit", + "additionalContext": block, + } + } + ) + ) + else: + print("[Surreal-Memory] No reasoning strategies to inject", file=sys.stderr) # noqa: T201 + + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/tests/unit/test_hook_session_start.py b/tests/unit/test_hook_session_start.py index 655ecb09..301c0bac 100644 --- a/tests/unit/test_hook_session_start.py +++ b/tests/unit/test_hook_session_start.py @@ -122,15 +122,16 @@ def test_read_hook_input_valid_json() -> None: def test_main_outputs_context_json_on_success(capsys: pytest.CaptureFixture[str]) -> None: - """When memories exist, main() writes a JSON context response to stdout.""" + """When memories exist, main() writes a hookSpecificOutput JSON response.""" with patch("sys.stdin", io.StringIO("{}")): with patch("asyncio.run", return_value="- Fixed auth bug\n- Added retry logic"): main() # happy path — no sys.exit, just returns captured = capsys.readouterr() response = json.loads(captured.out.strip()) - assert response["type"] == "context" - assert "Fixed auth bug" in response["content"] + hook_out = response["hookSpecificOutput"] + assert hook_out["hookEventName"] == "SessionStart" + assert "Fixed auth bug" in hook_out["additionalContext"] def test_main_exits_silently_when_no_memories(capsys: pytest.CaptureFixture[str]) -> None: @@ -168,8 +169,9 @@ def test_main_combines_memories_and_reasoning_blocks( main() response = json.loads(capsys.readouterr().out.strip()) - assert response["type"] == "context" - content = response["content"] + hook_out = response["hookSpecificOutput"] + assert hook_out["hookEventName"] == "SessionStart" + content = hook_out["additionalContext"] assert "## Recent Memories — project: proj" in content assert "- mem bullet" in content assert "## Reasoning strategies (learned from claude-fable-5)" in content @@ -196,9 +198,9 @@ def test_main_reasoning_failure_isolated_from_memories( main() captured = capsys.readouterr() - response = json.loads(captured.out.strip()) - assert "- mem bullet" in response["content"] - assert "Reasoning strategies" not in response["content"] + content = json.loads(captured.out.strip())["hookSpecificOutput"]["additionalContext"] + assert "- mem bullet" in content + assert "Reasoning strategies" not in content assert "reasoning injection failed" in captured.err.lower() @@ -221,7 +223,7 @@ def test_main_memories_failure_isolated_from_reasoning( main() captured = capsys.readouterr() - response = json.loads(captured.out.strip()) - assert "Reasoning strategies" in response["content"] - assert "Recent Memories" not in response["content"] + content = json.loads(captured.out.strip())["hookSpecificOutput"]["additionalContext"] + assert "Reasoning strategies" in content + assert "Recent Memories" not in content assert "context load failed" in captured.err.lower() diff --git a/tests/unit/test_hook_user_prompt_submit.py b/tests/unit/test_hook_user_prompt_submit.py new file mode 100644 index 00000000..7617e470 --- /dev/null +++ b/tests/unit/test_hook_user_prompt_submit.py @@ -0,0 +1,88 @@ +"""Tests for the UserPromptSubmit Claude Code hook. + +The hook emits the reasoning-strategies block inside a hookSpecificOutput JSON +envelope (additionalContext) — the only channel Claude Code adds to the model's +context for this event — and always exits 0 so it can never block the prompt. +The block itself is produced by the shared +engine.reasoning_injection.get_reasoning_context orchestrator, which is patched +here — its own behavior (resolve/build/marker) is covered in +test_reasoning_injection.py. +""" + +from __future__ import annotations + +import io +import json +from unittest.mock import AsyncMock, patch + +import pytest + +from surreal_memory.hooks.user_prompt_submit import main, read_hook_input + +_ORCHESTRATOR = "surreal_memory.engine.reasoning_injection.get_reasoning_context" +_REASONING_BLOCK = "## Reasoning strategies (learned from claude-fable-5)\n\n1. **plan**" + + +def test_read_hook_input_empty_stdin() -> None: + with patch("sys.stdin", io.StringIO("")): + assert read_hook_input() == {} + + +def test_read_hook_input_valid_json() -> None: + payload = {"session_id": "s1", "transcript_path": "/x/t.jsonl", "prompt": "hi"} + with patch("sys.stdin", io.StringIO(json.dumps(payload))): + assert read_hook_input() == payload + + +def test_read_hook_input_malformed_json() -> None: + with patch("sys.stdin", io.StringIO("not json")): + assert read_hook_input() == {} + + +def test_main_emits_hook_specific_output_json(capsys: pytest.CaptureFixture[str]) -> None: + # Context reaches the model ONLY via hookSpecificOutput.additionalContext — + # the hook must emit that JSON envelope, not raw stdout. + with patch("sys.stdin", io.StringIO("{}")): + with patch(_ORCHESTRATOR, new=AsyncMock(return_value=_REASONING_BLOCK)): + with pytest.raises(SystemExit) as exc: + main() + + assert exc.value.code == 0 + payload = json.loads(capsys.readouterr().out.strip()) + hook_out = payload["hookSpecificOutput"] + assert hook_out["hookEventName"] == "UserPromptSubmit" + assert hook_out["additionalContext"] == _REASONING_BLOCK + + +def test_main_no_block_prints_nothing_to_stdout(capsys: pytest.CaptureFixture[str]) -> None: + with patch("sys.stdin", io.StringIO("{}")): + with patch(_ORCHESTRATOR, new=AsyncMock(return_value="")): + with pytest.raises(SystemExit) as exc: + main() + + assert exc.value.code == 0 + captured = capsys.readouterr() + assert captured.out.strip() == "" # nothing injected into the prompt + assert "No reasoning strategies" in captured.err + + +def test_main_injection_failure_exits_zero(capsys: pytest.CaptureFixture[str]) -> None: + # An orchestrator exception must never block the prompt — exit 0, no stdout. + with patch("sys.stdin", io.StringIO("{}")): + with patch(_ORCHESTRATOR, new=AsyncMock(side_effect=RuntimeError("boom"))): + with pytest.raises(SystemExit) as exc: + main() + + assert exc.value.code == 0 + captured = capsys.readouterr() + assert captured.out.strip() == "" + assert "failed" in captured.err.lower() + + +def test_main_malformed_stdin_does_not_crash(capsys: pytest.CaptureFixture[str]) -> None: + with patch("sys.stdin", io.StringIO("not valid json")): + with patch(_ORCHESTRATOR, new=AsyncMock(return_value="")): + with pytest.raises(SystemExit) as exc: + main() + + assert exc.value.code == 0 diff --git a/tests/unit/test_reasoning_injection.py b/tests/unit/test_reasoning_injection.py index 1c2fd797..ab443657 100644 --- a/tests/unit/test_reasoning_injection.py +++ b/tests/unit/test_reasoning_injection.py @@ -11,6 +11,7 @@ import json import logging from pathlib import Path +from unittest.mock import AsyncMock, patch import pytest @@ -19,6 +20,7 @@ from surreal_memory.engine.reasoning_injection import ( already_injected, build_injection_context, + get_reasoning_context, mark_injected, resolve_active_model, ) @@ -285,6 +287,56 @@ async def test_build_block_warns_on_fetch_ceiling( assert block # still renders from whatever was fetched +# ── get_reasoning_context (shared hook orchestrator) ───────────────────────── + + +async def test_get_reasoning_context_disabled_returns_empty( + clean_env: Path, tmp_path: Path +) -> None: + cfg = _ucfg(tmp_path, injection_enabled=False) + with patch("surreal_memory.unified_config.get_config", return_value=cfg): + assert await get_reasoning_context({"session_id": "s-disabled"}) == "" + + +async def test_get_reasoning_context_builds_and_marks_session( + clean_env: Path, tmp_path: Path +) -> None: + storage = InMemoryStorage() + storage.set_brain("default") + await _add_pattern(storage, "claude-fable-5", "debugging", "debugging: verify", "s", 1.0, 3) + cfg = _ucfg(tmp_path, injection_map=(("claude-opus-*", "claude-fable-5"),)) + with ( + patch("surreal_memory.unified_config.get_config", return_value=cfg), + patch( + "surreal_memory.unified_config.get_shared_storage", + new=AsyncMock(return_value=storage), + ), + ): + block = await get_reasoning_context({"session_id": "s-happy", "model": "claude-opus-4-8"}) + + assert "learned from claude-fable-5" in block + # Session marker set → the sibling UserPromptSubmit hook won't re-inject. + assert already_injected("s-happy") is True + + +async def test_get_reasoning_context_skips_when_already_injected( + clean_env: Path, tmp_path: Path +) -> None: + mark_injected("s-dup") # e.g. SessionStart already injected this session + cfg = _ucfg(tmp_path, injection_map=(("claude-opus-*", "claude-fable-5"),)) + + async def _must_not_open(_name: str) -> object: + raise AssertionError("storage must not open when the session is already injected") + + with ( + patch("surreal_memory.unified_config.get_config", return_value=cfg), + patch("surreal_memory.unified_config.get_shared_storage", new=_must_not_open), + ): + result = await get_reasoning_context({"session_id": "s-dup", "model": "claude-opus-4-8"}) + + assert result == "" + + # ── session idempotency markers ────────────────────────────────────────────── From e442e942b5e6103b2bdf8b1864a5605e72001e77 Mon Sep 17 00:00:00 2001 From: Toni Nowak Date: Fri, 17 Jul 2026 14:38:54 +0200 Subject: [PATCH 07/12] feat: reasoning dashboard API route (U7) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit server/routes/reasoning_training.py: new local-only dashboard router (/api/dashboard/reasoning) — GET /status (config + per-model trace/pattern stats + per-model category coverage + mining-job state), PUT /config (partial update with 422 validation: no-thinking models, glob/literal injection sources, category charset, ranges), POST /mine (background job, 400 if mining disabled, per-brain 409), GET /patterns[+/{id}], DELETE /patterns[/{id}|?model=], DELETE /traces?model= (privacy wipe). Registered in routes/__init__ + app.py. storage: new delete_reasoning_traces_by_model across base/sqlite/surrealdb/memory (parameterized, empty-model no-op; SurrealDB live-verified on v3.2.0). unified_config.create_isolated_storage: a fresh, non-cached SurrealDB instance so the background mining job holds its own brain context — a concurrent request's set_brain() on the shared singleton can no longer cross-write its graph writes into the wrong brain. Mining job state is keyed per brain (no cross-brain block or status leak). reasoning_distiller now honors mining_models in distillation, not just ingestion, so POST /mine {models} restricts the whole run. Mining runs ingest+distill directly (not ConsolidationEngine) so backfill/models overrides are honored; gated on mining_enabled (privacy). Reviewed by real-db-test-runner (live), security-reviewer, python-reviewer (all APPROVE). --- .../engine/reasoning_distiller.py | 6 + src/surreal_memory/server/app.py | 2 + src/surreal_memory/server/routes/__init__.py | 2 + .../server/routes/reasoning_training.py | 614 ++++++++++++++++++ src/surreal_memory/storage/base.py | 8 + src/surreal_memory/storage/memory_store.py | 10 + .../storage/sqlite_reasoning_traces.py | 13 + .../storage/surrealdb/reasoning_traces.py | 18 + src/surreal_memory/unified_config.py | 73 ++- tests/unit/test_reasoning_distiller.py | 19 + tests/unit/test_reasoning_traces_storage.py | 31 + tests/unit/test_route_reasoning_training.py | 427 ++++++++++++ tests/unit/test_surrealdb_reasoning_traces.py | 19 + 13 files changed, 1231 insertions(+), 11 deletions(-) create mode 100644 src/surreal_memory/server/routes/reasoning_training.py create mode 100644 tests/unit/test_route_reasoning_training.py diff --git a/src/surreal_memory/engine/reasoning_distiller.py b/src/surreal_memory/engine/reasoning_distiller.py index 7323cc48..d90aa31b 100644 --- a/src/surreal_memory/engine/reasoning_distiller.py +++ b/src/surreal_memory/engine/reasoning_distiller.py @@ -26,6 +26,7 @@ import re from collections import Counter from dataclasses import dataclass +from fnmatch import fnmatch from typing import TYPE_CHECKING, Any from surreal_memory.core.fiber import Fiber @@ -561,6 +562,11 @@ async def distill_reasoning_patterns( patterns_created = 0 processed_ids: list[Any] = [] models = await storage.get_reasoning_trace_models(brain_id) + if rt.mining_models: + # Honor the configured source-model globs so distillation is restricted to + # the same models as ingestion (and to POST /mine's models= override). An + # empty mining_models means "all models" (unchanged default behavior). + models = [m for m in models if any(fnmatch(m, pat) for pat in rt.mining_models)] for model in models: budget = rt.max_patterns_per_run - patterns_created diff --git a/src/surreal_memory/server/app.py b/src/surreal_memory/server/app.py index b4cf4e29..cb78575f 100755 --- a/src/surreal_memory/server/app.py +++ b/src/surreal_memory/server/app.py @@ -25,6 +25,7 @@ memory_router, oauth_router, openclaw_router, + reasoning_training_router, sync_router, ) from surreal_memory.storage.base import NeuralStorage @@ -532,6 +533,7 @@ async def get_storage( app.include_router(integration_status_router) app.include_router(oauth_router) app.include_router(openclaw_router) + app.include_router(reasoning_training_router) # Health check endpoint @app.get("/health", response_model=HealthResponse, tags=["health"]) diff --git a/src/surreal_memory/server/routes/__init__.py b/src/surreal_memory/server/routes/__init__.py index 70715613..3a2b2d7c 100755 --- a/src/surreal_memory/server/routes/__init__.py +++ b/src/surreal_memory/server/routes/__init__.py @@ -10,6 +10,7 @@ from surreal_memory.server.routes.memory import router as memory_router from surreal_memory.server.routes.oauth import router as oauth_router from surreal_memory.server.routes.openclaw_api import router as openclaw_router +from surreal_memory.server.routes.reasoning_training import router as reasoning_training_router from surreal_memory.server.routes.sync import router as sync_router __all__ = [ @@ -21,5 +22,6 @@ "memory_router", "oauth_router", "openclaw_router", + "reasoning_training_router", "sync_router", ] diff --git a/src/surreal_memory/server/routes/reasoning_training.py b/src/surreal_memory/server/routes/reasoning_training.py new file mode 100644 index 00000000..892976e9 --- /dev/null +++ b/src/surreal_memory/server/routes/reasoning_training.py @@ -0,0 +1,614 @@ +"""Reasoning-training dashboard API routes. + +Exposes the reasoning-training pipeline to the dashboard, kept in its own router +(dashboard_api.py is already ~1800 lines). Local-only via require_local_request. + +Endpoints (prefix ``/api/dashboard/reasoning``): +- ``GET /status`` config + per-model trace/pattern stats + coverage + mining-job state +- ``PUT /config`` partial config update (toggles, mining_models, injection_map, limits) +- ``POST /mine`` trigger a one-off mining run in the background (409 if already running) +- ``GET /patterns`` list learned pattern fibers (filter by model/category, paginated) +- ``GET /patterns/{id}`` one pattern's full detail +- ``DELETE /patterns/{id}`` delete one pattern +- ``DELETE /patterns`` delete all patterns for a model +- ``DELETE /traces`` privacy wipe: delete all staged traces for a model +""" + +from __future__ import annotations + +import asyncio +import logging +import re +from dataclasses import replace as dc_replace +from typing import Annotated, Any + +from fastapi import APIRouter, Depends, HTTPException, Query +from pydantic import BaseModel, Field + +from surreal_memory.core.brain import Brain +from surreal_memory.engine.reasoning_miner import _MODELS_WITHOUT_THINKING, normalize_model +from surreal_memory.server.dependencies import get_brain, get_storage, require_local_request +from surreal_memory.server.models import ErrorResponse +from surreal_memory.storage.base import NeuralStorage +from surreal_memory.utils.timeutils import utcnow + +logger = logging.getLogger(__name__) + +router = APIRouter( + prefix="/api/dashboard/reasoning", + tags=["reasoning"], + dependencies=[Depends(require_local_request)], +) + +# Pattern fibers are idempotent by _reasoning_signature (bounded population); +# matches the distiller / injection fetch ceiling. +_PATTERN_FETCH_LIMIT = 5000 +_MAX_PAGE = 100 +# Model names / injection globs: letters, digits, dot, underscore, dash, glob chars. +_MODEL_NAME_RE = re.compile(r"^[A-Za-z0-9._*?-]{1,128}$") + +# Background mining jobs, keyed by brain_id so one brain's run neither blocks nor +# leaks status into another's. Assumes a single uvicorn worker (the dashboard is +# launched without workers=N — cli/commands/tools.py); a multi-worker deployment +# would need shared state (e.g. a DB row) instead of these process globals. +_mining_tasks: dict[str, asyncio.Task[None]] = {} +_mining_states: dict[str, dict[str, Any]] = {} + + +def _idle_mining_state() -> dict[str, Any]: + return { + "running": False, + "started_at": None, + "finished_at": None, + "traces_ingested": 0, + "patterns_learned": 0, + "dry_run": False, + "error": None, + } + + +# ── Response / request models ───────────────────────────────────────────────── + + +class ModelTraceStats(BaseModel): + """Per-model trace + pattern counts and coverage.""" + + model: str + trace_count: int = 0 + unprocessed: int = 0 + pattern_count: int = 0 + has_thinking_text: bool = True + last_trace_at: str | None = None + coverage_percent: float = 0.0 + + +class CategoryCoverage(BaseModel): + """Coverage of one category for one source model.""" + + category: str + pattern_count: int + covered: bool + + +class MiningJobState(BaseModel): + """State of the (single) background mining job.""" + + running: bool + started_at: str | None = None + finished_at: str | None = None + traces_ingested: int = 0 + patterns_learned: int = 0 + dry_run: bool = False + error: str | None = None + + +class ReasoningStatusResponse(BaseModel): + """Full reasoning-training status for the dashboard.""" + + config: dict[str, Any] + detected_models: list[str] + per_model: list[ModelTraceStats] + coverage_by_model: dict[str, list[CategoryCoverage]] + total_traces: int + unprocessed_traces: int + total_patterns: int + mining: MiningJobState + + +class ReasoningConfigUpdate(BaseModel): + """Partial reasoning-training config update (all fields optional).""" + + mining_enabled: bool | None = None + injection_enabled: bool | None = None + mining_models: list[str] | None = None + injection_map: dict[str, str] | None = None + categories: list[str] | None = None + scan_lookback_days: int | None = Field(None, ge=0, le=100_000) + retention_days: int | None = Field(None, ge=1, le=100_000) + max_traces_total: int | None = Field(None, ge=1, le=10_000_000) + min_cluster_support: int | None = Field(None, ge=1, le=100_000) + max_patterns_per_run: int | None = Field(None, ge=1, le=100_000) + min_confidence: float | None = Field(None, ge=0.0, le=1.0) + min_patterns_per_category: int | None = Field(None, ge=1, le=100_000) + injection_max_patterns: int | None = Field(None, ge=1, le=1000) + injection_max_chars: int | None = Field(None, ge=1, le=1_000_000) + + +class MineRequest(BaseModel): + """Trigger a one-off mining run.""" + + backfill: bool = Field(False, description="Scan the full history (scan_lookback_days=0)") + dry_run: bool = Field( + False, description="Don't write — report as a no-op (parity with consolidation)" + ) + models: list[str] | None = Field(None, description="Restrict mining to these source models") + + +class MineResponse(BaseModel): + """Response to a mining trigger.""" + + status: str + mining: MiningJobState + + +class PatternSummary(BaseModel): + """One learned reasoning pattern (list view).""" + + id: str + source_model: str + category: str + title: str + confidence: float + frequency: int + signature: str + + +class PatternDetail(PatternSummary): + """One learned reasoning pattern with its full strategy/description.""" + + strategy: str + description: str + summary: str + + +class PatternsListResponse(BaseModel): + """Paginated learned-pattern list.""" + + patterns: list[PatternSummary] + total: int + limit: int + offset: int + + +class DeleteResponse(BaseModel): + """Result of a delete operation.""" + + deleted: int + + +# ── Helpers ─────────────────────────────────────────────────────────────────── + + +def _has_thinking(model: str) -> bool: + """A model has minable thinking text unless it's on the denylist (prefix match).""" + norm = normalize_model(model) + return not any(norm.startswith(prefix) for prefix in _MODELS_WITHOUT_THINKING) + + +def _validate_model_name(name: str, *, field: str) -> str: + """Validate a model name / injection glob; 422 on a bad shape.""" + cleaned = name.strip() + if not cleaned or not _MODEL_NAME_RE.match(cleaned): + raise HTTPException(status_code=422, detail=f"Invalid {field} name: {name!r}") + return cleaned + + +def _pattern_meta(fiber: Any) -> dict[str, Any]: + return fiber.metadata if isinstance(fiber.metadata, dict) else {} + + +def _to_summary(fiber: Any) -> PatternSummary: + md = _pattern_meta(fiber) + return PatternSummary( + id=str(fiber.id), + source_model=str(md.get("_source_model", "")), + category=str(md.get("_reasoning_category", "")), + title=str(md.get("_reasoning_title", "")), + confidence=float(md.get("_reasoning_confidence", 0.0) or 0.0), + frequency=int(md.get("_reasoning_frequency", 0) or 0), + signature=str(md.get("_reasoning_signature", "")), + ) + + +async def _fetch_pattern_fibers(storage: NeuralStorage) -> list[Any]: + """All learned pattern fibers for the current brain (bounded population).""" + return await storage.find_fibers(metadata_key="_reasoning_pattern", limit=_PATTERN_FETCH_LIMIT) + + +# ── GET /status ─────────────────────────────────────────────────────────────── + + +@router.get("/status", response_model=ReasoningStatusResponse, summary="Reasoning-training status") +async def get_status( + storage: Annotated[NeuralStorage, Depends(get_storage)], + brain: Annotated[Brain, Depends(get_brain)], +) -> ReasoningStatusResponse: + """Config + per-model trace/pattern stats + per-model category coverage.""" + from surreal_memory.unified_config import get_config + + config = get_config() + rt = config.reasoning_training + brain_id = brain.id + + stats = await storage.get_reasoning_stats(brain_id) + by_model_traces: dict[str, Any] = stats.get("by_model", {}) + fibers = await _fetch_pattern_fibers(storage) + + # Per-model pattern counts and per-category coverage from one fiber fetch. + pattern_counts: dict[str, int] = {} + cat_counts: dict[str, dict[str, int]] = {} + for f in fibers: + md = _pattern_meta(f) + source = str(md.get("_source_model", "")) + if not source: + continue + pattern_counts[source] = pattern_counts.get(source, 0) + 1 + if float(md.get("_reasoning_confidence", 0.0) or 0.0) < rt.min_confidence: + continue + cat = str(md.get("_reasoning_category", "")) + if cat in rt.categories: + model_cats = cat_counts.setdefault(source, {}) + model_cats[cat] = model_cats.get(cat, 0) + 1 + + # detected_models = union of DISTINCT trace models, config mining_models, + # pattern source models, and injection sources. + detected = sorted( + set(by_model_traces) + | set(rt.mining_models) + | set(pattern_counts) + | {s for _, s in rt.injection_map} + ) + + per_model: list[ModelTraceStats] = [] + coverage_by_model: dict[str, list[CategoryCoverage]] = {} + for model in detected: + tstats = by_model_traces.get(model, {}) + counts = cat_counts.get(model, {}) + n_covered = sum( + 1 for c in rt.categories if counts.get(c, 0) >= rt.min_patterns_per_category + ) + cov_pct = round(n_covered / len(rt.categories) * 100.0, 1) if rt.categories else 0.0 + trace_count = int(tstats.get("trace_count", 0) or 0) + per_model.append( + ModelTraceStats( + model=model, + trace_count=trace_count, + unprocessed=int(tstats.get("unprocessed", 0) or 0), + pattern_count=pattern_counts.get(model, 0), + has_thinking_text=_has_thinking(model) or trace_count > 0, + last_trace_at=tstats.get("last_trace_at") or None, + coverage_percent=cov_pct, + ) + ) + coverage_by_model[model] = [ + CategoryCoverage( + category=c, + pattern_count=counts.get(c, 0), + covered=counts.get(c, 0) >= rt.min_patterns_per_category, + ) + for c in rt.categories + ] + + return ReasoningStatusResponse( + config=rt.to_dict(), + detected_models=detected, + per_model=per_model, + coverage_by_model=coverage_by_model, + total_traces=int(stats.get("total", 0) or 0), + unprocessed_traces=int(stats.get("unprocessed", 0) or 0), + total_patterns=len(fibers), + mining=MiningJobState(**_mining_states.get(brain_id, _idle_mining_state())), + ) + + +# ── PUT /config ─────────────────────────────────────────────────────────────── + + +@router.put( + "/config", + responses={422: {"model": ErrorResponse}}, + summary="Update reasoning-training config", +) +async def update_config(body: ReasoningConfigUpdate) -> dict[str, Any]: + """Partial config update. 422 on a model without thinking text or a bad name.""" + from surreal_memory.unified_config import get_config, set_config + + config = get_config() + rt = config.reasoning_training + changes: dict[str, Any] = {} + + if body.mining_enabled is not None: + changes["mining_enabled"] = body.mining_enabled + if body.injection_enabled is not None: + changes["injection_enabled"] = body.injection_enabled + + if body.mining_models is not None: + models: list[str] = [] + for m in body.mining_models: + name = _validate_model_name(m, field="mining_models") + # A source model must actually produce thinking text to be minable. + if not _has_thinking(name): + raise HTTPException( + status_code=422, + detail=f"Model {name!r} has no thinking text and cannot be mined", + ) + models.append(name) + changes["mining_models"] = tuple(dict.fromkeys(models)) + + if body.injection_map is not None: + pairs: list[tuple[str, str]] = [] + for target, source in body.injection_map.items(): + t = _validate_model_name(target, field="injection_map target") + s = _validate_model_name(source, field="injection_map source") + # The source is matched literally (==) against a pattern's _source_model + # (reasoning_injection), so a glob would silently never match — reject it. + if "*" in s or "?" in s: + raise HTTPException( + status_code=422, + detail=f"Injection source {source!r} must be a literal model, not a glob", + ) + # The source (whose patterns get injected) must have thinking text; + # the target (recipient) may be a thinking-less model like opus. + if not _has_thinking(s): + raise HTTPException( + status_code=422, + detail=f"Injection source {s!r} has no thinking text", + ) + pairs.append((t, s)) + changes["injection_map"] = tuple(pairs) + + if body.categories is not None: + cats: list[str] = [] + for c in body.categories: + name = c.strip() + if not name: + continue + if not _MODEL_NAME_RE.match(name): + raise HTTPException(status_code=422, detail=f"Invalid category name: {c!r}") + cats.append(name[:64]) + deduped = tuple(dict.fromkeys(cats)) + if not deduped: + # 422 rather than a silent no-op (categories drive coverage math). + raise HTTPException(status_code=422, detail="categories cannot be empty") + changes["categories"] = deduped + + for field_name in ( + "scan_lookback_days", + "retention_days", + "max_traces_total", + "min_cluster_support", + "max_patterns_per_run", + "min_confidence", + "min_patterns_per_category", + "injection_max_patterns", + "injection_max_chars", + ): + value = getattr(body, field_name) + if value is not None: + changes[field_name] = value + + new_rt = dc_replace(rt, **changes) + updated = dc_replace(config, reasoning_training=new_rt) + updated.save() + set_config(updated) + return {"status": "updated", "config": new_rt.to_dict()} + + +# ── POST /mine ──────────────────────────────────────────────────────────────── + + +async def _run_mining( + brain_id: str, backfill: bool, dry_run: bool, models: list[str] | None +) -> None: + """Background mining job: ingest reasoning traces then distill patterns. + + Uses direct ingest+distill (not ConsolidationEngine) so the request's + backfill / models overrides are honored — the engine's reasoning handlers + reload config from disk and would ignore them. Runs on an ISOLATED storage + (create_isolated_storage) so a concurrently-served request's set_brain() on + the shared SurrealDB singleton can't redirect this job's graph writes into + the wrong brain. + """ + from surreal_memory.engine.reasoning_distiller import distill_reasoning_patterns + from surreal_memory.engine.reasoning_miner import ingest_reasoning_traces + from surreal_memory.unified_config import create_isolated_storage, get_config + + state = _mining_states.setdefault(brain_id, _idle_mining_state()) + try: + if dry_run: + # Parity with consolidation dry_run: no scanning, no writes. + state.update(traces_ingested=0, patterns_learned=0) + return + + config = get_config() + rt = config.reasoning_training + overrides: dict[str, Any] = {} + if backfill: + overrides["scan_lookback_days"] = 0 + if models: + overrides["mining_models"] = tuple(models) + run_config = dc_replace(config, reasoning_training=dc_replace(rt, **overrides)) + + storage = await create_isolated_storage(brain_id) + # We own the isolated SurrealDB instance and must close it; SQLite / in-memory + # return the shared instance, which must NOT be closed out from under others. + owns_storage = config.storage_backend == "surrealdb" + try: + ingest = await ingest_reasoning_traces(storage, brain_id, run_config) + distill = await distill_reasoning_patterns(storage, brain_id, run_config) + state.update( + traces_ingested=ingest.traces_ingested, + patterns_learned=distill.patterns_learned, + ) + finally: + if owns_storage: + await storage.close() + except Exception: # never crash; surface a generic error via job state + logger.exception("reasoning mining job failed for brain %s", brain_id) + state["error"] = "mining failed; see server logs" + finally: + state["running"] = False + state["finished_at"] = utcnow().isoformat() + + +@router.post( + "/mine", + response_model=MineResponse, + status_code=202, + responses={400: {"model": ErrorResponse}, 409: {"model": ErrorResponse}}, + summary="Trigger a one-off mining run", +) +async def trigger_mining( + body: MineRequest, + brain: Annotated[Brain, Depends(get_brain)], +) -> MineResponse: + """Start a background mining run. 400 if mining disabled, 409 if already running. + + Job state and the concurrency guard are per-brain, so a run on one brain never + blocks or leaks status into another. + """ + from surreal_memory.unified_config import get_config + + config = get_config() + if not config.reasoning_training.mining_enabled: + # Privacy: never scan ~/.claude transcripts unless mining is enabled. + raise HTTPException(status_code=400, detail="Mining is disabled; enable it first") + + existing = _mining_tasks.get(brain.id) + if existing is not None and not existing.done(): + raise HTTPException(status_code=409, detail="A mining run is already in progress") + + models = None + if body.models: + models = [_validate_model_name(m, field="models") for m in body.models] + + state = _idle_mining_state() + state.update(running=True, started_at=utcnow().isoformat(), dry_run=body.dry_run) + _mining_states[brain.id] = state + _mining_tasks[brain.id] = asyncio.create_task( + _run_mining(brain.id, body.backfill, body.dry_run, models) + ) + return MineResponse(status="started", mining=MiningJobState(**state)) + + +# ── GET /patterns ───────────────────────────────────────────────────────────── + + +@router.get("/patterns", response_model=PatternsListResponse, summary="List learned patterns") +async def list_patterns( + storage: Annotated[NeuralStorage, Depends(get_storage)], + brain: Annotated[Brain, Depends(get_brain)], + model: str | None = Query(None, description="Filter by source model"), + category: str | None = Query(None, description="Filter by category"), + limit: int = Query(50, ge=1, le=_MAX_PAGE), + offset: int = Query(0, ge=0), +) -> PatternsListResponse: + """List learned reasoning patterns (filter by source model / category).""" + fibers = await _fetch_pattern_fibers(storage) + summaries = [_to_summary(f) for f in fibers] + if model: + summaries = [s for s in summaries if s.source_model == model] + if category: + summaries = [s for s in summaries if s.category == category] + summaries.sort(key=lambda s: s.confidence * s.frequency, reverse=True) + total = len(summaries) + page = summaries[offset : offset + limit] + return PatternsListResponse(patterns=page, total=total, limit=limit, offset=offset) + + +@router.get( + "/patterns/{pattern_id}", + response_model=PatternDetail, + responses={404: {"model": ErrorResponse}}, + summary="Get one pattern's detail", +) +async def get_pattern( + pattern_id: str, + storage: Annotated[NeuralStorage, Depends(get_storage)], + brain: Annotated[Brain, Depends(get_brain)], +) -> PatternDetail: + """Return one learned pattern with its full strategy/description.""" + fiber = await storage.get_fiber(pattern_id) + if fiber is None or not _pattern_meta(fiber).get("_reasoning_pattern"): + raise HTTPException(status_code=404, detail="Pattern not found") + md = _pattern_meta(fiber) + base = _to_summary(fiber) + return PatternDetail( + **base.model_dump(), + strategy=str(md.get("_reasoning_strategy", "")), + description=str(md.get("_reasoning_description", "")), + summary=str(fiber.summary or ""), + ) + + +@router.delete( + "/patterns/{pattern_id}", + response_model=DeleteResponse, + responses={404: {"model": ErrorResponse}}, + summary="Delete one learned pattern", +) +async def delete_pattern( + pattern_id: str, + storage: Annotated[NeuralStorage, Depends(get_storage)], + brain: Annotated[Brain, Depends(get_brain)], +) -> DeleteResponse: + """Delete one learned pattern fiber. + + The pattern's private title-neuron is currently left as a harmless graph orphan + (follow-up ticket); the shared reasoning_category neuron is kept by design. + """ + fiber = await storage.get_fiber(pattern_id) + if fiber is None or not _pattern_meta(fiber).get("_reasoning_pattern"): + raise HTTPException(status_code=404, detail="Pattern not found") + deleted = await storage.delete_fiber(pattern_id) + return DeleteResponse(deleted=1 if deleted else 0) + + +@router.delete( + "/patterns", response_model=DeleteResponse, summary="Delete all patterns for a model" +) +async def delete_patterns_by_model( + storage: Annotated[NeuralStorage, Depends(get_storage)], + brain: Annotated[Brain, Depends(get_brain)], + model: str = Query(..., description="Delete all patterns whose source model matches"), +) -> DeleteResponse: + """Delete every learned pattern for a source model. + + Only the pattern fibers are removed; the shared reasoning_category concept-neuron + is intentionally kept (other models' patterns reference it), and the pattern's + private title-neuron is currently left as a harmless graph orphan (follow-up + ticket). Raw mined thinking lives in traces — DELETE /traces is the full wipe. + """ + if not model.strip(): + return DeleteResponse(deleted=0) # never a blanket wipe + fibers = await _fetch_pattern_fibers(storage) + victims = [f for f in fibers if _pattern_meta(f).get("_source_model") == model] + deleted = 0 + for f in victims: + if await storage.delete_fiber(str(f.id)): + deleted += 1 + return DeleteResponse(deleted=deleted) + + +# ── DELETE /traces (privacy wipe) ───────────────────────────────────────────── + + +@router.delete("/traces", response_model=DeleteResponse, summary="Wipe staged traces for a model") +async def delete_traces_by_model( + storage: Annotated[NeuralStorage, Depends(get_storage)], + brain: Annotated[Brain, Depends(get_brain)], + model: str = Query(..., description="Delete all staged reasoning traces for this model"), +) -> DeleteResponse: + """Privacy wipe: delete all staged reasoning traces for a model.""" + deleted = await storage.delete_reasoning_traces_by_model(brain.id, model) + return DeleteResponse(deleted=deleted) diff --git a/src/surreal_memory/storage/base.py b/src/surreal_memory/storage/base.py index 0c0727e8..2a3d6e48 100755 --- a/src/surreal_memory/storage/base.py +++ b/src/surreal_memory/storage/base.py @@ -1276,6 +1276,14 @@ async def get_reasoning_trace_models(self, brain_id: str) -> list[str]: """Return DISTINCT model names present in reasoning_traces. Default: empty.""" return [] + async def delete_reasoning_traces_by_model(self, brain_id: str, model: str) -> int: + """Delete all reasoning traces for a model (privacy wipe). Default: 0. + + Backends that buffer reasoning traces (SQLite, SurrealDB, in-memory) + override this. + """ + return 0 + async def add_retrieval_trace(self, trace: RetrievalTrace) -> str: """Persist a retrieval trace. Returns the trace ID.""" raise NotImplementedError diff --git a/src/surreal_memory/storage/memory_store.py b/src/surreal_memory/storage/memory_store.py index 458d191f..a132803d 100755 --- a/src/surreal_memory/storage/memory_store.py +++ b/src/surreal_memory/storage/memory_store.py @@ -954,6 +954,16 @@ async def get_reasoning_trace_models(self, brain_id: str) -> list[str]: """Return DISTINCT model names in reasoning_traces (sorted).""" return sorted({r["model"] for r in self._reasoning_traces[brain_id] if r["model"]}) + async def delete_reasoning_traces_by_model(self, brain_id: str, model: str) -> int: + """Delete all reasoning traces for a model (privacy wipe).""" + if not model: + return 0 + rows = self._reasoning_traces[brain_id] + kept = [r for r in rows if r["model"] != model] + deleted = len(rows) - len(kept) + self._reasoning_traces[brain_id] = kept + return deleted + # ========== Cleanup ========== async def clear(self, brain_id: str) -> None: diff --git a/src/surreal_memory/storage/sqlite_reasoning_traces.py b/src/surreal_memory/storage/sqlite_reasoning_traces.py index d0135a03..b8b9e455 100644 --- a/src/surreal_memory/storage/sqlite_reasoning_traces.py +++ b/src/surreal_memory/storage/sqlite_reasoning_traces.py @@ -270,3 +270,16 @@ async def get_reasoning_trace_models(self, brain_id: str) -> list[str]: if row["model"]: results.append(row["model"]) return results + + async def delete_reasoning_traces_by_model(self, brain_id: str, model: str) -> int: + """Delete all reasoning traces for a model (privacy wipe). Returns rows deleted.""" + if not model: + return 0 + conn = self._ensure_conn() + cursor = await conn.execute( + "DELETE FROM reasoning_traces WHERE brain_id = ? AND model = ?", + (brain_id, model), + ) + deleted = cursor.rowcount + await conn.commit() + return deleted diff --git a/src/surreal_memory/storage/surrealdb/reasoning_traces.py b/src/surreal_memory/storage/surrealdb/reasoning_traces.py index 9bff5189..eb3876ef 100644 --- a/src/surreal_memory/storage/surrealdb/reasoning_traces.py +++ b/src/surreal_memory/storage/surrealdb/reasoning_traces.py @@ -286,3 +286,21 @@ async def get_reasoning_trace_models(self, brain_id: str) -> list[str]: bid=brain_id, ) return sorted({r.get("model", "") for r in rows if r.get("model")}) + + async def delete_reasoning_traces_by_model(self, brain_id: str, model: str) -> int: + """Delete all reasoning traces for a model (privacy wipe); return count.""" + if not model: + return 0 + rows = await self._query( + "SELECT count() AS c FROM reasoning_traces" + " WHERE brain_id = $bid AND model = $model GROUP ALL", + bid=brain_id, + model=model, + ) + deleted = int(rows[0]["c"]) if rows else 0 + await self._query( + "DELETE reasoning_traces WHERE brain_id = $bid AND model = $model", + bid=brain_id, + model=model, + ) + return deleted diff --git a/src/surreal_memory/unified_config.py b/src/surreal_memory/unified_config.py index 64cbc438..7f6be427 100755 --- a/src/surreal_memory/unified_config.py +++ b/src/surreal_memory/unified_config.py @@ -2490,6 +2490,22 @@ async def _get_sqlite_storage( _surrealdb_storage: NeuralStorage | None = None +def _resolve_embedding_dim(config: UnifiedConfig) -> int: + """Resolve the embedding vector dimension the SurrealDB HNSW index must match. + + Priority: explicit config.embedding.dimension (e.g. a local bge-m3 server → + 1024) > known Gemini model dim > 3072 default. + """ + if config.embedding.enabled: + if config.embedding.dimension and config.embedding.dimension > 0: + return int(config.embedding.dimension) + if config.embedding.model: + from surreal_memory.engine.embedding.gemini_embedding import _MODEL_DIMENSIONS + + return _MODEL_DIMENSIONS.get(config.embedding.model, 3072) + return 3072 # Gemini 2.0 default + + async def _get_surrealdb_storage(config: UnifiedConfig, name: str) -> NeuralStorage: """Create or return cached SurrealDBStorage.""" global _surrealdb_storage @@ -2506,17 +2522,8 @@ async def _get_surrealdb_storage(config: UnifiedConfig, name: str) -> NeuralStor _surrealdb_storage.set_brain(name) return _surrealdb_storage - # Resolve the embedding vector dimension that the SurrealDB HNSW index must - # match. Priority: explicit config.embedding.dimension (e.g. a local - # OpenAI-compatible bge-m3 server → 1024) > known Gemini model dim > 3072. - emb_dim = 3072 # Gemini 2.0 default - if config.embedding.enabled: - if config.embedding.dimension and config.embedding.dimension > 0: - emb_dim = int(config.embedding.dimension) - elif config.embedding.model: - from surreal_memory.engine.embedding.gemini_embedding import _MODEL_DIMENSIONS - - emb_dim = _MODEL_DIMENSIONS.get(config.embedding.model, 3072) + # Resolve the embedding vector dimension that the SurrealDB HNSW index must match. + emb_dim = _resolve_embedding_dim(config) _warn_missing_surreal_pass() @@ -2557,3 +2564,47 @@ async def _get_surrealdb_storage(config: UnifiedConfig, name: str) -> NeuralStor _surrealdb_storage = storage logger.info("SurrealDB storage initialized for brain '%s'", name) return storage + + +async def create_isolated_storage(brain_name: str | None = None) -> NeuralStorage: + """Create a FRESH, non-cached storage bound to *brain_name*. + + Unlike get_shared_storage, this never returns the module-global SurrealDB + singleton, so a long-running background job (e.g. reasoning mining) can hold + its own brain context without a concurrently-served request's set_brain() + racing it and cross-writing into the wrong brain. The caller MUST close() the + returned storage. SQLite already caches per brain-file (each brain a separate + instance) and the in-memory backend is test-only, so those return the shared + instance — only the SurrealDB global singleton needs true isolation. + """ + config = get_config() + name = brain_name or config.current_brain + + if config.storage_backend == "surrealdb": + from surreal_memory.core.brain import Brain + from surreal_memory.storage.surrealdb import SurrealDBStorage + from surreal_memory.storage.surrealdb.connection import SurrealSettings + + _warn_missing_surreal_pass() + settings = SurrealSettings.from_env() + storage = SurrealDBStorage( + url=settings.url, + namespace=settings.namespace, + database=settings.database, + user=settings.user, + password=settings.password, + embedding_dim=_resolve_embedding_dim(config), + ) + await storage.initialize() + brain = await storage.get_brain(name) + if brain is None: + brain = await storage.find_brain_by_name(name) + if brain is None: + brain = Brain.create(name, brain_id=name) + await storage.save_brain(brain) + storage.set_brain(name) + return storage + + # SQLite (per-brain cached) and in-memory (test-only) are not shared across + # brains in a racy way; reuse the shared instance. + return await get_shared_storage(name) diff --git a/tests/unit/test_reasoning_distiller.py b/tests/unit/test_reasoning_distiller.py index 13f0d651..fd3a1adc 100644 --- a/tests/unit/test_reasoning_distiller.py +++ b/tests/unit/test_reasoning_distiller.py @@ -112,6 +112,25 @@ async def test_distill_creates_pattern_fiber(tmp_path: Path, no_embedder: None) assert cat_neuron +async def test_distill_honors_mining_models_filter(tmp_path: Path, no_embedder: None) -> None: + # Pre-existing unprocessed traces for two models; a mining_models glob must + # restrict distillation to the matching model only (HIGH-2 regression: the + # POST /mine models= override must actually gate distillation, not just ingest). + storage = InMemoryStorage() + storage.set_brain(BRAIN) + await _seed(storage, "claude-fable-5", _DEBUG_TRACES) + await _seed(storage, "claude-sonnet-5", _DEBUG_TRACES) + + cfg = _ucfg(tmp_path, mining_models=("claude-fable-5",)) + await distill_reasoning_patterns(storage, BRAIN, cfg) + + fibers = await storage.find_fibers(metadata_key="_reasoning_pattern", limit=100) + assert {f.metadata["_source_model"] for f in fibers} == {"claude-fable-5"} + # sonnet's traces are untouched (not consumed by the restricted run). + remaining = await storage.get_unprocessed_reasoning_traces(BRAIN, limit=100) + assert {t["model"] for t in remaining} == {"claude-sonnet-5"} + + async def test_distill_is_idempotent(tmp_path: Path, no_embedder: None) -> None: storage = InMemoryStorage() storage.set_brain(BRAIN) diff --git a/tests/unit/test_reasoning_traces_storage.py b/tests/unit/test_reasoning_traces_storage.py index 33c911d4..7bcf4447 100644 --- a/tests/unit/test_reasoning_traces_storage.py +++ b/tests/unit/test_reasoning_traces_storage.py @@ -212,6 +212,37 @@ async def test_get_reasoning_trace_models_distinct_sorted(storage: SQLiteStorage ] +async def test_delete_reasoning_traces_by_model(storage: SQLiteStorage) -> None: + await storage.insert_reasoning_traces( + BRAIN, + [ + _trace("h1", model="claude-fable-5"), + _trace("h2", model="claude-fable-5"), + _trace("h3", model="claude-sonnet-5"), + ], + ) + deleted = await storage.delete_reasoning_traces_by_model(BRAIN, "claude-fable-5") + assert deleted == 2 + assert await storage.get_reasoning_trace_models(BRAIN) == ["claude-sonnet-5"] + # Empty model is a no-op (never a blanket wipe). + assert await storage.delete_reasoning_traces_by_model(BRAIN, "") == 0 + + +async def test_delete_reasoning_traces_by_model_in_memory() -> None: + # The in-memory backend is a real, selectable production backend — cover it too. + from surreal_memory.storage.memory_store import InMemoryStorage + + store = InMemoryStorage() + store.set_brain(BRAIN) + await store.insert_reasoning_traces( + BRAIN, + [_trace("h1", model="claude-fable-5"), _trace("h2", model="claude-sonnet-5")], + ) + assert await store.delete_reasoning_traces_by_model(BRAIN, "claude-fable-5") == 1 + assert await store.get_reasoning_trace_models(BRAIN) == ["claude-sonnet-5"] + assert await store.delete_reasoning_traces_by_model(BRAIN, "") == 0 + + async def test_traces_are_brain_scoped(storage: SQLiteStorage) -> None: await storage._ensure_conn().execute( "INSERT OR IGNORE INTO brains (id, name, config, created_at, updated_at) " diff --git a/tests/unit/test_route_reasoning_training.py b/tests/unit/test_route_reasoning_training.py new file mode 100644 index 00000000..7db40e5a --- /dev/null +++ b/tests/unit/test_route_reasoning_training.py @@ -0,0 +1,427 @@ +"""Tests for the reasoning-training dashboard router. + +Mirrors test_dashboard_api.py: a bare FastAPI app with just this router, storage +and brain injected via dependency_overrides. The router-level require_local_request +passes because TestClient's host is "testclient". Config is patched at +surreal_memory.unified_config.* (the handlers import get_config/set_config locally). +""" + +from __future__ import annotations + +from pathlib import Path +from types import SimpleNamespace +from typing import Any +from unittest.mock import AsyncMock + +import pytest +from fastapi import FastAPI +from fastapi.testclient import TestClient + +import surreal_memory.server.routes.reasoning_training as rt_module +from surreal_memory.core.brain import Brain +from surreal_memory.server.dependencies import get_brain, get_storage +from surreal_memory.server.routes.reasoning_training import router +from surreal_memory.unified_config import ReasoningTrainingConfig, UnifiedConfig + +BRAIN_ID = "default" + + +def _cfg(tmp_path: Path, **rt_kw: Any) -> UnifiedConfig: + return UnifiedConfig( + data_dir=tmp_path / ".surrealmemory", + current_brain=BRAIN_ID, + reasoning_training=ReasoningTrainingConfig(**rt_kw), + ) + + +def _fiber( + fid: str, + model: str, + category: str, + title: str = "t", + confidence: float = 1.0, + frequency: int = 3, + *, + pattern: bool = True, +) -> SimpleNamespace: + meta: dict[str, Any] = { + "_source_model": model, + "_reasoning_category": category, + "_reasoning_title": title, + "_reasoning_confidence": confidence, + "_reasoning_frequency": frequency, + "_reasoning_signature": f"sig-{fid}", + "_reasoning_strategy": "verify -> check", + "_reasoning_description": "medoid description", + } + if pattern: + meta["_reasoning_pattern"] = True + return SimpleNamespace(id=fid, summary=f"summary-{fid}", metadata=meta) + + +@pytest.fixture(autouse=True) +def _reset_mining_state() -> Any: + """Isolate the per-brain mining job state/tasks between tests.""" + rt_module._mining_tasks = {} + rt_module._mining_states = {} + yield + rt_module._mining_tasks = {} + rt_module._mining_states = {} + + +@pytest.fixture +def mock_storage() -> AsyncMock: + storage = AsyncMock() + storage.get_reasoning_stats = AsyncMock( + return_value={"by_model": {}, "by_category": {}, "total": 0, "unprocessed": 0} + ) + storage.find_fibers = AsyncMock(return_value=[]) + storage.get_fiber = AsyncMock(return_value=None) + storage.delete_fiber = AsyncMock(return_value=True) + storage.delete_reasoning_traces_by_model = AsyncMock(return_value=0) + return storage + + +@pytest.fixture +def client(mock_storage: AsyncMock) -> TestClient: + app = FastAPI() + app.include_router(router) + brain = Brain.create(BRAIN_ID, brain_id=BRAIN_ID) + app.dependency_overrides[get_storage] = lambda: mock_storage + app.dependency_overrides[get_brain] = lambda: brain + return TestClient(app) + + +# ── GET /status ─────────────────────────────────────────────────────────────── + + +def test_status_empty(client: TestClient, tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr("surreal_memory.unified_config.get_config", lambda: _cfg(tmp_path)) + resp = client.get("/api/dashboard/reasoning/status") + assert resp.status_code == 200 + data = resp.json() + assert data["total_traces"] == 0 + assert data["total_patterns"] == 0 + assert data["detected_models"] == [] + assert data["mining"]["running"] is False + assert data["config"]["mining_enabled"] is False + + +def test_status_with_traces_and_patterns( + client: TestClient, mock_storage: AsyncMock, tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + monkeypatch.setattr("surreal_memory.unified_config.get_config", lambda: _cfg(tmp_path)) + mock_storage.get_reasoning_stats.return_value = { + "by_model": { + "claude-fable-5": { + "trace_count": 5, + "unprocessed": 2, + "last_trace_at": "2026-07-17T10:00:00", + } + }, + "by_category": {"debugging": 5}, + "total": 5, + "unprocessed": 2, + } + # 3 debugging patterns (>= min_patterns_per_category=3) → debugging covered. + mock_storage.find_fibers.return_value = [ + _fiber("p1", "claude-fable-5", "debugging"), + _fiber("p2", "claude-fable-5", "debugging"), + _fiber("p3", "claude-fable-5", "debugging"), + _fiber("p4", "claude-fable-5", "planning"), + ] + resp = client.get("/api/dashboard/reasoning/status") + assert resp.status_code == 200 + data = resp.json() + assert data["total_traces"] == 5 + assert data["total_patterns"] == 4 + assert "claude-fable-5" in data["detected_models"] + fable = next(m for m in data["per_model"] if m["model"] == "claude-fable-5") + assert fable["trace_count"] == 5 + assert fable["pattern_count"] == 4 + assert fable["has_thinking_text"] is True + assert fable["coverage_percent"] == pytest.approx(12.5) # 1 of 8 categories + cov = {c["category"]: c["covered"] for c in data["coverage_by_model"]["claude-fable-5"]} + assert cov["debugging"] is True + assert cov["planning"] is False + + +def test_status_denylisted_model_has_no_thinking( + client: TestClient, mock_storage: AsyncMock, tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + monkeypatch.setattr("surreal_memory.unified_config.get_config", lambda: _cfg(tmp_path)) + mock_storage.get_reasoning_stats.return_value = { + "by_model": {"claude-opus-4-8": {"trace_count": 0, "unprocessed": 0, "last_trace_at": ""}}, + "by_category": {}, + "total": 0, + "unprocessed": 0, + } + resp = client.get("/api/dashboard/reasoning/status") + data = resp.json() + opus = next(m for m in data["per_model"] if m["model"] == "claude-opus-4-8") + assert opus["has_thinking_text"] is False + + +# ── PUT /config ─────────────────────────────────────────────────────────────── + + +@pytest.fixture +def config_capture(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> dict[str, Any]: + """Patch get_config/set_config and stub save() so PUT /config never hits disk.""" + holder: dict[str, Any] = {"cfg": _cfg(tmp_path), "saved": None} + monkeypatch.setattr("surreal_memory.unified_config.get_config", lambda *_a, **_k: holder["cfg"]) + monkeypatch.setattr("surreal_memory.unified_config.set_config", lambda c: holder.update(cfg=c)) + monkeypatch.setattr(UnifiedConfig, "save", lambda self: holder.update(saved=self)) + return holder + + +def test_config_toggle_mining(client: TestClient, config_capture: dict[str, Any]) -> None: + resp = client.put("/api/dashboard/reasoning/config", json={"mining_enabled": True}) + assert resp.status_code == 200 + assert resp.json()["config"]["mining_enabled"] is True + assert config_capture["cfg"].reasoning_training.mining_enabled is True + assert config_capture["saved"] is not None # persisted + + +def test_config_rejects_model_without_thinking( + client: TestClient, config_capture: dict[str, Any] +) -> None: + resp = client.put( + "/api/dashboard/reasoning/config", json={"mining_models": ["claude-opus-4-8"]} + ) + assert resp.status_code == 422 + assert "thinking" in resp.json()["detail"].lower() + + +def test_config_rejects_injection_source_without_thinking( + client: TestClient, config_capture: dict[str, Any] +) -> None: + resp = client.put( + "/api/dashboard/reasoning/config", + json={"injection_map": {"claude-fable-5": "claude-opus-4-8"}}, + ) + assert resp.status_code == 422 + + +def test_config_allows_denylisted_target( + client: TestClient, config_capture: dict[str, Any] +) -> None: + # opus is a valid injection TARGET (recipient); fable is a thinking source. + resp = client.put( + "/api/dashboard/reasoning/config", + json={"injection_map": {"claude-opus-4-8": "claude-fable-5"}}, + ) + assert resp.status_code == 200 + assert config_capture["cfg"].reasoning_training.injection_map == ( + ("claude-opus-4-8", "claude-fable-5"), + ) + + +def test_config_allows_self_mapping(client: TestClient, config_capture: dict[str, Any]) -> None: + resp = client.put( + "/api/dashboard/reasoning/config", + json={"injection_map": {"claude-fable-5": "claude-fable-5"}}, + ) + assert resp.status_code == 200 + + +def test_config_min_confidence_out_of_range( + client: TestClient, config_capture: dict[str, Any] +) -> None: + resp = client.put("/api/dashboard/reasoning/config", json={"min_confidence": 1.5}) + assert resp.status_code == 422 + + +def test_config_rejects_bad_model_name(client: TestClient, config_capture: dict[str, Any]) -> None: + resp = client.put("/api/dashboard/reasoning/config", json={"mining_models": ["bad name!;drop"]}) + assert resp.status_code == 422 + + +def test_config_rejects_glob_injection_source( + client: TestClient, config_capture: dict[str, Any] +) -> None: + # Source is matched literally, so a glob source would silently never match. + resp = client.put( + "/api/dashboard/reasoning/config", + json={"injection_map": {"claude-opus-4-8": "claude-*"}}, + ) + assert resp.status_code == 422 + assert "literal" in resp.json()["detail"].lower() + + +def test_config_rejects_empty_categories( + client: TestClient, config_capture: dict[str, Any] +) -> None: + resp = client.put("/api/dashboard/reasoning/config", json={"categories": []}) + assert resp.status_code == 422 + + +def test_config_rejects_bad_category_name( + client: TestClient, config_capture: dict[str, Any] +) -> None: + resp = client.put("/api/dashboard/reasoning/config", json={"categories": ['bad"; drop']}) + assert resp.status_code == 422 + + +# ── POST /mine ──────────────────────────────────────────────────────────────── + + +def test_mine_disabled_returns_400( + client: TestClient, tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + monkeypatch.setattr("surreal_memory.unified_config.get_config", lambda: _cfg(tmp_path)) + resp = client.post("/api/dashboard/reasoning/mine", json={}) + assert resp.status_code == 400 + + +def test_mine_starts_when_enabled( + client: TestClient, tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + monkeypatch.setattr( + "surreal_memory.unified_config.get_config", + lambda: _cfg(tmp_path, mining_enabled=True), + ) + + async def _noop(*_a: Any, **_k: Any) -> None: + return None + + monkeypatch.setattr(rt_module, "_run_mining", _noop) + resp = client.post("/api/dashboard/reasoning/mine", json={"backfill": True}) + assert resp.status_code == 202 + body = resp.json() + assert body["status"] == "started" + assert body["mining"]["running"] is True + + +def test_mine_conflict_when_already_running( + client: TestClient, tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + monkeypatch.setattr( + "surreal_memory.unified_config.get_config", + lambda: _cfg(tmp_path, mining_enabled=True), + ) + monkeypatch.setattr(rt_module, "_mining_tasks", {BRAIN_ID: SimpleNamespace(done=lambda: False)}) + resp = client.post("/api/dashboard/reasoning/mine", json={}) + assert resp.status_code == 409 + + +def test_mine_isolated_per_brain( + client: TestClient, tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + # A running job on a DIFFERENT brain must neither block nor leak status into + # the requested brain (this client is scoped to BRAIN_ID="default"). + other_running = rt_module._idle_mining_state() + other_running.update(running=True, traces_ingested=99) + monkeypatch.setattr( + rt_module, "_mining_tasks", {"other-brain": SimpleNamespace(done=lambda: False)} + ) + monkeypatch.setattr(rt_module, "_mining_states", {"other-brain": other_running}) + + # GET /status for `default` does not see other-brain's job. + monkeypatch.setattr("surreal_memory.unified_config.get_config", lambda: _cfg(tmp_path)) + status = client.get("/api/dashboard/reasoning/status").json() + assert status["mining"]["running"] is False + assert status["mining"]["traces_ingested"] == 0 + + # POST /mine for `default` is not blocked by other-brain's running job. + monkeypatch.setattr( + "surreal_memory.unified_config.get_config", + lambda: _cfg(tmp_path, mining_enabled=True), + ) + + async def _noop(*_a: Any, **_k: Any) -> None: + return None + + monkeypatch.setattr(rt_module, "_run_mining", _noop) + assert client.post("/api/dashboard/reasoning/mine", json={}).status_code == 202 + + +# ── GET/DELETE patterns ─────────────────────────────────────────────────────── + + +def test_list_patterns_filters_and_ranks(client: TestClient, mock_storage: AsyncMock) -> None: + mock_storage.find_fibers.return_value = [ + _fiber("p1", "claude-fable-5", "debugging", confidence=0.5, frequency=2), + _fiber("p2", "claude-fable-5", "planning", confidence=1.0, frequency=3), + _fiber("p3", "claude-sonnet-5", "debugging", confidence=1.0, frequency=1), + ] + resp = client.get("/api/dashboard/reasoning/patterns", params={"model": "claude-fable-5"}) + assert resp.status_code == 200 + data = resp.json() + assert data["total"] == 2 + # Higher confidence*frequency ranks first (p2: 3.0 > p1: 1.0). + assert data["patterns"][0]["id"] == "p2" + + +def test_list_patterns_pagination(client: TestClient, mock_storage: AsyncMock) -> None: + mock_storage.find_fibers.return_value = [ + _fiber(f"p{i}", "claude-fable-5", "debugging", frequency=i) for i in range(5) + ] + resp = client.get("/api/dashboard/reasoning/patterns", params={"limit": 2, "offset": 0}) + data = resp.json() + assert data["total"] == 5 + assert len(data["patterns"]) == 2 + assert data["limit"] == 2 + + +def test_get_pattern_detail(client: TestClient, mock_storage: AsyncMock) -> None: + mock_storage.get_fiber.return_value = _fiber( + "p1", "claude-fable-5", "debugging", title="verify" + ) + resp = client.get("/api/dashboard/reasoning/patterns/p1") + assert resp.status_code == 200 + data = resp.json() + assert data["title"] == "verify" + assert data["strategy"] == "verify -> check" + assert data["description"] == "medoid description" + + +def test_get_pattern_404_for_non_pattern(client: TestClient, mock_storage: AsyncMock) -> None: + mock_storage.get_fiber.return_value = _fiber("x", "m", "c", pattern=False) + resp = client.get("/api/dashboard/reasoning/patterns/x") + assert resp.status_code == 404 + + +def test_delete_pattern(client: TestClient, mock_storage: AsyncMock) -> None: + mock_storage.get_fiber.return_value = _fiber("p1", "claude-fable-5", "debugging") + resp = client.request("DELETE", "/api/dashboard/reasoning/patterns/p1") + assert resp.status_code == 200 + assert resp.json()["deleted"] == 1 + mock_storage.delete_fiber.assert_awaited_once_with("p1") + + +def test_delete_pattern_404(client: TestClient, mock_storage: AsyncMock) -> None: + mock_storage.get_fiber.return_value = None + resp = client.request("DELETE", "/api/dashboard/reasoning/patterns/nope") + assert resp.status_code == 404 + + +def test_delete_patterns_by_model(client: TestClient, mock_storage: AsyncMock) -> None: + mock_storage.find_fibers.return_value = [ + _fiber("p1", "claude-fable-5", "debugging"), + _fiber("p2", "claude-fable-5", "planning"), + _fiber("p3", "claude-sonnet-5", "debugging"), + ] + resp = client.request( + "DELETE", "/api/dashboard/reasoning/patterns", params={"model": "claude-fable-5"} + ) + assert resp.status_code == 200 + assert resp.json()["deleted"] == 2 + assert mock_storage.delete_fiber.await_count == 2 + + +def test_delete_traces_by_model(client: TestClient, mock_storage: AsyncMock) -> None: + mock_storage.delete_reasoning_traces_by_model.return_value = 7 + resp = client.request( + "DELETE", "/api/dashboard/reasoning/traces", params={"model": "claude-fable-5"} + ) + assert resp.status_code == 200 + assert resp.json()["deleted"] == 7 + mock_storage.delete_reasoning_traces_by_model.assert_awaited_once_with( + BRAIN_ID, "claude-fable-5" + ) + + +def test_delete_traces_requires_model(client: TestClient) -> None: + resp = client.request("DELETE", "/api/dashboard/reasoning/traces") + assert resp.status_code == 422 # missing required query param diff --git a/tests/unit/test_surrealdb_reasoning_traces.py b/tests/unit/test_surrealdb_reasoning_traces.py index 455b14a1..6f96e150 100644 --- a/tests/unit/test_surrealdb_reasoning_traces.py +++ b/tests/unit/test_surrealdb_reasoning_traces.py @@ -54,6 +54,8 @@ async def _query(self, sql: str, **params: Any) -> list[dict[str, Any]]: if params.get("model"): rows = [r for r in rows if r.get("model") == params["model"]] return rows + if "AND model = $model GROUP ALL" in sql: + return [{"c": c.get("del_count", 0)}] if "processed = true AND created_at < $cutoff GROUP ALL" in sql: return [{"c": c.get("prune_count", 0)}] if "count() AS c FROM reasoning_traces WHERE brain_id = $bid GROUP ALL" in sql: @@ -108,6 +110,23 @@ async def test_insert_empty_returns_zero() -> None: assert store.inserts == [] +async def test_delete_by_model_counts_and_deletes() -> None: + store = _RTStore(del_count=3) + n = await store.delete_reasoning_traces_by_model("default", "claude-fable-5") + assert n == 3 + # A parameterized DELETE was issued for that model (no string interpolation). + assert any( + sql.startswith("DELETE reasoning_traces") and p.get("model") == "claude-fable-5" + for sql, p in store.queries + ) + + +async def test_delete_by_model_empty_is_noop() -> None: + store = _RTStore(del_count=99) + assert await store.delete_reasoning_traces_by_model("default", "") == 0 + assert store.queries == [] # short-circuits before issuing any query + + async def test_insert_truncates_task_context_and_computes_chars() -> None: store = _RTStore() await store.insert_reasoning_traces( From 398a74decebadd6d3a8677cf56b023cd8189a7aa Mon Sep 17 00:00:00 2001 From: Toni Nowak Date: Fri, 17 Jul 2026 15:26:57 +0200 Subject: [PATCH 08/12] feat: reasoning training dashboard page (U8) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dashboard/src/features/reasoning/: ReasoningPage (KPI cards, per-model coverage bars + per-category badges, empty/loading/error states) composing MiningConfigCard (mining toggle, per-model source checkboxes disabled for no-thinking models, Run mining with backfill + 409/400 handling, per-model trace wipe), InjectionMappingCard (injection toggle, source→target rows with stable-id keys, duplicate-target guard), and PatternsTable (model/category filters, pagination with shrink-clamp, per-pattern and per-model delete via ConfirmDialog). api/hooks/useReasoning.ts: status (polls 3s while mining runs), optimistic config update (no toggle flicker), trigger mining, patterns list, and pattern/traces deletes with correct cache invalidation. api/client.ts: apiErrorMessage() parses FastAPI {detail} so toasts show the message, not raw JSON. api/types.ts: interfaces mirroring the U7 Pydantic models. Wired route (App.tsx), nav (Sidebar.tsx, GraduationCap), and i18n (en.json). Rebuilt static/dist. Patterns table refreshes when a mining run finishes. e2e (dashboard/e2e/reasoning.spec.ts, 2 tests) passes; tsc + eslint clean. react-reviewer APPROVE (2 HIGH + 5 MED fixed). --- dashboard/.gitignore | 5 + dashboard/e2e/reasoning.spec.ts | 180 ++++++++++++++ dashboard/src/App.tsx | 9 + dashboard/src/api/client.ts | 18 ++ dashboard/src/api/hooks/useReasoning.ts | 114 +++++++++ dashboard/src/api/types.ts | 127 ++++++++++ dashboard/src/components/layout/Sidebar.tsx | 2 + .../reasoning/InjectionMappingCard.tsx | 180 ++++++++++++++ .../features/reasoning/MiningConfigCard.tsx | 185 ++++++++++++++ .../src/features/reasoning/PatternsTable.tsx | 231 ++++++++++++++++++ .../src/features/reasoning/ReasoningPage.tsx | 140 +++++++++++ dashboard/src/i18n/en.json | 68 +++++- ...e-7MxRvurw.js => DiagramsPage-ClJ9QIg8.js} | 2 +- ...-_rzMyZka.js => EvolutionPage-C6VI1EZi.js} | 2 +- ...Page-DnkZu_wH.js => GraphPage-B5RqF55O.js} | 2 +- ...age-WgJz4uYi.js => HealthPage-DoDlPq43.js} | 2 +- .../static/dist/assets/OraclePage-BOi3rQAz.js | 1 + .../static/dist/assets/OraclePage-zAsy8lB5.js | 1 - .../dist/assets/OverviewPage-Bd8oQbjM.js | 1 - .../dist/assets/OverviewPage-BixPEj84.js | 1 + ...roGate-wWiPatWA.js => ProGate-DjphnyL3.js} | 2 +- .../dist/assets/ReasoningPage-BjC1wtHj.js | 1 + ...e-BD10gAE1.js => SettingsPage-CcFz-Brq.js} | 2 +- ...ge-B_CEarTZ.js => StoragePage-BsRzooql.js} | 2 +- ...cPage-XGbJa_ff.js => SyncPage-BRERoUGJ.js} | 2 +- ...e-ByrSgpuo.js => TimelinePage-2mV1L6iZ.js} | 2 +- ...-C3TV9sEV.js => ToolStatsPage-yrXaz2Sj.js} | 2 +- .../dist/assets/UncertaintyPage-B1-YQ66j.js | 1 - .../dist/assets/UncertaintyPage-CdFbDPD5.js | 1 + .../dist/assets/VisualizePage-6HaaRoFH.js | 2 - .../dist/assets/VisualizePage-CayiR_fG.js | 2 + .../{card-DAwbJLqc.js => card-Duzfr-hx.js} | 2 +- .../dist/assets/confirm-dialog-DE0Sgk6_.js | 1 + .../static/dist/assets/index-BgBv2qcr.css | 1 + .../static/dist/assets/index-CSMoVcy_.js | 54 ---- .../static/dist/assets/index-Cc1YGEOX.css | 1 - .../static/dist/assets/index-DXL5wCpD.js | 54 ++++ .../static/dist/assets/skeleton-CAu64_35.js | 1 - .../static/dist/assets/skeleton-CBW-y0cP.js | 1 + .../dist/assets/vendor-icons-C6dhS1UE.js | 1 + .../dist/assets/vendor-icons-IAbuZhWE.js | 1 - .../server/static/dist/index.html | 6 +- 42 files changed, 1336 insertions(+), 77 deletions(-) create mode 100644 dashboard/e2e/reasoning.spec.ts create mode 100644 dashboard/src/api/hooks/useReasoning.ts create mode 100644 dashboard/src/features/reasoning/InjectionMappingCard.tsx create mode 100644 dashboard/src/features/reasoning/MiningConfigCard.tsx create mode 100644 dashboard/src/features/reasoning/PatternsTable.tsx create mode 100644 dashboard/src/features/reasoning/ReasoningPage.tsx rename src/surreal_memory/server/static/dist/assets/{DiagramsPage-7MxRvurw.js => DiagramsPage-ClJ9QIg8.js} (99%) rename src/surreal_memory/server/static/dist/assets/{EvolutionPage-_rzMyZka.js => EvolutionPage-C6VI1EZi.js} (83%) rename src/surreal_memory/server/static/dist/assets/{GraphPage-DnkZu_wH.js => GraphPage-B5RqF55O.js} (99%) rename src/surreal_memory/server/static/dist/assets/{HealthPage-WgJz4uYi.js => HealthPage-DoDlPq43.js} (82%) create mode 100644 src/surreal_memory/server/static/dist/assets/OraclePage-BOi3rQAz.js delete mode 100644 src/surreal_memory/server/static/dist/assets/OraclePage-zAsy8lB5.js delete mode 100644 src/surreal_memory/server/static/dist/assets/OverviewPage-Bd8oQbjM.js create mode 100644 src/surreal_memory/server/static/dist/assets/OverviewPage-BixPEj84.js rename src/surreal_memory/server/static/dist/assets/{ProGate-wWiPatWA.js => ProGate-DjphnyL3.js} (71%) create mode 100644 src/surreal_memory/server/static/dist/assets/ReasoningPage-BjC1wtHj.js rename src/surreal_memory/server/static/dist/assets/{SettingsPage-BD10gAE1.js => SettingsPage-CcFz-Brq.js} (93%) rename src/surreal_memory/server/static/dist/assets/{StoragePage-B_CEarTZ.js => StoragePage-BsRzooql.js} (88%) rename src/surreal_memory/server/static/dist/assets/{SyncPage-XGbJa_ff.js => SyncPage-BRERoUGJ.js} (92%) rename src/surreal_memory/server/static/dist/assets/{TimelinePage-ByrSgpuo.js => TimelinePage-2mV1L6iZ.js} (87%) rename src/surreal_memory/server/static/dist/assets/{ToolStatsPage-C3TV9sEV.js => ToolStatsPage-yrXaz2Sj.js} (95%) delete mode 100644 src/surreal_memory/server/static/dist/assets/UncertaintyPage-B1-YQ66j.js create mode 100644 src/surreal_memory/server/static/dist/assets/UncertaintyPage-CdFbDPD5.js delete mode 100644 src/surreal_memory/server/static/dist/assets/VisualizePage-6HaaRoFH.js create mode 100644 src/surreal_memory/server/static/dist/assets/VisualizePage-CayiR_fG.js rename src/surreal_memory/server/static/dist/assets/{card-DAwbJLqc.js => card-Duzfr-hx.js} (86%) create mode 100644 src/surreal_memory/server/static/dist/assets/confirm-dialog-DE0Sgk6_.js create mode 100644 src/surreal_memory/server/static/dist/assets/index-BgBv2qcr.css delete mode 100644 src/surreal_memory/server/static/dist/assets/index-CSMoVcy_.js delete mode 100644 src/surreal_memory/server/static/dist/assets/index-Cc1YGEOX.css create mode 100644 src/surreal_memory/server/static/dist/assets/index-DXL5wCpD.js delete mode 100644 src/surreal_memory/server/static/dist/assets/skeleton-CAu64_35.js create mode 100644 src/surreal_memory/server/static/dist/assets/skeleton-CBW-y0cP.js create mode 100644 src/surreal_memory/server/static/dist/assets/vendor-icons-C6dhS1UE.js delete mode 100644 src/surreal_memory/server/static/dist/assets/vendor-icons-IAbuZhWE.js diff --git a/dashboard/.gitignore b/dashboard/.gitignore index a547bf36..8d354d3d 100755 --- a/dashboard/.gitignore +++ b/dashboard/.gitignore @@ -22,3 +22,8 @@ dist-ssr *.njsproj *.sln *.sw? + +# Playwright transient outputs (not baselines) +test-results +playwright-report +e2e/__screenshots__ diff --git a/dashboard/e2e/reasoning.spec.ts b/dashboard/e2e/reasoning.spec.ts new file mode 100644 index 00000000..91070de8 --- /dev/null +++ b/dashboard/e2e/reasoning.spec.ts @@ -0,0 +1,180 @@ +import { test, expect, type Page } from "@playwright/test" + +/** + * Browser QA for the U8 "Reasoning Training" dashboard page + * (features/reasoning/ReasoningPage.tsx, route /reasoning, nav key `nav.reasoningTraining`). + * + * No backend runs on :8000 here, so every API call is intercepted and fulfilled with static + * JSON. main.tsx mounts , so navigations target /ui/. + */ + +const CATEGORIES = [ + "debugging", + "planning", + "implementation", + "refactoring", + "research", + "verification", + "architecture", + "data-analysis", +] + +const STATUS_BODY = { + config: { + mining_enabled: true, + injection_enabled: false, + mining_models: [], + injection_map: {}, + categories: CATEGORIES, + min_trace_chars: 200, + max_trace_chars: 20000, + max_traces_per_scan: 500, + scan_lookback_days: 30, + retention_days: 90, + max_traces_total: 20000, + min_cluster_support: 3, + max_patterns_per_run: 10, + min_confidence: 0.2, + min_patterns_per_category: 3, + injection_max_patterns: 5, + injection_max_chars: 4000, + distill_use_llm: false, + redact_secrets: true, + }, + detected_models: ["claude-fable-5"], + per_model: [ + { + model: "claude-fable-5", + trace_count: 5, + unprocessed: 2, + pattern_count: 3, + has_thinking_text: true, + last_trace_at: "2026-07-17T10:00:00", + coverage_percent: 12.5, + }, + ], + coverage_by_model: { + "claude-fable-5": CATEGORIES.map((c) => ({ + category: c, + pattern_count: c === "debugging" ? 3 : 0, + covered: c === "debugging", + })), + }, + total_traces: 5, + unprocessed_traces: 2, + total_patterns: 3, + mining: { + running: false, + started_at: null, + finished_at: null, + traces_ingested: 0, + patterns_learned: 0, + dry_run: false, + error: null, + }, +} + +const PATTERNS_BODY = { + patterns: [ + { + id: "p1", + source_model: "claude-fable-5", + category: "debugging", + title: "restate then verify", + confidence: 1.0, + frequency: 3, + signature: "sig1", + }, + ], + total: 1, + limit: 20, + offset: 0, +} + +const HEALTH_REPORT = { + grade: "A", + purity_score: 0.9, + connectivity: 0.8, + diversity: 0.7, + freshness: 0.85, + consolidation_ratio: 0.5, + orphan_rate: 0.1, + activation_efficiency: 0.6, + recall_confidence: 0.75, + neuron_count: 100, + synapse_count: 200, + fiber_count: 50, + contradiction_count: 3, + conflict_rate: 0.12, + warnings: [], + recommendations: [], + top_penalties: [], +} + +function json(body: unknown) { + return { status: 200, contentType: "application/json", body: JSON.stringify(body) } +} + +async function installMocks(page: Page) { + await page.route("**/api/dashboard/**", (route) => route.fulfill(json({}))) + await page.route("**/api/dashboard/stats", (route) => + route.fulfill(json({ active_brain: "test-brain" })), + ) + await page.route("**/api/dashboard/brains", (route) => route.fulfill(json([]))) + await page.route("**/api/dashboard/fibers", (route) => route.fulfill(json({ fibers: [] }))) + await page.route("**/api/dashboard/health", (route) => route.fulfill(json(HEALTH_REPORT))) + await page.route( + (url) => url.pathname === "/health", + (route) => route.fulfill(json({ status: "ok", version: "test" })), + ) + // Patterns must be registered before status so the more specific glob wins + // (Playwright checks handlers last-registered-first). + await page.route("**/api/dashboard/reasoning/patterns**", (route) => + route.fulfill(json(PATTERNS_BODY)), + ) + await page.route("**/api/dashboard/reasoning/status", (route) => + route.fulfill(json(STATUS_BODY)), + ) +} + +test.describe("U8 Reasoning Training page", () => { + test("renders populated reasoning content", async ({ page }) => { + await installMocks(page) + await page.goto("/ui/reasoning") + + await expect( + page.getByRole("heading", { level: 1, name: "Reasoning Training" }), + ).toBeVisible({ timeout: 20_000 }) + + // KPI cards. + await expect(page.getByText("Total traces")).toBeVisible() + await expect(page.getByText("Learned patterns")).toBeVisible() + + // Coverage + config cards show the detected model. + await expect(page.getByText("claude-fable-5").first()).toBeVisible() + await expect(page.getByText("12.5%")).toBeVisible() + + // Patterns table row. + await expect(page.getByText("restate then verify")).toBeVisible() + + // No raw untranslated i18n keys should leak into the DOM. + await expect(page.getByText(/reasoning\.[a-zA-Z]/)).toHaveCount(0) + + await page.screenshot({ path: "e2e/__screenshots__/reasoning.png", fullPage: true }) + }) + + test("sidebar Reasoning Training nav link navigates from another route", async ({ page }) => { + await installMocks(page) + await page.goto("/ui/health") + await expect(page.getByRole("navigation")).toBeVisible({ timeout: 20_000 }) + + const link = page.getByRole("navigation").getByRole("link", { name: "Reasoning Training" }) + await expect(link).toBeVisible() + await link.click() + + await expect(page).toHaveURL(/\/ui\/reasoning$/) + await expect( + page.getByRole("heading", { level: 1, name: "Reasoning Training" }), + ).toBeVisible() + }) +}) diff --git a/dashboard/src/App.tsx b/dashboard/src/App.tsx index d1962367..a7d198f6 100755 --- a/dashboard/src/App.tsx +++ b/dashboard/src/App.tsx @@ -16,6 +16,7 @@ const OraclePage = lazy(() => import("@/features/oracle/OraclePage")) const ToolStatsPage = lazy(() => import("@/features/tool-stats/ToolStatsPage")) const VisualizePage = lazy(() => import("@/features/visualize/VisualizePage")) const StoragePage = lazy(() => import("@/features/storage/StoragePage")) +const ReasoningPage = lazy(() => import("@/features/reasoning/ReasoningPage")) export default function App() { return ( @@ -125,6 +126,14 @@ export default function App() { } /> + }> + + + } + /> } /> diff --git a/dashboard/src/api/client.ts b/dashboard/src/api/client.ts index 4723b685..b5d47734 100755 --- a/dashboard/src/api/client.ts +++ b/dashboard/src/api/client.ts @@ -60,4 +60,22 @@ export const api = { request(path, { ...options, method: "DELETE" }), } +/** + * Extract a human-readable message from an ApiError. FastAPI returns + * `{"detail": "..."}` bodies, which `request()` stores verbatim as the error + * message — parse it out so toasts show the message, not raw JSON. + */ +export function apiErrorMessage(err: unknown, fallback: string): string { + if (err instanceof ApiError) { + try { + const parsed = JSON.parse(err.message) + if (parsed && typeof parsed.detail === "string") return parsed.detail + } catch { + /* body was not JSON — fall through to the raw text */ + } + return err.message || fallback + } + return fallback +} + export { ApiError } diff --git a/dashboard/src/api/hooks/useReasoning.ts b/dashboard/src/api/hooks/useReasoning.ts new file mode 100644 index 00000000..1aa0b7b7 --- /dev/null +++ b/dashboard/src/api/hooks/useReasoning.ts @@ -0,0 +1,114 @@ +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" +import { api } from "@/api/client" +import type { + MineRequest, + MineResponse, + PatternsListResponse, + ReasoningConfig, + ReasoningConfigUpdate, + ReasoningConfigUpdateResponse, + ReasoningDeleteResponse, + ReasoningStatusResponse, +} from "@/api/types" + +const keys = { + status: ["reasoning", "status"] as const, + patterns: ["reasoning", "patterns"] as const, + patternList: (model: string, category: string, limit: number, offset: number) => + ["reasoning", "patterns", model, category, limit, offset] as const, +} + +export function useReasoningStatus() { + return useQuery({ + queryKey: keys.status, + queryFn: () => api.get("/api/dashboard/reasoning/status"), + // Poll while a mining job is running so counts/coverage update live. + refetchInterval: (query) => (query.state.data?.mining.running ? 3000 : false), + }) +} + +export function useUpdateReasoningConfig() { + const queryClient = useQueryClient() + return useMutation({ + mutationFn: (body: ReasoningConfigUpdate) => + api.put("/api/dashboard/reasoning/config", body), + // Optimistically patch the cached status so toggles/checkboxes don't briefly + // revert to the old value in the window before the refetch lands. + onMutate: async (body) => { + await queryClient.cancelQueries({ queryKey: keys.status }) + const prev = queryClient.getQueryData(keys.status) + if (prev) { + queryClient.setQueryData(keys.status, { + ...prev, + config: { ...prev.config, ...body } as ReasoningConfig, + }) + } + return { prev } + }, + onError: (_err, _body, context) => { + if (context?.prev) queryClient.setQueryData(keys.status, context.prev) + }, + onSettled: () => queryClient.invalidateQueries({ queryKey: keys.status }), + }) +} + +export function useTriggerMining() { + const queryClient = useQueryClient() + return useMutation({ + mutationFn: (body: MineRequest) => + api.post("/api/dashboard/reasoning/mine", body), + onSuccess: () => queryClient.invalidateQueries({ queryKey: keys.status }), + }) +} + +export function useReasoningPatterns(model = "", category = "", limit = 50, offset = 0) { + const params = new URLSearchParams() + if (model) params.set("model", model) + if (category) params.set("category", category) + params.set("limit", String(limit)) + params.set("offset", String(offset)) + return useQuery({ + queryKey: keys.patternList(model, category, limit, offset), + queryFn: () => + api.get(`/api/dashboard/reasoning/patterns?${params.toString()}`), + }) +} + +export function useDeleteReasoningPattern() { + const queryClient = useQueryClient() + return useMutation({ + mutationFn: (id: string) => + api.delete( + `/api/dashboard/reasoning/patterns/${encodeURIComponent(id)}`, + ), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: keys.status }) + queryClient.invalidateQueries({ queryKey: keys.patterns }) + }, + }) +} + +export function useDeletePatternsByModel() { + const queryClient = useQueryClient() + return useMutation({ + mutationFn: (model: string) => + api.delete( + `/api/dashboard/reasoning/patterns?model=${encodeURIComponent(model)}`, + ), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: keys.status }) + queryClient.invalidateQueries({ queryKey: keys.patterns }) + }, + }) +} + +export function useWipeTraces() { + const queryClient = useQueryClient() + return useMutation({ + mutationFn: (model: string) => + api.delete( + `/api/dashboard/reasoning/traces?model=${encodeURIComponent(model)}`, + ), + onSuccess: () => queryClient.invalidateQueries({ queryKey: keys.status }), + }) +} diff --git a/dashboard/src/api/types.ts b/dashboard/src/api/types.ts index bf29d003..3700a72f 100755 --- a/dashboard/src/api/types.ts +++ b/dashboard/src/api/types.ts @@ -474,3 +474,130 @@ export interface UncertaintyOverview { scan: UncertaintyScan samples: UncertaintySamples } + +/* ------------------------------------------------------------------ */ +/* Reasoning training (matches server/routes/reasoning_training.py) */ +/* ------------------------------------------------------------------ */ + +export interface ReasoningConfig { + mining_enabled: boolean + injection_enabled: boolean + mining_models: string[] + injection_map: Record + categories: string[] + min_trace_chars: number + max_trace_chars: number + max_traces_per_scan: number + scan_lookback_days: number + retention_days: number + max_traces_total: number + min_cluster_support: number + max_patterns_per_run: number + min_confidence: number + min_patterns_per_category: number + injection_max_patterns: number + injection_max_chars: number + distill_use_llm: boolean + redact_secrets: boolean +} + +export interface ModelTraceStats { + model: string + trace_count: number + unprocessed: number + pattern_count: number + has_thinking_text: boolean + last_trace_at: string | null + coverage_percent: number +} + +export interface CategoryCoverage { + category: string + pattern_count: number + covered: boolean +} + +export interface MiningJobState { + running: boolean + started_at: string | null + finished_at: string | null + traces_ingested: number + patterns_learned: number + dry_run: boolean + error: string | null +} + +// GET /api/dashboard/reasoning/status +export interface ReasoningStatusResponse { + config: ReasoningConfig + detected_models: string[] + per_model: ModelTraceStats[] + coverage_by_model: Record + total_traces: number + unprocessed_traces: number + total_patterns: number + mining: MiningJobState +} + +// PUT /api/dashboard/reasoning/config (all fields optional) +export interface ReasoningConfigUpdate { + mining_enabled?: boolean + injection_enabled?: boolean + mining_models?: string[] + injection_map?: Record + categories?: string[] + scan_lookback_days?: number + retention_days?: number + max_traces_total?: number + min_cluster_support?: number + max_patterns_per_run?: number + min_confidence?: number + min_patterns_per_category?: number + injection_max_patterns?: number + injection_max_chars?: number +} + +export interface ReasoningConfigUpdateResponse { + status: string + config: ReasoningConfig +} + +// POST /api/dashboard/reasoning/mine +export interface MineRequest { + backfill?: boolean + dry_run?: boolean + models?: string[] +} + +export interface MineResponse { + status: string + mining: MiningJobState +} + +export interface PatternSummary { + id: string + source_model: string + category: string + title: string + confidence: number + frequency: number + signature: string +} + +export interface PatternDetail extends PatternSummary { + strategy: string + description: string + summary: string +} + +// GET /api/dashboard/reasoning/patterns +export interface PatternsListResponse { + patterns: PatternSummary[] + total: number + limit: number + offset: number +} + +export interface ReasoningDeleteResponse { + deleted: number +} diff --git a/dashboard/src/components/layout/Sidebar.tsx b/dashboard/src/components/layout/Sidebar.tsx index 2320719b..8be03780 100755 --- a/dashboard/src/components/layout/Sidebar.tsx +++ b/dashboard/src/components/layout/Sidebar.tsx @@ -14,6 +14,7 @@ import { Sparkle, ChartBar, ChartLine, + GraduationCap, } from "@phosphor-icons/react" import { cn } from "@/lib/utils" import { useLayoutStore } from "@/stores/useLayoutStore" @@ -30,6 +31,7 @@ const navItems = [ { to: "/sync", icon: Cloud, labelKey: "nav.sync" }, { to: "/oracle", icon: Sparkle, labelKey: "nav.oracle" }, { to: "/tool-stats", icon: ChartBar, labelKey: "nav.toolStats" }, + { to: "/reasoning", icon: GraduationCap, labelKey: "nav.reasoningTraining" }, { to: "/visualize", icon: ChartLine, labelKey: "nav.visualize" }, { to: "/storage", icon: HardDrive, labelKey: "nav.storage" }, { to: "/settings", icon: Gear, labelKey: "nav.settings" }, diff --git a/dashboard/src/features/reasoning/InjectionMappingCard.tsx b/dashboard/src/features/reasoning/InjectionMappingCard.tsx new file mode 100644 index 00000000..3dde6e1a --- /dev/null +++ b/dashboard/src/features/reasoning/InjectionMappingCard.tsx @@ -0,0 +1,180 @@ +import { useState } from "react" +import { toast } from "sonner" +import { useTranslation } from "react-i18next" +import { Plus, Trash } from "@phosphor-icons/react" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { Button } from "@/components/ui/button" +import { apiErrorMessage } from "@/api/client" +import { useUpdateReasoningConfig } from "@/api/hooks/useReasoning" +import type { ReasoningStatusResponse } from "@/api/types" + +interface Props { + status: ReasoningStatusResponse +} + +interface Pair { + id: string + target: string + source: string +} + +// Monotonic row-id source. Stable per-row ids keep React from reusing one row's +// DOM node for another after a delete (which would strand focus mid-edit). A +// module counter avoids a ref (which eslint bans from render) and only advances +// when rows are (re)created, not on every render. +let pairSeq = 0 +const nextPairId = () => `pair-${pairSeq++}` + +const makePairs = (map: Record): Pair[] => + Object.entries(map).map(([target, source]) => ({ id: nextPairId(), target, source })) + +export function InjectionMappingCard({ status }: Props) { + const { t } = useTranslation() + const updateConfig = useUpdateReasoningConfig() + + const injectionEnabled = status.config.injection_enabled + // Source models must have thinking text (the backend rejects others with 422). + const sourceModels = status.per_model.filter((m) => m.has_thinking_text).map((m) => m.model) + + const [pairs, setPairs] = useState(() => makePairs(status.config.injection_map)) + const [dirty, setDirty] = useState(false) + + // Reset the local editable list when the server map changes (after a save → + // refetch gives a new object reference). Adjusting state during render is the + // React-blessed alternative to a syncing effect. + const [prevMap, setPrevMap] = useState(status.config.injection_map) + if (status.config.injection_map !== prevMap) { + setPrevMap(status.config.injection_map) + setPairs(makePairs(status.config.injection_map)) + setDirty(false) + } + + const toggleInjection = (enabled: boolean) => { + updateConfig.mutate( + { injection_enabled: enabled }, + { + onSuccess: () => toast.success(t("reasoning.configSaved")), + onError: (err) => toast.error(apiErrorMessage(err, t("reasoning.configSaveFailed"))), + }, + ) + } + + const setPair = (id: string, patch: Partial) => { + setPairs((prev) => prev.map((p) => (p.id === id ? { ...p, ...patch } : p))) + setDirty(true) + } + const addPair = () => { + setPairs((prev) => [...prev, { id: nextPairId(), target: "", source: sourceModels[0] ?? "" }]) + setDirty(true) + } + const removePair = (id: string) => { + setPairs((prev) => prev.filter((p) => p.id !== id)) + setDirty(true) + } + + const save = () => { + const seen = new Set() + const map: Record = {} + for (const p of pairs) { + const target = p.target.trim() + const source = p.source.trim() + if (!target || !source) continue + if (seen.has(target)) { + // Two rows with the same target would silently collapse — surface it. + toast.error(t("reasoning.duplicateTarget", { target })) + return + } + seen.add(target) + map[target] = source + } + updateConfig.mutate( + { injection_map: map }, + { + onSuccess: () => { + toast.success(t("reasoning.configSaved")) + setDirty(false) + }, + onError: (err) => toast.error(apiErrorMessage(err, t("reasoning.configSaveFailed"))), + }, + ) + } + + return ( + + + {t("reasoning.injectionTitle")} + + + + +
+

+ {t("reasoning.injectionMap")} +

+ {pairs.length === 0 && ( +

{t("reasoning.noMappings")}

+ )} + {pairs.map((p) => ( +
+ + + setPair(p.id, { target: e.target.value })} + placeholder={t("reasoning.targetPlaceholder")} + className="w-40 rounded-md border border-border bg-background px-2 py-1.5 font-mono text-xs" + aria-label={t("reasoning.target")} + /> + +
+ ))} +
+ + +
+

{t("reasoning.injectionMapHint")}

+
+
+
+ ) +} diff --git a/dashboard/src/features/reasoning/MiningConfigCard.tsx b/dashboard/src/features/reasoning/MiningConfigCard.tsx new file mode 100644 index 00000000..c87eeeda --- /dev/null +++ b/dashboard/src/features/reasoning/MiningConfigCard.tsx @@ -0,0 +1,185 @@ +import { useState } from "react" +import { toast } from "sonner" +import { useTranslation } from "react-i18next" +import { Trash } from "@phosphor-icons/react" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { Button } from "@/components/ui/button" +import { ConfirmDialog } from "@/components/ui/confirm-dialog" +import { ApiError, apiErrorMessage } from "@/api/client" +import { + useTriggerMining, + useUpdateReasoningConfig, + useWipeTraces, +} from "@/api/hooks/useReasoning" +import type { ReasoningStatusResponse } from "@/api/types" + +interface Props { + status: ReasoningStatusResponse +} + +export function MiningConfigCard({ status }: Props) { + const { t } = useTranslation() + const updateConfig = useUpdateReasoningConfig() + const triggerMining = useTriggerMining() + const wipeTraces = useWipeTraces() + + const miningEnabled = status.config.mining_enabled + const selected = new Set(status.config.mining_models) + const running = status.mining.running + + const [backfill, setBackfill] = useState(false) + const [wipeModel, setWipeModel] = useState(null) + + const confirmWipe = () => { + if (!wipeModel) return + const m = wipeModel + setWipeModel(null) + wipeTraces.mutate(m, { + onSuccess: (res) => toast.success(t("reasoning.tracesWiped", { count: res.deleted })), + onError: (err) => toast.error(apiErrorMessage(err, t("reasoning.configSaveFailed"))), + }) + } + + const toggleMining = (enabled: boolean) => { + updateConfig.mutate( + { mining_enabled: enabled }, + { + onSuccess: () => toast.success(t("reasoning.configSaved")), + onError: (err) => toast.error(apiErrorMessage(err, t("reasoning.configSaveFailed"))), + }, + ) + } + + const toggleModel = (model: string, on: boolean) => { + const next = new Set(selected) + if (on) next.add(model) + else next.delete(model) + updateConfig.mutate( + { mining_models: [...next] }, + { + onSuccess: () => toast.success(t("reasoning.configSaved")), + onError: (err) => toast.error(apiErrorMessage(err, t("reasoning.configSaveFailed"))), + }, + ) + } + + const runMining = () => { + triggerMining.mutate( + { backfill }, + { + onSuccess: () => toast.success(t("reasoning.miningStarted")), + onError: (err) => { + if (err instanceof ApiError && err.status === 409) { + toast.error(t("reasoning.miningInProgress")) + } else if (err instanceof ApiError && err.status === 400) { + toast.error(t("reasoning.miningDisabled")) + } else { + toast.error(t("reasoning.miningFailed")) + } + }, + }, + ) + } + + return ( + + + {t("reasoning.miningTitle")} + + + + +
+

+ {t("reasoning.miningModels")} +

+ {status.detected_models.length === 0 ? ( +

{t("reasoning.noModels")}

+ ) : ( +
+ {status.per_model.map((m) => ( +
+ + {m.trace_count > 0 && ( + + )} +
+ ))} +
+ )} +

{t("reasoning.miningModelsHint")}

+
+ +
+ + +
+
+ + setWipeModel(null)} + /> +
+ ) +} diff --git a/dashboard/src/features/reasoning/PatternsTable.tsx b/dashboard/src/features/reasoning/PatternsTable.tsx new file mode 100644 index 00000000..2101ce4d --- /dev/null +++ b/dashboard/src/features/reasoning/PatternsTable.tsx @@ -0,0 +1,231 @@ +import { useState } from "react" +import { toast } from "sonner" +import { useTranslation } from "react-i18next" +import { Trash } from "@phosphor-icons/react" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { Button } from "@/components/ui/button" +import { Badge } from "@/components/ui/badge" +import { Skeleton } from "@/components/ui/skeleton" +import { ConfirmDialog } from "@/components/ui/confirm-dialog" +import { apiErrorMessage } from "@/api/client" +import { + useDeletePatternsByModel, + useDeleteReasoningPattern, + useReasoningPatterns, +} from "@/api/hooks/useReasoning" +import type { PatternSummary } from "@/api/types" + +interface Props { + detectedModels: string[] + categories: string[] +} + +const PAGE_SIZE = 20 + +export function PatternsTable({ detectedModels, categories }: Props) { + const { t } = useTranslation() + const [model, setModel] = useState("") + const [category, setCategory] = useState("") + const [offset, setOffset] = useState(0) + const [toDelete, setToDelete] = useState(null) + const [bulkModel, setBulkModel] = useState(null) + + const { data, isLoading, isError, refetch } = useReasoningPatterns( + model, + category, + PAGE_SIZE, + offset, + ) + const deletePattern = useDeleteReasoningPattern() + const deleteByModel = useDeletePatternsByModel() + + const total = data?.total ?? 0 + const patterns = data?.patterns ?? [] + + // If the data shrank below the current page (e.g. after a delete), step back so + // the user isn't stranded on an empty page with hidden pagination controls. + if (data && offset > 0 && offset >= total) { + setOffset(Math.max(0, total - PAGE_SIZE)) + } + + const resetPaging = () => setOffset(0) + + const confirmDelete = () => { + if (!toDelete) return + const id = toDelete.id + setToDelete(null) + deletePattern.mutate(id, { + onSuccess: () => toast.success(t("reasoning.patternDeleted")), + onError: () => toast.error(t("reasoning.patternDeleteFailed")), + }) + } + + const confirmBulkDelete = () => { + if (!bulkModel) return + const m = bulkModel + setBulkModel(null) + deleteByModel.mutate(m, { + onSuccess: (res) => + toast.success(t("reasoning.patternsDeletedCount", { count: res.deleted })), + onError: (err) => toast.error(apiErrorMessage(err, t("reasoning.patternDeleteFailed"))), + }) + } + + return ( + + + {t("reasoning.patternsTitle")} + + +
+ + + {model && ( + + )} +
+ + {isLoading ? ( + + ) : isError ? ( +
+

{t("reasoning.patternsError")}

+ +
+ ) : patterns.length === 0 ? ( +

{t("reasoning.noPatterns")}

+ ) : ( +
+ + + + + + + + + + + + {patterns.map((p) => ( + + + + + + + + + ))} + +
{t("reasoning.colTitle")}{t("reasoning.colModel")}{t("reasoning.colCategory")} + {t("reasoning.colConfidence")} + + {t("reasoning.colFrequency")} + +
{p.title}{p.source_model} + {p.category} + + {Math.round(p.confidence * 100)}% + {p.frequency} + +
+
+ )} + + {total > PAGE_SIZE && ( +
+ + {offset + 1}–{Math.min(offset + PAGE_SIZE, total)} / {total} + +
+ + +
+
+ )} +
+ + setToDelete(null)} + /> + + setBulkModel(null)} + /> +
+ ) +} diff --git a/dashboard/src/features/reasoning/ReasoningPage.tsx b/dashboard/src/features/reasoning/ReasoningPage.tsx new file mode 100644 index 00000000..fbd201da --- /dev/null +++ b/dashboard/src/features/reasoning/ReasoningPage.tsx @@ -0,0 +1,140 @@ +import { useEffect, useRef } from "react" +import { useTranslation } from "react-i18next" +import { useQueryClient } from "@tanstack/react-query" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { Button } from "@/components/ui/button" +import { Badge } from "@/components/ui/badge" +import { Skeleton } from "@/components/ui/skeleton" +import { useReasoningStatus } from "@/api/hooks/useReasoning" +import type { ReasoningStatusResponse } from "@/api/types" +import { MiningConfigCard } from "./MiningConfigCard" +import { InjectionMappingCard } from "./InjectionMappingCard" +import { PatternsTable } from "./PatternsTable" + +function Kpi({ label, value }: { label: string; value: number }) { + return ( + + + {label} + + +

{value.toLocaleString()}

+
+
+ ) +} + +function CoverageCard({ status }: { status: ReasoningStatusResponse }) { + const { t } = useTranslation() + const models = status.per_model.filter((m) => m.pattern_count > 0) + if (models.length === 0) return null + return ( + + + {t("reasoning.coverageTitle")} + + + {models.map((m) => { + const cats = status.coverage_by_model[m.model] ?? [] + return ( +
+
+ {m.model} + + {m.coverage_percent}% + +
+
+
+
+ {cats.length > 0 && ( +
+ {cats.map((c) => ( + + {c.category} ({c.pattern_count}) + + ))} +
+ )} +
+ ) + })} + + + ) +} + +export default function ReasoningPage() { + const { t } = useTranslation() + const queryClient = useQueryClient() + const { data: status, isLoading, isError, refetch } = useReasoningStatus() + + // A mining run creates new pattern fibers; when it finishes (running true→false), + // refresh the patterns table (the status poll already refreshes KPIs/coverage). + const running = status?.mining.running ?? false + const prevRunning = useRef(running) + useEffect(() => { + if (prevRunning.current && !running) { + queryClient.invalidateQueries({ queryKey: ["reasoning", "patterns"] }) + } + prevRunning.current = running + }, [running, queryClient]) + + return ( +
+
+

{t("reasoning.pageTitle")}

+

{t("reasoning.pageSubtitle")}

+
+ + {isLoading ? ( +
+ {[0, 1, 2, 3].map((i) => ( + + ))} +
+ ) : isError || !status ? ( + + +

{t("reasoning.statusError")}

+ +
+
+ ) : ( + <> +
+ + + + +
+ + {status.total_traces === 0 && !status.mining.running && ( + + + {t("reasoning.emptyState")} + + + )} + + + +
+ + +
+ + + + )} +
+ ) +} diff --git a/dashboard/src/i18n/en.json b/dashboard/src/i18n/en.json index 827bd34b..a52a8a84 100755 --- a/dashboard/src/i18n/en.json +++ b/dashboard/src/i18n/en.json @@ -10,6 +10,7 @@ "sync": "Cloud Sync", "oracle": "Oracle", "toolStats": "Tool Stats", + "reasoningTraining": "Reasoning Training", "visualize": "Visualize", "storage": "Storage", "settings": "Settings" @@ -30,7 +31,72 @@ "mainNavigation": "Main navigation", "lightMode": "Light mode", "darkMode": "Dark mode", - "systemTheme": "System theme" + "systemTheme": "System theme", + "retry": "Retry", + "prev": "Previous", + "next": "Next" + }, + "reasoning": { + "pageTitle": "Reasoning Training", + "pageSubtitle": "Mine model thinking into reasoning strategies and inject them into other models.", + "statusError": "Failed to load reasoning status.", + "emptyState": "No reasoning traces yet. Enable mining below, then run a backfill to scan past sessions.", + "kpiTraces": "Total traces", + "kpiUnprocessed": "Unprocessed", + "kpiPatterns": "Learned patterns", + "kpiModels": "Detected models", + "coverageTitle": "Category coverage", + "miningTitle": "Mining", + "miningEnabled": "Enable mining (reads model thinking from ~/.claude transcripts)", + "miningModels": "Source models", + "miningModelsHint": "None selected = mine all models with thinking text.", + "noModels": "No models detected yet.", + "noThinkingText": "This model produces no thinking text and cannot be mined.", + "noThinkingShort": "no thinking", + "backfill": "Backfill (full history)", + "runMining": "Run mining", + "miningRunning": "Mining…", + "miningStarted": "Mining started.", + "miningInProgress": "A mining run is already in progress.", + "miningDisabled": "Enable mining first.", + "miningFailed": "Failed to start mining.", + "injectionTitle": "Injection", + "injectionEnabled": "Enable injection (add learned strategies to other models' sessions)", + "injectionMap": "Source → target mappings", + "injectionMapHint": "Inject a source model's learned strategies into the target model's sessions.", + "noMappings": "No mappings configured.", + "source": "Source model", + "target": "Target model", + "targetPlaceholder": "target model / glob", + "addMapping": "Add mapping", + "save": "Save", + "configSaved": "Configuration saved.", + "configSaveFailed": "Failed to save configuration.", + "patternsTitle": "Pattern library", + "filterModel": "Filter by model", + "filterCategory": "Filter by category", + "allModels": "All models", + "allCategories": "All categories", + "patternsError": "Failed to load patterns.", + "noPatterns": "No learned patterns yet.", + "colTitle": "Pattern", + "colModel": "Model", + "colCategory": "Category", + "colConfidence": "Confidence", + "colFrequency": "Frequency", + "patternDeleted": "Pattern deleted.", + "patternDeleteFailed": "Failed to delete pattern.", + "deletePatternTitle": "Delete pattern?", + "deletePatternDesc": "Delete the learned pattern \"{{title}}\"? This cannot be undone.", + "deleteAllForModel": "Delete all for model", + "deleteAllTitle": "Delete all patterns?", + "deleteAllDesc": "Delete every learned pattern for \"{{model}}\"? This cannot be undone.", + "patternsDeletedCount": "Deleted {{count}} pattern(s).", + "wipeTraces": "Wipe traces", + "wipeTracesTitle": "Wipe traces?", + "wipeTracesDesc": "Permanently delete all staged reasoning traces for \"{{model}}\"? This cannot be undone.", + "tracesWiped": "Wiped {{count}} trace(s).", + "duplicateTarget": "Duplicate target \"{{target}}\" — each target maps to only one source." }, "overview": { "title": "Overview", diff --git a/src/surreal_memory/server/static/dist/assets/DiagramsPage-7MxRvurw.js b/src/surreal_memory/server/static/dist/assets/DiagramsPage-ClJ9QIg8.js similarity index 99% rename from src/surreal_memory/server/static/dist/assets/DiagramsPage-7MxRvurw.js rename to src/surreal_memory/server/static/dist/assets/DiagramsPage-ClJ9QIg8.js index 6fbf6ca4..a4bfb40d 100644 --- a/src/surreal_memory/server/static/dist/assets/DiagramsPage-7MxRvurw.js +++ b/src/surreal_memory/server/static/dist/assets/DiagramsPage-ClJ9QIg8.js @@ -1,4 +1,4 @@ -import{j as R}from"./vendor-query-CqA1cBNl.js";import{d as hs,r as Z,b as gs}from"./vendor-react-BfuodpLv.js";import{m as ps,n as ms,u as ys,b as xs}from"./index-CSMoVcy_.js";import{C as Ht,a as Dn,b as Ln,c as Vt}from"./card-DAwbJLqc.js";import{S as jn}from"./skeleton-CAu64_35.js";import{d as cn,T as ws,t as vs,n as bs}from"./timer-DWAvo6M8.js";import{i as Es,h as $n,j as zn,k as _s,l as Ns,m as Ss,n as yt,o as Bt,u as Cs}from"./vendor-recharts-BkwZfCWA.js";import"./vendor-icons-IAbuZhWE.js";import"./vendor-ui-Qm4_4bAc.js";function ae(e){if(typeof e=="string"||typeof e=="number")return""+e;let t="";if(Array.isArray(e))for(let n=0,o;n=0&&(t=e.slice(0,n))!=="xmlns"&&(e=e.slice(n+1)),Rn.hasOwnProperty(t)?{space:Rn[t],local:e}:e}function ks(e){return function(){var t=this.ownerDocument,n=this.namespaceURI;return n===Ut&&t.documentElement.namespaceURI===Ut?t.createElement(e):t.createElementNS(n,e)}}function Ms(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function To(e){var t=Mt(e);return(t.local?Ms:ks)(t)}function Is(){}function ln(e){return e==null?Is:function(){return this.querySelector(e)}}function Os(e){typeof e!="function"&&(e=ln(e));for(var t=this._groups,n=t.length,o=new Array(n),r=0;r=g&&(g=E+1);!(N=_[g])&&++g=0;)(s=o[r])&&(i&&s.compareDocumentPosition(i)^4&&i.parentNode.insertBefore(s,i),i=s);return this}function ta(e){e||(e=na);function t(d,f){return d&&f?e(d.__data__,f.__data__):!d-!f}for(var n=this._groups,o=n.length,r=new Array(o),i=0;it?1:e>=t?0:NaN}function oa(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function ra(){return Array.from(this)}function ia(){for(var e=this._groups,t=0,n=e.length;t1?this.each((t==null?ma:typeof t=="function"?xa:ya)(e,t,n??"")):He(this.node(),e)}function He(e,t){return e.style.getPropertyValue(t)||jo(e).getComputedStyle(e,null).getPropertyValue(t)}function va(e){return function(){delete this[e]}}function ba(e,t){return function(){this[e]=t}}function Ea(e,t){return function(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}}function _a(e,t){return arguments.length>1?this.each((t==null?va:typeof t=="function"?Ea:ba)(e,t)):this.node()[e]}function $o(e){return e.trim().split(/^|\s+/)}function un(e){return e.classList||new zo(e)}function zo(e){this._node=e,this._names=$o(e.getAttribute("class")||"")}zo.prototype={add:function(e){var t=this._names.indexOf(e);t<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var t=this._names.indexOf(e);t>=0&&(this._names.splice(t,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function Ro(e,t){for(var n=un(e),o=-1,r=t.length;++o=0&&(n=t.slice(o+1),t=t.slice(0,o)),{type:t,name:n}})}function Ka(e){return function(){var t=this.__on;if(t){for(var n=0,o=-1,r=t.length,i;n()=>e;function Kt(e,{sourceEvent:t,subject:n,target:o,identifier:r,active:i,x:s,y:c,dx:a,dy:l,dispatch:u}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:o,enumerable:!0,configurable:!0},identifier:{value:r,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:c,enumerable:!0,configurable:!0},dx:{value:a,enumerable:!0,configurable:!0},dy:{value:l,enumerable:!0,configurable:!0},_:{value:u}})}Kt.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};function ac(e){return!e.ctrlKey&&!e.button}function cc(){return this.parentNode}function lc(e,t){return t??{x:e.x,y:e.y}}function uc(){return navigator.maxTouchPoints||"ontouchstart"in this}function Wo(){var e=ac,t=cc,n=lc,o=uc,r={},i=cn("start","drag","end"),s=0,c,a,l,u,d=0;function f(p){p.on("mousedown.drag",h).filter(o).on("touchstart.drag",_).on("touchmove.drag",b,sc).on("touchend.drag touchcancel.drag",E).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function h(p,N){if(!(u||!e.call(this,p,N))){var S=g(this,t.call(this,p,N),p,N,"mouse");S&&(le(p.view).on("mousemove.drag",m,Je).on("mouseup.drag",w,Je),Fo(p.view),Ft(p),l=!1,c=p.clientX,a=p.clientY,S("start",p))}}function m(p){if(Re(p),!l){var N=p.clientX-c,S=p.clientY-a;l=N*N+S*S>d}r.mouse("drag",p)}function w(p){le(p.view).on("mousemove.drag mouseup.drag",null),Yo(p.view,l),Re(p),r.mouse("end",p)}function _(p,N){if(e.call(this,p,N)){var S=p.changedTouches,T=t.call(this,p,N),L=S.length,$,A;for($=0;${o.stop(),e(r+t)},t,n),o}var dc=cn("start","end","cancel","interrupt"),fc=[],Zo=0,Vn=1,Qt=2,xt=3,Bn=4,Jt=5,wt=6;function It(e,t,n,o,r,i){var s=e.__transition;if(!s)e.__transition={};else if(n in s)return;hc(e,n,{name:t,index:o,group:r,on:dc,tween:fc,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:Zo})}function dn(e,t){var n=me(e,t);if(n.state>Zo)throw new Error("too late; already scheduled");return n}function we(e,t){var n=me(e,t);if(n.state>xt)throw new Error("too late; already running");return n}function me(e,t){var n=e.__transition;if(!n||!(n=n[t]))throw new Error("transition not found");return n}function hc(e,t,n){var o=e.__transition,r;o[t]=n,n.timer=vs(i,0,n.time);function i(l){n.state=Vn,n.timer.restart(s,n.delay,n.time),n.delay<=l&&s(l-n.delay)}function s(l){var u,d,f,h;if(n.state!==Vn)return a();for(u in o)if(h=o[u],h.name===n.name){if(h.state===xt)return Hn(s);h.state===Bn?(h.state=wt,h.timer.stop(),h.on.call("interrupt",e,e.__data__,h.index,h.group),delete o[u]):+uQt&&o.state=0&&(t=t.slice(0,n)),!t||t==="start"})}function Fc(e,t,n){var o,r,i=Bc(t)?dn:we;return function(){var s=i(this,e),c=s.on;c!==o&&(r=(o=c).copy()).on(t,n),s.on=r}}function Yc(e,t){var n=this._id;return arguments.length<2?me(this.node(),n).on.on(e):this.each(Fc(n,e,t))}function Wc(e){return function(){var t=this.parentNode;for(var n in this.__transition)if(+n!==e)return;t&&t.removeChild(this)}}function Zc(){return this.on("end.remove",Wc(this._id))}function Xc(e){var t=this._name,n=this._id;typeof e!="function"&&(e=ln(e));for(var o=this._groups,r=o.length,i=new Array(r),s=0;s()=>e;function xl(e,{sourceEvent:t,target:n,transform:o,dispatch:r}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:o,enumerable:!0,configurable:!0},_:{value:r}})}function Ee(e,t,n){this.k=e,this.x=t,this.y=n}Ee.prototype={constructor:Ee,scale:function(e){return e===1?this:new Ee(this.k*e,this.x,this.y)},translate:function(e,t){return e===0&t===0?this:new Ee(this.k,this.x+this.k*e,this.y+this.k*t)},apply:function(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function(e){return e*this.k+this.x},applyY:function(e){return e*this.k+this.y},invert:function(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function(e){return(e-this.x)/this.k},invertY:function(e){return(e-this.y)/this.k},rescaleX:function(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var Ot=new Ee(1,0,0);Uo.prototype=Ee.prototype;function Uo(e){for(;!e.__zoom;)if(!(e=e.parentNode))return Ot;return e.__zoom}function Yt(e){e.stopImmediatePropagation()}function Ke(e){e.preventDefault(),e.stopImmediatePropagation()}function wl(e){return(!e.ctrlKey||e.type==="wheel")&&!e.button}function vl(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGElement||e,e.hasAttribute("viewBox")?(e=e.viewBox.baseVal,[[e.x,e.y],[e.x+e.width,e.y+e.height]]):[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]):[[0,0],[e.clientWidth,e.clientHeight]]}function Fn(){return this.__zoom||Ot}function bl(e){return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*(e.ctrlKey?10:1)}function El(){return navigator.maxTouchPoints||"ontouchstart"in this}function _l(e,t,n){var o=e.invertX(t[0][0])-n[0][0],r=e.invertX(t[1][0])-n[1][0],i=e.invertY(t[0][1])-n[0][1],s=e.invertY(t[1][1])-n[1][1];return e.translate(r>o?(o+r)/2:Math.min(0,o)||Math.max(0,r),s>i?(i+s)/2:Math.min(0,i)||Math.max(0,s))}function Ko(){var e=wl,t=vl,n=_l,o=bl,r=El,i=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],c=250,a=yt,l=cn("start","zoom","end"),u,d,f,h=500,m=150,w=0,_=10;function b(y){y.property("__zoom",Fn).on("wheel.zoom",L,{passive:!1}).on("mousedown.zoom",$).on("dblclick.zoom",A).filter(r).on("touchstart.zoom",C).on("touchmove.zoom",P).on("touchend.zoom touchcancel.zoom",D).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}b.transform=function(y,I,v,k){var M=y.selection?y.selection():y;M.property("__zoom",Fn),y!==M?N(y,I,v,k):M.interrupt().each(function(){S(this,arguments).event(k).start().zoom(null,typeof I=="function"?I.apply(this,arguments):I).end()})},b.scaleBy=function(y,I,v,k){b.scaleTo(y,function(){var M=this.__zoom.k,j=typeof I=="function"?I.apply(this,arguments):I;return M*j},v,k)},b.scaleTo=function(y,I,v,k){b.transform(y,function(){var M=t.apply(this,arguments),j=this.__zoom,B=v==null?p(M):typeof v=="function"?v.apply(this,arguments):v,F=j.invert(B),Y=typeof I=="function"?I.apply(this,arguments):I;return n(g(E(j,Y),B,F),M,s)},v,k)},b.translateBy=function(y,I,v,k){b.transform(y,function(){return n(this.__zoom.translate(typeof I=="function"?I.apply(this,arguments):I,typeof v=="function"?v.apply(this,arguments):v),t.apply(this,arguments),s)},null,k)},b.translateTo=function(y,I,v,k,M){b.transform(y,function(){var j=t.apply(this,arguments),B=this.__zoom,F=k==null?p(j):typeof k=="function"?k.apply(this,arguments):k;return n(Ot.translate(F[0],F[1]).scale(B.k).translate(typeof I=="function"?-I.apply(this,arguments):-I,typeof v=="function"?-v.apply(this,arguments):-v),j,s)},k,M)};function E(y,I){return I=Math.max(i[0],Math.min(i[1],I)),I===y.k?y:new Ee(I,y.x,y.y)}function g(y,I,v){var k=I[0]-v[0]*y.k,M=I[1]-v[1]*y.k;return k===y.x&&M===y.y?y:new Ee(y.k,k,M)}function p(y){return[(+y[0][0]+ +y[1][0])/2,(+y[0][1]+ +y[1][1])/2]}function N(y,I,v,k){y.on("start.zoom",function(){S(this,arguments).event(k).start()}).on("interrupt.zoom end.zoom",function(){S(this,arguments).event(k).end()}).tween("zoom",function(){var M=this,j=arguments,B=S(M,j).event(k),F=t.apply(M,j),Y=v==null?p(F):typeof v=="function"?v.apply(M,j):v,X=Math.max(F[1][0]-F[0][0],F[1][1]-F[0][1]),O=M.__zoom,x=typeof I=="function"?I.apply(M,j):I,z=a(O.invert(Y).concat(X/O.k),x.invert(Y).concat(X/x.k));return function(V){if(V===1)V=x;else{var H=z(V),W=X/H[2];V=new Ee(W,Y[0]-H[0]*W,Y[1]-H[1]*W)}B.zoom(null,V)}})}function S(y,I,v){return!v&&y.__zooming||new T(y,I)}function T(y,I){this.that=y,this.args=I,this.active=0,this.sourceEvent=null,this.extent=t.apply(y,I),this.taps=0}T.prototype={event:function(y){return y&&(this.sourceEvent=y),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(y,I){return this.mouse&&y!=="mouse"&&(this.mouse[1]=I.invert(this.mouse[0])),this.touch0&&y!=="touch"&&(this.touch0[1]=I.invert(this.touch0[0])),this.touch1&&y!=="touch"&&(this.touch1[1]=I.invert(this.touch1[0])),this.that.__zoom=I,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(y){var I=le(this.that).datum();l.call(y,this.that,new xl(y,{sourceEvent:this.sourceEvent,target:b,transform:this.that.__zoom,dispatch:l}),I)}};function L(y,...I){if(!e.apply(this,arguments))return;var v=S(this,I).event(y),k=this.__zoom,M=Math.max(i[0],Math.min(i[1],k.k*Math.pow(2,o.apply(this,arguments)))),j=fe(y);if(v.wheel)(v.mouse[0][0]!==j[0]||v.mouse[0][1]!==j[1])&&(v.mouse[1]=k.invert(v.mouse[0]=j)),clearTimeout(v.wheel);else{if(k.k===M)return;v.mouse=[j,k.invert(j)],vt(this),v.start()}Ke(y),v.wheel=setTimeout(B,m),v.zoom("mouse",n(g(E(k,M),v.mouse[0],v.mouse[1]),v.extent,s));function B(){v.wheel=null,v.end()}}function $(y,...I){if(f||!e.apply(this,arguments))return;var v=y.currentTarget,k=S(this,I,!0).event(y),M=le(y.view).on("mousemove.zoom",Y,!0).on("mouseup.zoom",X,!0),j=fe(y,v),B=y.clientX,F=y.clientY;Fo(y.view),Yt(y),k.mouse=[j,this.__zoom.invert(j)],vt(this),k.start();function Y(O){if(Ke(O),!k.moved){var x=O.clientX-B,z=O.clientY-F;k.moved=x*x+z*z>w}k.event(O).zoom("mouse",n(g(k.that.__zoom,k.mouse[0]=fe(O,v),k.mouse[1]),k.extent,s))}function X(O){M.on("mousemove.zoom mouseup.zoom",null),Yo(O.view,k.moved),Ke(O),k.event(O).end()}}function A(y,...I){if(e.apply(this,arguments)){var v=this.__zoom,k=fe(y.changedTouches?y.changedTouches[0]:y,this),M=v.invert(k),j=v.k*(y.shiftKey?.5:2),B=n(g(E(v,j),k,M),t.apply(this,I),s);Ke(y),c>0?le(this).transition().duration(c).call(N,B,k,y):le(this).call(b.transform,B,k,y)}}function C(y,...I){if(e.apply(this,arguments)){var v=y.touches,k=v.length,M=S(this,I,y.changedTouches.length===k).event(y),j,B,F,Y;for(Yt(y),B=0;B"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:e=>`Node type "${e}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:e=>`The old edge with id=${e} does not exist.`,error009:e=>`Marker type "${e}" doesn't exist.`,error008:(e,{id:t,sourceHandle:n,targetHandle:o})=>`Couldn't create edge for ${e} handle id: "${e==="source"?n:o}", edge id: ${t}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:e=>`Edge type "${e}" not found. Using fallback type "default".`,error012:e=>`Node with id "${e}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(e="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${e}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs."},et=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],Qo=["Enter"," ","Escape"],Jo={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:e,x:t,y:n})=>`Moved selected node ${e}. New position, x: ${t}, y: ${n}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var Ve;(function(e){e.Strict="strict",e.Loose="loose"})(Ve||(Ve={}));var Pe;(function(e){e.Free="free",e.Vertical="vertical",e.Horizontal="horizontal"})(Pe||(Pe={}));var tt;(function(e){e.Partial="partial",e.Full="full"})(tt||(tt={}));const er={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var Me;(function(e){e.Bezier="default",e.Straight="straight",e.Step="step",e.SmoothStep="smoothstep",e.SimpleBezier="simplebezier"})(Me||(Me={}));var Et;(function(e){e.Arrow="arrow",e.ArrowClosed="arrowclosed"})(Et||(Et={}));var K;(function(e){e.Left="left",e.Top="top",e.Right="right",e.Bottom="bottom"})(K||(K={}));const Yn={[K.Left]:K.Right,[K.Right]:K.Left,[K.Top]:K.Bottom,[K.Bottom]:K.Top};function tr(e){return e===null?null:e?"valid":"invalid"}const nr=e=>"id"in e&&"source"in e&&"target"in e,Nl=e=>"id"in e&&"position"in e&&!("source"in e)&&!("target"in e),hn=e=>"id"in e&&"internals"in e&&!("source"in e)&&!("target"in e),st=(e,t=[0,0])=>{const{width:n,height:o}=Se(e),r=e.origin??t,i=n*r[0],s=o*r[1];return{x:e.position.x-i,y:e.position.y-s}},Sl=(e,t={nodeOrigin:[0,0]})=>{if(e.length===0)return{x:0,y:0,width:0,height:0};const n=e.reduce((o,r)=>{const i=typeof r=="string";let s=!t.nodeLookup&&!i?r:void 0;t.nodeLookup&&(s=i?t.nodeLookup.get(r):hn(r)?r:t.nodeLookup.get(r.id));const c=s?_t(s,t.nodeOrigin):{x:0,y:0,x2:0,y2:0};return Tt(o,c)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return Pt(n)},at=(e,t={})=>{let n={x:1/0,y:1/0,x2:-1/0,y2:-1/0},o=!1;return e.forEach(r=>{(t.filter===void 0||t.filter(r))&&(n=Tt(n,_t(r)),o=!0)}),o?Pt(n):{x:0,y:0,width:0,height:0}},gn=(e,t,[n,o,r]=[0,0,1],i=!1,s=!1)=>{const c={...lt(t,[n,o,r]),width:t.width/r,height:t.height/r},a=[];for(const l of e.values()){const{measured:u,selectable:d=!0,hidden:f=!1}=l;if(s&&!d||f)continue;const h=u.width??l.width??l.initialWidth??null,m=u.height??l.height??l.initialHeight??null,w=nt(c,Fe(l)),_=(h??0)*(m??0),b=i&&w>0;(!l.internals.handleBounds||b||w>=_||l.dragging)&&a.push(l)}return a},Cl=(e,t)=>{const n=new Set;return e.forEach(o=>{n.add(o.id)}),t.filter(o=>n.has(o.source)||n.has(o.target))};function kl(e,t){const n=new Map,o=t?.nodes?new Set(t.nodes.map(r=>r.id)):null;return e.forEach(r=>{r.measured.width&&r.measured.height&&(t?.includeHiddenNodes||!r.hidden)&&(!o||o.has(r.id))&&n.set(r.id,r)}),n}async function Ml({nodes:e,width:t,height:n,panZoom:o,minZoom:r,maxZoom:i},s){if(e.size===0)return Promise.resolve(!0);const c=kl(e,s),a=at(c),l=pn(a,t,n,s?.minZoom??r,s?.maxZoom??i,s?.padding??.1);return await o.setViewport(l,{duration:s?.duration,ease:s?.ease,interpolate:s?.interpolate}),Promise.resolve(!0)}function or({nodeId:e,nextPosition:t,nodeLookup:n,nodeOrigin:o=[0,0],nodeExtent:r,onError:i}){const s=n.get(e),c=s.parentId?n.get(s.parentId):void 0,{x:a,y:l}=c?c.internals.positionAbsolute:{x:0,y:0},u=s.origin??o;let d=s.extent||r;if(s.extent==="parent"&&!s.expandParent)if(!c)i?.("005",xe.error005());else{const h=c.measured.width,m=c.measured.height;h&&m&&(d=[[a,l],[a+h,l+m]])}else c&&Ye(s.extent)&&(d=[[s.extent[0][0]+a,s.extent[0][1]+l],[s.extent[1][0]+a,s.extent[1][1]+l]]);const f=Ye(d)?Ae(t,d,s.measured):t;return(s.measured.width===void 0||s.measured.height===void 0)&&i?.("015",xe.error015()),{position:{x:f.x-a+(s.measured.width??0)*u[0],y:f.y-l+(s.measured.height??0)*u[1]},positionAbsolute:f}}async function Il({nodesToRemove:e=[],edgesToRemove:t=[],nodes:n,edges:o,onBeforeDelete:r}){const i=new Set(e.map(f=>f.id)),s=[];for(const f of n){if(f.deletable===!1)continue;const h=i.has(f.id),m=!h&&f.parentId&&s.find(w=>w.id===f.parentId);(h||m)&&s.push(f)}const c=new Set(t.map(f=>f.id)),a=o.filter(f=>f.deletable!==!1),u=Cl(s,a);for(const f of a)c.has(f.id)&&!u.find(m=>m.id===f.id)&&u.push(f);if(!r)return{edges:u,nodes:s};const d=await r({nodes:s,edges:u});return typeof d=="boolean"?d?{edges:u,nodes:s}:{edges:[],nodes:[]}:d}const Be=(e,t=0,n=1)=>Math.min(Math.max(e,t),n),Ae=(e={x:0,y:0},t,n)=>({x:Be(e.x,t[0][0],t[1][0]-(n?.width??0)),y:Be(e.y,t[0][1],t[1][1]-(n?.height??0))});function rr(e,t,n){const{width:o,height:r}=Se(n),{x:i,y:s}=n.internals.positionAbsolute;return Ae(e,[[i,s],[i+o,s+r]],t)}const Wn=(e,t,n)=>en?-Be(Math.abs(e-n),1,t)/t:0,ir=(e,t,n=15,o=40)=>{const r=Wn(e.x,o,t.width-o)*n,i=Wn(e.y,o,t.height-o)*n;return[r,i]},Tt=(e,t)=>({x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),x2:Math.max(e.x2,t.x2),y2:Math.max(e.y2,t.y2)}),en=({x:e,y:t,width:n,height:o})=>({x:e,y:t,x2:e+n,y2:t+o}),Pt=({x:e,y:t,x2:n,y2:o})=>({x:e,y:t,width:n-e,height:o-t}),Fe=(e,t=[0,0])=>{const{x:n,y:o}=hn(e)?e.internals.positionAbsolute:st(e,t);return{x:n,y:o,width:e.measured?.width??e.width??e.initialWidth??0,height:e.measured?.height??e.height??e.initialHeight??0}},_t=(e,t=[0,0])=>{const{x:n,y:o}=hn(e)?e.internals.positionAbsolute:st(e,t);return{x:n,y:o,x2:n+(e.measured?.width??e.width??e.initialWidth??0),y2:o+(e.measured?.height??e.height??e.initialHeight??0)}},sr=(e,t)=>Pt(Tt(en(e),en(t))),nt=(e,t)=>{const n=Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x)),o=Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y));return Math.ceil(n*o)},Zn=e=>he(e.width)&&he(e.height)&&he(e.x)&&he(e.y),he=e=>!isNaN(e)&&isFinite(e),Ol=(e,t)=>{},ct=(e,t=[1,1])=>({x:t[0]*Math.round(e.x/t[0]),y:t[1]*Math.round(e.y/t[1])}),lt=({x:e,y:t},[n,o,r],i=!1,s=[1,1])=>{const c={x:(e-n)/r,y:(t-o)/r};return i?ct(c,s):c},Nt=({x:e,y:t},[n,o,r])=>({x:e*r+n,y:t*r+o});function je(e,t){if(typeof e=="number")return Math.floor((t-t/(1+e))*.5);if(typeof e=="string"&&e.endsWith("px")){const n=parseFloat(e);if(!Number.isNaN(n))return Math.floor(n)}if(typeof e=="string"&&e.endsWith("%")){const n=parseFloat(e);if(!Number.isNaN(n))return Math.floor(t*n*.01)}return console.error(`[React Flow] The padding value "${e}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function Tl(e,t,n){if(typeof e=="string"||typeof e=="number"){const o=je(e,n),r=je(e,t);return{top:o,right:r,bottom:o,left:r,x:r*2,y:o*2}}if(typeof e=="object"){const o=je(e.top??e.y??0,n),r=je(e.bottom??e.y??0,n),i=je(e.left??e.x??0,t),s=je(e.right??e.x??0,t);return{top:o,right:s,bottom:r,left:i,x:i+s,y:o+r}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function Pl(e,t,n,o,r,i){const{x:s,y:c}=Nt(e,[t,n,o]),{x:a,y:l}=Nt({x:e.x+e.width,y:e.y+e.height},[t,n,o]),u=r-a,d=i-l;return{left:Math.floor(s),top:Math.floor(c),right:Math.floor(u),bottom:Math.floor(d)}}const pn=(e,t,n,o,r,i)=>{const s=Tl(i,t,n),c=(t-s.x)/e.width,a=(n-s.y)/e.height,l=Math.min(c,a),u=Be(l,o,r),d=e.x+e.width/2,f=e.y+e.height/2,h=t/2-d*u,m=n/2-f*u,w=Pl(e,h,m,u,t,n),_={left:Math.min(w.left-s.left,0),top:Math.min(w.top-s.top,0),right:Math.min(w.right-s.right,0),bottom:Math.min(w.bottom-s.bottom,0)};return{x:h-_.left+_.right,y:m-_.top+_.bottom,zoom:u}},ot=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function Ye(e){return e!=null&&e!=="parent"}function Se(e){return{width:e.measured?.width??e.width??e.initialWidth??0,height:e.measured?.height??e.height??e.initialHeight??0}}function ar(e){return(e.measured?.width??e.width??e.initialWidth)!==void 0&&(e.measured?.height??e.height??e.initialHeight)!==void 0}function cr(e,t={width:0,height:0},n,o,r){const i={...e},s=o.get(n);if(s){const c=s.origin||r;i.x+=s.internals.positionAbsolute.x-(t.width??0)*c[0],i.y+=s.internals.positionAbsolute.y-(t.height??0)*c[1]}return i}function Xn(e,t){if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0}function Al(){let e,t;return{promise:new Promise((o,r)=>{e=o,t=r}),resolve:e,reject:t}}function Dl(e){return{...Jo,...e||{}}}function Qe(e,{snapGrid:t=[0,0],snapToGrid:n=!1,transform:o,containerBounds:r}){const{x:i,y:s}=ge(e),c=lt({x:i-(r?.left??0),y:s-(r?.top??0)},o),{x:a,y:l}=n?ct(c,t):c;return{xSnapped:a,ySnapped:l,...c}}const mn=e=>({width:e.offsetWidth,height:e.offsetHeight}),lr=e=>e?.getRootNode?.()||window?.document,Ll=["INPUT","SELECT","TEXTAREA"];function ur(e){const t=e.composedPath?.()?.[0]||e.target;return t?.nodeType!==1?!1:Ll.includes(t.nodeName)||t.hasAttribute("contenteditable")||!!t.closest(".nokey")}const dr=e=>"clientX"in e,ge=(e,t)=>{const n=dr(e),o=n?e.clientX:e.touches?.[0].clientX,r=n?e.clientY:e.touches?.[0].clientY;return{x:o-(t?.left??0),y:r-(t?.top??0)}},Gn=(e,t,n,o,r)=>{const i=t.querySelectorAll(`.${e}`);return!i||!i.length?null:Array.from(i).map(s=>{const c=s.getBoundingClientRect();return{id:s.getAttribute("data-handleid"),type:e,nodeId:r,position:s.getAttribute("data-handlepos"),x:(c.left-n.left)/o,y:(c.top-n.top)/o,...mn(s)}})};function fr({sourceX:e,sourceY:t,targetX:n,targetY:o,sourceControlX:r,sourceControlY:i,targetControlX:s,targetControlY:c}){const a=e*.125+r*.375+s*.375+n*.125,l=t*.125+i*.375+c*.375+o*.125,u=Math.abs(a-e),d=Math.abs(l-t);return[a,l,u,d]}function ht(e,t){return e>=0?.5*e:t*25*Math.sqrt(-e)}function qn({pos:e,x1:t,y1:n,x2:o,y2:r,c:i}){switch(e){case K.Left:return[t-ht(t-o,i),n];case K.Right:return[t+ht(o-t,i),n];case K.Top:return[t,n-ht(n-r,i)];case K.Bottom:return[t,n+ht(r-n,i)]}}function yn({sourceX:e,sourceY:t,sourcePosition:n=K.Bottom,targetX:o,targetY:r,targetPosition:i=K.Top,curvature:s=.25}){const[c,a]=qn({pos:n,x1:e,y1:t,x2:o,y2:r,c:s}),[l,u]=qn({pos:i,x1:o,y1:r,x2:e,y2:t,c:s}),[d,f,h,m]=fr({sourceX:e,sourceY:t,targetX:o,targetY:r,sourceControlX:c,sourceControlY:a,targetControlX:l,targetControlY:u});return[`M${e},${t} C${c},${a} ${l},${u} ${o},${r}`,d,f,h,m]}function hr({sourceX:e,sourceY:t,targetX:n,targetY:o}){const r=Math.abs(n-e)/2,i=n0}const zl=({source:e,sourceHandle:t,target:n,targetHandle:o})=>`xy-edge__${e}${t||""}-${n}${o||""}`,Rl=(e,t)=>t.some(n=>n.source===e.source&&n.target===e.target&&(n.sourceHandle===e.sourceHandle||!n.sourceHandle&&!e.sourceHandle)&&(n.targetHandle===e.targetHandle||!n.targetHandle&&!e.targetHandle)),Hl=(e,t,n={})=>{if(!e.source||!e.target)return t;const o=n.getEdgeId||zl;let r;return nr(e)?r={...e}:r={...e,id:o(e)},Rl(r,t)?t:(r.sourceHandle===null&&delete r.sourceHandle,r.targetHandle===null&&delete r.targetHandle,t.concat(r))};function gr({sourceX:e,sourceY:t,targetX:n,targetY:o}){const[r,i,s,c]=hr({sourceX:e,sourceY:t,targetX:n,targetY:o});return[`M ${e},${t}L ${n},${o}`,r,i,s,c]}const Un={[K.Left]:{x:-1,y:0},[K.Right]:{x:1,y:0},[K.Top]:{x:0,y:-1},[K.Bottom]:{x:0,y:1}},Vl=({source:e,sourcePosition:t=K.Bottom,target:n})=>t===K.Left||t===K.Right?e.xMath.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2));function Bl({source:e,sourcePosition:t=K.Bottom,target:n,targetPosition:o=K.Top,center:r,offset:i,stepPosition:s}){const c=Un[t],a=Un[o],l={x:e.x+c.x*i,y:e.y+c.y*i},u={x:n.x+a.x*i,y:n.y+a.y*i},d=Vl({source:l,sourcePosition:t,target:u}),f=d.x!==0?"x":"y",h=d[f];let m=[],w,_;const b={x:0,y:0},E={x:0,y:0},[,,g,p]=hr({sourceX:e.x,sourceY:e.y,targetX:n.x,targetY:n.y});if(c[f]*a[f]===-1){f==="x"?(w=r.x??l.x+(u.x-l.x)*s,_=r.y??(l.y+u.y)/2):(w=r.x??(l.x+u.x)/2,_=r.y??l.y+(u.y-l.y)*s);const S=[{x:w,y:l.y},{x:w,y:u.y}],T=[{x:l.x,y:_},{x:u.x,y:_}];c[f]===h?m=f==="x"?S:T:m=f==="x"?T:S}else{const S=[{x:l.x,y:u.y}],T=[{x:u.x,y:l.y}];if(f==="x"?m=c.x===h?T:S:m=c.y===h?S:T,t===o){const P=Math.abs(e[f]-n[f]);if(P<=i){const D=Math.min(i-1,i-P);c[f]===h?b[f]=(l[f]>e[f]?-1:1)*D:E[f]=(u[f]>n[f]?-1:1)*D}}if(t!==o){const P=f==="x"?"y":"x",D=c[f]===a[P],y=l[P]>u[P],I=l[P]=C?(w=(L.x+$.x)/2,_=m[0].y):(w=m[0].x,_=(L.y+$.y)/2)}return[[e,{x:l.x+b.x,y:l.y+b.y},...m,{x:u.x+E.x,y:u.y+E.y},n],w,_,g,p]}function Fl(e,t,n,o){const r=Math.min(Kn(e,t)/2,Kn(t,n)/2,o),{x:i,y:s}=t;if(e.x===i&&i===n.x||e.y===s&&s===n.y)return`L${i} ${s}`;if(e.y===s){const l=e.x{let p="";return g>0&&gn.id===t):e[0])||null}function nn(e,t){return e?typeof e=="string"?e:`${t?`${t}__`:""}${Object.keys(e).sort().map(o=>`${o}=${e[o]}`).join("&")}`:""}function Wl(e,{id:t,defaultColor:n,defaultMarkerStart:o,defaultMarkerEnd:r}){const i=new Set;return e.reduce((s,c)=>([c.markerStart||o,c.markerEnd||r].forEach(a=>{if(a&&typeof a=="object"){const l=nn(a,t);i.has(l)||(s.push({id:l,color:a.color||n,...a}),i.add(l))}}),s),[]).sort((s,c)=>s.id.localeCompare(c.id))}const pr=1e3,Zl=10,xn={nodeOrigin:[0,0],nodeExtent:et,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},Xl={...xn,checkEquality:!0};function wn(e,t){const n={...e};for(const o in t)t[o]!==void 0&&(n[o]=t[o]);return n}function Gl(e,t,n){const o=wn(xn,n);for(const r of e.values())if(r.parentId)bn(r,e,t,o);else{const i=st(r,o.nodeOrigin),s=Ye(r.extent)?r.extent:o.nodeExtent,c=Ae(i,s,Se(r));r.internals.positionAbsolute=c}}function ql(e,t){if(!e.handles)return e.measured?t?.internals.handleBounds:void 0;const n=[],o=[];for(const r of e.handles){const i={id:r.id,width:r.width??1,height:r.height??1,nodeId:e.id,x:r.x,y:r.y,position:r.position,type:r.type};r.type==="source"?n.push(i):r.type==="target"&&o.push(i)}return{source:n,target:o}}function vn(e){return e==="manual"}function on(e,t,n,o={}){const r=wn(Xl,o),i={i:0},s=new Map(t),c=r?.elevateNodesOnSelect&&!vn(r.zIndexMode)?pr:0;let a=e.length>0;t.clear(),n.clear();for(const l of e){let u=s.get(l.id);if(r.checkEquality&&l===u?.internals.userNode)t.set(l.id,u);else{const d=st(l,r.nodeOrigin),f=Ye(l.extent)?l.extent:r.nodeExtent,h=Ae(d,f,Se(l));u={...r.defaults,...l,measured:{width:l.measured?.width,height:l.measured?.height},internals:{positionAbsolute:h,handleBounds:ql(l,u),z:mr(l,c,r.zIndexMode),userNode:l}},t.set(l.id,u)}(u.measured===void 0||u.measured.width===void 0||u.measured.height===void 0)&&!u.hidden&&(a=!1),l.parentId&&bn(u,t,n,o,i)}return a}function Ul(e,t){if(!e.parentId)return;const n=t.get(e.parentId);n?n.set(e.id,e):t.set(e.parentId,new Map([[e.id,e]]))}function bn(e,t,n,o,r){const{elevateNodesOnSelect:i,nodeOrigin:s,nodeExtent:c,zIndexMode:a}=wn(xn,o),l=e.parentId,u=t.get(l);if(!u){console.warn(`Parent node ${l} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}Ul(e,n),r&&!u.parentId&&u.internals.rootParentIndex===void 0&&a==="auto"&&(u.internals.rootParentIndex=++r.i,u.internals.z=u.internals.z+r.i*Zl),r&&u.internals.rootParentIndex!==void 0&&(r.i=u.internals.rootParentIndex);const d=i&&!vn(a)?pr:0,{x:f,y:h,z:m}=Kl(e,u,s,c,d,a),{positionAbsolute:w}=e.internals,_=f!==w.x||h!==w.y;(_||m!==e.internals.z)&&t.set(e.id,{...e,internals:{...e.internals,positionAbsolute:_?{x:f,y:h}:w,z:m}})}function mr(e,t,n){const o=he(e.zIndex)?e.zIndex:0;return vn(n)?o:o+(e.selected?t:0)}function Kl(e,t,n,o,r,i){const{x:s,y:c}=t.internals.positionAbsolute,a=Se(e),l=st(e,n),u=Ye(e.extent)?Ae(l,e.extent,a):l;let d=Ae({x:s+u.x,y:c+u.y},o,a);e.extent==="parent"&&(d=rr(d,a,t));const f=mr(e,r,i),h=t.internals.z??0;return{x:d.x,y:d.y,z:h>=f?h+1:f}}function En(e,t,n,o=[0,0]){const r=[],i=new Map;for(const s of e){const c=t.get(s.parentId);if(!c)continue;const a=i.get(s.parentId)?.expandedRect??Fe(c),l=sr(a,s.rect);i.set(s.parentId,{expandedRect:l,parent:c})}return i.size>0&&i.forEach(({expandedRect:s,parent:c},a)=>{const l=c.internals.positionAbsolute,u=Se(c),d=c.origin??o,f=s.x0||h>0||_||b)&&(r.push({id:a,type:"position",position:{x:c.position.x-f+_,y:c.position.y-h+b}}),n.get(a)?.forEach(E=>{e.some(g=>g.id===E.id)||r.push({id:E.id,type:"position",position:{x:E.position.x+f,y:E.position.y+h}})})),(u.width0){const h=En(f,t,n,r);l.push(...h)}return{changes:l,updatedInternals:a}}async function Jl({delta:e,panZoom:t,transform:n,translateExtent:o,width:r,height:i}){if(!t||!e.x&&!e.y)return Promise.resolve(!1);const s=await t.setViewportConstrained({x:n[0]+e.x,y:n[1]+e.y,zoom:n[2]},[[0,0],[r,i]],o),c=!!s&&(s.x!==n[0]||s.y!==n[1]||s.k!==n[2]);return Promise.resolve(c)}function to(e,t,n,o,r,i){let s=r;const c=o.get(s)||new Map;o.set(s,c.set(n,t)),s=`${r}-${e}`;const a=o.get(s)||new Map;if(o.set(s,a.set(n,t)),i){s=`${r}-${e}-${i}`;const l=o.get(s)||new Map;o.set(s,l.set(n,t))}}function yr(e,t,n){e.clear(),t.clear();for(const o of n){const{source:r,target:i,sourceHandle:s=null,targetHandle:c=null}=o,a={edgeId:o.id,source:r,target:i,sourceHandle:s,targetHandle:c},l=`${r}-${s}--${i}-${c}`,u=`${i}-${c}--${r}-${s}`;to("source",a,u,e,r,s),to("target",a,l,e,i,c),t.set(o.id,o)}}function xr(e,t){if(!e.parentId)return!1;const n=t.get(e.parentId);return n?n.selected?!0:xr(n,t):!1}function no(e,t,n){let o=e;do{if(o?.matches?.(t))return!0;if(o===n)return!1;o=o?.parentElement}while(o);return!1}function eu(e,t,n,o){const r=new Map;for(const[i,s]of e)if((s.selected||s.id===o)&&(!s.parentId||!xr(s,e))&&(s.draggable||t&&typeof s.draggable>"u")){const c=e.get(i);c&&r.set(i,{id:i,position:c.position||{x:0,y:0},distance:{x:n.x-c.internals.positionAbsolute.x,y:n.y-c.internals.positionAbsolute.y},extent:c.extent,parentId:c.parentId,origin:c.origin,expandParent:c.expandParent,internals:{positionAbsolute:c.internals.positionAbsolute||{x:0,y:0}},measured:{width:c.measured.width??0,height:c.measured.height??0}})}return r}function Wt({nodeId:e,dragItems:t,nodeLookup:n,dragging:o=!0}){const r=[];for(const[s,c]of t){const a=n.get(s)?.internals.userNode;a&&r.push({...a,position:c.position,dragging:o})}if(!e)return[r[0],r];const i=n.get(e)?.internals.userNode;return[i?{...i,position:t.get(e)?.position||i.position,dragging:o}:r[0],r]}function tu({dragItems:e,snapGrid:t,x:n,y:o}){const r=e.values().next().value;if(!r)return null;const i={x:n-r.distance.x,y:o-r.distance.y},s=ct(i,t);return{x:s.x-i.x,y:s.y-i.y}}function nu({onNodeMouseDown:e,getStoreItems:t,onDragStart:n,onDrag:o,onDragStop:r}){let i={x:null,y:null},s=0,c=new Map,a=!1,l={x:0,y:0},u=null,d=!1,f=null,h=!1,m=!1,w=null;function _({noDragClassName:E,handleSelector:g,domNode:p,isSelectable:N,nodeId:S,nodeClickDistance:T=0}){f=le(p);function L({x:P,y:D}){const{nodeLookup:y,nodeExtent:I,snapGrid:v,snapToGrid:k,nodeOrigin:M,onNodeDrag:j,onSelectionDrag:B,onError:F,updateNodePositions:Y}=t();i={x:P,y:D};let X=!1;const O=c.size>1,x=O&&I?en(at(c)):null,z=O&&k?tu({dragItems:c,snapGrid:v,x:P,y:D}):null;for(const[V,H]of c){if(!y.has(V))continue;let W={x:P-H.distance.x,y:D-H.distance.y};k&&(W=z?{x:Math.round(W.x+z.x),y:Math.round(W.y+z.y)}:ct(W,v));let G=null;if(O&&I&&!H.extent&&x){const{positionAbsolute:Q}=H.internals,J=Q.x-x.x+I[0][0],ee=Q.x+H.measured.width-x.x2+I[1][0],ne=Q.y-x.y+I[0][1],ce=Q.y+H.measured.height-x.y2+I[1][1];G=[[J,ne],[ee,ce]]}const{position:q,positionAbsolute:U}=or({nodeId:V,nextPosition:W,nodeLookup:y,nodeExtent:G||I,nodeOrigin:M,onError:F});X=X||H.position.x!==q.x||H.position.y!==q.y,H.position=q,H.internals.positionAbsolute=U}if(m=m||X,!!X&&(Y(c,!0),w&&(o||j||!S&&B))){const[V,H]=Wt({nodeId:S,dragItems:c,nodeLookup:y});o?.(w,c,V,H),j?.(w,V,H),S||B?.(w,H)}}async function $(){if(!u)return;const{transform:P,panBy:D,autoPanSpeed:y,autoPanOnNodeDrag:I}=t();if(!I){a=!1,cancelAnimationFrame(s);return}const[v,k]=ir(l,u,y);(v!==0||k!==0)&&(i.x=(i.x??0)-v/P[2],i.y=(i.y??0)-k/P[2],await D({x:v,y:k})&&L(i)),s=requestAnimationFrame($)}function A(P){const{nodeLookup:D,multiSelectionActive:y,nodesDraggable:I,transform:v,snapGrid:k,snapToGrid:M,selectNodesOnDrag:j,onNodeDragStart:B,onSelectionDragStart:F,unselectNodesAndEdges:Y}=t();d=!0,(!j||!N)&&!y&&S&&(D.get(S)?.selected||Y()),N&&j&&S&&e?.(S);const X=Qe(P.sourceEvent,{transform:v,snapGrid:k,snapToGrid:M,containerBounds:u});if(i=X,c=eu(D,I,X,S),c.size>0&&(n||B||!S&&F)){const[O,x]=Wt({nodeId:S,dragItems:c,nodeLookup:D});n?.(P.sourceEvent,c,O,x),B?.(P.sourceEvent,O,x),S||F?.(P.sourceEvent,x)}}const C=Wo().clickDistance(T).on("start",P=>{const{domNode:D,nodeDragThreshold:y,transform:I,snapGrid:v,snapToGrid:k}=t();u=D?.getBoundingClientRect()||null,h=!1,m=!1,w=P.sourceEvent,y===0&&A(P),i=Qe(P.sourceEvent,{transform:I,snapGrid:v,snapToGrid:k,containerBounds:u}),l=ge(P.sourceEvent,u)}).on("drag",P=>{const{autoPanOnNodeDrag:D,transform:y,snapGrid:I,snapToGrid:v,nodeDragThreshold:k,nodeLookup:M}=t(),j=Qe(P.sourceEvent,{transform:y,snapGrid:I,snapToGrid:v,containerBounds:u});if(w=P.sourceEvent,(P.sourceEvent.type==="touchmove"&&P.sourceEvent.touches.length>1||S&&!M.has(S))&&(h=!0),!h){if(!a&&D&&d&&(a=!0,$()),!d){const B=ge(P.sourceEvent,u),F=B.x-l.x,Y=B.y-l.y;Math.sqrt(F*F+Y*Y)>k&&A(P)}(i.x!==j.xSnapped||i.y!==j.ySnapped)&&c&&d&&(l=ge(P.sourceEvent,u),L(j))}}).on("end",P=>{if(!(!d||h)&&(a=!1,d=!1,cancelAnimationFrame(s),c.size>0)){const{nodeLookup:D,updateNodePositions:y,onNodeDragStop:I,onSelectionDragStop:v}=t();if(m&&(y(c,!1),m=!1),r||I||!S&&v){const[k,M]=Wt({nodeId:S,dragItems:c,nodeLookup:D,dragging:!1});r?.(P.sourceEvent,c,k,M),I?.(P.sourceEvent,k,M),S||v?.(P.sourceEvent,M)}}}).filter(P=>{const D=P.target;return!P.button&&(!E||!no(D,`.${E}`,p))&&(!g||no(D,g,p))});f.call(C)}function b(){f?.on(".drag",null)}return{update:_,destroy:b}}function ou(e,t,n){const o=[],r={x:e.x-n,y:e.y-n,width:n*2,height:n*2};for(const i of t.values())nt(r,Fe(i))>0&&o.push(i);return o}const ru=250;function iu(e,t,n,o){let r=[],i=1/0;const s=ou(e,n,t+ru);for(const c of s){const a=[...c.internals.handleBounds?.source??[],...c.internals.handleBounds?.target??[]];for(const l of a){if(o.nodeId===l.nodeId&&o.type===l.type&&o.id===l.id)continue;const{x:u,y:d}=De(c,l,l.position,!0),f=Math.sqrt(Math.pow(u-e.x,2)+Math.pow(d-e.y,2));f>t||(f1){const c=o.type==="source"?"target":"source";return r.find(a=>a.type===c)??r[0]}return r[0]}function wr(e,t,n,o,r,i=!1){const s=o.get(e);if(!s)return null;const c=r==="strict"?s.internals.handleBounds?.[t]:[...s.internals.handleBounds?.source??[],...s.internals.handleBounds?.target??[]],a=(n?c?.find(l=>l.id===n):c?.[0])??null;return a&&i?{...a,...De(s,a,a.position,!0)}:a}function vr(e,t){return e||(t?.classList.contains("target")?"target":t?.classList.contains("source")?"source":null)}function su(e,t){let n=null;return t?n=!0:e&&!t&&(n=!1),n}const br=()=>!0;function au(e,{connectionMode:t,connectionRadius:n,handleId:o,nodeId:r,edgeUpdaterType:i,isTarget:s,domNode:c,nodeLookup:a,lib:l,autoPanOnConnect:u,flowId:d,panBy:f,cancelConnection:h,onConnectStart:m,onConnect:w,onConnectEnd:_,isValidConnection:b=br,onReconnectEnd:E,updateConnection:g,getTransform:p,getFromHandle:N,autoPanSpeed:S,dragThreshold:T=1,handleDomNode:L}){const $=lr(e.target);let A=0,C;const{x:P,y:D}=ge(e),y=vr(i,L),I=c?.getBoundingClientRect();let v=!1;if(!I||!y)return;const k=wr(r,y,o,a,t);if(!k)return;let M=ge(e,I),j=!1,B=null,F=!1,Y=null;function X(){if(!u||!I)return;const[q,U]=ir(M,I,S);f({x:q,y:U}),A=requestAnimationFrame(X)}const O={...k,nodeId:r,type:y,position:k.position},x=a.get(r);let V={inProgress:!0,isValid:null,from:De(x,O,K.Left,!0),fromHandle:O,fromPosition:O.position,fromNode:x,to:M,toHandle:null,toPosition:Yn[O.position],toNode:null,pointer:M};function H(){v=!0,g(V),m?.(e,{nodeId:r,handleId:o,handleType:y})}T===0&&H();function W(q){if(!v){const{x:ce,y:de}=ge(q),ve=ce-P,Oe=de-D;if(!(ve*ve+Oe*Oe>T*T))return;H()}if(!N()||!O){G(q);return}const U=p();M=ge(q,I),C=iu(lt(M,U,!1,[1,1]),n,a,O),j||(X(),j=!0);const Q=Er(q,{handle:C,connectionMode:t,fromNodeId:r,fromHandleId:o,fromType:s?"target":"source",isValidConnection:b,doc:$,lib:l,flowId:d,nodeLookup:a});Y=Q.handleDomNode,B=Q.connection,F=su(!!C,Q.isValid);const J=a.get(r),ee=J?De(J,O,K.Left,!0):V.from,ne={...V,from:ee,isValid:F,to:Q.toHandle&&F?Nt({x:Q.toHandle.x,y:Q.toHandle.y},U):M,toHandle:Q.toHandle,toPosition:F&&Q.toHandle?Q.toHandle.position:Yn[O.position],toNode:Q.toHandle?a.get(Q.toHandle.nodeId):null,pointer:M};g(ne),V=ne}function G(q){if(!("touches"in q&&q.touches.length>0)){if(v){(C||Y)&&B&&F&&w?.(B);const{inProgress:U,...Q}=V,J={...Q,toPosition:V.toHandle?V.toPosition:null};_?.(q,J),i&&E?.(q,J)}h(),cancelAnimationFrame(A),j=!1,F=!1,B=null,Y=null,$.removeEventListener("mousemove",W),$.removeEventListener("mouseup",G),$.removeEventListener("touchmove",W),$.removeEventListener("touchend",G)}}$.addEventListener("mousemove",W),$.addEventListener("mouseup",G),$.addEventListener("touchmove",W),$.addEventListener("touchend",G)}function Er(e,{handle:t,connectionMode:n,fromNodeId:o,fromHandleId:r,fromType:i,doc:s,lib:c,flowId:a,isValidConnection:l=br,nodeLookup:u}){const d=i==="target",f=t?s.querySelector(`.${c}-flow__handle[data-id="${a}-${t?.nodeId}-${t?.id}-${t?.type}"]`):null,{x:h,y:m}=ge(e),w=s.elementFromPoint(h,m),_=w?.classList.contains(`${c}-flow__handle`)?w:f,b={handleDomNode:_,isValid:!1,connection:null,toHandle:null};if(_){const E=vr(void 0,_),g=_.getAttribute("data-nodeid"),p=_.getAttribute("data-handleid"),N=_.classList.contains("connectable"),S=_.classList.contains("connectableend");if(!g||!E)return b;const T={source:d?g:o,sourceHandle:d?p:r,target:d?o:g,targetHandle:d?r:p};b.connection=T;const $=N&&S&&(n===Ve.Strict?d&&E==="source"||!d&&E==="target":g!==o||p!==r);b.isValid=$&&l(T),b.toHandle=wr(g,E,p,u,n,!0)}return b}const rn={onPointerDown:au,isValid:Er};function cu({domNode:e,panZoom:t,getTransform:n,getViewScale:o}){const r=le(e);function i({translateExtent:c,width:a,height:l,zoomStep:u=1,pannable:d=!0,zoomable:f=!0,inversePan:h=!1}){const m=g=>{if(g.sourceEvent.type!=="wheel"||!t)return;const p=n(),N=g.sourceEvent.ctrlKey&&ot()?10:1,S=-g.sourceEvent.deltaY*(g.sourceEvent.deltaMode===1?.05:g.sourceEvent.deltaMode?1:.002)*u,T=p[2]*Math.pow(2,S*N);t.scaleTo(T)};let w=[0,0];const _=g=>{(g.sourceEvent.type==="mousedown"||g.sourceEvent.type==="touchstart")&&(w=[g.sourceEvent.clientX??g.sourceEvent.touches[0].clientX,g.sourceEvent.clientY??g.sourceEvent.touches[0].clientY])},b=g=>{const p=n();if(g.sourceEvent.type!=="mousemove"&&g.sourceEvent.type!=="touchmove"||!t)return;const N=[g.sourceEvent.clientX??g.sourceEvent.touches[0].clientX,g.sourceEvent.clientY??g.sourceEvent.touches[0].clientY],S=[N[0]-w[0],N[1]-w[1]];w=N;const T=o()*Math.max(p[2],Math.log(p[2]))*(h?-1:1),L={x:p[0]-S[0]*T,y:p[1]-S[1]*T},$=[[0,0],[a,l]];t.setViewportConstrained({x:L.x,y:L.y,zoom:p[2]},$,c)},E=Ko().on("start",_).on("zoom",d?b:null).on("zoom.wheel",f?m:null);r.call(E,{})}function s(){r.on("zoom",null)}return{update:i,destroy:s,pointer:fe}}const At=e=>({x:e.x,y:e.y,zoom:e.k}),Zt=({x:e,y:t,zoom:n})=>Ot.translate(e,t).scale(n),$e=(e,t)=>e.target.closest(`.${t}`),_r=(e,t)=>t===2&&Array.isArray(e)&&e.includes(2),lu=e=>((e*=2)<=1?e*e*e:(e-=2)*e*e+2)/2,Xt=(e,t=0,n=lu,o=()=>{})=>{const r=typeof t=="number"&&t>0;return r||o(),r?e.transition().duration(t).ease(n).on("end",o):e},Nr=e=>{const t=e.ctrlKey&&ot()?10:1;return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*t};function uu({zoomPanValues:e,noWheelClassName:t,d3Selection:n,d3Zoom:o,panOnScrollMode:r,panOnScrollSpeed:i,zoomOnPinch:s,onPanZoomStart:c,onPanZoom:a,onPanZoomEnd:l}){return u=>{if($e(u,t))return u.ctrlKey&&u.preventDefault(),!1;u.preventDefault(),u.stopImmediatePropagation();const d=n.property("__zoom").k||1;if(u.ctrlKey&&s){const _=fe(u),b=Nr(u),E=d*Math.pow(2,b);o.scaleTo(n,E,_,u);return}const f=u.deltaMode===1?20:1;let h=r===Pe.Vertical?0:u.deltaX*f,m=r===Pe.Horizontal?0:u.deltaY*f;!ot()&&u.shiftKey&&r!==Pe.Vertical&&(h=u.deltaY*f,m=0),o.translateBy(n,-(h/d)*i,-(m/d)*i,{internal:!0});const w=At(n.property("__zoom"));clearTimeout(e.panScrollTimeout),e.isPanScrolling?(a?.(u,w),e.panScrollTimeout=setTimeout(()=>{l?.(u,w),e.isPanScrolling=!1},150)):(e.isPanScrolling=!0,c?.(u,w))}}function du({noWheelClassName:e,preventScrolling:t,d3ZoomHandler:n}){return function(o,r){const i=o.type==="wheel",s=!t&&i&&!o.ctrlKey,c=$e(o,e);if(o.ctrlKey&&i&&c&&o.preventDefault(),s||c)return null;o.preventDefault(),n.call(this,o,r)}}function fu({zoomPanValues:e,onDraggingChange:t,onPanZoomStart:n}){return o=>{if(o.sourceEvent?.internal)return;const r=At(o.transform);e.mouseButton=o.sourceEvent?.button||0,e.isZoomingOrPanning=!0,e.prevViewport=r,o.sourceEvent?.type==="mousedown"&&t(!0),n&&n?.(o.sourceEvent,r)}}function hu({zoomPanValues:e,panOnDrag:t,onPaneContextMenu:n,onTransformChange:o,onPanZoom:r}){return i=>{e.usedRightMouseButton=!!(n&&_r(t,e.mouseButton??0)),i.sourceEvent?.sync||o([i.transform.x,i.transform.y,i.transform.k]),r&&!i.sourceEvent?.internal&&r?.(i.sourceEvent,At(i.transform))}}function gu({zoomPanValues:e,panOnDrag:t,panOnScroll:n,onDraggingChange:o,onPanZoomEnd:r,onPaneContextMenu:i}){return s=>{if(!s.sourceEvent?.internal&&(e.isZoomingOrPanning=!1,i&&_r(t,e.mouseButton??0)&&!e.usedRightMouseButton&&s.sourceEvent&&i(s.sourceEvent),e.usedRightMouseButton=!1,o(!1),r)){const c=At(s.transform);e.prevViewport=c,clearTimeout(e.timerId),e.timerId=setTimeout(()=>{r?.(s.sourceEvent,c)},n?150:0)}}}function pu({zoomActivationKeyPressed:e,zoomOnScroll:t,zoomOnPinch:n,panOnDrag:o,panOnScroll:r,zoomOnDoubleClick:i,userSelectionActive:s,noWheelClassName:c,noPanClassName:a,lib:l,connectionInProgress:u}){return d=>{const f=e||t,h=n&&d.ctrlKey,m=d.type==="wheel";if(d.button===1&&d.type==="mousedown"&&($e(d,`${l}-flow__node`)||$e(d,`${l}-flow__edge`)))return!0;if(!o&&!f&&!r&&!i&&!n||s||u&&!m||$e(d,c)&&m||$e(d,a)&&(!m||r&&m&&!e)||!n&&d.ctrlKey&&m)return!1;if(!n&&d.type==="touchstart"&&d.touches?.length>1)return d.preventDefault(),!1;if(!f&&!r&&!h&&m||!o&&(d.type==="mousedown"||d.type==="touchstart")||Array.isArray(o)&&!o.includes(d.button)&&d.type==="mousedown")return!1;const w=Array.isArray(o)&&o.includes(d.button)||!d.button||d.button<=1;return(!d.ctrlKey||m)&&w}}function mu({domNode:e,minZoom:t,maxZoom:n,translateExtent:o,viewport:r,onPanZoom:i,onPanZoomStart:s,onPanZoomEnd:c,onDraggingChange:a}){const l={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},u=e.getBoundingClientRect(),d=Ko().scaleExtent([t,n]).translateExtent(o),f=le(e).call(d);E({x:r.x,y:r.y,zoom:Be(r.zoom,t,n)},[[0,0],[u.width,u.height]],o);const h=f.on("wheel.zoom"),m=f.on("dblclick.zoom");d.wheelDelta(Nr);function w(C,P){return f?new Promise(D=>{d?.interpolate(P?.interpolate==="linear"?Bt:yt).transform(Xt(f,P?.duration,P?.ease,()=>D(!0)),C)}):Promise.resolve(!1)}function _({noWheelClassName:C,noPanClassName:P,onPaneContextMenu:D,userSelectionActive:y,panOnScroll:I,panOnDrag:v,panOnScrollMode:k,panOnScrollSpeed:M,preventScrolling:j,zoomOnPinch:B,zoomOnScroll:F,zoomOnDoubleClick:Y,zoomActivationKeyPressed:X,lib:O,onTransformChange:x,connectionInProgress:z,paneClickDistance:V,selectionOnDrag:H}){y&&!l.isZoomingOrPanning&&b();const W=I&&!X&&!y;d.clickDistance(H?1/0:!he(V)||V<0?0:V);const G=W?uu({zoomPanValues:l,noWheelClassName:C,d3Selection:f,d3Zoom:d,panOnScrollMode:k,panOnScrollSpeed:M,zoomOnPinch:B,onPanZoomStart:s,onPanZoom:i,onPanZoomEnd:c}):du({noWheelClassName:C,preventScrolling:j,d3ZoomHandler:h});if(f.on("wheel.zoom",G,{passive:!1}),!y){const U=fu({zoomPanValues:l,onDraggingChange:a,onPanZoomStart:s});d.on("start",U);const Q=hu({zoomPanValues:l,panOnDrag:v,onPaneContextMenu:!!D,onPanZoom:i,onTransformChange:x});d.on("zoom",Q);const J=gu({zoomPanValues:l,panOnDrag:v,panOnScroll:I,onPaneContextMenu:D,onPanZoomEnd:c,onDraggingChange:a});d.on("end",J)}const q=pu({zoomActivationKeyPressed:X,panOnDrag:v,zoomOnScroll:F,panOnScroll:I,zoomOnDoubleClick:Y,zoomOnPinch:B,userSelectionActive:y,noPanClassName:P,noWheelClassName:C,lib:O,connectionInProgress:z});d.filter(q),Y?f.on("dblclick.zoom",m):f.on("dblclick.zoom",null)}function b(){d.on("zoom",null)}async function E(C,P,D){const y=Zt(C),I=d?.constrain()(y,P,D);return I&&await w(I),new Promise(v=>v(I))}async function g(C,P){const D=Zt(C);return await w(D,P),new Promise(y=>y(D))}function p(C){if(f){const P=Zt(C),D=f.property("__zoom");(D.k!==C.zoom||D.x!==C.x||D.y!==C.y)&&d?.transform(f,P,null,{sync:!0})}}function N(){const C=f?Uo(f.node()):{x:0,y:0,k:1};return{x:C.x,y:C.y,zoom:C.k}}function S(C,P){return f?new Promise(D=>{d?.interpolate(P?.interpolate==="linear"?Bt:yt).scaleTo(Xt(f,P?.duration,P?.ease,()=>D(!0)),C)}):Promise.resolve(!1)}function T(C,P){return f?new Promise(D=>{d?.interpolate(P?.interpolate==="linear"?Bt:yt).scaleBy(Xt(f,P?.duration,P?.ease,()=>D(!0)),C)}):Promise.resolve(!1)}function L(C){d?.scaleExtent(C)}function $(C){d?.translateExtent(C)}function A(C){const P=!he(C)||C<0?0:C;d?.clickDistance(P)}return{update:_,destroy:b,setViewport:g,setViewportConstrained:E,getViewport:N,scaleTo:S,scaleBy:T,setScaleExtent:L,setTranslateExtent:$,syncViewport:p,setClickDistance:A}}var We;(function(e){e.Line="line",e.Handle="handle"})(We||(We={}));function yu({width:e,prevWidth:t,height:n,prevHeight:o,affectsX:r,affectsY:i}){const s=e-t,c=n-o,a=[s>0?1:s<0?-1:0,c>0?1:c<0?-1:0];return s&&r&&(a[0]=a[0]*-1),c&&i&&(a[1]=a[1]*-1),a}function oo(e){const t=e.includes("right")||e.includes("left"),n=e.includes("bottom")||e.includes("top"),o=e.includes("left"),r=e.includes("top");return{isHorizontal:t,isVertical:n,affectsX:o,affectsY:r}}function Ce(e,t){return Math.max(0,t-e)}function ke(e,t){return Math.max(0,e-t)}function gt(e,t,n){return Math.max(0,t-e,e-n)}function ro(e,t){return e?!t:t}function xu(e,t,n,o,r,i,s,c){let{affectsX:a,affectsY:l}=t;const{isHorizontal:u,isVertical:d}=t,f=u&&d,{xSnapped:h,ySnapped:m}=n,{minWidth:w,maxWidth:_,minHeight:b,maxHeight:E}=o,{x:g,y:p,width:N,height:S,aspectRatio:T}=e;let L=Math.floor(u?h-e.pointerX:0),$=Math.floor(d?m-e.pointerY:0);const A=N+(a?-L:L),C=S+(l?-$:$),P=-i[0]*N,D=-i[1]*S;let y=gt(A,w,_),I=gt(C,b,E);if(s){let M=0,j=0;a&&L<0?M=Ce(g+L+P,s[0][0]):!a&&L>0&&(M=ke(g+A+P,s[1][0])),l&&$<0?j=Ce(p+$+D,s[0][1]):!l&&$>0&&(j=ke(p+C+D,s[1][1])),y=Math.max(y,M),I=Math.max(I,j)}if(c){let M=0,j=0;a&&L>0?M=ke(g+L,c[0][0]):!a&&L<0&&(M=Ce(g+A,c[1][0])),l&&$>0?j=ke(p+$,c[0][1]):!l&&$<0&&(j=Ce(p+C,c[1][1])),y=Math.max(y,M),I=Math.max(I,j)}if(r){if(u){const M=gt(A/T,b,E)*T;if(y=Math.max(y,M),s){let j=0;!a&&!l||a&&!l&&f?j=ke(p+D+A/T,s[1][1])*T:j=Ce(p+D+(a?L:-L)/T,s[0][1])*T,y=Math.max(y,j)}if(c){let j=0;!a&&!l||a&&!l&&f?j=Ce(p+A/T,c[1][1])*T:j=ke(p+(a?L:-L)/T,c[0][1])*T,y=Math.max(y,j)}}if(d){const M=gt(C*T,w,_)/T;if(I=Math.max(I,M),s){let j=0;!a&&!l||l&&!a&&f?j=ke(g+C*T+P,s[1][0])/T:j=Ce(g+(l?$:-$)*T+P,s[0][0])/T,I=Math.max(I,j)}if(c){let j=0;!a&&!l||l&&!a&&f?j=Ce(g+C*T,c[1][0])/T:j=ke(g+(l?$:-$)*T,c[0][0])/T,I=Math.max(I,j)}}}$=$+($<0?I:-I),L=L+(L<0?y:-y),r&&(f?A>C*T?$=(ro(a,l)?-L:L)/T:L=(ro(a,l)?-$:$)*T:u?($=L/T,l=a):(L=$*T,a=l));const v=a?g+L:g,k=l?p+$:p;return{width:N+(a?-L:L),height:S+(l?-$:$),x:i[0]*L*(a?-1:1)+v,y:i[1]*$*(l?-1:1)+k}}const Sr={width:0,height:0,x:0,y:0},wu={...Sr,pointerX:0,pointerY:0,aspectRatio:1};function vu(e){return[[0,0],[e.measured.width,e.measured.height]]}function bu(e,t,n){const o=t.position.x+e.position.x,r=t.position.y+e.position.y,i=e.measured.width??0,s=e.measured.height??0,c=n[0]*i,a=n[1]*s;return[[o-c,r-a],[o+i-c,r+s-a]]}function Eu({domNode:e,nodeId:t,getStoreItems:n,onChange:o,onEnd:r}){const i=le(e);let s={controlDirection:oo("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function c({controlPosition:l,boundaries:u,keepAspectRatio:d,resizeDirection:f,onResizeStart:h,onResize:m,onResizeEnd:w,shouldResize:_}){let b={...Sr},E={...wu};s={boundaries:u,resizeDirection:f,keepAspectRatio:d,controlDirection:oo(l)};let g,p=null,N=[],S,T,L,$=!1;const A=Wo().on("start",C=>{const{nodeLookup:P,transform:D,snapGrid:y,snapToGrid:I,nodeOrigin:v,paneDomNode:k}=n();if(g=P.get(t),!g)return;p=k?.getBoundingClientRect()??null;const{xSnapped:M,ySnapped:j}=Qe(C.sourceEvent,{transform:D,snapGrid:y,snapToGrid:I,containerBounds:p});b={width:g.measured.width??0,height:g.measured.height??0,x:g.position.x??0,y:g.position.y??0},E={...b,pointerX:M,pointerY:j,aspectRatio:b.width/b.height},S=void 0,g.parentId&&(g.extent==="parent"||g.expandParent)&&(S=P.get(g.parentId),T=S&&g.extent==="parent"?vu(S):void 0),N=[],L=void 0;for(const[B,F]of P)if(F.parentId===t&&(N.push({id:B,position:{...F.position},extent:F.extent}),F.extent==="parent"||F.expandParent)){const Y=bu(F,g,F.origin??v);L?L=[[Math.min(Y[0][0],L[0][0]),Math.min(Y[0][1],L[0][1])],[Math.max(Y[1][0],L[1][0]),Math.max(Y[1][1],L[1][1])]]:L=Y}h?.(C,{...b})}).on("drag",C=>{const{transform:P,snapGrid:D,snapToGrid:y,nodeOrigin:I}=n(),v=Qe(C.sourceEvent,{transform:P,snapGrid:D,snapToGrid:y,containerBounds:p}),k=[];if(!g)return;const{x:M,y:j,width:B,height:F}=b,Y={},X=g.origin??I,{width:O,height:x,x:z,y:V}=xu(E,s.controlDirection,v,s.boundaries,s.keepAspectRatio,X,T,L),H=O!==B,W=x!==F,G=z!==M&&H,q=V!==j&&W;if(!G&&!q&&!H&&!W)return;if((G||q||X[0]===1||X[1]===1)&&(Y.x=G?z:b.x,Y.y=q?V:b.y,b.x=Y.x,b.y=Y.y,N.length>0)){const ee=z-M,ne=V-j;for(const ce of N)ce.position={x:ce.position.x-ee+X[0]*(O-B),y:ce.position.y-ne+X[1]*(x-F)},k.push(ce)}if((H||W)&&(Y.width=H&&(!s.resizeDirection||s.resizeDirection==="horizontal")?O:b.width,Y.height=W&&(!s.resizeDirection||s.resizeDirection==="vertical")?x:b.height,b.width=Y.width,b.height=Y.height),S&&g.expandParent){const ee=X[0]*(Y.width??0);Y.x&&Y.x{$&&(w?.(C,{...b}),r?.({...b}),$=!1)});i.call(A)}function a(){i.on(".drag",null)}return{update:c,destroy:a}}const _u={},io=e=>{let t;const n=new Set,o=(u,d)=>{const f=typeof u=="function"?u(t):u;if(!Object.is(f,t)){const h=t;t=d??(typeof f!="object"||f===null)?f:Object.assign({},t,f),n.forEach(m=>m(t,h))}},r=()=>t,a={setState:o,getState:r,getInitialState:()=>l,subscribe:u=>(n.add(u),()=>n.delete(u)),destroy:()=>{(_u?"production":void 0)!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),n.clear()}},l=t=e(o,r,a);return a},Nu=e=>e?io(e):io,{useDebugValue:Su}=hs,{useSyncExternalStoreWithSelector:Cu}=Cs,ku=e=>e;function Cr(e,t=ku,n){const o=Cu(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,n);return Su(o),o}const so=(e,t)=>{const n=Nu(e),o=(r,i=t)=>Cr(n,r,i);return Object.assign(o,n),o},Mu=(e,t)=>e?so(e,t):so;function re(e,t){if(Object.is(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(const[o,r]of e)if(!Object.is(r,t.get(o)))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(const o of e)if(!t.has(o))return!1;return!0}const n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;for(const o of n)if(!Object.prototype.hasOwnProperty.call(t,o)||!Object.is(e[o],t[o]))return!1;return!0}const Dt=Z.createContext(null),Iu=Dt.Provider,kr=xe.error001();function te(e,t){const n=Z.useContext(Dt);if(n===null)throw new Error(kr);return Cr(n,e,t)}function ie(){const e=Z.useContext(Dt);if(e===null)throw new Error(kr);return Z.useMemo(()=>({getState:e.getState,setState:e.setState,subscribe:e.subscribe}),[e])}const ao={display:"none"},Ou={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},Mr="react-flow__node-desc",Ir="react-flow__edge-desc",Tu="react-flow__aria-live",Pu=e=>e.ariaLiveMessage,Au=e=>e.ariaLabelConfig;function Du({rfId:e}){const t=te(Pu);return R.jsx("div",{id:`${Tu}-${e}`,"aria-live":"assertive","aria-atomic":"true",style:Ou,children:t})}function Lu({rfId:e,disableKeyboardA11y:t}){const n=te(Au);return R.jsxs(R.Fragment,{children:[R.jsx("div",{id:`${Mr}-${e}`,style:ao,children:t?n["node.a11yDescription.default"]:n["node.a11yDescription.keyboardDisabled"]}),R.jsx("div",{id:`${Ir}-${e}`,style:ao,children:n["edge.a11yDescription.default"]}),!t&&R.jsx(Du,{rfId:e})]})}const Lt=Z.forwardRef(({position:e="top-left",children:t,className:n,style:o,...r},i)=>{const s=`${e}`.split("-");return R.jsx("div",{className:ae(["react-flow__panel",n,...s]),style:o,ref:i,...r,children:t})});Lt.displayName="Panel";function ju({proOptions:e,position:t="bottom-right"}){return e?.hideAttribution?null:R.jsx(Lt,{position:t,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:R.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}const $u=e=>{const t=[],n=[];for(const[,o]of e.nodeLookup)o.selected&&t.push(o.internals.userNode);for(const[,o]of e.edgeLookup)o.selected&&n.push(o);return{selectedNodes:t,selectedEdges:n}},pt=e=>e.id;function zu(e,t){return re(e.selectedNodes.map(pt),t.selectedNodes.map(pt))&&re(e.selectedEdges.map(pt),t.selectedEdges.map(pt))}function Ru({onSelectionChange:e}){const t=ie(),{selectedNodes:n,selectedEdges:o}=te($u,zu);return Z.useEffect(()=>{const r={nodes:n,edges:o};e?.(r),t.getState().onSelectionChangeHandlers.forEach(i=>i(r))},[n,o,e]),null}const Hu=e=>!!e.onSelectionChangeHandlers;function Vu({onSelectionChange:e}){const t=te(Hu);return e||t?R.jsx(Ru,{onSelectionChange:e}):null}const Or=[0,0],Bu={x:0,y:0,zoom:1},Fu=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","nodesFocusable","edgesFocusable","edgesReconnectable","elevateNodesOnSelect","elevateEdgesOnSelect","minZoom","maxZoom","nodeExtent","onNodesChange","onEdgesChange","elementsSelectable","connectionMode","snapGrid","snapToGrid","translateExtent","connectOnClick","defaultEdgeOptions","fitView","fitViewOptions","onNodesDelete","onEdgesDelete","onDelete","onNodeDrag","onNodeDragStart","onNodeDragStop","onSelectionDrag","onSelectionDragStart","onSelectionDragStop","onMoveStart","onMove","onMoveEnd","noPanClassName","nodeOrigin","autoPanOnConnect","autoPanOnNodeDrag","onError","connectionRadius","isValidConnection","selectNodesOnDrag","nodeDragThreshold","connectionDragThreshold","onBeforeDelete","debug","autoPanSpeed","ariaLabelConfig","zIndexMode"],co=[...Fu,"rfId"],Yu=e=>({setNodes:e.setNodes,setEdges:e.setEdges,setMinZoom:e.setMinZoom,setMaxZoom:e.setMaxZoom,setTranslateExtent:e.setTranslateExtent,setNodeExtent:e.setNodeExtent,reset:e.reset,setDefaultNodesAndEdges:e.setDefaultNodesAndEdges}),lo={translateExtent:et,nodeOrigin:Or,minZoom:.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function Wu(e){const{setNodes:t,setEdges:n,setMinZoom:o,setMaxZoom:r,setTranslateExtent:i,setNodeExtent:s,reset:c,setDefaultNodesAndEdges:a}=te(Yu,re),l=ie();Z.useEffect(()=>(a(e.defaultNodes,e.defaultEdges),()=>{u.current=lo,c()}),[]);const u=Z.useRef(lo);return Z.useEffect(()=>{for(const d of co){const f=e[d],h=u.current[d];f!==h&&(typeof e[d]>"u"||(d==="nodes"?t(f):d==="edges"?n(f):d==="minZoom"?o(f):d==="maxZoom"?r(f):d==="translateExtent"?i(f):d==="nodeExtent"?s(f):d==="ariaLabelConfig"?l.setState({ariaLabelConfig:Dl(f)}):d==="fitView"?l.setState({fitViewQueued:f}):d==="fitViewOptions"?l.setState({fitViewOptions:f}):l.setState({[d]:f})))}u.current=e},co.map(d=>e[d])),null}function uo(){return typeof window>"u"||!window.matchMedia?null:window.matchMedia("(prefers-color-scheme: dark)")}function Zu(e){const[t,n]=Z.useState(e==="system"?null:e);return Z.useEffect(()=>{if(e!=="system"){n(e);return}const o=uo(),r=()=>n(o?.matches?"dark":"light");return r(),o?.addEventListener("change",r),()=>{o?.removeEventListener("change",r)}},[e]),t!==null?t:uo()?.matches?"dark":"light"}const fo=typeof document<"u"?document:null;function rt(e=null,t={target:fo,actInsideInputWithModifier:!0}){const[n,o]=Z.useState(!1),r=Z.useRef(!1),i=Z.useRef(new Set([])),[s,c]=Z.useMemo(()=>{if(e!==null){const l=(Array.isArray(e)?e:[e]).filter(d=>typeof d=="string").map(d=>d.replace("+",` +import{j as R}from"./vendor-query-CqA1cBNl.js";import{d as hs,r as Z,b as gs}from"./vendor-react-BfuodpLv.js";import{m as ps,n as ms,f as ys,B as xs}from"./index-DXL5wCpD.js";import{C as Ht,a as Dn,b as Ln,c as Vt}from"./card-Duzfr-hx.js";import{S as jn}from"./skeleton-CBW-y0cP.js";import{d as cn,T as ws,t as vs,n as bs}from"./timer-DWAvo6M8.js";import{i as Es,h as $n,j as zn,k as _s,l as Ns,m as Ss,n as yt,o as Bt,u as Cs}from"./vendor-recharts-BkwZfCWA.js";import"./vendor-icons-C6dhS1UE.js";import"./vendor-ui-Qm4_4bAc.js";function ae(e){if(typeof e=="string"||typeof e=="number")return""+e;let t="";if(Array.isArray(e))for(let n=0,o;n=0&&(t=e.slice(0,n))!=="xmlns"&&(e=e.slice(n+1)),Rn.hasOwnProperty(t)?{space:Rn[t],local:e}:e}function ks(e){return function(){var t=this.ownerDocument,n=this.namespaceURI;return n===Ut&&t.documentElement.namespaceURI===Ut?t.createElement(e):t.createElementNS(n,e)}}function Ms(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function To(e){var t=Mt(e);return(t.local?Ms:ks)(t)}function Is(){}function ln(e){return e==null?Is:function(){return this.querySelector(e)}}function Os(e){typeof e!="function"&&(e=ln(e));for(var t=this._groups,n=t.length,o=new Array(n),r=0;r=g&&(g=E+1);!(N=_[g])&&++g=0;)(s=o[r])&&(i&&s.compareDocumentPosition(i)^4&&i.parentNode.insertBefore(s,i),i=s);return this}function ta(e){e||(e=na);function t(d,f){return d&&f?e(d.__data__,f.__data__):!d-!f}for(var n=this._groups,o=n.length,r=new Array(o),i=0;it?1:e>=t?0:NaN}function oa(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function ra(){return Array.from(this)}function ia(){for(var e=this._groups,t=0,n=e.length;t1?this.each((t==null?ma:typeof t=="function"?xa:ya)(e,t,n??"")):He(this.node(),e)}function He(e,t){return e.style.getPropertyValue(t)||jo(e).getComputedStyle(e,null).getPropertyValue(t)}function va(e){return function(){delete this[e]}}function ba(e,t){return function(){this[e]=t}}function Ea(e,t){return function(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}}function _a(e,t){return arguments.length>1?this.each((t==null?va:typeof t=="function"?Ea:ba)(e,t)):this.node()[e]}function $o(e){return e.trim().split(/^|\s+/)}function un(e){return e.classList||new zo(e)}function zo(e){this._node=e,this._names=$o(e.getAttribute("class")||"")}zo.prototype={add:function(e){var t=this._names.indexOf(e);t<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var t=this._names.indexOf(e);t>=0&&(this._names.splice(t,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function Ro(e,t){for(var n=un(e),o=-1,r=t.length;++o=0&&(n=t.slice(o+1),t=t.slice(0,o)),{type:t,name:n}})}function Ka(e){return function(){var t=this.__on;if(t){for(var n=0,o=-1,r=t.length,i;n()=>e;function Kt(e,{sourceEvent:t,subject:n,target:o,identifier:r,active:i,x:s,y:c,dx:a,dy:l,dispatch:u}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:o,enumerable:!0,configurable:!0},identifier:{value:r,enumerable:!0,configurable:!0},active:{value:i,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:c,enumerable:!0,configurable:!0},dx:{value:a,enumerable:!0,configurable:!0},dy:{value:l,enumerable:!0,configurable:!0},_:{value:u}})}Kt.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};function ac(e){return!e.ctrlKey&&!e.button}function cc(){return this.parentNode}function lc(e,t){return t??{x:e.x,y:e.y}}function uc(){return navigator.maxTouchPoints||"ontouchstart"in this}function Wo(){var e=ac,t=cc,n=lc,o=uc,r={},i=cn("start","drag","end"),s=0,c,a,l,u,d=0;function f(p){p.on("mousedown.drag",h).filter(o).on("touchstart.drag",_).on("touchmove.drag",b,sc).on("touchend.drag touchcancel.drag",E).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function h(p,N){if(!(u||!e.call(this,p,N))){var S=g(this,t.call(this,p,N),p,N,"mouse");S&&(le(p.view).on("mousemove.drag",m,Je).on("mouseup.drag",w,Je),Fo(p.view),Ft(p),l=!1,c=p.clientX,a=p.clientY,S("start",p))}}function m(p){if(Re(p),!l){var N=p.clientX-c,S=p.clientY-a;l=N*N+S*S>d}r.mouse("drag",p)}function w(p){le(p.view).on("mousemove.drag mouseup.drag",null),Yo(p.view,l),Re(p),r.mouse("end",p)}function _(p,N){if(e.call(this,p,N)){var S=p.changedTouches,T=t.call(this,p,N),L=S.length,$,A;for($=0;${o.stop(),e(r+t)},t,n),o}var dc=cn("start","end","cancel","interrupt"),fc=[],Zo=0,Vn=1,Qt=2,xt=3,Bn=4,Jt=5,wt=6;function It(e,t,n,o,r,i){var s=e.__transition;if(!s)e.__transition={};else if(n in s)return;hc(e,n,{name:t,index:o,group:r,on:dc,tween:fc,time:i.time,delay:i.delay,duration:i.duration,ease:i.ease,timer:null,state:Zo})}function dn(e,t){var n=me(e,t);if(n.state>Zo)throw new Error("too late; already scheduled");return n}function we(e,t){var n=me(e,t);if(n.state>xt)throw new Error("too late; already running");return n}function me(e,t){var n=e.__transition;if(!n||!(n=n[t]))throw new Error("transition not found");return n}function hc(e,t,n){var o=e.__transition,r;o[t]=n,n.timer=vs(i,0,n.time);function i(l){n.state=Vn,n.timer.restart(s,n.delay,n.time),n.delay<=l&&s(l-n.delay)}function s(l){var u,d,f,h;if(n.state!==Vn)return a();for(u in o)if(h=o[u],h.name===n.name){if(h.state===xt)return Hn(s);h.state===Bn?(h.state=wt,h.timer.stop(),h.on.call("interrupt",e,e.__data__,h.index,h.group),delete o[u]):+uQt&&o.state=0&&(t=t.slice(0,n)),!t||t==="start"})}function Fc(e,t,n){var o,r,i=Bc(t)?dn:we;return function(){var s=i(this,e),c=s.on;c!==o&&(r=(o=c).copy()).on(t,n),s.on=r}}function Yc(e,t){var n=this._id;return arguments.length<2?me(this.node(),n).on.on(e):this.each(Fc(n,e,t))}function Wc(e){return function(){var t=this.parentNode;for(var n in this.__transition)if(+n!==e)return;t&&t.removeChild(this)}}function Zc(){return this.on("end.remove",Wc(this._id))}function Xc(e){var t=this._name,n=this._id;typeof e!="function"&&(e=ln(e));for(var o=this._groups,r=o.length,i=new Array(r),s=0;s()=>e;function xl(e,{sourceEvent:t,target:n,transform:o,dispatch:r}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:o,enumerable:!0,configurable:!0},_:{value:r}})}function Ee(e,t,n){this.k=e,this.x=t,this.y=n}Ee.prototype={constructor:Ee,scale:function(e){return e===1?this:new Ee(this.k*e,this.x,this.y)},translate:function(e,t){return e===0&t===0?this:new Ee(this.k,this.x+this.k*e,this.y+this.k*t)},apply:function(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function(e){return e*this.k+this.x},applyY:function(e){return e*this.k+this.y},invert:function(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function(e){return(e-this.x)/this.k},invertY:function(e){return(e-this.y)/this.k},rescaleX:function(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var Ot=new Ee(1,0,0);Uo.prototype=Ee.prototype;function Uo(e){for(;!e.__zoom;)if(!(e=e.parentNode))return Ot;return e.__zoom}function Yt(e){e.stopImmediatePropagation()}function Ke(e){e.preventDefault(),e.stopImmediatePropagation()}function wl(e){return(!e.ctrlKey||e.type==="wheel")&&!e.button}function vl(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGElement||e,e.hasAttribute("viewBox")?(e=e.viewBox.baseVal,[[e.x,e.y],[e.x+e.width,e.y+e.height]]):[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]):[[0,0],[e.clientWidth,e.clientHeight]]}function Fn(){return this.__zoom||Ot}function bl(e){return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*(e.ctrlKey?10:1)}function El(){return navigator.maxTouchPoints||"ontouchstart"in this}function _l(e,t,n){var o=e.invertX(t[0][0])-n[0][0],r=e.invertX(t[1][0])-n[1][0],i=e.invertY(t[0][1])-n[0][1],s=e.invertY(t[1][1])-n[1][1];return e.translate(r>o?(o+r)/2:Math.min(0,o)||Math.max(0,r),s>i?(i+s)/2:Math.min(0,i)||Math.max(0,s))}function Ko(){var e=wl,t=vl,n=_l,o=bl,r=El,i=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],c=250,a=yt,l=cn("start","zoom","end"),u,d,f,h=500,m=150,w=0,_=10;function b(y){y.property("__zoom",Fn).on("wheel.zoom",L,{passive:!1}).on("mousedown.zoom",$).on("dblclick.zoom",A).filter(r).on("touchstart.zoom",C).on("touchmove.zoom",P).on("touchend.zoom touchcancel.zoom",D).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}b.transform=function(y,I,v,k){var M=y.selection?y.selection():y;M.property("__zoom",Fn),y!==M?N(y,I,v,k):M.interrupt().each(function(){S(this,arguments).event(k).start().zoom(null,typeof I=="function"?I.apply(this,arguments):I).end()})},b.scaleBy=function(y,I,v,k){b.scaleTo(y,function(){var M=this.__zoom.k,j=typeof I=="function"?I.apply(this,arguments):I;return M*j},v,k)},b.scaleTo=function(y,I,v,k){b.transform(y,function(){var M=t.apply(this,arguments),j=this.__zoom,B=v==null?p(M):typeof v=="function"?v.apply(this,arguments):v,F=j.invert(B),Y=typeof I=="function"?I.apply(this,arguments):I;return n(g(E(j,Y),B,F),M,s)},v,k)},b.translateBy=function(y,I,v,k){b.transform(y,function(){return n(this.__zoom.translate(typeof I=="function"?I.apply(this,arguments):I,typeof v=="function"?v.apply(this,arguments):v),t.apply(this,arguments),s)},null,k)},b.translateTo=function(y,I,v,k,M){b.transform(y,function(){var j=t.apply(this,arguments),B=this.__zoom,F=k==null?p(j):typeof k=="function"?k.apply(this,arguments):k;return n(Ot.translate(F[0],F[1]).scale(B.k).translate(typeof I=="function"?-I.apply(this,arguments):-I,typeof v=="function"?-v.apply(this,arguments):-v),j,s)},k,M)};function E(y,I){return I=Math.max(i[0],Math.min(i[1],I)),I===y.k?y:new Ee(I,y.x,y.y)}function g(y,I,v){var k=I[0]-v[0]*y.k,M=I[1]-v[1]*y.k;return k===y.x&&M===y.y?y:new Ee(y.k,k,M)}function p(y){return[(+y[0][0]+ +y[1][0])/2,(+y[0][1]+ +y[1][1])/2]}function N(y,I,v,k){y.on("start.zoom",function(){S(this,arguments).event(k).start()}).on("interrupt.zoom end.zoom",function(){S(this,arguments).event(k).end()}).tween("zoom",function(){var M=this,j=arguments,B=S(M,j).event(k),F=t.apply(M,j),Y=v==null?p(F):typeof v=="function"?v.apply(M,j):v,X=Math.max(F[1][0]-F[0][0],F[1][1]-F[0][1]),O=M.__zoom,x=typeof I=="function"?I.apply(M,j):I,z=a(O.invert(Y).concat(X/O.k),x.invert(Y).concat(X/x.k));return function(V){if(V===1)V=x;else{var H=z(V),W=X/H[2];V=new Ee(W,Y[0]-H[0]*W,Y[1]-H[1]*W)}B.zoom(null,V)}})}function S(y,I,v){return!v&&y.__zooming||new T(y,I)}function T(y,I){this.that=y,this.args=I,this.active=0,this.sourceEvent=null,this.extent=t.apply(y,I),this.taps=0}T.prototype={event:function(y){return y&&(this.sourceEvent=y),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(y,I){return this.mouse&&y!=="mouse"&&(this.mouse[1]=I.invert(this.mouse[0])),this.touch0&&y!=="touch"&&(this.touch0[1]=I.invert(this.touch0[0])),this.touch1&&y!=="touch"&&(this.touch1[1]=I.invert(this.touch1[0])),this.that.__zoom=I,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(y){var I=le(this.that).datum();l.call(y,this.that,new xl(y,{sourceEvent:this.sourceEvent,target:b,transform:this.that.__zoom,dispatch:l}),I)}};function L(y,...I){if(!e.apply(this,arguments))return;var v=S(this,I).event(y),k=this.__zoom,M=Math.max(i[0],Math.min(i[1],k.k*Math.pow(2,o.apply(this,arguments)))),j=fe(y);if(v.wheel)(v.mouse[0][0]!==j[0]||v.mouse[0][1]!==j[1])&&(v.mouse[1]=k.invert(v.mouse[0]=j)),clearTimeout(v.wheel);else{if(k.k===M)return;v.mouse=[j,k.invert(j)],vt(this),v.start()}Ke(y),v.wheel=setTimeout(B,m),v.zoom("mouse",n(g(E(k,M),v.mouse[0],v.mouse[1]),v.extent,s));function B(){v.wheel=null,v.end()}}function $(y,...I){if(f||!e.apply(this,arguments))return;var v=y.currentTarget,k=S(this,I,!0).event(y),M=le(y.view).on("mousemove.zoom",Y,!0).on("mouseup.zoom",X,!0),j=fe(y,v),B=y.clientX,F=y.clientY;Fo(y.view),Yt(y),k.mouse=[j,this.__zoom.invert(j)],vt(this),k.start();function Y(O){if(Ke(O),!k.moved){var x=O.clientX-B,z=O.clientY-F;k.moved=x*x+z*z>w}k.event(O).zoom("mouse",n(g(k.that.__zoom,k.mouse[0]=fe(O,v),k.mouse[1]),k.extent,s))}function X(O){M.on("mousemove.zoom mouseup.zoom",null),Yo(O.view,k.moved),Ke(O),k.event(O).end()}}function A(y,...I){if(e.apply(this,arguments)){var v=this.__zoom,k=fe(y.changedTouches?y.changedTouches[0]:y,this),M=v.invert(k),j=v.k*(y.shiftKey?.5:2),B=n(g(E(v,j),k,M),t.apply(this,I),s);Ke(y),c>0?le(this).transition().duration(c).call(N,B,k,y):le(this).call(b.transform,B,k,y)}}function C(y,...I){if(e.apply(this,arguments)){var v=y.touches,k=v.length,M=S(this,I,y.changedTouches.length===k).event(y),j,B,F,Y;for(Yt(y),B=0;B"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:e=>`Node type "${e}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:e=>`The old edge with id=${e} does not exist.`,error009:e=>`Marker type "${e}" doesn't exist.`,error008:(e,{id:t,sourceHandle:n,targetHandle:o})=>`Couldn't create edge for ${e} handle id: "${e==="source"?n:o}", edge id: ${t}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:e=>`Edge type "${e}" not found. Using fallback type "default".`,error012:e=>`Node with id "${e}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(e="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${e}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs."},et=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],Qo=["Enter"," ","Escape"],Jo={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:e,x:t,y:n})=>`Moved selected node ${e}. New position, x: ${t}, y: ${n}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var Ve;(function(e){e.Strict="strict",e.Loose="loose"})(Ve||(Ve={}));var Pe;(function(e){e.Free="free",e.Vertical="vertical",e.Horizontal="horizontal"})(Pe||(Pe={}));var tt;(function(e){e.Partial="partial",e.Full="full"})(tt||(tt={}));const er={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var Me;(function(e){e.Bezier="default",e.Straight="straight",e.Step="step",e.SmoothStep="smoothstep",e.SimpleBezier="simplebezier"})(Me||(Me={}));var Et;(function(e){e.Arrow="arrow",e.ArrowClosed="arrowclosed"})(Et||(Et={}));var K;(function(e){e.Left="left",e.Top="top",e.Right="right",e.Bottom="bottom"})(K||(K={}));const Yn={[K.Left]:K.Right,[K.Right]:K.Left,[K.Top]:K.Bottom,[K.Bottom]:K.Top};function tr(e){return e===null?null:e?"valid":"invalid"}const nr=e=>"id"in e&&"source"in e&&"target"in e,Nl=e=>"id"in e&&"position"in e&&!("source"in e)&&!("target"in e),hn=e=>"id"in e&&"internals"in e&&!("source"in e)&&!("target"in e),st=(e,t=[0,0])=>{const{width:n,height:o}=Se(e),r=e.origin??t,i=n*r[0],s=o*r[1];return{x:e.position.x-i,y:e.position.y-s}},Sl=(e,t={nodeOrigin:[0,0]})=>{if(e.length===0)return{x:0,y:0,width:0,height:0};const n=e.reduce((o,r)=>{const i=typeof r=="string";let s=!t.nodeLookup&&!i?r:void 0;t.nodeLookup&&(s=i?t.nodeLookup.get(r):hn(r)?r:t.nodeLookup.get(r.id));const c=s?_t(s,t.nodeOrigin):{x:0,y:0,x2:0,y2:0};return Tt(o,c)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return Pt(n)},at=(e,t={})=>{let n={x:1/0,y:1/0,x2:-1/0,y2:-1/0},o=!1;return e.forEach(r=>{(t.filter===void 0||t.filter(r))&&(n=Tt(n,_t(r)),o=!0)}),o?Pt(n):{x:0,y:0,width:0,height:0}},gn=(e,t,[n,o,r]=[0,0,1],i=!1,s=!1)=>{const c={...lt(t,[n,o,r]),width:t.width/r,height:t.height/r},a=[];for(const l of e.values()){const{measured:u,selectable:d=!0,hidden:f=!1}=l;if(s&&!d||f)continue;const h=u.width??l.width??l.initialWidth??null,m=u.height??l.height??l.initialHeight??null,w=nt(c,Fe(l)),_=(h??0)*(m??0),b=i&&w>0;(!l.internals.handleBounds||b||w>=_||l.dragging)&&a.push(l)}return a},Cl=(e,t)=>{const n=new Set;return e.forEach(o=>{n.add(o.id)}),t.filter(o=>n.has(o.source)||n.has(o.target))};function kl(e,t){const n=new Map,o=t?.nodes?new Set(t.nodes.map(r=>r.id)):null;return e.forEach(r=>{r.measured.width&&r.measured.height&&(t?.includeHiddenNodes||!r.hidden)&&(!o||o.has(r.id))&&n.set(r.id,r)}),n}async function Ml({nodes:e,width:t,height:n,panZoom:o,minZoom:r,maxZoom:i},s){if(e.size===0)return Promise.resolve(!0);const c=kl(e,s),a=at(c),l=pn(a,t,n,s?.minZoom??r,s?.maxZoom??i,s?.padding??.1);return await o.setViewport(l,{duration:s?.duration,ease:s?.ease,interpolate:s?.interpolate}),Promise.resolve(!0)}function or({nodeId:e,nextPosition:t,nodeLookup:n,nodeOrigin:o=[0,0],nodeExtent:r,onError:i}){const s=n.get(e),c=s.parentId?n.get(s.parentId):void 0,{x:a,y:l}=c?c.internals.positionAbsolute:{x:0,y:0},u=s.origin??o;let d=s.extent||r;if(s.extent==="parent"&&!s.expandParent)if(!c)i?.("005",xe.error005());else{const h=c.measured.width,m=c.measured.height;h&&m&&(d=[[a,l],[a+h,l+m]])}else c&&Ye(s.extent)&&(d=[[s.extent[0][0]+a,s.extent[0][1]+l],[s.extent[1][0]+a,s.extent[1][1]+l]]);const f=Ye(d)?Ae(t,d,s.measured):t;return(s.measured.width===void 0||s.measured.height===void 0)&&i?.("015",xe.error015()),{position:{x:f.x-a+(s.measured.width??0)*u[0],y:f.y-l+(s.measured.height??0)*u[1]},positionAbsolute:f}}async function Il({nodesToRemove:e=[],edgesToRemove:t=[],nodes:n,edges:o,onBeforeDelete:r}){const i=new Set(e.map(f=>f.id)),s=[];for(const f of n){if(f.deletable===!1)continue;const h=i.has(f.id),m=!h&&f.parentId&&s.find(w=>w.id===f.parentId);(h||m)&&s.push(f)}const c=new Set(t.map(f=>f.id)),a=o.filter(f=>f.deletable!==!1),u=Cl(s,a);for(const f of a)c.has(f.id)&&!u.find(m=>m.id===f.id)&&u.push(f);if(!r)return{edges:u,nodes:s};const d=await r({nodes:s,edges:u});return typeof d=="boolean"?d?{edges:u,nodes:s}:{edges:[],nodes:[]}:d}const Be=(e,t=0,n=1)=>Math.min(Math.max(e,t),n),Ae=(e={x:0,y:0},t,n)=>({x:Be(e.x,t[0][0],t[1][0]-(n?.width??0)),y:Be(e.y,t[0][1],t[1][1]-(n?.height??0))});function rr(e,t,n){const{width:o,height:r}=Se(n),{x:i,y:s}=n.internals.positionAbsolute;return Ae(e,[[i,s],[i+o,s+r]],t)}const Wn=(e,t,n)=>en?-Be(Math.abs(e-n),1,t)/t:0,ir=(e,t,n=15,o=40)=>{const r=Wn(e.x,o,t.width-o)*n,i=Wn(e.y,o,t.height-o)*n;return[r,i]},Tt=(e,t)=>({x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),x2:Math.max(e.x2,t.x2),y2:Math.max(e.y2,t.y2)}),en=({x:e,y:t,width:n,height:o})=>({x:e,y:t,x2:e+n,y2:t+o}),Pt=({x:e,y:t,x2:n,y2:o})=>({x:e,y:t,width:n-e,height:o-t}),Fe=(e,t=[0,0])=>{const{x:n,y:o}=hn(e)?e.internals.positionAbsolute:st(e,t);return{x:n,y:o,width:e.measured?.width??e.width??e.initialWidth??0,height:e.measured?.height??e.height??e.initialHeight??0}},_t=(e,t=[0,0])=>{const{x:n,y:o}=hn(e)?e.internals.positionAbsolute:st(e,t);return{x:n,y:o,x2:n+(e.measured?.width??e.width??e.initialWidth??0),y2:o+(e.measured?.height??e.height??e.initialHeight??0)}},sr=(e,t)=>Pt(Tt(en(e),en(t))),nt=(e,t)=>{const n=Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x)),o=Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y));return Math.ceil(n*o)},Zn=e=>he(e.width)&&he(e.height)&&he(e.x)&&he(e.y),he=e=>!isNaN(e)&&isFinite(e),Ol=(e,t)=>{},ct=(e,t=[1,1])=>({x:t[0]*Math.round(e.x/t[0]),y:t[1]*Math.round(e.y/t[1])}),lt=({x:e,y:t},[n,o,r],i=!1,s=[1,1])=>{const c={x:(e-n)/r,y:(t-o)/r};return i?ct(c,s):c},Nt=({x:e,y:t},[n,o,r])=>({x:e*r+n,y:t*r+o});function je(e,t){if(typeof e=="number")return Math.floor((t-t/(1+e))*.5);if(typeof e=="string"&&e.endsWith("px")){const n=parseFloat(e);if(!Number.isNaN(n))return Math.floor(n)}if(typeof e=="string"&&e.endsWith("%")){const n=parseFloat(e);if(!Number.isNaN(n))return Math.floor(t*n*.01)}return console.error(`[React Flow] The padding value "${e}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function Tl(e,t,n){if(typeof e=="string"||typeof e=="number"){const o=je(e,n),r=je(e,t);return{top:o,right:r,bottom:o,left:r,x:r*2,y:o*2}}if(typeof e=="object"){const o=je(e.top??e.y??0,n),r=je(e.bottom??e.y??0,n),i=je(e.left??e.x??0,t),s=je(e.right??e.x??0,t);return{top:o,right:s,bottom:r,left:i,x:i+s,y:o+r}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function Pl(e,t,n,o,r,i){const{x:s,y:c}=Nt(e,[t,n,o]),{x:a,y:l}=Nt({x:e.x+e.width,y:e.y+e.height},[t,n,o]),u=r-a,d=i-l;return{left:Math.floor(s),top:Math.floor(c),right:Math.floor(u),bottom:Math.floor(d)}}const pn=(e,t,n,o,r,i)=>{const s=Tl(i,t,n),c=(t-s.x)/e.width,a=(n-s.y)/e.height,l=Math.min(c,a),u=Be(l,o,r),d=e.x+e.width/2,f=e.y+e.height/2,h=t/2-d*u,m=n/2-f*u,w=Pl(e,h,m,u,t,n),_={left:Math.min(w.left-s.left,0),top:Math.min(w.top-s.top,0),right:Math.min(w.right-s.right,0),bottom:Math.min(w.bottom-s.bottom,0)};return{x:h-_.left+_.right,y:m-_.top+_.bottom,zoom:u}},ot=()=>typeof navigator<"u"&&navigator?.userAgent?.indexOf("Mac")>=0;function Ye(e){return e!=null&&e!=="parent"}function Se(e){return{width:e.measured?.width??e.width??e.initialWidth??0,height:e.measured?.height??e.height??e.initialHeight??0}}function ar(e){return(e.measured?.width??e.width??e.initialWidth)!==void 0&&(e.measured?.height??e.height??e.initialHeight)!==void 0}function cr(e,t={width:0,height:0},n,o,r){const i={...e},s=o.get(n);if(s){const c=s.origin||r;i.x+=s.internals.positionAbsolute.x-(t.width??0)*c[0],i.y+=s.internals.positionAbsolute.y-(t.height??0)*c[1]}return i}function Xn(e,t){if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0}function Al(){let e,t;return{promise:new Promise((o,r)=>{e=o,t=r}),resolve:e,reject:t}}function Dl(e){return{...Jo,...e||{}}}function Qe(e,{snapGrid:t=[0,0],snapToGrid:n=!1,transform:o,containerBounds:r}){const{x:i,y:s}=ge(e),c=lt({x:i-(r?.left??0),y:s-(r?.top??0)},o),{x:a,y:l}=n?ct(c,t):c;return{xSnapped:a,ySnapped:l,...c}}const mn=e=>({width:e.offsetWidth,height:e.offsetHeight}),lr=e=>e?.getRootNode?.()||window?.document,Ll=["INPUT","SELECT","TEXTAREA"];function ur(e){const t=e.composedPath?.()?.[0]||e.target;return t?.nodeType!==1?!1:Ll.includes(t.nodeName)||t.hasAttribute("contenteditable")||!!t.closest(".nokey")}const dr=e=>"clientX"in e,ge=(e,t)=>{const n=dr(e),o=n?e.clientX:e.touches?.[0].clientX,r=n?e.clientY:e.touches?.[0].clientY;return{x:o-(t?.left??0),y:r-(t?.top??0)}},Gn=(e,t,n,o,r)=>{const i=t.querySelectorAll(`.${e}`);return!i||!i.length?null:Array.from(i).map(s=>{const c=s.getBoundingClientRect();return{id:s.getAttribute("data-handleid"),type:e,nodeId:r,position:s.getAttribute("data-handlepos"),x:(c.left-n.left)/o,y:(c.top-n.top)/o,...mn(s)}})};function fr({sourceX:e,sourceY:t,targetX:n,targetY:o,sourceControlX:r,sourceControlY:i,targetControlX:s,targetControlY:c}){const a=e*.125+r*.375+s*.375+n*.125,l=t*.125+i*.375+c*.375+o*.125,u=Math.abs(a-e),d=Math.abs(l-t);return[a,l,u,d]}function ht(e,t){return e>=0?.5*e:t*25*Math.sqrt(-e)}function qn({pos:e,x1:t,y1:n,x2:o,y2:r,c:i}){switch(e){case K.Left:return[t-ht(t-o,i),n];case K.Right:return[t+ht(o-t,i),n];case K.Top:return[t,n-ht(n-r,i)];case K.Bottom:return[t,n+ht(r-n,i)]}}function yn({sourceX:e,sourceY:t,sourcePosition:n=K.Bottom,targetX:o,targetY:r,targetPosition:i=K.Top,curvature:s=.25}){const[c,a]=qn({pos:n,x1:e,y1:t,x2:o,y2:r,c:s}),[l,u]=qn({pos:i,x1:o,y1:r,x2:e,y2:t,c:s}),[d,f,h,m]=fr({sourceX:e,sourceY:t,targetX:o,targetY:r,sourceControlX:c,sourceControlY:a,targetControlX:l,targetControlY:u});return[`M${e},${t} C${c},${a} ${l},${u} ${o},${r}`,d,f,h,m]}function hr({sourceX:e,sourceY:t,targetX:n,targetY:o}){const r=Math.abs(n-e)/2,i=n0}const zl=({source:e,sourceHandle:t,target:n,targetHandle:o})=>`xy-edge__${e}${t||""}-${n}${o||""}`,Rl=(e,t)=>t.some(n=>n.source===e.source&&n.target===e.target&&(n.sourceHandle===e.sourceHandle||!n.sourceHandle&&!e.sourceHandle)&&(n.targetHandle===e.targetHandle||!n.targetHandle&&!e.targetHandle)),Hl=(e,t,n={})=>{if(!e.source||!e.target)return t;const o=n.getEdgeId||zl;let r;return nr(e)?r={...e}:r={...e,id:o(e)},Rl(r,t)?t:(r.sourceHandle===null&&delete r.sourceHandle,r.targetHandle===null&&delete r.targetHandle,t.concat(r))};function gr({sourceX:e,sourceY:t,targetX:n,targetY:o}){const[r,i,s,c]=hr({sourceX:e,sourceY:t,targetX:n,targetY:o});return[`M ${e},${t}L ${n},${o}`,r,i,s,c]}const Un={[K.Left]:{x:-1,y:0},[K.Right]:{x:1,y:0},[K.Top]:{x:0,y:-1},[K.Bottom]:{x:0,y:1}},Vl=({source:e,sourcePosition:t=K.Bottom,target:n})=>t===K.Left||t===K.Right?e.xMath.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2));function Bl({source:e,sourcePosition:t=K.Bottom,target:n,targetPosition:o=K.Top,center:r,offset:i,stepPosition:s}){const c=Un[t],a=Un[o],l={x:e.x+c.x*i,y:e.y+c.y*i},u={x:n.x+a.x*i,y:n.y+a.y*i},d=Vl({source:l,sourcePosition:t,target:u}),f=d.x!==0?"x":"y",h=d[f];let m=[],w,_;const b={x:0,y:0},E={x:0,y:0},[,,g,p]=hr({sourceX:e.x,sourceY:e.y,targetX:n.x,targetY:n.y});if(c[f]*a[f]===-1){f==="x"?(w=r.x??l.x+(u.x-l.x)*s,_=r.y??(l.y+u.y)/2):(w=r.x??(l.x+u.x)/2,_=r.y??l.y+(u.y-l.y)*s);const S=[{x:w,y:l.y},{x:w,y:u.y}],T=[{x:l.x,y:_},{x:u.x,y:_}];c[f]===h?m=f==="x"?S:T:m=f==="x"?T:S}else{const S=[{x:l.x,y:u.y}],T=[{x:u.x,y:l.y}];if(f==="x"?m=c.x===h?T:S:m=c.y===h?S:T,t===o){const P=Math.abs(e[f]-n[f]);if(P<=i){const D=Math.min(i-1,i-P);c[f]===h?b[f]=(l[f]>e[f]?-1:1)*D:E[f]=(u[f]>n[f]?-1:1)*D}}if(t!==o){const P=f==="x"?"y":"x",D=c[f]===a[P],y=l[P]>u[P],I=l[P]=C?(w=(L.x+$.x)/2,_=m[0].y):(w=m[0].x,_=(L.y+$.y)/2)}return[[e,{x:l.x+b.x,y:l.y+b.y},...m,{x:u.x+E.x,y:u.y+E.y},n],w,_,g,p]}function Fl(e,t,n,o){const r=Math.min(Kn(e,t)/2,Kn(t,n)/2,o),{x:i,y:s}=t;if(e.x===i&&i===n.x||e.y===s&&s===n.y)return`L${i} ${s}`;if(e.y===s){const l=e.x{let p="";return g>0&&gn.id===t):e[0])||null}function nn(e,t){return e?typeof e=="string"?e:`${t?`${t}__`:""}${Object.keys(e).sort().map(o=>`${o}=${e[o]}`).join("&")}`:""}function Wl(e,{id:t,defaultColor:n,defaultMarkerStart:o,defaultMarkerEnd:r}){const i=new Set;return e.reduce((s,c)=>([c.markerStart||o,c.markerEnd||r].forEach(a=>{if(a&&typeof a=="object"){const l=nn(a,t);i.has(l)||(s.push({id:l,color:a.color||n,...a}),i.add(l))}}),s),[]).sort((s,c)=>s.id.localeCompare(c.id))}const pr=1e3,Zl=10,xn={nodeOrigin:[0,0],nodeExtent:et,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},Xl={...xn,checkEquality:!0};function wn(e,t){const n={...e};for(const o in t)t[o]!==void 0&&(n[o]=t[o]);return n}function Gl(e,t,n){const o=wn(xn,n);for(const r of e.values())if(r.parentId)bn(r,e,t,o);else{const i=st(r,o.nodeOrigin),s=Ye(r.extent)?r.extent:o.nodeExtent,c=Ae(i,s,Se(r));r.internals.positionAbsolute=c}}function ql(e,t){if(!e.handles)return e.measured?t?.internals.handleBounds:void 0;const n=[],o=[];for(const r of e.handles){const i={id:r.id,width:r.width??1,height:r.height??1,nodeId:e.id,x:r.x,y:r.y,position:r.position,type:r.type};r.type==="source"?n.push(i):r.type==="target"&&o.push(i)}return{source:n,target:o}}function vn(e){return e==="manual"}function on(e,t,n,o={}){const r=wn(Xl,o),i={i:0},s=new Map(t),c=r?.elevateNodesOnSelect&&!vn(r.zIndexMode)?pr:0;let a=e.length>0;t.clear(),n.clear();for(const l of e){let u=s.get(l.id);if(r.checkEquality&&l===u?.internals.userNode)t.set(l.id,u);else{const d=st(l,r.nodeOrigin),f=Ye(l.extent)?l.extent:r.nodeExtent,h=Ae(d,f,Se(l));u={...r.defaults,...l,measured:{width:l.measured?.width,height:l.measured?.height},internals:{positionAbsolute:h,handleBounds:ql(l,u),z:mr(l,c,r.zIndexMode),userNode:l}},t.set(l.id,u)}(u.measured===void 0||u.measured.width===void 0||u.measured.height===void 0)&&!u.hidden&&(a=!1),l.parentId&&bn(u,t,n,o,i)}return a}function Ul(e,t){if(!e.parentId)return;const n=t.get(e.parentId);n?n.set(e.id,e):t.set(e.parentId,new Map([[e.id,e]]))}function bn(e,t,n,o,r){const{elevateNodesOnSelect:i,nodeOrigin:s,nodeExtent:c,zIndexMode:a}=wn(xn,o),l=e.parentId,u=t.get(l);if(!u){console.warn(`Parent node ${l} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}Ul(e,n),r&&!u.parentId&&u.internals.rootParentIndex===void 0&&a==="auto"&&(u.internals.rootParentIndex=++r.i,u.internals.z=u.internals.z+r.i*Zl),r&&u.internals.rootParentIndex!==void 0&&(r.i=u.internals.rootParentIndex);const d=i&&!vn(a)?pr:0,{x:f,y:h,z:m}=Kl(e,u,s,c,d,a),{positionAbsolute:w}=e.internals,_=f!==w.x||h!==w.y;(_||m!==e.internals.z)&&t.set(e.id,{...e,internals:{...e.internals,positionAbsolute:_?{x:f,y:h}:w,z:m}})}function mr(e,t,n){const o=he(e.zIndex)?e.zIndex:0;return vn(n)?o:o+(e.selected?t:0)}function Kl(e,t,n,o,r,i){const{x:s,y:c}=t.internals.positionAbsolute,a=Se(e),l=st(e,n),u=Ye(e.extent)?Ae(l,e.extent,a):l;let d=Ae({x:s+u.x,y:c+u.y},o,a);e.extent==="parent"&&(d=rr(d,a,t));const f=mr(e,r,i),h=t.internals.z??0;return{x:d.x,y:d.y,z:h>=f?h+1:f}}function En(e,t,n,o=[0,0]){const r=[],i=new Map;for(const s of e){const c=t.get(s.parentId);if(!c)continue;const a=i.get(s.parentId)?.expandedRect??Fe(c),l=sr(a,s.rect);i.set(s.parentId,{expandedRect:l,parent:c})}return i.size>0&&i.forEach(({expandedRect:s,parent:c},a)=>{const l=c.internals.positionAbsolute,u=Se(c),d=c.origin??o,f=s.x0||h>0||_||b)&&(r.push({id:a,type:"position",position:{x:c.position.x-f+_,y:c.position.y-h+b}}),n.get(a)?.forEach(E=>{e.some(g=>g.id===E.id)||r.push({id:E.id,type:"position",position:{x:E.position.x+f,y:E.position.y+h}})})),(u.width0){const h=En(f,t,n,r);l.push(...h)}return{changes:l,updatedInternals:a}}async function Jl({delta:e,panZoom:t,transform:n,translateExtent:o,width:r,height:i}){if(!t||!e.x&&!e.y)return Promise.resolve(!1);const s=await t.setViewportConstrained({x:n[0]+e.x,y:n[1]+e.y,zoom:n[2]},[[0,0],[r,i]],o),c=!!s&&(s.x!==n[0]||s.y!==n[1]||s.k!==n[2]);return Promise.resolve(c)}function to(e,t,n,o,r,i){let s=r;const c=o.get(s)||new Map;o.set(s,c.set(n,t)),s=`${r}-${e}`;const a=o.get(s)||new Map;if(o.set(s,a.set(n,t)),i){s=`${r}-${e}-${i}`;const l=o.get(s)||new Map;o.set(s,l.set(n,t))}}function yr(e,t,n){e.clear(),t.clear();for(const o of n){const{source:r,target:i,sourceHandle:s=null,targetHandle:c=null}=o,a={edgeId:o.id,source:r,target:i,sourceHandle:s,targetHandle:c},l=`${r}-${s}--${i}-${c}`,u=`${i}-${c}--${r}-${s}`;to("source",a,u,e,r,s),to("target",a,l,e,i,c),t.set(o.id,o)}}function xr(e,t){if(!e.parentId)return!1;const n=t.get(e.parentId);return n?n.selected?!0:xr(n,t):!1}function no(e,t,n){let o=e;do{if(o?.matches?.(t))return!0;if(o===n)return!1;o=o?.parentElement}while(o);return!1}function eu(e,t,n,o){const r=new Map;for(const[i,s]of e)if((s.selected||s.id===o)&&(!s.parentId||!xr(s,e))&&(s.draggable||t&&typeof s.draggable>"u")){const c=e.get(i);c&&r.set(i,{id:i,position:c.position||{x:0,y:0},distance:{x:n.x-c.internals.positionAbsolute.x,y:n.y-c.internals.positionAbsolute.y},extent:c.extent,parentId:c.parentId,origin:c.origin,expandParent:c.expandParent,internals:{positionAbsolute:c.internals.positionAbsolute||{x:0,y:0}},measured:{width:c.measured.width??0,height:c.measured.height??0}})}return r}function Wt({nodeId:e,dragItems:t,nodeLookup:n,dragging:o=!0}){const r=[];for(const[s,c]of t){const a=n.get(s)?.internals.userNode;a&&r.push({...a,position:c.position,dragging:o})}if(!e)return[r[0],r];const i=n.get(e)?.internals.userNode;return[i?{...i,position:t.get(e)?.position||i.position,dragging:o}:r[0],r]}function tu({dragItems:e,snapGrid:t,x:n,y:o}){const r=e.values().next().value;if(!r)return null;const i={x:n-r.distance.x,y:o-r.distance.y},s=ct(i,t);return{x:s.x-i.x,y:s.y-i.y}}function nu({onNodeMouseDown:e,getStoreItems:t,onDragStart:n,onDrag:o,onDragStop:r}){let i={x:null,y:null},s=0,c=new Map,a=!1,l={x:0,y:0},u=null,d=!1,f=null,h=!1,m=!1,w=null;function _({noDragClassName:E,handleSelector:g,domNode:p,isSelectable:N,nodeId:S,nodeClickDistance:T=0}){f=le(p);function L({x:P,y:D}){const{nodeLookup:y,nodeExtent:I,snapGrid:v,snapToGrid:k,nodeOrigin:M,onNodeDrag:j,onSelectionDrag:B,onError:F,updateNodePositions:Y}=t();i={x:P,y:D};let X=!1;const O=c.size>1,x=O&&I?en(at(c)):null,z=O&&k?tu({dragItems:c,snapGrid:v,x:P,y:D}):null;for(const[V,H]of c){if(!y.has(V))continue;let W={x:P-H.distance.x,y:D-H.distance.y};k&&(W=z?{x:Math.round(W.x+z.x),y:Math.round(W.y+z.y)}:ct(W,v));let G=null;if(O&&I&&!H.extent&&x){const{positionAbsolute:Q}=H.internals,J=Q.x-x.x+I[0][0],ee=Q.x+H.measured.width-x.x2+I[1][0],ne=Q.y-x.y+I[0][1],ce=Q.y+H.measured.height-x.y2+I[1][1];G=[[J,ne],[ee,ce]]}const{position:q,positionAbsolute:U}=or({nodeId:V,nextPosition:W,nodeLookup:y,nodeExtent:G||I,nodeOrigin:M,onError:F});X=X||H.position.x!==q.x||H.position.y!==q.y,H.position=q,H.internals.positionAbsolute=U}if(m=m||X,!!X&&(Y(c,!0),w&&(o||j||!S&&B))){const[V,H]=Wt({nodeId:S,dragItems:c,nodeLookup:y});o?.(w,c,V,H),j?.(w,V,H),S||B?.(w,H)}}async function $(){if(!u)return;const{transform:P,panBy:D,autoPanSpeed:y,autoPanOnNodeDrag:I}=t();if(!I){a=!1,cancelAnimationFrame(s);return}const[v,k]=ir(l,u,y);(v!==0||k!==0)&&(i.x=(i.x??0)-v/P[2],i.y=(i.y??0)-k/P[2],await D({x:v,y:k})&&L(i)),s=requestAnimationFrame($)}function A(P){const{nodeLookup:D,multiSelectionActive:y,nodesDraggable:I,transform:v,snapGrid:k,snapToGrid:M,selectNodesOnDrag:j,onNodeDragStart:B,onSelectionDragStart:F,unselectNodesAndEdges:Y}=t();d=!0,(!j||!N)&&!y&&S&&(D.get(S)?.selected||Y()),N&&j&&S&&e?.(S);const X=Qe(P.sourceEvent,{transform:v,snapGrid:k,snapToGrid:M,containerBounds:u});if(i=X,c=eu(D,I,X,S),c.size>0&&(n||B||!S&&F)){const[O,x]=Wt({nodeId:S,dragItems:c,nodeLookup:D});n?.(P.sourceEvent,c,O,x),B?.(P.sourceEvent,O,x),S||F?.(P.sourceEvent,x)}}const C=Wo().clickDistance(T).on("start",P=>{const{domNode:D,nodeDragThreshold:y,transform:I,snapGrid:v,snapToGrid:k}=t();u=D?.getBoundingClientRect()||null,h=!1,m=!1,w=P.sourceEvent,y===0&&A(P),i=Qe(P.sourceEvent,{transform:I,snapGrid:v,snapToGrid:k,containerBounds:u}),l=ge(P.sourceEvent,u)}).on("drag",P=>{const{autoPanOnNodeDrag:D,transform:y,snapGrid:I,snapToGrid:v,nodeDragThreshold:k,nodeLookup:M}=t(),j=Qe(P.sourceEvent,{transform:y,snapGrid:I,snapToGrid:v,containerBounds:u});if(w=P.sourceEvent,(P.sourceEvent.type==="touchmove"&&P.sourceEvent.touches.length>1||S&&!M.has(S))&&(h=!0),!h){if(!a&&D&&d&&(a=!0,$()),!d){const B=ge(P.sourceEvent,u),F=B.x-l.x,Y=B.y-l.y;Math.sqrt(F*F+Y*Y)>k&&A(P)}(i.x!==j.xSnapped||i.y!==j.ySnapped)&&c&&d&&(l=ge(P.sourceEvent,u),L(j))}}).on("end",P=>{if(!(!d||h)&&(a=!1,d=!1,cancelAnimationFrame(s),c.size>0)){const{nodeLookup:D,updateNodePositions:y,onNodeDragStop:I,onSelectionDragStop:v}=t();if(m&&(y(c,!1),m=!1),r||I||!S&&v){const[k,M]=Wt({nodeId:S,dragItems:c,nodeLookup:D,dragging:!1});r?.(P.sourceEvent,c,k,M),I?.(P.sourceEvent,k,M),S||v?.(P.sourceEvent,M)}}}).filter(P=>{const D=P.target;return!P.button&&(!E||!no(D,`.${E}`,p))&&(!g||no(D,g,p))});f.call(C)}function b(){f?.on(".drag",null)}return{update:_,destroy:b}}function ou(e,t,n){const o=[],r={x:e.x-n,y:e.y-n,width:n*2,height:n*2};for(const i of t.values())nt(r,Fe(i))>0&&o.push(i);return o}const ru=250;function iu(e,t,n,o){let r=[],i=1/0;const s=ou(e,n,t+ru);for(const c of s){const a=[...c.internals.handleBounds?.source??[],...c.internals.handleBounds?.target??[]];for(const l of a){if(o.nodeId===l.nodeId&&o.type===l.type&&o.id===l.id)continue;const{x:u,y:d}=De(c,l,l.position,!0),f=Math.sqrt(Math.pow(u-e.x,2)+Math.pow(d-e.y,2));f>t||(f1){const c=o.type==="source"?"target":"source";return r.find(a=>a.type===c)??r[0]}return r[0]}function wr(e,t,n,o,r,i=!1){const s=o.get(e);if(!s)return null;const c=r==="strict"?s.internals.handleBounds?.[t]:[...s.internals.handleBounds?.source??[],...s.internals.handleBounds?.target??[]],a=(n?c?.find(l=>l.id===n):c?.[0])??null;return a&&i?{...a,...De(s,a,a.position,!0)}:a}function vr(e,t){return e||(t?.classList.contains("target")?"target":t?.classList.contains("source")?"source":null)}function su(e,t){let n=null;return t?n=!0:e&&!t&&(n=!1),n}const br=()=>!0;function au(e,{connectionMode:t,connectionRadius:n,handleId:o,nodeId:r,edgeUpdaterType:i,isTarget:s,domNode:c,nodeLookup:a,lib:l,autoPanOnConnect:u,flowId:d,panBy:f,cancelConnection:h,onConnectStart:m,onConnect:w,onConnectEnd:_,isValidConnection:b=br,onReconnectEnd:E,updateConnection:g,getTransform:p,getFromHandle:N,autoPanSpeed:S,dragThreshold:T=1,handleDomNode:L}){const $=lr(e.target);let A=0,C;const{x:P,y:D}=ge(e),y=vr(i,L),I=c?.getBoundingClientRect();let v=!1;if(!I||!y)return;const k=wr(r,y,o,a,t);if(!k)return;let M=ge(e,I),j=!1,B=null,F=!1,Y=null;function X(){if(!u||!I)return;const[q,U]=ir(M,I,S);f({x:q,y:U}),A=requestAnimationFrame(X)}const O={...k,nodeId:r,type:y,position:k.position},x=a.get(r);let V={inProgress:!0,isValid:null,from:De(x,O,K.Left,!0),fromHandle:O,fromPosition:O.position,fromNode:x,to:M,toHandle:null,toPosition:Yn[O.position],toNode:null,pointer:M};function H(){v=!0,g(V),m?.(e,{nodeId:r,handleId:o,handleType:y})}T===0&&H();function W(q){if(!v){const{x:ce,y:de}=ge(q),ve=ce-P,Oe=de-D;if(!(ve*ve+Oe*Oe>T*T))return;H()}if(!N()||!O){G(q);return}const U=p();M=ge(q,I),C=iu(lt(M,U,!1,[1,1]),n,a,O),j||(X(),j=!0);const Q=Er(q,{handle:C,connectionMode:t,fromNodeId:r,fromHandleId:o,fromType:s?"target":"source",isValidConnection:b,doc:$,lib:l,flowId:d,nodeLookup:a});Y=Q.handleDomNode,B=Q.connection,F=su(!!C,Q.isValid);const J=a.get(r),ee=J?De(J,O,K.Left,!0):V.from,ne={...V,from:ee,isValid:F,to:Q.toHandle&&F?Nt({x:Q.toHandle.x,y:Q.toHandle.y},U):M,toHandle:Q.toHandle,toPosition:F&&Q.toHandle?Q.toHandle.position:Yn[O.position],toNode:Q.toHandle?a.get(Q.toHandle.nodeId):null,pointer:M};g(ne),V=ne}function G(q){if(!("touches"in q&&q.touches.length>0)){if(v){(C||Y)&&B&&F&&w?.(B);const{inProgress:U,...Q}=V,J={...Q,toPosition:V.toHandle?V.toPosition:null};_?.(q,J),i&&E?.(q,J)}h(),cancelAnimationFrame(A),j=!1,F=!1,B=null,Y=null,$.removeEventListener("mousemove",W),$.removeEventListener("mouseup",G),$.removeEventListener("touchmove",W),$.removeEventListener("touchend",G)}}$.addEventListener("mousemove",W),$.addEventListener("mouseup",G),$.addEventListener("touchmove",W),$.addEventListener("touchend",G)}function Er(e,{handle:t,connectionMode:n,fromNodeId:o,fromHandleId:r,fromType:i,doc:s,lib:c,flowId:a,isValidConnection:l=br,nodeLookup:u}){const d=i==="target",f=t?s.querySelector(`.${c}-flow__handle[data-id="${a}-${t?.nodeId}-${t?.id}-${t?.type}"]`):null,{x:h,y:m}=ge(e),w=s.elementFromPoint(h,m),_=w?.classList.contains(`${c}-flow__handle`)?w:f,b={handleDomNode:_,isValid:!1,connection:null,toHandle:null};if(_){const E=vr(void 0,_),g=_.getAttribute("data-nodeid"),p=_.getAttribute("data-handleid"),N=_.classList.contains("connectable"),S=_.classList.contains("connectableend");if(!g||!E)return b;const T={source:d?g:o,sourceHandle:d?p:r,target:d?o:g,targetHandle:d?r:p};b.connection=T;const $=N&&S&&(n===Ve.Strict?d&&E==="source"||!d&&E==="target":g!==o||p!==r);b.isValid=$&&l(T),b.toHandle=wr(g,E,p,u,n,!0)}return b}const rn={onPointerDown:au,isValid:Er};function cu({domNode:e,panZoom:t,getTransform:n,getViewScale:o}){const r=le(e);function i({translateExtent:c,width:a,height:l,zoomStep:u=1,pannable:d=!0,zoomable:f=!0,inversePan:h=!1}){const m=g=>{if(g.sourceEvent.type!=="wheel"||!t)return;const p=n(),N=g.sourceEvent.ctrlKey&&ot()?10:1,S=-g.sourceEvent.deltaY*(g.sourceEvent.deltaMode===1?.05:g.sourceEvent.deltaMode?1:.002)*u,T=p[2]*Math.pow(2,S*N);t.scaleTo(T)};let w=[0,0];const _=g=>{(g.sourceEvent.type==="mousedown"||g.sourceEvent.type==="touchstart")&&(w=[g.sourceEvent.clientX??g.sourceEvent.touches[0].clientX,g.sourceEvent.clientY??g.sourceEvent.touches[0].clientY])},b=g=>{const p=n();if(g.sourceEvent.type!=="mousemove"&&g.sourceEvent.type!=="touchmove"||!t)return;const N=[g.sourceEvent.clientX??g.sourceEvent.touches[0].clientX,g.sourceEvent.clientY??g.sourceEvent.touches[0].clientY],S=[N[0]-w[0],N[1]-w[1]];w=N;const T=o()*Math.max(p[2],Math.log(p[2]))*(h?-1:1),L={x:p[0]-S[0]*T,y:p[1]-S[1]*T},$=[[0,0],[a,l]];t.setViewportConstrained({x:L.x,y:L.y,zoom:p[2]},$,c)},E=Ko().on("start",_).on("zoom",d?b:null).on("zoom.wheel",f?m:null);r.call(E,{})}function s(){r.on("zoom",null)}return{update:i,destroy:s,pointer:fe}}const At=e=>({x:e.x,y:e.y,zoom:e.k}),Zt=({x:e,y:t,zoom:n})=>Ot.translate(e,t).scale(n),$e=(e,t)=>e.target.closest(`.${t}`),_r=(e,t)=>t===2&&Array.isArray(e)&&e.includes(2),lu=e=>((e*=2)<=1?e*e*e:(e-=2)*e*e+2)/2,Xt=(e,t=0,n=lu,o=()=>{})=>{const r=typeof t=="number"&&t>0;return r||o(),r?e.transition().duration(t).ease(n).on("end",o):e},Nr=e=>{const t=e.ctrlKey&&ot()?10:1;return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*t};function uu({zoomPanValues:e,noWheelClassName:t,d3Selection:n,d3Zoom:o,panOnScrollMode:r,panOnScrollSpeed:i,zoomOnPinch:s,onPanZoomStart:c,onPanZoom:a,onPanZoomEnd:l}){return u=>{if($e(u,t))return u.ctrlKey&&u.preventDefault(),!1;u.preventDefault(),u.stopImmediatePropagation();const d=n.property("__zoom").k||1;if(u.ctrlKey&&s){const _=fe(u),b=Nr(u),E=d*Math.pow(2,b);o.scaleTo(n,E,_,u);return}const f=u.deltaMode===1?20:1;let h=r===Pe.Vertical?0:u.deltaX*f,m=r===Pe.Horizontal?0:u.deltaY*f;!ot()&&u.shiftKey&&r!==Pe.Vertical&&(h=u.deltaY*f,m=0),o.translateBy(n,-(h/d)*i,-(m/d)*i,{internal:!0});const w=At(n.property("__zoom"));clearTimeout(e.panScrollTimeout),e.isPanScrolling?(a?.(u,w),e.panScrollTimeout=setTimeout(()=>{l?.(u,w),e.isPanScrolling=!1},150)):(e.isPanScrolling=!0,c?.(u,w))}}function du({noWheelClassName:e,preventScrolling:t,d3ZoomHandler:n}){return function(o,r){const i=o.type==="wheel",s=!t&&i&&!o.ctrlKey,c=$e(o,e);if(o.ctrlKey&&i&&c&&o.preventDefault(),s||c)return null;o.preventDefault(),n.call(this,o,r)}}function fu({zoomPanValues:e,onDraggingChange:t,onPanZoomStart:n}){return o=>{if(o.sourceEvent?.internal)return;const r=At(o.transform);e.mouseButton=o.sourceEvent?.button||0,e.isZoomingOrPanning=!0,e.prevViewport=r,o.sourceEvent?.type==="mousedown"&&t(!0),n&&n?.(o.sourceEvent,r)}}function hu({zoomPanValues:e,panOnDrag:t,onPaneContextMenu:n,onTransformChange:o,onPanZoom:r}){return i=>{e.usedRightMouseButton=!!(n&&_r(t,e.mouseButton??0)),i.sourceEvent?.sync||o([i.transform.x,i.transform.y,i.transform.k]),r&&!i.sourceEvent?.internal&&r?.(i.sourceEvent,At(i.transform))}}function gu({zoomPanValues:e,panOnDrag:t,panOnScroll:n,onDraggingChange:o,onPanZoomEnd:r,onPaneContextMenu:i}){return s=>{if(!s.sourceEvent?.internal&&(e.isZoomingOrPanning=!1,i&&_r(t,e.mouseButton??0)&&!e.usedRightMouseButton&&s.sourceEvent&&i(s.sourceEvent),e.usedRightMouseButton=!1,o(!1),r)){const c=At(s.transform);e.prevViewport=c,clearTimeout(e.timerId),e.timerId=setTimeout(()=>{r?.(s.sourceEvent,c)},n?150:0)}}}function pu({zoomActivationKeyPressed:e,zoomOnScroll:t,zoomOnPinch:n,panOnDrag:o,panOnScroll:r,zoomOnDoubleClick:i,userSelectionActive:s,noWheelClassName:c,noPanClassName:a,lib:l,connectionInProgress:u}){return d=>{const f=e||t,h=n&&d.ctrlKey,m=d.type==="wheel";if(d.button===1&&d.type==="mousedown"&&($e(d,`${l}-flow__node`)||$e(d,`${l}-flow__edge`)))return!0;if(!o&&!f&&!r&&!i&&!n||s||u&&!m||$e(d,c)&&m||$e(d,a)&&(!m||r&&m&&!e)||!n&&d.ctrlKey&&m)return!1;if(!n&&d.type==="touchstart"&&d.touches?.length>1)return d.preventDefault(),!1;if(!f&&!r&&!h&&m||!o&&(d.type==="mousedown"||d.type==="touchstart")||Array.isArray(o)&&!o.includes(d.button)&&d.type==="mousedown")return!1;const w=Array.isArray(o)&&o.includes(d.button)||!d.button||d.button<=1;return(!d.ctrlKey||m)&&w}}function mu({domNode:e,minZoom:t,maxZoom:n,translateExtent:o,viewport:r,onPanZoom:i,onPanZoomStart:s,onPanZoomEnd:c,onDraggingChange:a}){const l={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},u=e.getBoundingClientRect(),d=Ko().scaleExtent([t,n]).translateExtent(o),f=le(e).call(d);E({x:r.x,y:r.y,zoom:Be(r.zoom,t,n)},[[0,0],[u.width,u.height]],o);const h=f.on("wheel.zoom"),m=f.on("dblclick.zoom");d.wheelDelta(Nr);function w(C,P){return f?new Promise(D=>{d?.interpolate(P?.interpolate==="linear"?Bt:yt).transform(Xt(f,P?.duration,P?.ease,()=>D(!0)),C)}):Promise.resolve(!1)}function _({noWheelClassName:C,noPanClassName:P,onPaneContextMenu:D,userSelectionActive:y,panOnScroll:I,panOnDrag:v,panOnScrollMode:k,panOnScrollSpeed:M,preventScrolling:j,zoomOnPinch:B,zoomOnScroll:F,zoomOnDoubleClick:Y,zoomActivationKeyPressed:X,lib:O,onTransformChange:x,connectionInProgress:z,paneClickDistance:V,selectionOnDrag:H}){y&&!l.isZoomingOrPanning&&b();const W=I&&!X&&!y;d.clickDistance(H?1/0:!he(V)||V<0?0:V);const G=W?uu({zoomPanValues:l,noWheelClassName:C,d3Selection:f,d3Zoom:d,panOnScrollMode:k,panOnScrollSpeed:M,zoomOnPinch:B,onPanZoomStart:s,onPanZoom:i,onPanZoomEnd:c}):du({noWheelClassName:C,preventScrolling:j,d3ZoomHandler:h});if(f.on("wheel.zoom",G,{passive:!1}),!y){const U=fu({zoomPanValues:l,onDraggingChange:a,onPanZoomStart:s});d.on("start",U);const Q=hu({zoomPanValues:l,panOnDrag:v,onPaneContextMenu:!!D,onPanZoom:i,onTransformChange:x});d.on("zoom",Q);const J=gu({zoomPanValues:l,panOnDrag:v,panOnScroll:I,onPaneContextMenu:D,onPanZoomEnd:c,onDraggingChange:a});d.on("end",J)}const q=pu({zoomActivationKeyPressed:X,panOnDrag:v,zoomOnScroll:F,panOnScroll:I,zoomOnDoubleClick:Y,zoomOnPinch:B,userSelectionActive:y,noPanClassName:P,noWheelClassName:C,lib:O,connectionInProgress:z});d.filter(q),Y?f.on("dblclick.zoom",m):f.on("dblclick.zoom",null)}function b(){d.on("zoom",null)}async function E(C,P,D){const y=Zt(C),I=d?.constrain()(y,P,D);return I&&await w(I),new Promise(v=>v(I))}async function g(C,P){const D=Zt(C);return await w(D,P),new Promise(y=>y(D))}function p(C){if(f){const P=Zt(C),D=f.property("__zoom");(D.k!==C.zoom||D.x!==C.x||D.y!==C.y)&&d?.transform(f,P,null,{sync:!0})}}function N(){const C=f?Uo(f.node()):{x:0,y:0,k:1};return{x:C.x,y:C.y,zoom:C.k}}function S(C,P){return f?new Promise(D=>{d?.interpolate(P?.interpolate==="linear"?Bt:yt).scaleTo(Xt(f,P?.duration,P?.ease,()=>D(!0)),C)}):Promise.resolve(!1)}function T(C,P){return f?new Promise(D=>{d?.interpolate(P?.interpolate==="linear"?Bt:yt).scaleBy(Xt(f,P?.duration,P?.ease,()=>D(!0)),C)}):Promise.resolve(!1)}function L(C){d?.scaleExtent(C)}function $(C){d?.translateExtent(C)}function A(C){const P=!he(C)||C<0?0:C;d?.clickDistance(P)}return{update:_,destroy:b,setViewport:g,setViewportConstrained:E,getViewport:N,scaleTo:S,scaleBy:T,setScaleExtent:L,setTranslateExtent:$,syncViewport:p,setClickDistance:A}}var We;(function(e){e.Line="line",e.Handle="handle"})(We||(We={}));function yu({width:e,prevWidth:t,height:n,prevHeight:o,affectsX:r,affectsY:i}){const s=e-t,c=n-o,a=[s>0?1:s<0?-1:0,c>0?1:c<0?-1:0];return s&&r&&(a[0]=a[0]*-1),c&&i&&(a[1]=a[1]*-1),a}function oo(e){const t=e.includes("right")||e.includes("left"),n=e.includes("bottom")||e.includes("top"),o=e.includes("left"),r=e.includes("top");return{isHorizontal:t,isVertical:n,affectsX:o,affectsY:r}}function Ce(e,t){return Math.max(0,t-e)}function ke(e,t){return Math.max(0,e-t)}function gt(e,t,n){return Math.max(0,t-e,e-n)}function ro(e,t){return e?!t:t}function xu(e,t,n,o,r,i,s,c){let{affectsX:a,affectsY:l}=t;const{isHorizontal:u,isVertical:d}=t,f=u&&d,{xSnapped:h,ySnapped:m}=n,{minWidth:w,maxWidth:_,minHeight:b,maxHeight:E}=o,{x:g,y:p,width:N,height:S,aspectRatio:T}=e;let L=Math.floor(u?h-e.pointerX:0),$=Math.floor(d?m-e.pointerY:0);const A=N+(a?-L:L),C=S+(l?-$:$),P=-i[0]*N,D=-i[1]*S;let y=gt(A,w,_),I=gt(C,b,E);if(s){let M=0,j=0;a&&L<0?M=Ce(g+L+P,s[0][0]):!a&&L>0&&(M=ke(g+A+P,s[1][0])),l&&$<0?j=Ce(p+$+D,s[0][1]):!l&&$>0&&(j=ke(p+C+D,s[1][1])),y=Math.max(y,M),I=Math.max(I,j)}if(c){let M=0,j=0;a&&L>0?M=ke(g+L,c[0][0]):!a&&L<0&&(M=Ce(g+A,c[1][0])),l&&$>0?j=ke(p+$,c[0][1]):!l&&$<0&&(j=Ce(p+C,c[1][1])),y=Math.max(y,M),I=Math.max(I,j)}if(r){if(u){const M=gt(A/T,b,E)*T;if(y=Math.max(y,M),s){let j=0;!a&&!l||a&&!l&&f?j=ke(p+D+A/T,s[1][1])*T:j=Ce(p+D+(a?L:-L)/T,s[0][1])*T,y=Math.max(y,j)}if(c){let j=0;!a&&!l||a&&!l&&f?j=Ce(p+A/T,c[1][1])*T:j=ke(p+(a?L:-L)/T,c[0][1])*T,y=Math.max(y,j)}}if(d){const M=gt(C*T,w,_)/T;if(I=Math.max(I,M),s){let j=0;!a&&!l||l&&!a&&f?j=ke(g+C*T+P,s[1][0])/T:j=Ce(g+(l?$:-$)*T+P,s[0][0])/T,I=Math.max(I,j)}if(c){let j=0;!a&&!l||l&&!a&&f?j=Ce(g+C*T,c[1][0])/T:j=ke(g+(l?$:-$)*T,c[0][0])/T,I=Math.max(I,j)}}}$=$+($<0?I:-I),L=L+(L<0?y:-y),r&&(f?A>C*T?$=(ro(a,l)?-L:L)/T:L=(ro(a,l)?-$:$)*T:u?($=L/T,l=a):(L=$*T,a=l));const v=a?g+L:g,k=l?p+$:p;return{width:N+(a?-L:L),height:S+(l?-$:$),x:i[0]*L*(a?-1:1)+v,y:i[1]*$*(l?-1:1)+k}}const Sr={width:0,height:0,x:0,y:0},wu={...Sr,pointerX:0,pointerY:0,aspectRatio:1};function vu(e){return[[0,0],[e.measured.width,e.measured.height]]}function bu(e,t,n){const o=t.position.x+e.position.x,r=t.position.y+e.position.y,i=e.measured.width??0,s=e.measured.height??0,c=n[0]*i,a=n[1]*s;return[[o-c,r-a],[o+i-c,r+s-a]]}function Eu({domNode:e,nodeId:t,getStoreItems:n,onChange:o,onEnd:r}){const i=le(e);let s={controlDirection:oo("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function c({controlPosition:l,boundaries:u,keepAspectRatio:d,resizeDirection:f,onResizeStart:h,onResize:m,onResizeEnd:w,shouldResize:_}){let b={...Sr},E={...wu};s={boundaries:u,resizeDirection:f,keepAspectRatio:d,controlDirection:oo(l)};let g,p=null,N=[],S,T,L,$=!1;const A=Wo().on("start",C=>{const{nodeLookup:P,transform:D,snapGrid:y,snapToGrid:I,nodeOrigin:v,paneDomNode:k}=n();if(g=P.get(t),!g)return;p=k?.getBoundingClientRect()??null;const{xSnapped:M,ySnapped:j}=Qe(C.sourceEvent,{transform:D,snapGrid:y,snapToGrid:I,containerBounds:p});b={width:g.measured.width??0,height:g.measured.height??0,x:g.position.x??0,y:g.position.y??0},E={...b,pointerX:M,pointerY:j,aspectRatio:b.width/b.height},S=void 0,g.parentId&&(g.extent==="parent"||g.expandParent)&&(S=P.get(g.parentId),T=S&&g.extent==="parent"?vu(S):void 0),N=[],L=void 0;for(const[B,F]of P)if(F.parentId===t&&(N.push({id:B,position:{...F.position},extent:F.extent}),F.extent==="parent"||F.expandParent)){const Y=bu(F,g,F.origin??v);L?L=[[Math.min(Y[0][0],L[0][0]),Math.min(Y[0][1],L[0][1])],[Math.max(Y[1][0],L[1][0]),Math.max(Y[1][1],L[1][1])]]:L=Y}h?.(C,{...b})}).on("drag",C=>{const{transform:P,snapGrid:D,snapToGrid:y,nodeOrigin:I}=n(),v=Qe(C.sourceEvent,{transform:P,snapGrid:D,snapToGrid:y,containerBounds:p}),k=[];if(!g)return;const{x:M,y:j,width:B,height:F}=b,Y={},X=g.origin??I,{width:O,height:x,x:z,y:V}=xu(E,s.controlDirection,v,s.boundaries,s.keepAspectRatio,X,T,L),H=O!==B,W=x!==F,G=z!==M&&H,q=V!==j&&W;if(!G&&!q&&!H&&!W)return;if((G||q||X[0]===1||X[1]===1)&&(Y.x=G?z:b.x,Y.y=q?V:b.y,b.x=Y.x,b.y=Y.y,N.length>0)){const ee=z-M,ne=V-j;for(const ce of N)ce.position={x:ce.position.x-ee+X[0]*(O-B),y:ce.position.y-ne+X[1]*(x-F)},k.push(ce)}if((H||W)&&(Y.width=H&&(!s.resizeDirection||s.resizeDirection==="horizontal")?O:b.width,Y.height=W&&(!s.resizeDirection||s.resizeDirection==="vertical")?x:b.height,b.width=Y.width,b.height=Y.height),S&&g.expandParent){const ee=X[0]*(Y.width??0);Y.x&&Y.x{$&&(w?.(C,{...b}),r?.({...b}),$=!1)});i.call(A)}function a(){i.on(".drag",null)}return{update:c,destroy:a}}const _u={},io=e=>{let t;const n=new Set,o=(u,d)=>{const f=typeof u=="function"?u(t):u;if(!Object.is(f,t)){const h=t;t=d??(typeof f!="object"||f===null)?f:Object.assign({},t,f),n.forEach(m=>m(t,h))}},r=()=>t,a={setState:o,getState:r,getInitialState:()=>l,subscribe:u=>(n.add(u),()=>n.delete(u)),destroy:()=>{(_u?"production":void 0)!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),n.clear()}},l=t=e(o,r,a);return a},Nu=e=>e?io(e):io,{useDebugValue:Su}=hs,{useSyncExternalStoreWithSelector:Cu}=Cs,ku=e=>e;function Cr(e,t=ku,n){const o=Cu(e.subscribe,e.getState,e.getServerState||e.getInitialState,t,n);return Su(o),o}const so=(e,t)=>{const n=Nu(e),o=(r,i=t)=>Cr(n,r,i);return Object.assign(o,n),o},Mu=(e,t)=>e?so(e,t):so;function re(e,t){if(Object.is(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(const[o,r]of e)if(!Object.is(r,t.get(o)))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(const o of e)if(!t.has(o))return!1;return!0}const n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;for(const o of n)if(!Object.prototype.hasOwnProperty.call(t,o)||!Object.is(e[o],t[o]))return!1;return!0}const Dt=Z.createContext(null),Iu=Dt.Provider,kr=xe.error001();function te(e,t){const n=Z.useContext(Dt);if(n===null)throw new Error(kr);return Cr(n,e,t)}function ie(){const e=Z.useContext(Dt);if(e===null)throw new Error(kr);return Z.useMemo(()=>({getState:e.getState,setState:e.setState,subscribe:e.subscribe}),[e])}const ao={display:"none"},Ou={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},Mr="react-flow__node-desc",Ir="react-flow__edge-desc",Tu="react-flow__aria-live",Pu=e=>e.ariaLiveMessage,Au=e=>e.ariaLabelConfig;function Du({rfId:e}){const t=te(Pu);return R.jsx("div",{id:`${Tu}-${e}`,"aria-live":"assertive","aria-atomic":"true",style:Ou,children:t})}function Lu({rfId:e,disableKeyboardA11y:t}){const n=te(Au);return R.jsxs(R.Fragment,{children:[R.jsx("div",{id:`${Mr}-${e}`,style:ao,children:t?n["node.a11yDescription.default"]:n["node.a11yDescription.keyboardDisabled"]}),R.jsx("div",{id:`${Ir}-${e}`,style:ao,children:n["edge.a11yDescription.default"]}),!t&&R.jsx(Du,{rfId:e})]})}const Lt=Z.forwardRef(({position:e="top-left",children:t,className:n,style:o,...r},i)=>{const s=`${e}`.split("-");return R.jsx("div",{className:ae(["react-flow__panel",n,...s]),style:o,ref:i,...r,children:t})});Lt.displayName="Panel";function ju({proOptions:e,position:t="bottom-right"}){return e?.hideAttribution?null:R.jsx(Lt,{position:t,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:R.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}const $u=e=>{const t=[],n=[];for(const[,o]of e.nodeLookup)o.selected&&t.push(o.internals.userNode);for(const[,o]of e.edgeLookup)o.selected&&n.push(o);return{selectedNodes:t,selectedEdges:n}},pt=e=>e.id;function zu(e,t){return re(e.selectedNodes.map(pt),t.selectedNodes.map(pt))&&re(e.selectedEdges.map(pt),t.selectedEdges.map(pt))}function Ru({onSelectionChange:e}){const t=ie(),{selectedNodes:n,selectedEdges:o}=te($u,zu);return Z.useEffect(()=>{const r={nodes:n,edges:o};e?.(r),t.getState().onSelectionChangeHandlers.forEach(i=>i(r))},[n,o,e]),null}const Hu=e=>!!e.onSelectionChangeHandlers;function Vu({onSelectionChange:e}){const t=te(Hu);return e||t?R.jsx(Ru,{onSelectionChange:e}):null}const Or=[0,0],Bu={x:0,y:0,zoom:1},Fu=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","nodesFocusable","edgesFocusable","edgesReconnectable","elevateNodesOnSelect","elevateEdgesOnSelect","minZoom","maxZoom","nodeExtent","onNodesChange","onEdgesChange","elementsSelectable","connectionMode","snapGrid","snapToGrid","translateExtent","connectOnClick","defaultEdgeOptions","fitView","fitViewOptions","onNodesDelete","onEdgesDelete","onDelete","onNodeDrag","onNodeDragStart","onNodeDragStop","onSelectionDrag","onSelectionDragStart","onSelectionDragStop","onMoveStart","onMove","onMoveEnd","noPanClassName","nodeOrigin","autoPanOnConnect","autoPanOnNodeDrag","onError","connectionRadius","isValidConnection","selectNodesOnDrag","nodeDragThreshold","connectionDragThreshold","onBeforeDelete","debug","autoPanSpeed","ariaLabelConfig","zIndexMode"],co=[...Fu,"rfId"],Yu=e=>({setNodes:e.setNodes,setEdges:e.setEdges,setMinZoom:e.setMinZoom,setMaxZoom:e.setMaxZoom,setTranslateExtent:e.setTranslateExtent,setNodeExtent:e.setNodeExtent,reset:e.reset,setDefaultNodesAndEdges:e.setDefaultNodesAndEdges}),lo={translateExtent:et,nodeOrigin:Or,minZoom:.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function Wu(e){const{setNodes:t,setEdges:n,setMinZoom:o,setMaxZoom:r,setTranslateExtent:i,setNodeExtent:s,reset:c,setDefaultNodesAndEdges:a}=te(Yu,re),l=ie();Z.useEffect(()=>(a(e.defaultNodes,e.defaultEdges),()=>{u.current=lo,c()}),[]);const u=Z.useRef(lo);return Z.useEffect(()=>{for(const d of co){const f=e[d],h=u.current[d];f!==h&&(typeof e[d]>"u"||(d==="nodes"?t(f):d==="edges"?n(f):d==="minZoom"?o(f):d==="maxZoom"?r(f):d==="translateExtent"?i(f):d==="nodeExtent"?s(f):d==="ariaLabelConfig"?l.setState({ariaLabelConfig:Dl(f)}):d==="fitView"?l.setState({fitViewQueued:f}):d==="fitViewOptions"?l.setState({fitViewOptions:f}):l.setState({[d]:f})))}u.current=e},co.map(d=>e[d])),null}function uo(){return typeof window>"u"||!window.matchMedia?null:window.matchMedia("(prefers-color-scheme: dark)")}function Zu(e){const[t,n]=Z.useState(e==="system"?null:e);return Z.useEffect(()=>{if(e!=="system"){n(e);return}const o=uo(),r=()=>n(o?.matches?"dark":"light");return r(),o?.addEventListener("change",r),()=>{o?.removeEventListener("change",r)}},[e]),t!==null?t:uo()?.matches?"dark":"light"}const fo=typeof document<"u"?document:null;function rt(e=null,t={target:fo,actInsideInputWithModifier:!0}){const[n,o]=Z.useState(!1),r=Z.useRef(!1),i=Z.useRef(new Set([])),[s,c]=Z.useMemo(()=>{if(e!==null){const l=(Array.isArray(e)?e:[e]).filter(d=>typeof d=="string").map(d=>d.replace("+",` `).replace(` `,` diff --git a/src/surreal_memory/server/static/dist/assets/EvolutionPage-_rzMyZka.js b/src/surreal_memory/server/static/dist/assets/EvolutionPage-C6VI1EZi.js similarity index 83% rename from src/surreal_memory/server/static/dist/assets/EvolutionPage-_rzMyZka.js rename to src/surreal_memory/server/static/dist/assets/EvolutionPage-C6VI1EZi.js index 7abe5de7..550af650 100644 --- a/src/surreal_memory/server/static/dist/assets/EvolutionPage-_rzMyZka.js +++ b/src/surreal_memory/server/static/dist/assets/EvolutionPage-C6VI1EZi.js @@ -1 +1 @@ -import{j as s}from"./vendor-query-CqA1cBNl.js";import{l as x,u as h}from"./index-CSMoVcy_.js";import{P as g}from"./ProGate-wWiPatWA.js";import{C as l,a as n,b as c,c as d}from"./card-DAwbJLqc.js";import{S as u}from"./skeleton-CAu64_35.js";import{R as j,B as p,X as v,Y as f,T as b,f as y,g as N}from"./vendor-recharts-BkwZfCWA.js";import"./vendor-react-BfuodpLv.js";import"./vendor-icons-IAbuZhWE.js";import"./vendor-ui-Qm4_4bAc.js";const _={short_term:"var(--color-chart-4)",working:"var(--color-chart-3)",episodic:"var(--color-chart-1)",semantic:"var(--color-chart-2)"};function r({label:t,value:o}){const e=Math.round(o*100);return s.jsxs("div",{className:"space-y-1",children:[s.jsxs("div",{className:"flex justify-between text-sm",children:[s.jsx("span",{className:"text-muted-foreground",children:t}),s.jsxs("span",{className:"font-mono font-medium",children:[e,"%"]})]}),s.jsx("div",{className:"h-2 overflow-hidden rounded-full bg-muted",children:s.jsx("div",{className:"h-full rounded-full bg-primary transition-all duration-500",style:{width:`${e}%`}})})]})}function E(){const{data:t,isLoading:o}=x(),{t:e}=h(),i=t?.stage_distribution?[{stage:e("evolution.shortTerm"),count:t.stage_distribution.short_term,key:"short_term"},{stage:e("evolution.working"),count:t.stage_distribution.working,key:"working"},{stage:e("evolution.episodic"),count:t.stage_distribution.episodic,key:"episodic"},{stage:e("evolution.semantic"),count:t.stage_distribution.semantic,key:"semantic"}]:[];return s.jsx(g,{label:e("license.pro_feature","Pro Feature"),children:s.jsxs("div",{className:"space-y-6 p-6",children:[s.jsx("h1",{className:"font-display text-2xl font-bold",children:e("evolution.title")}),s.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[s.jsxs(l,{children:[s.jsx(n,{children:s.jsx(c,{children:e("evolution.brainMetrics")})}),s.jsx(d,{children:o?s.jsx("div",{className:"space-y-4",children:Array.from({length:3}).map((a,m)=>s.jsx(u,{className:"h-10 w-full"},m))}):t?s.jsxs("div",{className:"space-y-4",children:[s.jsx(r,{label:e("evolution.maturity"),value:t.maturity_level}),s.jsx(r,{label:e("evolution.plasticity"),value:t.plasticity}),s.jsx(r,{label:e("evolution.semanticRatio"),value:t.semantic_ratio}),s.jsxs("div",{className:"mt-4 grid grid-cols-2 gap-4 text-sm",children:[s.jsxs("div",{children:[s.jsx("p",{className:"text-muted-foreground",children:e("evolution.totalFibers")}),s.jsx("p",{className:"font-mono text-lg font-bold",children:t.total_fibers.toLocaleString()})]}),s.jsxs("div",{children:[s.jsx("p",{className:"text-muted-foreground",children:e("evolution.totalNeurons")}),s.jsx("p",{className:"font-mono text-lg font-bold",children:t.total_neurons.toLocaleString()})]})]})]}):null})]}),s.jsxs(l,{children:[s.jsx(n,{children:s.jsx(c,{children:e("evolution.stageDistribution")})}),s.jsx(d,{children:o?s.jsx(u,{className:"h-64 w-full"}):s.jsx(j,{width:"100%",height:260,children:s.jsxs(p,{data:i,children:[s.jsx(v,{dataKey:"stage",tick:{fill:"var(--color-muted-foreground)",fontSize:12}}),s.jsx(f,{tick:{fill:"var(--color-muted-foreground)",fontSize:12}}),s.jsx(b,{contentStyle:{backgroundColor:"var(--color-card)",border:"1px solid var(--color-border)",borderRadius:"8px",fontSize:"12px"}}),s.jsx(y,{dataKey:"count",radius:[4,4,0,0],children:i.map(a=>s.jsx(N,{fill:_[a.key]??"var(--color-chart-1)"},a.stage))})]})})})]})]})]})})}export{E as default}; +import{j as s}from"./vendor-query-CqA1cBNl.js";import{l as x,f as h}from"./index-DXL5wCpD.js";import{P as g}from"./ProGate-DjphnyL3.js";import{C as l,a as n,b as c,c as d}from"./card-Duzfr-hx.js";import{S as u}from"./skeleton-CBW-y0cP.js";import{R as j,B as f,X as p,Y as v,T as b,f as y,g as N}from"./vendor-recharts-BkwZfCWA.js";import"./vendor-react-BfuodpLv.js";import"./vendor-icons-C6dhS1UE.js";import"./vendor-ui-Qm4_4bAc.js";const _={short_term:"var(--color-chart-4)",working:"var(--color-chart-3)",episodic:"var(--color-chart-1)",semantic:"var(--color-chart-2)"};function r({label:t,value:o}){const e=Math.round(o*100);return s.jsxs("div",{className:"space-y-1",children:[s.jsxs("div",{className:"flex justify-between text-sm",children:[s.jsx("span",{className:"text-muted-foreground",children:t}),s.jsxs("span",{className:"font-mono font-medium",children:[e,"%"]})]}),s.jsx("div",{className:"h-2 overflow-hidden rounded-full bg-muted",children:s.jsx("div",{className:"h-full rounded-full bg-primary transition-all duration-500",style:{width:`${e}%`}})})]})}function E(){const{data:t,isLoading:o}=x(),{t:e}=h(),i=t?.stage_distribution?[{stage:e("evolution.shortTerm"),count:t.stage_distribution.short_term,key:"short_term"},{stage:e("evolution.working"),count:t.stage_distribution.working,key:"working"},{stage:e("evolution.episodic"),count:t.stage_distribution.episodic,key:"episodic"},{stage:e("evolution.semantic"),count:t.stage_distribution.semantic,key:"semantic"}]:[];return s.jsx(g,{label:e("license.pro_feature","Pro Feature"),children:s.jsxs("div",{className:"space-y-6 p-6",children:[s.jsx("h1",{className:"font-display text-2xl font-bold",children:e("evolution.title")}),s.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[s.jsxs(l,{children:[s.jsx(n,{children:s.jsx(c,{children:e("evolution.brainMetrics")})}),s.jsx(d,{children:o?s.jsx("div",{className:"space-y-4",children:Array.from({length:3}).map((a,m)=>s.jsx(u,{className:"h-10 w-full"},m))}):t?s.jsxs("div",{className:"space-y-4",children:[s.jsx(r,{label:e("evolution.maturity"),value:t.maturity_level}),s.jsx(r,{label:e("evolution.plasticity"),value:t.plasticity}),s.jsx(r,{label:e("evolution.semanticRatio"),value:t.semantic_ratio}),s.jsxs("div",{className:"mt-4 grid grid-cols-2 gap-4 text-sm",children:[s.jsxs("div",{children:[s.jsx("p",{className:"text-muted-foreground",children:e("evolution.totalFibers")}),s.jsx("p",{className:"font-mono text-lg font-bold",children:t.total_fibers.toLocaleString()})]}),s.jsxs("div",{children:[s.jsx("p",{className:"text-muted-foreground",children:e("evolution.totalNeurons")}),s.jsx("p",{className:"font-mono text-lg font-bold",children:t.total_neurons.toLocaleString()})]})]})]}):null})]}),s.jsxs(l,{children:[s.jsx(n,{children:s.jsx(c,{children:e("evolution.stageDistribution")})}),s.jsx(d,{children:o?s.jsx(u,{className:"h-64 w-full"}):s.jsx(j,{width:"100%",height:260,children:s.jsxs(f,{data:i,children:[s.jsx(p,{dataKey:"stage",tick:{fill:"var(--color-muted-foreground)",fontSize:12}}),s.jsx(v,{tick:{fill:"var(--color-muted-foreground)",fontSize:12}}),s.jsx(b,{contentStyle:{backgroundColor:"var(--color-card)",border:"1px solid var(--color-border)",borderRadius:"8px",fontSize:"12px"}}),s.jsx(y,{dataKey:"count",radius:[4,4,0,0],children:i.map(a=>s.jsx(N,{fill:_[a.key]??"var(--color-chart-1)"},a.stage))})]})})})]})]})]})})}export{E as default}; diff --git a/src/surreal_memory/server/static/dist/assets/GraphPage-DnkZu_wH.js b/src/surreal_memory/server/static/dist/assets/GraphPage-B5RqF55O.js similarity index 99% rename from src/surreal_memory/server/static/dist/assets/GraphPage-DnkZu_wH.js rename to src/surreal_memory/server/static/dist/assets/GraphPage-B5RqF55O.js index 175ee550..20517f6e 100644 --- a/src/surreal_memory/server/static/dist/assets/GraphPage-DnkZu_wH.js +++ b/src/surreal_memory/server/static/dist/assets/GraphPage-B5RqF55O.js @@ -1,4 +1,4 @@ -import{j as V}from"./vendor-query-CqA1cBNl.js";import{g as mi,r as Te}from"./vendor-react-BfuodpLv.js";import{i as er,u as tr,B as ir,b as rr}from"./index-CSMoVcy_.js";import{C as Pt,a as nr,b as ar,c as It}from"./card-DAwbJLqc.js";import{S as or}from"./skeleton-CAu64_35.js";import"./vendor-icons-IAbuZhWE.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";var Qe={exports:{}},Ot;function sr(){if(Ot)return Qe.exports;Ot=1;var n=typeof Reflect=="object"?Reflect:null,i=n&&typeof n.apply=="function"?n.apply:function(v,_,S){return Function.prototype.apply.call(v,_,S)},t;n&&typeof n.ownKeys=="function"?t=n.ownKeys:Object.getOwnPropertySymbols?t=function(v){return Object.getOwnPropertyNames(v).concat(Object.getOwnPropertySymbols(v))}:t=function(v){return Object.getOwnPropertyNames(v)};function e(m){console&&console.warn&&console.warn(m)}var r=Number.isNaN||function(v){return v!==v};function a(){a.init.call(this)}Qe.exports=a,Qe.exports.once=D,a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var o=10;function s(m){if(typeof m!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof m)}Object.defineProperty(a,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(m){if(typeof m!="number"||m<0||r(m))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+m+".");o=m}}),a.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},a.prototype.setMaxListeners=function(v){if(typeof v!="number"||v<0||r(v))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+v+".");return this._maxListeners=v,this};function u(m){return m._maxListeners===void 0?a.defaultMaxListeners:m._maxListeners}a.prototype.getMaxListeners=function(){return u(this)},a.prototype.emit=function(v){for(var _=[],S=1;S0&&(P=_[0]),P instanceof Error)throw P;var j=new Error("Unhandled error."+(P?" ("+P.message+")":""));throw j.context=P,j}var z=F[v];if(z===void 0)return!1;if(typeof z=="function")i(z,this,_);else for(var f=z.length,K=b(z,f),S=0;S0&&P.length>G&&!P.warned){P.warned=!0;var j=new Error("Possible EventEmitter memory leak detected. "+P.length+" "+String(v)+" listeners added. Use emitter.setMaxListeners() to increase limit");j.name="MaxListenersExceededWarning",j.emitter=m,j.type=v,j.count=P.length,e(j)}return m}a.prototype.addListener=function(v,_){return h(this,v,_,!1)},a.prototype.on=a.prototype.addListener,a.prototype.prependListener=function(v,_){return h(this,v,_,!0)};function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(m,v,_){var S={fired:!1,wrapFn:void 0,target:m,type:v,listener:_},G=d.bind(S);return G.listener=_,S.wrapFn=G,G}a.prototype.once=function(v,_){return s(_),this.on(v,l(this,v,_)),this},a.prototype.prependOnceListener=function(v,_){return s(_),this.prependListener(v,l(this,v,_)),this},a.prototype.removeListener=function(v,_){var S,G,F,P,j;if(s(_),G=this._events,G===void 0)return this;if(S=G[v],S===void 0)return this;if(S===_||S.listener===_)--this._eventsCount===0?this._events=Object.create(null):(delete G[v],G.removeListener&&this.emit("removeListener",v,S.listener||_));else if(typeof S!="function"){for(F=-1,P=S.length-1;P>=0;P--)if(S[P]===_||S[P].listener===_){j=S[P].listener,F=P;break}if(F<0)return this;F===0?S.shift():w(S,F),S.length===1&&(G[v]=S[0]),G.removeListener!==void 0&&this.emit("removeListener",v,j||_)}return this},a.prototype.off=a.prototype.removeListener,a.prototype.removeAllListeners=function(v){var _,S,G;if(S=this._events,S===void 0)return this;if(S.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):S[v]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete S[v]),this;if(arguments.length===0){var F=Object.keys(S),P;for(G=0;G=0;G--)this.removeListener(v,_[G]);return this};function c(m,v,_){var S=m._events;if(S===void 0)return[];var G=S[v];return G===void 0?[]:typeof G=="function"?_?[G.listener||G]:[G]:_?C(G):b(G,G.length)}a.prototype.listeners=function(v){return c(this,v,!0)},a.prototype.rawListeners=function(v){return c(this,v,!1)},a.listenerCount=function(m,v){return typeof m.listenerCount=="function"?m.listenerCount(v):g.call(m,v)},a.prototype.listenerCount=g;function g(m){var v=this._events;if(v!==void 0){var _=v[m];if(typeof _=="function")return 1;if(_!==void 0)return _.length}return 0}a.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]};function b(m,v){for(var _=new Array(v),S=0;Sn++}function me(){const n=arguments;let i=null,t=-1;return{[Symbol.iterator](){return this},next(){let e=null;do{if(i===null){if(t++,t>=n.length)return{done:!0};i=n[t][Symbol.iterator]()}if(e=i.next(),e.done){i=null;continue}break}while(!0);return e}}}function Le(){return{[Symbol.iterator](){return this},next(){return{done:!0}}}}class kt extends Error{constructor(i){super(),this.name="GraphError",this.message=i}}class x extends kt{constructor(i){super(i),this.name="InvalidArgumentsGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,x.prototype.constructor)}}class k extends kt{constructor(i){super(i),this.name="NotFoundGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,k.prototype.constructor)}}class I extends kt{constructor(i){super(i),this.name="UsageGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,I.prototype.constructor)}}function bi(n,i){this.key=n,this.attributes=i,this.clear()}bi.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}};function wi(n,i){this.key=n,this.attributes=i,this.clear()}wi.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}};function Ei(n,i){this.key=n,this.attributes=i,this.clear()}Ei.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}};function Ge(n,i,t,e,r){this.key=i,this.attributes=r,this.undirected=n,this.source=t,this.target=e}Ge.prototype.attach=function(){let n="out",i="in";this.undirected&&(n=i="undirected");const t=this.source.key,e=this.target.key;this.source[n][e]=this,!(this.undirected&&t===e)&&(this.target[i][t]=this)};Ge.prototype.attachMulti=function(){let n="out",i="in";const t=this.source.key,e=this.target.key;this.undirected&&(n=i="undirected");const r=this.source[n],a=r[e];if(typeof a>"u"){r[e]=this,this.undirected&&t===e||(this.target[i][t]=this);return}a.previous=this,this.next=a,r[e]=this,this.target[i][t]=this};Ge.prototype.detach=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),delete this.source[t][i],delete this.target[e][n]};Ge.prototype.detachMulti=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),this.previous===void 0?this.next===void 0?(delete this.source[t][i],delete this.target[e][n]):(this.next.previous=void 0,this.source[t][i]=this.next,this.target[e][n]=this.next):(this.previous.next=this.next,this.next!==void 0&&(this.next.previous=this.previous))};const _i=0,Ti=1,dr=2,Si=3;function ve(n,i,t,e,r,a,o){let s,u,h,d;if(e=""+e,t===_i){if(s=n._nodes.get(e),!s)throw new k(`Graph.${i}: could not find the "${e}" node in the graph.`);h=r,d=a}else if(t===Si){if(r=""+r,u=n._edges.get(r),!u)throw new k(`Graph.${i}: could not find the "${r}" edge in the graph.`);const l=u.source.key,c=u.target.key;if(e===l)s=u.target;else if(e===c)s=u.source;else throw new k(`Graph.${i}: the "${e}" node is not attached to the "${r}" edge (${l}, ${c}).`);h=a,d=o}else{if(u=n._edges.get(e),!u)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`);t===Ti?s=u.source:s=u.target,h=r,d=a}return[s,h,d]}function lr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ve(this,i,t,e,r,a);return o.attributes[s]}}function cr(n,i,t){n.prototype[i]=function(e,r){const[a]=ve(this,i,t,e,r);return a.attributes}}function fr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ve(this,i,t,e,r,a);return o.attributes.hasOwnProperty(s)}}function gr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ve(this,i,t,e,r,a,o);return s.attributes[u]=h,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function pr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ve(this,i,t,e,r,a,o);if(typeof h!="function")throw new x(`Graph.${i}: updater should be a function.`);const d=s.attributes,l=h(d[u]);return d[u]=l,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function mr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ve(this,i,t,e,r,a);return delete o.attributes[s],this.emit("nodeAttributesUpdated",{key:o.key,type:"remove",attributes:o.attributes,name:s}),this}}function vr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ve(this,i,t,e,r,a);if(!J(s))throw new x(`Graph.${i}: provided attributes are not a plain object.`);return o.attributes=s,this.emit("nodeAttributesUpdated",{key:o.key,type:"replace",attributes:o.attributes}),this}}function yr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ve(this,i,t,e,r,a);if(!J(s))throw new x(`Graph.${i}: provided attributes are not a plain object.`);return Z(o.attributes,s),this.emit("nodeAttributesUpdated",{key:o.key,type:"merge",attributes:o.attributes,data:s}),this}}function br(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ve(this,i,t,e,r,a);if(typeof s!="function")throw new x(`Graph.${i}: provided updater is not a function.`);return o.attributes=s(o.attributes),this.emit("nodeAttributesUpdated",{key:o.key,type:"update",attributes:o.attributes}),this}}const wr=[{name:n=>`get${n}Attribute`,attacher:lr},{name:n=>`get${n}Attributes`,attacher:cr},{name:n=>`has${n}Attribute`,attacher:fr},{name:n=>`set${n}Attribute`,attacher:gr},{name:n=>`update${n}Attribute`,attacher:pr},{name:n=>`remove${n}Attribute`,attacher:mr},{name:n=>`replace${n}Attributes`,attacher:vr},{name:n=>`merge${n}Attributes`,attacher:yr},{name:n=>`update${n}Attributes`,attacher:br}];function Er(n){wr.forEach(function({name:i,attacher:t}){t(n,i("Node"),_i),t(n,i("Source"),Ti),t(n,i("Target"),dr),t(n,i("Opposite"),Si)})}function _r(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new k(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes[r]}}function Tr(n,i,t){n.prototype[i]=function(e){let r;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>1){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const a=""+e,o=""+arguments[1];if(r=oe(this,a,o,t),!r)throw new k(`Graph.${i}: could not find an edge for the given path ("${a}" - "${o}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,r=this._edges.get(e),!r)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return r.attributes}}function Sr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new k(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes.hasOwnProperty(r)}}function Cr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new k(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return o.attributes[r]=a,this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Rr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new k(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof a!="function")throw new x(`Graph.${i}: updater should be a function.`);return o.attributes[r]=a(o.attributes[r]),this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Ar(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new k(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return delete a.attributes[r],this.emit("edgeAttributesUpdated",{key:a.key,type:"remove",attributes:a.attributes,name:r}),this}}function kr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new k(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new x(`Graph.${i}: provided attributes are not a plain object.`);return a.attributes=r,this.emit("edgeAttributesUpdated",{key:a.key,type:"replace",attributes:a.attributes}),this}}function xr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new k(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new x(`Graph.${i}: provided attributes are not a plain object.`);return Z(a.attributes,r),this.emit("edgeAttributesUpdated",{key:a.key,type:"merge",attributes:a.attributes,data:r}),this}}function Dr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new k(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof r!="function")throw new x(`Graph.${i}: provided updater is not a function.`);return a.attributes=r(a.attributes),this.emit("edgeAttributesUpdated",{key:a.key,type:"update",attributes:a.attributes}),this}}const Lr=[{name:n=>`get${n}Attribute`,attacher:_r},{name:n=>`get${n}Attributes`,attacher:Tr},{name:n=>`has${n}Attribute`,attacher:Sr},{name:n=>`set${n}Attribute`,attacher:Cr},{name:n=>`update${n}Attribute`,attacher:Rr},{name:n=>`remove${n}Attribute`,attacher:Ar},{name:n=>`replace${n}Attributes`,attacher:kr},{name:n=>`merge${n}Attributes`,attacher:xr},{name:n=>`update${n}Attributes`,attacher:Dr}];function Gr(n){Lr.forEach(function({name:i,attacher:t}){t(n,i("Edge"),"mixed"),t(n,i("DirectedEdge"),"directed"),t(n,i("UndirectedEdge"),"undirected")})}const Fr=[{name:"edges",type:"mixed"},{name:"inEdges",type:"directed",direction:"in"},{name:"outEdges",type:"directed",direction:"out"},{name:"inboundEdges",type:"mixed",direction:"in"},{name:"outboundEdges",type:"mixed",direction:"out"},{name:"directedEdges",type:"directed"},{name:"undirectedEdges",type:"undirected"}];function Nr(n,i,t,e){let r=!1;for(const a in i){if(a===e)continue;const o=i[a];if(r=t(o.key,o.attributes,o.source.key,o.target.key,o.source.attributes,o.target.attributes,o.undirected),n&&r)return o.key}}function Pr(n,i,t,e){let r,a,o,s=!1;for(const u in i)if(u!==e){r=i[u];do{if(a=r.source,o=r.target,s=t(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected),n&&s)return r.key;r=r.next}while(r!==void 0)}}function ht(n,i){const t=Object.keys(n),e=t.length;let r,a=0;return{[Symbol.iterator](){return this},next(){do if(r)r=r.next;else{if(a>=e)return{done:!0};const o=t[a++];if(o===i){r=void 0;continue}r=n[o]}while(!r);return{done:!1,value:{edge:r.key,attributes:r.attributes,source:r.source.key,target:r.target.key,sourceAttributes:r.source.attributes,targetAttributes:r.target.attributes,undirected:r.undirected}}}}}function Ir(n,i,t,e){const r=i[t];if(!r)return;const a=r.source,o=r.target;if(e(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected)&&n)return r.key}function Or(n,i,t,e){let r=i[t];if(!r)return;let a=!1;do{if(a=e(r.key,r.attributes,r.source.key,r.target.key,r.source.attributes,r.target.attributes,r.undirected),n&&a)return r.key;r=r.next}while(r!==void 0)}function dt(n,i){let t=n[i];if(t.next!==void 0)return{[Symbol.iterator](){return this},next(){if(!t)return{done:!0};const r={edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected};return t=t.next,{done:!1,value:r}}};let e=!1;return{[Symbol.iterator](){return this},next(){return e===!0?{done:!0}:(e=!0,{done:!1,value:{edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected}})}}}function Ur(n,i){if(n.size===0)return[];if(i==="mixed"||i===n.type)return Array.from(n._edges.keys());const t=i==="undirected"?n.undirectedSize:n.directedSize,e=new Array(t),r=i==="undirected",a=n._edges.values();let o=0,s,u;for(;s=a.next(),s.done!==!0;)u=s.value,u.undirected===r&&(e[o++]=u.key);return e}function Ci(n,i,t,e){if(i.size===0)return;const r=t!=="mixed"&&t!==i.type,a=t==="undirected";let o,s,u=!1;const h=i._edges.values();for(;o=h.next(),o.done!==!0;){if(s=o.value,r&&s.undirected!==a)continue;const{key:d,attributes:l,source:c,target:g}=s;if(u=e(d,l,c.key,g.key,c.attributes,g.attributes,s.undirected),n&&u)return d}}function zr(n,i){if(n.size===0)return Le();const t=i!=="mixed"&&i!==n.type,e=i==="undirected",r=n._edges.values();return{[Symbol.iterator](){return this},next(){let a,o;for(;;){if(a=r.next(),a.done)return a;if(o=a.value,!(t&&o.undirected!==e))break}return{value:{edge:o.key,attributes:o.attributes,source:o.source.key,target:o.target.key,sourceAttributes:o.source.attributes,targetAttributes:o.target.attributes,undirected:o.undirected},done:!1}}}}function xt(n,i,t,e,r,a){const o=i?Pr:Nr;let s;if(t!=="undirected"&&(e!=="out"&&(s=o(n,r.in,a),n&&s)||e!=="in"&&(s=o(n,r.out,a,e?void 0:r.key),n&&s))||t!=="directed"&&(s=o(n,r.undirected,a),n&&s))return s}function $r(n,i,t,e){const r=[];return xt(!1,n,i,t,e,function(a){r.push(a)}),r}function Br(n,i,t){let e=Le();return n!=="undirected"&&(i!=="out"&&typeof t.in<"u"&&(e=me(e,ht(t.in))),i!=="in"&&typeof t.out<"u"&&(e=me(e,ht(t.out,i?void 0:t.key)))),n!=="directed"&&typeof t.undirected<"u"&&(e=me(e,ht(t.undirected))),e}function Dt(n,i,t,e,r,a,o){const s=t?Or:Ir;let u;if(i!=="undirected"&&(typeof r.in<"u"&&e!=="out"&&(u=s(n,r.in,a,o),n&&u)||typeof r.out<"u"&&e!=="in"&&(e||r.key!==a)&&(u=s(n,r.out,a,o),n&&u))||i!=="directed"&&typeof r.undirected<"u"&&(u=s(n,r.undirected,a,o),n&&u))return u}function Mr(n,i,t,e,r){const a=[];return Dt(!1,n,i,t,e,r,function(o){a.push(o)}),a}function Hr(n,i,t,e){let r=Le();return n!=="undirected"&&(typeof t.in<"u"&&i!=="out"&&e in t.in&&(r=me(r,dt(t.in,e))),typeof t.out<"u"&&i!=="in"&&e in t.out&&(i||t.key!==e)&&(r=me(r,dt(t.out,e)))),n!=="directed"&&typeof t.undirected<"u"&&e in t.undirected&&(r=me(r,dt(t.undirected,e))),r}function Wr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a,o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];if(!arguments.length)return Ur(this,e);if(arguments.length===1){a=""+a;const s=this._nodes.get(a);if(typeof s>"u")throw new k(`Graph.${t}: could not find the "${a}" node in the graph.`);return $r(this.multi,e==="mixed"?this.type:e,r,s)}if(arguments.length===2){a=""+a,o=""+o;const s=this._nodes.get(a);if(!s)throw new k(`Graph.${t}: could not find the "${a}" source node in the graph.`);if(!this._nodes.has(o))throw new k(`Graph.${t}: could not find the "${o}" target node in the graph.`);return Mr(e,this.multi,r,s,o)}throw new x(`Graph.${t}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function jr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d,l){if(!(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)){if(arguments.length===1)return l=h,Ci(!1,this,e,l);if(arguments.length===2){h=""+h,l=d;const c=this._nodes.get(h);if(typeof c>"u")throw new k(`Graph.${a}: could not find the "${h}" node in the graph.`);return xt(!1,this.multi,e==="mixed"?this.type:e,r,c,l)}if(arguments.length===3){h=""+h,d=""+d;const c=this._nodes.get(h);if(!c)throw new k(`Graph.${a}: could not find the "${h}" source node in the graph.`);if(!this._nodes.has(d))throw new k(`Graph.${a}: could not find the "${d}" target node in the graph.`);return Dt(!1,e,this.multi,r,c,d,l)}throw new x(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)}};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop();let l;if(h.length===0){let c=0;e!=="directed"&&(c+=this.undirectedSize),e!=="undirected"&&(c+=this.directedSize),l=new Array(c);let g=0;h.push((b,w,C,D,T,A,m)=>{l[g++]=d(b,w,C,D,T,A,m)})}else l=[],h.push((c,g,b,w,C,D,T)=>{l.push(d(c,g,b,w,C,D,T))});return this[a].apply(this,h),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop(),l=[];return h.push((c,g,b,w,C,D,T)=>{d(c,g,b,w,C,D,T)&&l.push(c)}),this[a].apply(this,h),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(){let h=Array.prototype.slice.call(arguments);if(h.length<2||h.length>4)throw new x(`Graph.${u}: invalid number of arguments (expecting 2, 3 or 4 and got ${h.length}).`);if(typeof h[h.length-1]=="function"&&typeof h[h.length-2]!="function")throw new x(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let d,l;h.length===2?(d=h[0],l=h[1],h=[]):h.length===3?(d=h[1],l=h[2],h=[h[0]]):h.length===4&&(d=h[2],l=h[3],h=[h[0],h[1]]);let c=l;return h.push((g,b,w,C,D,T,A)=>{c=d(c,g,b,w,C,D,T,A)}),this[a].apply(this,h),c}}function Vr(n,i){const{name:t,type:e,direction:r}=i,a="find"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(u,h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return!1;if(arguments.length===1)return d=u,Ci(!0,this,e,d);if(arguments.length===2){u=""+u,d=h;const l=this._nodes.get(u);if(typeof l>"u")throw new k(`Graph.${a}: could not find the "${u}" node in the graph.`);return xt(!0,this.multi,e==="mixed"?this.type:e,r,l,d)}if(arguments.length===3){u=""+u,h=""+h;const l=this._nodes.get(u);if(!l)throw new k(`Graph.${a}: could not find the "${u}" source node in the graph.`);if(!this._nodes.has(h))throw new k(`Graph.${a}: could not find the "${h}" target node in the graph.`);return Dt(!0,e,this.multi,r,l,h,d)}throw new x(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)};const o="some"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[o]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,c,g,b,w,C,D)=>h(l,c,g,b,w,C,D)),!!this[a].apply(this,u)};const s="every"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[s]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,c,g,b,w,C,D)=>!h(l,c,g,b,w,C,D)),!this[a].apply(this,u)}}function qr(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o,s){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();if(!arguments.length)return zr(this,e);if(arguments.length===1){o=""+o;const u=this._nodes.get(o);if(!u)throw new k(`Graph.${a}: could not find the "${o}" node in the graph.`);return Br(e,r,u)}if(arguments.length===2){o=""+o,s=""+s;const u=this._nodes.get(o);if(!u)throw new k(`Graph.${a}: could not find the "${o}" source node in the graph.`);if(!this._nodes.has(s))throw new k(`Graph.${a}: could not find the "${s}" target node in the graph.`);return Hr(e,r,u,s)}throw new x(`Graph.${a}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function Kr(n){Fr.forEach(i=>{Wr(n,i),jr(n,i),Vr(n,i),qr(n,i)})}const Yr=[{name:"neighbors",type:"mixed"},{name:"inNeighbors",type:"directed",direction:"in"},{name:"outNeighbors",type:"directed",direction:"out"},{name:"inboundNeighbors",type:"mixed",direction:"in"},{name:"outboundNeighbors",type:"mixed",direction:"out"},{name:"directedNeighbors",type:"directed"},{name:"undirectedNeighbors",type:"undirected"}];function ot(){this.A=null,this.B=null}ot.prototype.wrap=function(n){this.A===null?this.A=n:this.B===null&&(this.B=n)};ot.prototype.has=function(n){return this.A!==null&&n in this.A||this.B!==null&&n in this.B};function Oe(n,i,t,e,r){for(const a in e){const o=e[a],s=o.source,u=o.target,h=s===t?u:s;if(i&&i.has(h.key))continue;const d=r(h.key,h.attributes);if(n&&d)return h.key}}function Lt(n,i,t,e,r){if(i!=="mixed"){if(i==="undirected")return Oe(n,null,e,e.undirected,r);if(typeof t=="string")return Oe(n,null,e,e[t],r)}const a=new ot;let o;if(i!=="undirected"){if(t!=="out"){if(o=Oe(n,null,e,e.in,r),n&&o)return o;a.wrap(e.in)}if(t!=="in"){if(o=Oe(n,a,e,e.out,r),n&&o)return o;a.wrap(e.out)}}if(i!=="directed"&&(o=Oe(n,a,e,e.undirected,r),n&&o))return o}function Zr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Object.keys(t.undirected);if(typeof i=="string")return Object.keys(t[i])}const e=[];return Lt(!1,n,i,t,function(r){e.push(r)}),e}function Ue(n,i,t){const e=Object.keys(t),r=e.length;let a=0;return{[Symbol.iterator](){return this},next(){let o=null;do{if(a>=r)return n&&n.wrap(t),{done:!0};const s=t[e[a++]],u=s.source,h=s.target;if(o=u===i?h:u,n&&n.has(o.key)){o=null;continue}}while(o===null);return{done:!1,value:{neighbor:o.key,attributes:o.attributes}}}}}function Xr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Ue(null,t,t.undirected);if(typeof i=="string")return Ue(null,t,t[i])}let e=Le();const r=new ot;return n!=="undirected"&&(i!=="out"&&(e=me(e,Ue(r,t,t.in))),i!=="in"&&(e=me(e,Ue(r,t,t.out)))),n!=="directed"&&(e=me(e,Ue(r,t,t.undirected))),e}function Jr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];a=""+a;const o=this._nodes.get(a);if(typeof o>"u")throw new k(`Graph.${t}: could not find the "${a}" node in the graph.`);return Zr(e==="mixed"?this.type:e,r,o)}}function Qr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new k(`Graph.${a}: could not find the "${h}" node in the graph.`);Lt(!1,e==="mixed"?this.type:e,r,l,d)};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(h,d){const l=[];return this[a](h,(c,g)=>{l.push(d(c,g))}),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(h,d){const l=[];return this[a](h,(c,g)=>{d(c,g)&&l.push(c)}),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(h,d,l){if(arguments.length<3)throw new x(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let c=l;return this[a](h,(g,b)=>{c=d(c,g,b)}),c}}function en(n,i){const{name:t,type:e,direction:r}=i,a=t[0].toUpperCase()+t.slice(1,-1),o="find"+a;n.prototype[o]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new k(`Graph.${o}: could not find the "${h}" node in the graph.`);return Lt(!0,e==="mixed"?this.type:e,r,l,d)};const s="some"+a;n.prototype[s]=function(h,d){return!!this[o](h,d)};const u="every"+a;n.prototype[u]=function(h,d){return!this[o](h,(c,g)=>!d(c,g))}}function tn(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();o=""+o;const s=this._nodes.get(o);if(typeof s>"u")throw new k(`Graph.${a}: could not find the "${o}" node in the graph.`);return Xr(e==="mixed"?this.type:e,r,s)}}function rn(n){Yr.forEach(i=>{Jr(n,i),Qr(n,i),en(n,i),tn(n,i)})}function et(n,i,t,e,r){const a=e._nodes.values(),o=e.type;let s,u,h,d,l,c;for(;s=a.next(),s.done!==!0;){let g=!1;if(u=s.value,o!=="undirected"){d=u.out;for(h in d){l=d[h];do c=l.target,g=!0,r(u.key,c.key,u.attributes,c.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}if(o!=="directed"){d=u.undirected;for(h in d)if(!(i&&u.key>h)){l=d[h];do c=l.target,c.key!==h&&(c=l.source),g=!0,r(u.key,c.key,u.attributes,c.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}t&&!g&&r(u.key,null,u.attributes,null,null,null,null)}}function nn(n,i){const t={key:n};return yi(i.attributes)||(t.attributes=Z({},i.attributes)),t}function an(n,i,t){const e={key:i,source:t.source.key,target:t.target.key};return yi(t.attributes)||(e.attributes=Z({},t.attributes)),n==="mixed"&&t.undirected&&(e.undirected=!0),e}function on(n){if(!J(n))throw new x('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a "key" property.');if(!("key"in n))throw new x("Graph.import: serialized node is missing its key.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new x("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.")}function sn(n){if(!J(n))throw new x('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a "source" & "target" property.');if(!("source"in n))throw new x("Graph.import: serialized edge is missing its source.");if(!("target"in n))throw new x("Graph.import: serialized edge is missing its target.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new x("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.");if("undirected"in n&&typeof n.undirected!="boolean")throw new x("Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.")}const un=hr(),hn=new Set(["directed","undirected","mixed"]),zt=new Set(["domain","_events","_eventsCount","_maxListeners"]),dn=[{name:n=>`${n}Edge`,generateKey:!0},{name:n=>`${n}DirectedEdge`,generateKey:!0,type:"directed"},{name:n=>`${n}UndirectedEdge`,generateKey:!0,type:"undirected"},{name:n=>`${n}EdgeWithKey`},{name:n=>`${n}DirectedEdgeWithKey`,type:"directed"},{name:n=>`${n}UndirectedEdgeWithKey`,type:"undirected"}],ln={allowSelfLoops:!0,multi:!1,type:"mixed"};function cn(n,i,t){if(t&&!J(t))throw new x(`Graph.addNode: invalid attributes. Expecting an object but got "${t}"`);if(i=""+i,t=t||{},n._nodes.has(i))throw new I(`Graph.addNode: the "${i}" node already exist in the graph.`);const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function $t(n,i,t){const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function Ri(n,i,t,e,r,a,o,s){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.`);if(s&&!J(s))throw new x(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`);if(a=""+a,o=""+o,s=s||{},!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);const u=n._nodes.get(a),h=n._nodes.get(o);if(!u)throw new k(`Graph.${i}: source node "${a}" not found.`);if(!h)throw new k(`Graph.${i}: target node "${o}" not found.`);const d={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);if(!n.multi&&(e?typeof u.undirected[o]<"u":typeof u.out[o]<"u"))throw new I(`Graph.${i}: an edge linking "${a}" to "${o}" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`);const l=new Ge(e,r,u,h,s);n._edges.set(r,l);const c=a===o;return e?(u.undirectedDegree++,h.undirectedDegree++,c&&(u.undirectedLoops++,n._undirectedSelfLoopCount++)):(u.outDegree++,h.inDegree++,c&&(u.directedLoops++,n._directedSelfLoopCount++)),n.multi?l.attachMulti():l.attach(),e?n._undirectedSize++:n._directedSize++,d.key=r,n.emit("edgeAdded",d),r}function fn(n,i,t,e,r,a,o,s,u){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.`);if(s){if(u){if(typeof s!="function")throw new x(`Graph.${i}: invalid updater function. Expecting a function but got "${s}"`)}else if(!J(s))throw new x(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`)}a=""+a,o=""+o;let h;if(u&&(h=s,s=void 0),!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);let d=n._nodes.get(a),l=n._nodes.get(o),c,g;if(!t&&(c=n._edges.get(r),c)){if((c.source.key!==a||c.target.key!==o)&&(!e||c.source.key!==o||c.target.key!==a))throw new I(`Graph.${i}: inconsistency detected when attempting to merge the "${r}" edge with "${a}" source & "${o}" target vs. ("${c.source.key}", "${c.target.key}").`);g=c}if(!g&&!n.multi&&d&&(g=e?d.undirected[o]:d.out[o]),g){const T=[g.key,!1,!1,!1];if(u?!h:!s)return T;if(u){const A=g.attributes;g.attributes=h(A),n.emit("edgeAttributesUpdated",{type:"replace",key:g.key,attributes:g.attributes})}else Z(g.attributes,s),n.emit("edgeAttributesUpdated",{type:"merge",key:g.key,attributes:g.attributes,data:s});return T}s=s||{},u&&h&&(s=h(s));const b={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);let w=!1,C=!1;d||(d=$t(n,a,{}),w=!0,a===o&&(l=d,C=!0)),l||(l=$t(n,o,{}),C=!0),c=new Ge(e,r,d,l,s),n._edges.set(r,c);const D=a===o;return e?(d.undirectedDegree++,l.undirectedDegree++,D&&(d.undirectedLoops++,n._undirectedSelfLoopCount++)):(d.outDegree++,l.inDegree++,D&&(d.directedLoops++,n._directedSelfLoopCount++)),n.multi?c.attachMulti():c.attach(),e?n._undirectedSize++:n._directedSize++,b.key=r,n.emit("edgeAdded",b),[r,!0,w,C]}function Ae(n,i){n._edges.delete(i.key);const{source:t,target:e,attributes:r}=i,a=i.undirected,o=t===e;a?(t.undirectedDegree--,e.undirectedDegree--,o&&(t.undirectedLoops--,n._undirectedSelfLoopCount--)):(t.outDegree--,e.inDegree--,o&&(t.directedLoops--,n._directedSelfLoopCount--)),n.multi?i.detachMulti():i.detach(),a?n._undirectedSize--:n._directedSize--,n.emit("edgeDropped",{key:i.key,attributes:r,source:t.key,target:e.key,undirected:a})}class W extends vi.EventEmitter{constructor(i){if(super(),i=Z({},ln,i),typeof i.multi!="boolean")throw new x(`Graph.constructor: invalid 'multi' option. Expecting a boolean but got "${i.multi}".`);if(!hn.has(i.type))throw new x(`Graph.constructor: invalid 'type' option. Should be one of "mixed", "directed" or "undirected" but got "${i.type}".`);if(typeof i.allowSelfLoops!="boolean")throw new x(`Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got "${i.allowSelfLoops}".`);const t=i.type==="mixed"?bi:i.type==="directed"?wi:Ei;ae(this,"NodeDataClass",t);const e="geid_"+un()+"_";let r=0;const a=()=>{let o;do o=e+r++;while(this._edges.has(o));return o};ae(this,"_attributes",{}),ae(this,"_nodes",new Map),ae(this,"_edges",new Map),ae(this,"_directedSize",0),ae(this,"_undirectedSize",0),ae(this,"_directedSelfLoopCount",0),ae(this,"_undirectedSelfLoopCount",0),ae(this,"_edgeKeyGenerator",a),ae(this,"_options",i),zt.forEach(o=>ae(this,o,this[o])),he(this,"order",()=>this._nodes.size),he(this,"size",()=>this._edges.size),he(this,"directedSize",()=>this._directedSize),he(this,"undirectedSize",()=>this._undirectedSize),he(this,"selfLoopCount",()=>this._directedSelfLoopCount+this._undirectedSelfLoopCount),he(this,"directedSelfLoopCount",()=>this._directedSelfLoopCount),he(this,"undirectedSelfLoopCount",()=>this._undirectedSelfLoopCount),he(this,"multi",this._options.multi),he(this,"type",this._options.type),he(this,"allowSelfLoops",this._options.allowSelfLoops),he(this,"implementation",()=>"graphology")}_resetInstanceCounters(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0}hasNode(i){return this._nodes.has(""+i)}hasDirectedEdge(i,t){if(this.type==="undirected")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&!r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.out.hasOwnProperty(t):!1}throw new x(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasUndirectedEdge(i,t){if(this.type==="directed")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.undirected.hasOwnProperty(t):!1}throw new x(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasEdge(i,t){if(arguments.length===1){const e=""+i;return this._edges.has(e)}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?typeof e.out<"u"&&e.out.hasOwnProperty(t)||typeof e.undirected<"u"&&e.undirected.hasOwnProperty(t):!1}throw new x(`Graph.hasEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}directedEdge(i,t){if(this.type==="undirected")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.");const e=this._nodes.get(i);if(!e)throw new k(`Graph.directedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new k(`Graph.directedEdge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||void 0;if(r)return r.key}undirectedEdge(i,t){if(this.type==="directed")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.");const e=this._nodes.get(i);if(!e)throw new k(`Graph.undirectedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new k(`Graph.undirectedEdge: could not find the "${t}" target node in the graph.`);const r=e.undirected&&e.undirected[t]||void 0;if(r)return r.key}edge(i,t){if(this.multi)throw new I("Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.");i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.edge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new k(`Graph.edge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||e.undirected&&e.undirected[t]||void 0;if(r)return r.key}areDirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areDirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in||t in e.out}areOutNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areOutNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.out}areInNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areInNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in}areUndirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areUndirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="directed"?!1:t in e.undirected}areNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&(t in e.in||t in e.out)||this.type!=="directed"&&t in e.undirected}areInboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areInboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.in||this.type!=="directed"&&t in e.undirected}areOutboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areOutboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.out||this.type!=="directed"&&t in e.undirected}inDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.inDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree}outDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.outDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree}directedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.directedDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree}undirectedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.undirectedDegree: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree}inboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.inboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree),e}outboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.outboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.outDegree),e}degree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.degree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree),e}inDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.inDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree-t.directedLoops}outDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.outDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree-t.directedLoops}directedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.directedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree-t.directedLoops*2}undirectedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.undirectedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree-t.undirectedLoops*2}inboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.inboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree,r+=t.directedLoops),e-r}outboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.outboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.outDegree,r+=t.directedLoops),e-r}degreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.degreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree,r+=t.directedLoops*2),e-r}source(i){i=""+i;const t=this._edges.get(i);if(!t)throw new k(`Graph.source: could not find the "${i}" edge in the graph.`);return t.source.key}target(i){i=""+i;const t=this._edges.get(i);if(!t)throw new k(`Graph.target: could not find the "${i}" edge in the graph.`);return t.target.key}extremities(i){i=""+i;const t=this._edges.get(i);if(!t)throw new k(`Graph.extremities: could not find the "${i}" edge in the graph.`);return[t.source.key,t.target.key]}opposite(i,t){i=""+i,t=""+t;const e=this._edges.get(t);if(!e)throw new k(`Graph.opposite: could not find the "${t}" edge in the graph.`);const r=e.source.key,a=e.target.key;if(i===r)return a;if(i===a)return r;throw new k(`Graph.opposite: the "${i}" node is not attached to the "${t}" edge (${r}, ${a}).`)}hasExtremity(i,t){i=""+i,t=""+t;const e=this._edges.get(i);if(!e)throw new k(`Graph.hasExtremity: could not find the "${i}" edge in the graph.`);return e.source.key===t||e.target.key===t}isUndirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new k(`Graph.isUndirected: could not find the "${i}" edge in the graph.`);return t.undirected}isDirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new k(`Graph.isDirected: could not find the "${i}" edge in the graph.`);return!t.undirected}isSelfLoop(i){i=""+i;const t=this._edges.get(i);if(!t)throw new k(`Graph.isSelfLoop: could not find the "${i}" edge in the graph.`);return t.source===t.target}addNode(i,t){return cn(this,i,t).key}mergeNode(i,t){if(t&&!J(t))throw new x(`Graph.mergeNode: invalid attributes. Expecting an object but got "${t}"`);i=""+i,t=t||{};let e=this._nodes.get(i);return e?(t&&(Z(e.attributes,t),this.emit("nodeAttributesUpdated",{type:"merge",key:i,attributes:e.attributes,data:t})),[i,!1]):(e=new this.NodeDataClass(i,t),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:t}),[i,!0])}updateNode(i,t){if(t&&typeof t!="function")throw new x(`Graph.updateNode: invalid updater function. Expecting a function but got "${t}"`);i=""+i;let e=this._nodes.get(i);if(e){if(t){const a=e.attributes;e.attributes=t(a),this.emit("nodeAttributesUpdated",{type:"replace",key:i,attributes:e.attributes})}return[i,!1]}const r=t?t({}):{};return e=new this.NodeDataClass(i,r),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:r}),[i,!0]}dropNode(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.dropNode: could not find the "${i}" node in the graph.`);let e;if(this.type!=="undirected"){for(const r in t.out){e=t.out[r];do Ae(this,e),e=e.next;while(e)}for(const r in t.in){e=t.in[r];do Ae(this,e),e=e.next;while(e)}}if(this.type!=="directed")for(const r in t.undirected){e=t.undirected[r];do Ae(this,e),e=e.next;while(e)}this._nodes.delete(i),this.emit("nodeDropped",{key:i,attributes:t.attributes})}dropEdge(i){let t;if(arguments.length>1){const e=""+arguments[0],r=""+arguments[1];if(t=oe(this,e,r,this.type),!t)throw new k(`Graph.dropEdge: could not find the "${e}" -> "${r}" edge in the graph.`)}else if(i=""+i,t=this._edges.get(i),!t)throw new k(`Graph.dropEdge: could not find the "${i}" edge in the graph.`);return Ae(this,t),this}dropDirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");i=""+i,t=""+t;const e=oe(this,i,t,"directed");if(!e)throw new k(`Graph.dropDirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return Ae(this,e),this}dropUndirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");const e=oe(this,i,t,"undirected");if(!e)throw new k(`Graph.dropUndirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return Ae(this,e),this}clear(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit("cleared")}clearEdges(){const i=this._nodes.values();let t;for(;t=i.next(),t.done!==!0;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit("edgesCleared")}getAttribute(i){return this._attributes[i]}getAttributes(){return this._attributes}hasAttribute(i){return this._attributes.hasOwnProperty(i)}setAttribute(i,t){return this._attributes[i]=t,this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}updateAttribute(i,t){if(typeof t!="function")throw new x("Graph.updateAttribute: updater should be a function.");const e=this._attributes[i];return this._attributes[i]=t(e),this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}removeAttribute(i){return delete this._attributes[i],this.emit("attributesUpdated",{type:"remove",attributes:this._attributes,name:i}),this}replaceAttributes(i){if(!J(i))throw new x("Graph.replaceAttributes: provided attributes are not a plain object.");return this._attributes=i,this.emit("attributesUpdated",{type:"replace",attributes:this._attributes}),this}mergeAttributes(i){if(!J(i))throw new x("Graph.mergeAttributes: provided attributes are not a plain object.");return Z(this._attributes,i),this.emit("attributesUpdated",{type:"merge",attributes:this._attributes,data:i}),this}updateAttributes(i){if(typeof i!="function")throw new x("Graph.updateAttributes: provided updater is not a function.");return this._attributes=i(this._attributes),this.emit("attributesUpdated",{type:"update",attributes:this._attributes}),this}updateEachNodeAttributes(i,t){if(typeof i!="function")throw new x("Graph.updateEachNodeAttributes: expecting an updater function.");if(t&&!Ut(t))throw new x("Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._nodes.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,a.attributes=i(a.key,a.attributes);this.emit("eachNodeAttributesUpdated",{hints:t||null})}updateEachEdgeAttributes(i,t){if(typeof i!="function")throw new x("Graph.updateEachEdgeAttributes: expecting an updater function.");if(t&&!Ut(t))throw new x("Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._edges.values();let r,a,o,s;for(;r=e.next(),r.done!==!0;)a=r.value,o=a.source,s=a.target,a.attributes=i(a.key,a.attributes,o.key,s.key,o.attributes,s.attributes,a.undirected);this.emit("eachEdgeAttributesUpdated",{hints:t||null})}forEachAdjacencyEntry(i){if(typeof i!="function")throw new x("Graph.forEachAdjacencyEntry: expecting a callback.");et(!1,!1,!1,this,i)}forEachAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new x("Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.");et(!1,!1,!0,this,i)}forEachAssymetricAdjacencyEntry(i){if(typeof i!="function")throw new x("Graph.forEachAssymetricAdjacencyEntry: expecting a callback.");et(!1,!0,!1,this,i)}forEachAssymetricAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new x("Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.");et(!1,!0,!0,this,i)}nodes(){return Array.from(this._nodes.keys())}forEachNode(i){if(typeof i!="function")throw new x("Graph.forEachNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)}findNode(i){if(typeof i!="function")throw new x("Graph.findNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return r.key}mapNodes(i){if(typeof i!="function")throw new x("Graph.mapNode: expecting a callback.");const t=this._nodes.values();let e,r;const a=new Array(this.order);let o=0;for(;e=t.next(),e.done!==!0;)r=e.value,a[o++]=i(r.key,r.attributes);return a}someNode(i){if(typeof i!="function")throw new x("Graph.someNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return!0;return!1}everyNode(i){if(typeof i!="function")throw new x("Graph.everyNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,!i(r.key,r.attributes))return!1;return!0}filterNodes(i){if(typeof i!="function")throw new x("Graph.filterNodes: expecting a callback.");const t=this._nodes.values();let e,r;const a=[];for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)&&a.push(r.key);return a}reduceNodes(i,t){if(typeof i!="function")throw new x("Graph.reduceNodes: expecting a callback.");if(arguments.length<2)throw new x("Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.");let e=t;const r=this._nodes.values();let a,o;for(;a=r.next(),a.done!==!0;)o=a.value,e=i(e,o.key,o.attributes);return e}nodeEntries(){const i=this._nodes.values();return{[Symbol.iterator](){return this},next(){const t=i.next();if(t.done)return t;const e=t.value;return{value:{node:e.key,attributes:e.attributes},done:!1}}}}export(){const i=new Array(this._nodes.size);let t=0;this._nodes.forEach((r,a)=>{i[t++]=nn(a,r)});const e=new Array(this._edges.size);return t=0,this._edges.forEach((r,a)=>{e[t++]=an(this.type,a,r)}),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:i,edges:e}}import(i,t=!1){if(i instanceof W)return i.forEachNode((u,h)=>{t?this.mergeNode(u,h):this.addNode(u,h)}),i.forEachEdge((u,h,d,l,c,g,b)=>{t?b?this.mergeUndirectedEdgeWithKey(u,d,l,h):this.mergeDirectedEdgeWithKey(u,d,l,h):b?this.addUndirectedEdgeWithKey(u,d,l,h):this.addDirectedEdgeWithKey(u,d,l,h)}),this;if(!J(i))throw new x("Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.");if(i.attributes){if(!J(i.attributes))throw new x("Graph.import: invalid attributes. Expecting a plain object.");t?this.mergeAttributes(i.attributes):this.replaceAttributes(i.attributes)}let e,r,a,o,s;if(i.nodes){if(a=i.nodes,!Array.isArray(a))throw new x("Graph.import: invalid nodes. Expecting an array.");for(e=0,r=a.length;e{const a=Z({},e.attributes);e=new t.NodeDataClass(r,a),t._nodes.set(r,e)}),t}copy(i){if(i=i||{},typeof i.type=="string"&&i.type!==this.type&&i.type!=="mixed")throw new I(`Graph.copy: cannot create an incompatible copy from "${this.type}" type to "${i.type}" because this would mean losing information about the current graph.`);if(typeof i.multi=="boolean"&&i.multi!==this.multi&&i.multi!==!0)throw new I("Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.");if(typeof i.allowSelfLoops=="boolean"&&i.allowSelfLoops!==this.allowSelfLoops&&i.allowSelfLoops!==!0)throw new I("Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.");const t=this.emptyCopy(i),e=this._edges.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,Ri(t,"copy",!1,a.undirected,a.key,a.source.key,a.target.key,Z({},a.attributes));return t}toJSON(){return this.export()}toString(){return"[object Graph]"}inspect(){const i={};this._nodes.forEach((a,o)=>{i[o]=a.attributes});const t={},e={};this._edges.forEach((a,o)=>{const s=a.undirected?"--":"->";let u="",h=a.source.key,d=a.target.key,l;a.undirected&&h>d&&(l=h,h=d,d=l);const c=`(${h})${s}(${d})`;o.startsWith("geid_")?this.multi&&(typeof e[c]>"u"?e[c]=0:e[c]++,u+=`${e[c]}. `):u+=`[${o}]: `,u+=c,t[u]=a.attributes});const r={};for(const a in this)this.hasOwnProperty(a)&&!zt.has(a)&&typeof this[a]!="function"&&typeof a!="symbol"&&(r[a]=this[a]);return r.attributes=this._attributes,r.nodes=i,r.edges=t,ae(r,"constructor",this.constructor),r}}typeof Symbol<"u"&&(W.prototype[Symbol.for("nodejs.util.inspect.custom")]=W.prototype.inspect);dn.forEach(n=>{["add","merge","update"].forEach(i=>{const t=n.name(i),e=i==="add"?Ri:fn;n.generateKey?W.prototype[t]=function(r,a,o){return e(this,t,!0,(n.type||this.type)==="undirected",null,r,a,o,i==="update")}:W.prototype[t]=function(r,a,o,s){return e(this,t,!1,(n.type||this.type)==="undirected",r,a,o,s,i==="update")}})});Er(W);Gr(W);Kr(W);rn(W);class Ai extends W{constructor(i){const t=Z({type:"directed"},i);if("multi"in t&&t.multi!==!1)throw new x("DirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="directed")throw new x('DirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class ki extends W{constructor(i){const t=Z({type:"undirected"},i);if("multi"in t&&t.multi!==!1)throw new x("UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="undirected")throw new x('UndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class xi extends W{constructor(i){const t=Z({multi:!0},i);if("multi"in t&&t.multi!==!0)throw new x("MultiGraph.from: inconsistent indication that the graph should be simple in given options!");super(t)}}class Di extends W{constructor(i){const t=Z({type:"directed",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new x("MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="directed")throw new x('MultiDirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Li extends W{constructor(i){const t=Z({type:"undirected",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new x("MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="undirected")throw new x('MultiUndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}function Fe(n){n.from=function(i,t){const e=Z({},i.options,t),r=new n(e);return r.import(i),r}}Fe(W);Fe(Ai);Fe(ki);Fe(xi);Fe(Di);Fe(Li);W.Graph=W;W.DirectedGraph=Ai;W.UndirectedGraph=ki;W.MultiGraph=xi;W.MultiDirectedGraph=Di;W.MultiUndirectedGraph=Li;W.InvalidArgumentsGraphError=x;W.NotFoundGraphError=k;W.UsageGraphError=I;function gn(n,i){if(typeof n!="object"||!n)return n;var t=n[Symbol.toPrimitive];if(t!==void 0){var e=t.call(n,i);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(n)}function We(n){var i=gn(n,"string");return typeof i=="symbol"?i:i+""}function Q(n,i){if(!(n instanceof i))throw new TypeError("Cannot call a class as a function")}function Bt(n,i){for(var t=0;tn.length)&&(i=n.length);for(var t=0,e=Array(i);t0&&(P=_[0]),P instanceof Error)throw P;var j=new Error("Unhandled error."+(P?" ("+P.message+")":""));throw j.context=P,j}var z=F[v];if(z===void 0)return!1;if(typeof z=="function")i(z,this,_);else for(var f=z.length,K=b(z,f),S=0;S0&&P.length>G&&!P.warned){P.warned=!0;var j=new Error("Possible EventEmitter memory leak detected. "+P.length+" "+String(v)+" listeners added. Use emitter.setMaxListeners() to increase limit");j.name="MaxListenersExceededWarning",j.emitter=m,j.type=v,j.count=P.length,e(j)}return m}a.prototype.addListener=function(v,_){return h(this,v,_,!1)},a.prototype.on=a.prototype.addListener,a.prototype.prependListener=function(v,_){return h(this,v,_,!0)};function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(m,v,_){var S={fired:!1,wrapFn:void 0,target:m,type:v,listener:_},G=d.bind(S);return G.listener=_,S.wrapFn=G,G}a.prototype.once=function(v,_){return s(_),this.on(v,l(this,v,_)),this},a.prototype.prependOnceListener=function(v,_){return s(_),this.prependListener(v,l(this,v,_)),this},a.prototype.removeListener=function(v,_){var S,G,F,P,j;if(s(_),G=this._events,G===void 0)return this;if(S=G[v],S===void 0)return this;if(S===_||S.listener===_)--this._eventsCount===0?this._events=Object.create(null):(delete G[v],G.removeListener&&this.emit("removeListener",v,S.listener||_));else if(typeof S!="function"){for(F=-1,P=S.length-1;P>=0;P--)if(S[P]===_||S[P].listener===_){j=S[P].listener,F=P;break}if(F<0)return this;F===0?S.shift():w(S,F),S.length===1&&(G[v]=S[0]),G.removeListener!==void 0&&this.emit("removeListener",v,j||_)}return this},a.prototype.off=a.prototype.removeListener,a.prototype.removeAllListeners=function(v){var _,S,G;if(S=this._events,S===void 0)return this;if(S.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):S[v]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete S[v]),this;if(arguments.length===0){var F=Object.keys(S),P;for(G=0;G=0;G--)this.removeListener(v,_[G]);return this};function c(m,v,_){var S=m._events;if(S===void 0)return[];var G=S[v];return G===void 0?[]:typeof G=="function"?_?[G.listener||G]:[G]:_?C(G):b(G,G.length)}a.prototype.listeners=function(v){return c(this,v,!0)},a.prototype.rawListeners=function(v){return c(this,v,!1)},a.listenerCount=function(m,v){return typeof m.listenerCount=="function"?m.listenerCount(v):g.call(m,v)},a.prototype.listenerCount=g;function g(m){var v=this._events;if(v!==void 0){var _=v[m];if(typeof _=="function")return 1;if(_!==void 0)return _.length}return 0}a.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]};function b(m,v){for(var _=new Array(v),S=0;Sn++}function me(){const n=arguments;let i=null,t=-1;return{[Symbol.iterator](){return this},next(){let e=null;do{if(i===null){if(t++,t>=n.length)return{done:!0};i=n[t][Symbol.iterator]()}if(e=i.next(),e.done){i=null;continue}break}while(!0);return e}}}function Le(){return{[Symbol.iterator](){return this},next(){return{done:!0}}}}class kt extends Error{constructor(i){super(),this.name="GraphError",this.message=i}}class x extends kt{constructor(i){super(i),this.name="InvalidArgumentsGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,x.prototype.constructor)}}class k extends kt{constructor(i){super(i),this.name="NotFoundGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,k.prototype.constructor)}}class I extends kt{constructor(i){super(i),this.name="UsageGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,I.prototype.constructor)}}function bi(n,i){this.key=n,this.attributes=i,this.clear()}bi.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}};function wi(n,i){this.key=n,this.attributes=i,this.clear()}wi.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}};function Ei(n,i){this.key=n,this.attributes=i,this.clear()}Ei.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}};function Ge(n,i,t,e,r){this.key=i,this.attributes=r,this.undirected=n,this.source=t,this.target=e}Ge.prototype.attach=function(){let n="out",i="in";this.undirected&&(n=i="undirected");const t=this.source.key,e=this.target.key;this.source[n][e]=this,!(this.undirected&&t===e)&&(this.target[i][t]=this)};Ge.prototype.attachMulti=function(){let n="out",i="in";const t=this.source.key,e=this.target.key;this.undirected&&(n=i="undirected");const r=this.source[n],a=r[e];if(typeof a>"u"){r[e]=this,this.undirected&&t===e||(this.target[i][t]=this);return}a.previous=this,this.next=a,r[e]=this,this.target[i][t]=this};Ge.prototype.detach=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),delete this.source[t][i],delete this.target[e][n]};Ge.prototype.detachMulti=function(){const n=this.source.key,i=this.target.key;let t="out",e="in";this.undirected&&(t=e="undirected"),this.previous===void 0?this.next===void 0?(delete this.source[t][i],delete this.target[e][n]):(this.next.previous=void 0,this.source[t][i]=this.next,this.target[e][n]=this.next):(this.previous.next=this.next,this.next!==void 0&&(this.next.previous=this.previous))};const _i=0,Ti=1,dr=2,Si=3;function ve(n,i,t,e,r,a,o){let s,u,h,d;if(e=""+e,t===_i){if(s=n._nodes.get(e),!s)throw new k(`Graph.${i}: could not find the "${e}" node in the graph.`);h=r,d=a}else if(t===Si){if(r=""+r,u=n._edges.get(r),!u)throw new k(`Graph.${i}: could not find the "${r}" edge in the graph.`);const l=u.source.key,c=u.target.key;if(e===l)s=u.target;else if(e===c)s=u.source;else throw new k(`Graph.${i}: the "${e}" node is not attached to the "${r}" edge (${l}, ${c}).`);h=a,d=o}else{if(u=n._edges.get(e),!u)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`);t===Ti?s=u.source:s=u.target,h=r,d=a}return[s,h,d]}function lr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ve(this,i,t,e,r,a);return o.attributes[s]}}function cr(n,i,t){n.prototype[i]=function(e,r){const[a]=ve(this,i,t,e,r);return a.attributes}}function fr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ve(this,i,t,e,r,a);return o.attributes.hasOwnProperty(s)}}function gr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ve(this,i,t,e,r,a,o);return s.attributes[u]=h,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function pr(n,i,t){n.prototype[i]=function(e,r,a,o){const[s,u,h]=ve(this,i,t,e,r,a,o);if(typeof h!="function")throw new x(`Graph.${i}: updater should be a function.`);const d=s.attributes,l=h(d[u]);return d[u]=l,this.emit("nodeAttributesUpdated",{key:s.key,type:"set",attributes:s.attributes,name:u}),this}}function mr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ve(this,i,t,e,r,a);return delete o.attributes[s],this.emit("nodeAttributesUpdated",{key:o.key,type:"remove",attributes:o.attributes,name:s}),this}}function vr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ve(this,i,t,e,r,a);if(!J(s))throw new x(`Graph.${i}: provided attributes are not a plain object.`);return o.attributes=s,this.emit("nodeAttributesUpdated",{key:o.key,type:"replace",attributes:o.attributes}),this}}function yr(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ve(this,i,t,e,r,a);if(!J(s))throw new x(`Graph.${i}: provided attributes are not a plain object.`);return Z(o.attributes,s),this.emit("nodeAttributesUpdated",{key:o.key,type:"merge",attributes:o.attributes,data:s}),this}}function br(n,i,t){n.prototype[i]=function(e,r,a){const[o,s]=ve(this,i,t,e,r,a);if(typeof s!="function")throw new x(`Graph.${i}: provided updater is not a function.`);return o.attributes=s(o.attributes),this.emit("nodeAttributesUpdated",{key:o.key,type:"update",attributes:o.attributes}),this}}const wr=[{name:n=>`get${n}Attribute`,attacher:lr},{name:n=>`get${n}Attributes`,attacher:cr},{name:n=>`has${n}Attribute`,attacher:fr},{name:n=>`set${n}Attribute`,attacher:gr},{name:n=>`update${n}Attribute`,attacher:pr},{name:n=>`remove${n}Attribute`,attacher:mr},{name:n=>`replace${n}Attributes`,attacher:vr},{name:n=>`merge${n}Attributes`,attacher:yr},{name:n=>`update${n}Attributes`,attacher:br}];function Er(n){wr.forEach(function({name:i,attacher:t}){t(n,i("Node"),_i),t(n,i("Source"),Ti),t(n,i("Target"),dr),t(n,i("Opposite"),Si)})}function _r(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new k(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes[r]}}function Tr(n,i,t){n.prototype[i]=function(e){let r;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>1){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const a=""+e,o=""+arguments[1];if(r=oe(this,a,o,t),!r)throw new k(`Graph.${i}: could not find an edge for the given path ("${a}" - "${o}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,r=this._edges.get(e),!r)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return r.attributes}}function Sr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new k(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return a.attributes.hasOwnProperty(r)}}function Cr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new k(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return o.attributes[r]=a,this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Rr(n,i,t){n.prototype[i]=function(e,r,a){let o;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const s=""+e,u=""+r;if(r=arguments[2],a=arguments[3],o=oe(this,s,u,t),!o)throw new k(`Graph.${i}: could not find an edge for the given path ("${s}" - "${u}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,o=this._edges.get(e),!o)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof a!="function")throw new x(`Graph.${i}: updater should be a function.`);return o.attributes[r]=a(o.attributes[r]),this.emit("edgeAttributesUpdated",{key:o.key,type:"set",attributes:o.attributes,name:r}),this}}function Ar(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new k(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}return delete a.attributes[r],this.emit("edgeAttributesUpdated",{key:a.key,type:"remove",attributes:a.attributes,name:r}),this}}function kr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new k(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new x(`Graph.${i}: provided attributes are not a plain object.`);return a.attributes=r,this.emit("edgeAttributesUpdated",{key:a.key,type:"replace",attributes:a.attributes}),this}}function xr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new k(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(!J(r))throw new x(`Graph.${i}: provided attributes are not a plain object.`);return Z(a.attributes,r),this.emit("edgeAttributesUpdated",{key:a.key,type:"merge",attributes:a.attributes,data:r}),this}}function Dr(n,i,t){n.prototype[i]=function(e,r){let a;if(this.type!=="mixed"&&t!=="mixed"&&t!==this.type)throw new I(`Graph.${i}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new I(`Graph.${i}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const o=""+e,s=""+r;if(r=arguments[2],a=oe(this,o,s,t),!a)throw new k(`Graph.${i}: could not find an edge for the given path ("${o}" - "${s}").`)}else{if(t!=="mixed")throw new I(`Graph.${i}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(e=""+e,a=this._edges.get(e),!a)throw new k(`Graph.${i}: could not find the "${e}" edge in the graph.`)}if(typeof r!="function")throw new x(`Graph.${i}: provided updater is not a function.`);return a.attributes=r(a.attributes),this.emit("edgeAttributesUpdated",{key:a.key,type:"update",attributes:a.attributes}),this}}const Lr=[{name:n=>`get${n}Attribute`,attacher:_r},{name:n=>`get${n}Attributes`,attacher:Tr},{name:n=>`has${n}Attribute`,attacher:Sr},{name:n=>`set${n}Attribute`,attacher:Cr},{name:n=>`update${n}Attribute`,attacher:Rr},{name:n=>`remove${n}Attribute`,attacher:Ar},{name:n=>`replace${n}Attributes`,attacher:kr},{name:n=>`merge${n}Attributes`,attacher:xr},{name:n=>`update${n}Attributes`,attacher:Dr}];function Gr(n){Lr.forEach(function({name:i,attacher:t}){t(n,i("Edge"),"mixed"),t(n,i("DirectedEdge"),"directed"),t(n,i("UndirectedEdge"),"undirected")})}const Fr=[{name:"edges",type:"mixed"},{name:"inEdges",type:"directed",direction:"in"},{name:"outEdges",type:"directed",direction:"out"},{name:"inboundEdges",type:"mixed",direction:"in"},{name:"outboundEdges",type:"mixed",direction:"out"},{name:"directedEdges",type:"directed"},{name:"undirectedEdges",type:"undirected"}];function Nr(n,i,t,e){let r=!1;for(const a in i){if(a===e)continue;const o=i[a];if(r=t(o.key,o.attributes,o.source.key,o.target.key,o.source.attributes,o.target.attributes,o.undirected),n&&r)return o.key}}function Pr(n,i,t,e){let r,a,o,s=!1;for(const u in i)if(u!==e){r=i[u];do{if(a=r.source,o=r.target,s=t(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected),n&&s)return r.key;r=r.next}while(r!==void 0)}}function ht(n,i){const t=Object.keys(n),e=t.length;let r,a=0;return{[Symbol.iterator](){return this},next(){do if(r)r=r.next;else{if(a>=e)return{done:!0};const o=t[a++];if(o===i){r=void 0;continue}r=n[o]}while(!r);return{done:!1,value:{edge:r.key,attributes:r.attributes,source:r.source.key,target:r.target.key,sourceAttributes:r.source.attributes,targetAttributes:r.target.attributes,undirected:r.undirected}}}}}function Ir(n,i,t,e){const r=i[t];if(!r)return;const a=r.source,o=r.target;if(e(r.key,r.attributes,a.key,o.key,a.attributes,o.attributes,r.undirected)&&n)return r.key}function Or(n,i,t,e){let r=i[t];if(!r)return;let a=!1;do{if(a=e(r.key,r.attributes,r.source.key,r.target.key,r.source.attributes,r.target.attributes,r.undirected),n&&a)return r.key;r=r.next}while(r!==void 0)}function dt(n,i){let t=n[i];if(t.next!==void 0)return{[Symbol.iterator](){return this},next(){if(!t)return{done:!0};const r={edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected};return t=t.next,{done:!1,value:r}}};let e=!1;return{[Symbol.iterator](){return this},next(){return e===!0?{done:!0}:(e=!0,{done:!1,value:{edge:t.key,attributes:t.attributes,source:t.source.key,target:t.target.key,sourceAttributes:t.source.attributes,targetAttributes:t.target.attributes,undirected:t.undirected}})}}}function Ur(n,i){if(n.size===0)return[];if(i==="mixed"||i===n.type)return Array.from(n._edges.keys());const t=i==="undirected"?n.undirectedSize:n.directedSize,e=new Array(t),r=i==="undirected",a=n._edges.values();let o=0,s,u;for(;s=a.next(),s.done!==!0;)u=s.value,u.undirected===r&&(e[o++]=u.key);return e}function Ci(n,i,t,e){if(i.size===0)return;const r=t!=="mixed"&&t!==i.type,a=t==="undirected";let o,s,u=!1;const h=i._edges.values();for(;o=h.next(),o.done!==!0;){if(s=o.value,r&&s.undirected!==a)continue;const{key:d,attributes:l,source:c,target:g}=s;if(u=e(d,l,c.key,g.key,c.attributes,g.attributes,s.undirected),n&&u)return d}}function zr(n,i){if(n.size===0)return Le();const t=i!=="mixed"&&i!==n.type,e=i==="undirected",r=n._edges.values();return{[Symbol.iterator](){return this},next(){let a,o;for(;;){if(a=r.next(),a.done)return a;if(o=a.value,!(t&&o.undirected!==e))break}return{value:{edge:o.key,attributes:o.attributes,source:o.source.key,target:o.target.key,sourceAttributes:o.source.attributes,targetAttributes:o.target.attributes,undirected:o.undirected},done:!1}}}}function xt(n,i,t,e,r,a){const o=i?Pr:Nr;let s;if(t!=="undirected"&&(e!=="out"&&(s=o(n,r.in,a),n&&s)||e!=="in"&&(s=o(n,r.out,a,e?void 0:r.key),n&&s))||t!=="directed"&&(s=o(n,r.undirected,a),n&&s))return s}function $r(n,i,t,e){const r=[];return xt(!1,n,i,t,e,function(a){r.push(a)}),r}function Br(n,i,t){let e=Le();return n!=="undirected"&&(i!=="out"&&typeof t.in<"u"&&(e=me(e,ht(t.in))),i!=="in"&&typeof t.out<"u"&&(e=me(e,ht(t.out,i?void 0:t.key)))),n!=="directed"&&typeof t.undirected<"u"&&(e=me(e,ht(t.undirected))),e}function Dt(n,i,t,e,r,a,o){const s=t?Or:Ir;let u;if(i!=="undirected"&&(typeof r.in<"u"&&e!=="out"&&(u=s(n,r.in,a,o),n&&u)||typeof r.out<"u"&&e!=="in"&&(e||r.key!==a)&&(u=s(n,r.out,a,o),n&&u))||i!=="directed"&&typeof r.undirected<"u"&&(u=s(n,r.undirected,a,o),n&&u))return u}function Mr(n,i,t,e,r){const a=[];return Dt(!1,n,i,t,e,r,function(o){a.push(o)}),a}function Hr(n,i,t,e){let r=Le();return n!=="undirected"&&(typeof t.in<"u"&&i!=="out"&&e in t.in&&(r=me(r,dt(t.in,e))),typeof t.out<"u"&&i!=="in"&&e in t.out&&(i||t.key!==e)&&(r=me(r,dt(t.out,e)))),n!=="directed"&&typeof t.undirected<"u"&&e in t.undirected&&(r=me(r,dt(t.undirected,e))),r}function Wr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a,o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];if(!arguments.length)return Ur(this,e);if(arguments.length===1){a=""+a;const s=this._nodes.get(a);if(typeof s>"u")throw new k(`Graph.${t}: could not find the "${a}" node in the graph.`);return $r(this.multi,e==="mixed"?this.type:e,r,s)}if(arguments.length===2){a=""+a,o=""+o;const s=this._nodes.get(a);if(!s)throw new k(`Graph.${t}: could not find the "${a}" source node in the graph.`);if(!this._nodes.has(o))throw new k(`Graph.${t}: could not find the "${o}" target node in the graph.`);return Mr(e,this.multi,r,s,o)}throw new x(`Graph.${t}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function jr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d,l){if(!(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)){if(arguments.length===1)return l=h,Ci(!1,this,e,l);if(arguments.length===2){h=""+h,l=d;const c=this._nodes.get(h);if(typeof c>"u")throw new k(`Graph.${a}: could not find the "${h}" node in the graph.`);return xt(!1,this.multi,e==="mixed"?this.type:e,r,c,l)}if(arguments.length===3){h=""+h,d=""+d;const c=this._nodes.get(h);if(!c)throw new k(`Graph.${a}: could not find the "${h}" source node in the graph.`);if(!this._nodes.has(d))throw new k(`Graph.${a}: could not find the "${d}" target node in the graph.`);return Dt(!1,e,this.multi,r,c,d,l)}throw new x(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)}};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop();let l;if(h.length===0){let c=0;e!=="directed"&&(c+=this.undirectedSize),e!=="undirected"&&(c+=this.directedSize),l=new Array(c);let g=0;h.push((b,w,C,D,T,A,m)=>{l[g++]=d(b,w,C,D,T,A,m)})}else l=[],h.push((c,g,b,w,C,D,T)=>{l.push(d(c,g,b,w,C,D,T))});return this[a].apply(this,h),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(){const h=Array.prototype.slice.call(arguments),d=h.pop(),l=[];return h.push((c,g,b,w,C,D,T)=>{d(c,g,b,w,C,D,T)&&l.push(c)}),this[a].apply(this,h),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(){let h=Array.prototype.slice.call(arguments);if(h.length<2||h.length>4)throw new x(`Graph.${u}: invalid number of arguments (expecting 2, 3 or 4 and got ${h.length}).`);if(typeof h[h.length-1]=="function"&&typeof h[h.length-2]!="function")throw new x(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let d,l;h.length===2?(d=h[0],l=h[1],h=[]):h.length===3?(d=h[1],l=h[2],h=[h[0]]):h.length===4&&(d=h[2],l=h[3],h=[h[0],h[1]]);let c=l;return h.push((g,b,w,C,D,T,A)=>{c=d(c,g,b,w,C,D,T,A)}),this[a].apply(this,h),c}}function Vr(n,i){const{name:t,type:e,direction:r}=i,a="find"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(u,h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return!1;if(arguments.length===1)return d=u,Ci(!0,this,e,d);if(arguments.length===2){u=""+u,d=h;const l=this._nodes.get(u);if(typeof l>"u")throw new k(`Graph.${a}: could not find the "${u}" node in the graph.`);return xt(!0,this.multi,e==="mixed"?this.type:e,r,l,d)}if(arguments.length===3){u=""+u,h=""+h;const l=this._nodes.get(u);if(!l)throw new k(`Graph.${a}: could not find the "${u}" source node in the graph.`);if(!this._nodes.has(h))throw new k(`Graph.${a}: could not find the "${h}" target node in the graph.`);return Dt(!0,e,this.multi,r,l,h,d)}throw new x(`Graph.${a}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)};const o="some"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[o]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,c,g,b,w,C,D)=>h(l,c,g,b,w,C,D)),!!this[a].apply(this,u)};const s="every"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[s]=function(){const u=Array.prototype.slice.call(arguments),h=u.pop();return u.push((l,c,g,b,w,C,D)=>!h(l,c,g,b,w,C,D)),!this[a].apply(this,u)}}function qr(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o,s){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();if(!arguments.length)return zr(this,e);if(arguments.length===1){o=""+o;const u=this._nodes.get(o);if(!u)throw new k(`Graph.${a}: could not find the "${o}" node in the graph.`);return Br(e,r,u)}if(arguments.length===2){o=""+o,s=""+s;const u=this._nodes.get(o);if(!u)throw new k(`Graph.${a}: could not find the "${o}" source node in the graph.`);if(!this._nodes.has(s))throw new k(`Graph.${a}: could not find the "${s}" target node in the graph.`);return Hr(e,r,u,s)}throw new x(`Graph.${a}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function Kr(n){Fr.forEach(i=>{Wr(n,i),jr(n,i),Vr(n,i),qr(n,i)})}const Yr=[{name:"neighbors",type:"mixed"},{name:"inNeighbors",type:"directed",direction:"in"},{name:"outNeighbors",type:"directed",direction:"out"},{name:"inboundNeighbors",type:"mixed",direction:"in"},{name:"outboundNeighbors",type:"mixed",direction:"out"},{name:"directedNeighbors",type:"directed"},{name:"undirectedNeighbors",type:"undirected"}];function ot(){this.A=null,this.B=null}ot.prototype.wrap=function(n){this.A===null?this.A=n:this.B===null&&(this.B=n)};ot.prototype.has=function(n){return this.A!==null&&n in this.A||this.B!==null&&n in this.B};function Oe(n,i,t,e,r){for(const a in e){const o=e[a],s=o.source,u=o.target,h=s===t?u:s;if(i&&i.has(h.key))continue;const d=r(h.key,h.attributes);if(n&&d)return h.key}}function Lt(n,i,t,e,r){if(i!=="mixed"){if(i==="undirected")return Oe(n,null,e,e.undirected,r);if(typeof t=="string")return Oe(n,null,e,e[t],r)}const a=new ot;let o;if(i!=="undirected"){if(t!=="out"){if(o=Oe(n,null,e,e.in,r),n&&o)return o;a.wrap(e.in)}if(t!=="in"){if(o=Oe(n,a,e,e.out,r),n&&o)return o;a.wrap(e.out)}}if(i!=="directed"&&(o=Oe(n,a,e,e.undirected,r),n&&o))return o}function Zr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Object.keys(t.undirected);if(typeof i=="string")return Object.keys(t[i])}const e=[];return Lt(!1,n,i,t,function(r){e.push(r)}),e}function Ue(n,i,t){const e=Object.keys(t),r=e.length;let a=0;return{[Symbol.iterator](){return this},next(){let o=null;do{if(a>=r)return n&&n.wrap(t),{done:!0};const s=t[e[a++]],u=s.source,h=s.target;if(o=u===i?h:u,n&&n.has(o.key)){o=null;continue}}while(o===null);return{done:!1,value:{neighbor:o.key,attributes:o.attributes}}}}}function Xr(n,i,t){if(n!=="mixed"){if(n==="undirected")return Ue(null,t,t.undirected);if(typeof i=="string")return Ue(null,t,t[i])}let e=Le();const r=new ot;return n!=="undirected"&&(i!=="out"&&(e=me(e,Ue(r,t,t.in))),i!=="in"&&(e=me(e,Ue(r,t,t.out)))),n!=="directed"&&(e=me(e,Ue(r,t,t.undirected))),e}function Jr(n,i){const{name:t,type:e,direction:r}=i;n.prototype[t]=function(a){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return[];a=""+a;const o=this._nodes.get(a);if(typeof o>"u")throw new k(`Graph.${t}: could not find the "${a}" node in the graph.`);return Zr(e==="mixed"?this.type:e,r,o)}}function Qr(n,i){const{name:t,type:e,direction:r}=i,a="forEach"+t[0].toUpperCase()+t.slice(1,-1);n.prototype[a]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new k(`Graph.${a}: could not find the "${h}" node in the graph.`);Lt(!1,e==="mixed"?this.type:e,r,l,d)};const o="map"+t[0].toUpperCase()+t.slice(1);n.prototype[o]=function(h,d){const l=[];return this[a](h,(c,g)=>{l.push(d(c,g))}),l};const s="filter"+t[0].toUpperCase()+t.slice(1);n.prototype[s]=function(h,d){const l=[];return this[a](h,(c,g)=>{d(c,g)&&l.push(c)}),l};const u="reduce"+t[0].toUpperCase()+t.slice(1);n.prototype[u]=function(h,d,l){if(arguments.length<3)throw new x(`Graph.${u}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let c=l;return this[a](h,(g,b)=>{c=d(c,g,b)}),c}}function en(n,i){const{name:t,type:e,direction:r}=i,a=t[0].toUpperCase()+t.slice(1,-1),o="find"+a;n.prototype[o]=function(h,d){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return;h=""+h;const l=this._nodes.get(h);if(typeof l>"u")throw new k(`Graph.${o}: could not find the "${h}" node in the graph.`);return Lt(!0,e==="mixed"?this.type:e,r,l,d)};const s="some"+a;n.prototype[s]=function(h,d){return!!this[o](h,d)};const u="every"+a;n.prototype[u]=function(h,d){return!this[o](h,(c,g)=>!d(c,g))}}function tn(n,i){const{name:t,type:e,direction:r}=i,a=t.slice(0,-1)+"Entries";n.prototype[a]=function(o){if(e!=="mixed"&&this.type!=="mixed"&&e!==this.type)return Le();o=""+o;const s=this._nodes.get(o);if(typeof s>"u")throw new k(`Graph.${a}: could not find the "${o}" node in the graph.`);return Xr(e==="mixed"?this.type:e,r,s)}}function rn(n){Yr.forEach(i=>{Jr(n,i),Qr(n,i),en(n,i),tn(n,i)})}function et(n,i,t,e,r){const a=e._nodes.values(),o=e.type;let s,u,h,d,l,c;for(;s=a.next(),s.done!==!0;){let g=!1;if(u=s.value,o!=="undirected"){d=u.out;for(h in d){l=d[h];do c=l.target,g=!0,r(u.key,c.key,u.attributes,c.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}if(o!=="directed"){d=u.undirected;for(h in d)if(!(i&&u.key>h)){l=d[h];do c=l.target,c.key!==h&&(c=l.source),g=!0,r(u.key,c.key,u.attributes,c.attributes,l.key,l.attributes,l.undirected),l=l.next;while(l)}}t&&!g&&r(u.key,null,u.attributes,null,null,null,null)}}function nn(n,i){const t={key:n};return yi(i.attributes)||(t.attributes=Z({},i.attributes)),t}function an(n,i,t){const e={key:i,source:t.source.key,target:t.target.key};return yi(t.attributes)||(e.attributes=Z({},t.attributes)),n==="mixed"&&t.undirected&&(e.undirected=!0),e}function on(n){if(!J(n))throw new x('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a "key" property.');if(!("key"in n))throw new x("Graph.import: serialized node is missing its key.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new x("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.")}function sn(n){if(!J(n))throw new x('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a "source" & "target" property.');if(!("source"in n))throw new x("Graph.import: serialized edge is missing its source.");if(!("target"in n))throw new x("Graph.import: serialized edge is missing its target.");if("attributes"in n&&(!J(n.attributes)||n.attributes===null))throw new x("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.");if("undirected"in n&&typeof n.undirected!="boolean")throw new x("Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.")}const un=hr(),hn=new Set(["directed","undirected","mixed"]),zt=new Set(["domain","_events","_eventsCount","_maxListeners"]),dn=[{name:n=>`${n}Edge`,generateKey:!0},{name:n=>`${n}DirectedEdge`,generateKey:!0,type:"directed"},{name:n=>`${n}UndirectedEdge`,generateKey:!0,type:"undirected"},{name:n=>`${n}EdgeWithKey`},{name:n=>`${n}DirectedEdgeWithKey`,type:"directed"},{name:n=>`${n}UndirectedEdgeWithKey`,type:"undirected"}],ln={allowSelfLoops:!0,multi:!1,type:"mixed"};function cn(n,i,t){if(t&&!J(t))throw new x(`Graph.addNode: invalid attributes. Expecting an object but got "${t}"`);if(i=""+i,t=t||{},n._nodes.has(i))throw new I(`Graph.addNode: the "${i}" node already exist in the graph.`);const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function $t(n,i,t){const e=new n.NodeDataClass(i,t);return n._nodes.set(i,e),n.emit("nodeAdded",{key:i,attributes:t}),e}function Ri(n,i,t,e,r,a,o,s){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.`);if(s&&!J(s))throw new x(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`);if(a=""+a,o=""+o,s=s||{},!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);const u=n._nodes.get(a),h=n._nodes.get(o);if(!u)throw new k(`Graph.${i}: source node "${a}" not found.`);if(!h)throw new k(`Graph.${i}: target node "${o}" not found.`);const d={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);if(!n.multi&&(e?typeof u.undirected[o]<"u":typeof u.out[o]<"u"))throw new I(`Graph.${i}: an edge linking "${a}" to "${o}" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`);const l=new Ge(e,r,u,h,s);n._edges.set(r,l);const c=a===o;return e?(u.undirectedDegree++,h.undirectedDegree++,c&&(u.undirectedLoops++,n._undirectedSelfLoopCount++)):(u.outDegree++,h.inDegree++,c&&(u.directedLoops++,n._directedSelfLoopCount++)),n.multi?l.attachMulti():l.attach(),e?n._undirectedSize++:n._directedSize++,d.key=r,n.emit("edgeAdded",d),r}function fn(n,i,t,e,r,a,o,s,u){if(!e&&n.type==="undirected")throw new I(`Graph.${i}: you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.`);if(e&&n.type==="directed")throw new I(`Graph.${i}: you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.`);if(s){if(u){if(typeof s!="function")throw new x(`Graph.${i}: invalid updater function. Expecting a function but got "${s}"`)}else if(!J(s))throw new x(`Graph.${i}: invalid attributes. Expecting an object but got "${s}"`)}a=""+a,o=""+o;let h;if(u&&(h=s,s=void 0),!n.allowSelfLoops&&a===o)throw new I(`Graph.${i}: source & target are the same ("${a}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);let d=n._nodes.get(a),l=n._nodes.get(o),c,g;if(!t&&(c=n._edges.get(r),c)){if((c.source.key!==a||c.target.key!==o)&&(!e||c.source.key!==o||c.target.key!==a))throw new I(`Graph.${i}: inconsistency detected when attempting to merge the "${r}" edge with "${a}" source & "${o}" target vs. ("${c.source.key}", "${c.target.key}").`);g=c}if(!g&&!n.multi&&d&&(g=e?d.undirected[o]:d.out[o]),g){const T=[g.key,!1,!1,!1];if(u?!h:!s)return T;if(u){const A=g.attributes;g.attributes=h(A),n.emit("edgeAttributesUpdated",{type:"replace",key:g.key,attributes:g.attributes})}else Z(g.attributes,s),n.emit("edgeAttributesUpdated",{type:"merge",key:g.key,attributes:g.attributes,data:s});return T}s=s||{},u&&h&&(s=h(s));const b={key:null,undirected:e,source:a,target:o,attributes:s};if(t)r=n._edgeKeyGenerator();else if(r=""+r,n._edges.has(r))throw new I(`Graph.${i}: the "${r}" edge already exists in the graph.`);let w=!1,C=!1;d||(d=$t(n,a,{}),w=!0,a===o&&(l=d,C=!0)),l||(l=$t(n,o,{}),C=!0),c=new Ge(e,r,d,l,s),n._edges.set(r,c);const D=a===o;return e?(d.undirectedDegree++,l.undirectedDegree++,D&&(d.undirectedLoops++,n._undirectedSelfLoopCount++)):(d.outDegree++,l.inDegree++,D&&(d.directedLoops++,n._directedSelfLoopCount++)),n.multi?c.attachMulti():c.attach(),e?n._undirectedSize++:n._directedSize++,b.key=r,n.emit("edgeAdded",b),[r,!0,w,C]}function Ae(n,i){n._edges.delete(i.key);const{source:t,target:e,attributes:r}=i,a=i.undirected,o=t===e;a?(t.undirectedDegree--,e.undirectedDegree--,o&&(t.undirectedLoops--,n._undirectedSelfLoopCount--)):(t.outDegree--,e.inDegree--,o&&(t.directedLoops--,n._directedSelfLoopCount--)),n.multi?i.detachMulti():i.detach(),a?n._undirectedSize--:n._directedSize--,n.emit("edgeDropped",{key:i.key,attributes:r,source:t.key,target:e.key,undirected:a})}class W extends vi.EventEmitter{constructor(i){if(super(),i=Z({},ln,i),typeof i.multi!="boolean")throw new x(`Graph.constructor: invalid 'multi' option. Expecting a boolean but got "${i.multi}".`);if(!hn.has(i.type))throw new x(`Graph.constructor: invalid 'type' option. Should be one of "mixed", "directed" or "undirected" but got "${i.type}".`);if(typeof i.allowSelfLoops!="boolean")throw new x(`Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got "${i.allowSelfLoops}".`);const t=i.type==="mixed"?bi:i.type==="directed"?wi:Ei;ae(this,"NodeDataClass",t);const e="geid_"+un()+"_";let r=0;const a=()=>{let o;do o=e+r++;while(this._edges.has(o));return o};ae(this,"_attributes",{}),ae(this,"_nodes",new Map),ae(this,"_edges",new Map),ae(this,"_directedSize",0),ae(this,"_undirectedSize",0),ae(this,"_directedSelfLoopCount",0),ae(this,"_undirectedSelfLoopCount",0),ae(this,"_edgeKeyGenerator",a),ae(this,"_options",i),zt.forEach(o=>ae(this,o,this[o])),he(this,"order",()=>this._nodes.size),he(this,"size",()=>this._edges.size),he(this,"directedSize",()=>this._directedSize),he(this,"undirectedSize",()=>this._undirectedSize),he(this,"selfLoopCount",()=>this._directedSelfLoopCount+this._undirectedSelfLoopCount),he(this,"directedSelfLoopCount",()=>this._directedSelfLoopCount),he(this,"undirectedSelfLoopCount",()=>this._undirectedSelfLoopCount),he(this,"multi",this._options.multi),he(this,"type",this._options.type),he(this,"allowSelfLoops",this._options.allowSelfLoops),he(this,"implementation",()=>"graphology")}_resetInstanceCounters(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0}hasNode(i){return this._nodes.has(""+i)}hasDirectedEdge(i,t){if(this.type==="undirected")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&!r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.out.hasOwnProperty(t):!1}throw new x(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasUndirectedEdge(i,t){if(this.type==="directed")return!1;if(arguments.length===1){const e=""+i,r=this._edges.get(e);return!!r&&r.undirected}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?e.undirected.hasOwnProperty(t):!1}throw new x(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasEdge(i,t){if(arguments.length===1){const e=""+i;return this._edges.has(e)}else if(arguments.length===2){i=""+i,t=""+t;const e=this._nodes.get(i);return e?typeof e.out<"u"&&e.out.hasOwnProperty(t)||typeof e.undirected<"u"&&e.undirected.hasOwnProperty(t):!1}throw new x(`Graph.hasEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}directedEdge(i,t){if(this.type==="undirected")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.");const e=this._nodes.get(i);if(!e)throw new k(`Graph.directedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new k(`Graph.directedEdge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||void 0;if(r)return r.key}undirectedEdge(i,t){if(this.type==="directed")return;if(i=""+i,t=""+t,this.multi)throw new I("Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.");const e=this._nodes.get(i);if(!e)throw new k(`Graph.undirectedEdge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new k(`Graph.undirectedEdge: could not find the "${t}" target node in the graph.`);const r=e.undirected&&e.undirected[t]||void 0;if(r)return r.key}edge(i,t){if(this.multi)throw new I("Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.");i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.edge: could not find the "${i}" source node in the graph.`);if(!this._nodes.has(t))throw new k(`Graph.edge: could not find the "${t}" target node in the graph.`);const r=e.out&&e.out[t]||e.undirected&&e.undirected[t]||void 0;if(r)return r.key}areDirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areDirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in||t in e.out}areOutNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areOutNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.out}areInNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areInNeighbors: could not find the "${i}" node in the graph.`);return this.type==="undirected"?!1:t in e.in}areUndirectedNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areUndirectedNeighbors: could not find the "${i}" node in the graph.`);return this.type==="directed"?!1:t in e.undirected}areNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&(t in e.in||t in e.out)||this.type!=="directed"&&t in e.undirected}areInboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areInboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.in||this.type!=="directed"&&t in e.undirected}areOutboundNeighbors(i,t){i=""+i,t=""+t;const e=this._nodes.get(i);if(!e)throw new k(`Graph.areOutboundNeighbors: could not find the "${i}" node in the graph.`);return this.type!=="undirected"&&t in e.out||this.type!=="directed"&&t in e.undirected}inDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.inDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree}outDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.outDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree}directedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.directedDegree: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree}undirectedDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.undirectedDegree: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree}inboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.inboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree),e}outboundDegree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.outboundDegree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.outDegree),e}degree(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.degree: could not find the "${i}" node in the graph.`);let e=0;return this.type!=="directed"&&(e+=t.undirectedDegree),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree),e}inDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.inDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree-t.directedLoops}outDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.outDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.outDegree-t.directedLoops}directedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.directedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="undirected"?0:t.inDegree+t.outDegree-t.directedLoops*2}undirectedDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.undirectedDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);return this.type==="directed"?0:t.undirectedDegree-t.undirectedLoops*2}inboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.inboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree,r+=t.directedLoops),e-r}outboundDegreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.outboundDegreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.outDegree,r+=t.directedLoops),e-r}degreeWithoutSelfLoops(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.degreeWithoutSelfLoops: could not find the "${i}" node in the graph.`);let e=0,r=0;return this.type!=="directed"&&(e+=t.undirectedDegree,r+=t.undirectedLoops*2),this.type!=="undirected"&&(e+=t.inDegree+t.outDegree,r+=t.directedLoops*2),e-r}source(i){i=""+i;const t=this._edges.get(i);if(!t)throw new k(`Graph.source: could not find the "${i}" edge in the graph.`);return t.source.key}target(i){i=""+i;const t=this._edges.get(i);if(!t)throw new k(`Graph.target: could not find the "${i}" edge in the graph.`);return t.target.key}extremities(i){i=""+i;const t=this._edges.get(i);if(!t)throw new k(`Graph.extremities: could not find the "${i}" edge in the graph.`);return[t.source.key,t.target.key]}opposite(i,t){i=""+i,t=""+t;const e=this._edges.get(t);if(!e)throw new k(`Graph.opposite: could not find the "${t}" edge in the graph.`);const r=e.source.key,a=e.target.key;if(i===r)return a;if(i===a)return r;throw new k(`Graph.opposite: the "${i}" node is not attached to the "${t}" edge (${r}, ${a}).`)}hasExtremity(i,t){i=""+i,t=""+t;const e=this._edges.get(i);if(!e)throw new k(`Graph.hasExtremity: could not find the "${i}" edge in the graph.`);return e.source.key===t||e.target.key===t}isUndirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new k(`Graph.isUndirected: could not find the "${i}" edge in the graph.`);return t.undirected}isDirected(i){i=""+i;const t=this._edges.get(i);if(!t)throw new k(`Graph.isDirected: could not find the "${i}" edge in the graph.`);return!t.undirected}isSelfLoop(i){i=""+i;const t=this._edges.get(i);if(!t)throw new k(`Graph.isSelfLoop: could not find the "${i}" edge in the graph.`);return t.source===t.target}addNode(i,t){return cn(this,i,t).key}mergeNode(i,t){if(t&&!J(t))throw new x(`Graph.mergeNode: invalid attributes. Expecting an object but got "${t}"`);i=""+i,t=t||{};let e=this._nodes.get(i);return e?(t&&(Z(e.attributes,t),this.emit("nodeAttributesUpdated",{type:"merge",key:i,attributes:e.attributes,data:t})),[i,!1]):(e=new this.NodeDataClass(i,t),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:t}),[i,!0])}updateNode(i,t){if(t&&typeof t!="function")throw new x(`Graph.updateNode: invalid updater function. Expecting a function but got "${t}"`);i=""+i;let e=this._nodes.get(i);if(e){if(t){const a=e.attributes;e.attributes=t(a),this.emit("nodeAttributesUpdated",{type:"replace",key:i,attributes:e.attributes})}return[i,!1]}const r=t?t({}):{};return e=new this.NodeDataClass(i,r),this._nodes.set(i,e),this.emit("nodeAdded",{key:i,attributes:r}),[i,!0]}dropNode(i){i=""+i;const t=this._nodes.get(i);if(!t)throw new k(`Graph.dropNode: could not find the "${i}" node in the graph.`);let e;if(this.type!=="undirected"){for(const r in t.out){e=t.out[r];do Ae(this,e),e=e.next;while(e)}for(const r in t.in){e=t.in[r];do Ae(this,e),e=e.next;while(e)}}if(this.type!=="directed")for(const r in t.undirected){e=t.undirected[r];do Ae(this,e),e=e.next;while(e)}this._nodes.delete(i),this.emit("nodeDropped",{key:i,attributes:t.attributes})}dropEdge(i){let t;if(arguments.length>1){const e=""+arguments[0],r=""+arguments[1];if(t=oe(this,e,r,this.type),!t)throw new k(`Graph.dropEdge: could not find the "${e}" -> "${r}" edge in the graph.`)}else if(i=""+i,t=this._edges.get(i),!t)throw new k(`Graph.dropEdge: could not find the "${i}" edge in the graph.`);return Ae(this,t),this}dropDirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");i=""+i,t=""+t;const e=oe(this,i,t,"directed");if(!e)throw new k(`Graph.dropDirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return Ae(this,e),this}dropUndirectedEdge(i,t){if(arguments.length<2)throw new I("Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new I("Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");const e=oe(this,i,t,"undirected");if(!e)throw new k(`Graph.dropUndirectedEdge: could not find a "${i}" -> "${t}" edge in the graph.`);return Ae(this,e),this}clear(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit("cleared")}clearEdges(){const i=this._nodes.values();let t;for(;t=i.next(),t.done!==!0;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit("edgesCleared")}getAttribute(i){return this._attributes[i]}getAttributes(){return this._attributes}hasAttribute(i){return this._attributes.hasOwnProperty(i)}setAttribute(i,t){return this._attributes[i]=t,this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}updateAttribute(i,t){if(typeof t!="function")throw new x("Graph.updateAttribute: updater should be a function.");const e=this._attributes[i];return this._attributes[i]=t(e),this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:i}),this}removeAttribute(i){return delete this._attributes[i],this.emit("attributesUpdated",{type:"remove",attributes:this._attributes,name:i}),this}replaceAttributes(i){if(!J(i))throw new x("Graph.replaceAttributes: provided attributes are not a plain object.");return this._attributes=i,this.emit("attributesUpdated",{type:"replace",attributes:this._attributes}),this}mergeAttributes(i){if(!J(i))throw new x("Graph.mergeAttributes: provided attributes are not a plain object.");return Z(this._attributes,i),this.emit("attributesUpdated",{type:"merge",attributes:this._attributes,data:i}),this}updateAttributes(i){if(typeof i!="function")throw new x("Graph.updateAttributes: provided updater is not a function.");return this._attributes=i(this._attributes),this.emit("attributesUpdated",{type:"update",attributes:this._attributes}),this}updateEachNodeAttributes(i,t){if(typeof i!="function")throw new x("Graph.updateEachNodeAttributes: expecting an updater function.");if(t&&!Ut(t))throw new x("Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._nodes.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,a.attributes=i(a.key,a.attributes);this.emit("eachNodeAttributesUpdated",{hints:t||null})}updateEachEdgeAttributes(i,t){if(typeof i!="function")throw new x("Graph.updateEachEdgeAttributes: expecting an updater function.");if(t&&!Ut(t))throw new x("Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const e=this._edges.values();let r,a,o,s;for(;r=e.next(),r.done!==!0;)a=r.value,o=a.source,s=a.target,a.attributes=i(a.key,a.attributes,o.key,s.key,o.attributes,s.attributes,a.undirected);this.emit("eachEdgeAttributesUpdated",{hints:t||null})}forEachAdjacencyEntry(i){if(typeof i!="function")throw new x("Graph.forEachAdjacencyEntry: expecting a callback.");et(!1,!1,!1,this,i)}forEachAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new x("Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.");et(!1,!1,!0,this,i)}forEachAssymetricAdjacencyEntry(i){if(typeof i!="function")throw new x("Graph.forEachAssymetricAdjacencyEntry: expecting a callback.");et(!1,!0,!1,this,i)}forEachAssymetricAdjacencyEntryWithOrphans(i){if(typeof i!="function")throw new x("Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.");et(!1,!0,!0,this,i)}nodes(){return Array.from(this._nodes.keys())}forEachNode(i){if(typeof i!="function")throw new x("Graph.forEachNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)}findNode(i){if(typeof i!="function")throw new x("Graph.findNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return r.key}mapNodes(i){if(typeof i!="function")throw new x("Graph.mapNode: expecting a callback.");const t=this._nodes.values();let e,r;const a=new Array(this.order);let o=0;for(;e=t.next(),e.done!==!0;)r=e.value,a[o++]=i(r.key,r.attributes);return a}someNode(i){if(typeof i!="function")throw new x("Graph.someNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,i(r.key,r.attributes))return!0;return!1}everyNode(i){if(typeof i!="function")throw new x("Graph.everyNode: expecting a callback.");const t=this._nodes.values();let e,r;for(;e=t.next(),e.done!==!0;)if(r=e.value,!i(r.key,r.attributes))return!1;return!0}filterNodes(i){if(typeof i!="function")throw new x("Graph.filterNodes: expecting a callback.");const t=this._nodes.values();let e,r;const a=[];for(;e=t.next(),e.done!==!0;)r=e.value,i(r.key,r.attributes)&&a.push(r.key);return a}reduceNodes(i,t){if(typeof i!="function")throw new x("Graph.reduceNodes: expecting a callback.");if(arguments.length<2)throw new x("Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.");let e=t;const r=this._nodes.values();let a,o;for(;a=r.next(),a.done!==!0;)o=a.value,e=i(e,o.key,o.attributes);return e}nodeEntries(){const i=this._nodes.values();return{[Symbol.iterator](){return this},next(){const t=i.next();if(t.done)return t;const e=t.value;return{value:{node:e.key,attributes:e.attributes},done:!1}}}}export(){const i=new Array(this._nodes.size);let t=0;this._nodes.forEach((r,a)=>{i[t++]=nn(a,r)});const e=new Array(this._edges.size);return t=0,this._edges.forEach((r,a)=>{e[t++]=an(this.type,a,r)}),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:i,edges:e}}import(i,t=!1){if(i instanceof W)return i.forEachNode((u,h)=>{t?this.mergeNode(u,h):this.addNode(u,h)}),i.forEachEdge((u,h,d,l,c,g,b)=>{t?b?this.mergeUndirectedEdgeWithKey(u,d,l,h):this.mergeDirectedEdgeWithKey(u,d,l,h):b?this.addUndirectedEdgeWithKey(u,d,l,h):this.addDirectedEdgeWithKey(u,d,l,h)}),this;if(!J(i))throw new x("Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.");if(i.attributes){if(!J(i.attributes))throw new x("Graph.import: invalid attributes. Expecting a plain object.");t?this.mergeAttributes(i.attributes):this.replaceAttributes(i.attributes)}let e,r,a,o,s;if(i.nodes){if(a=i.nodes,!Array.isArray(a))throw new x("Graph.import: invalid nodes. Expecting an array.");for(e=0,r=a.length;e{const a=Z({},e.attributes);e=new t.NodeDataClass(r,a),t._nodes.set(r,e)}),t}copy(i){if(i=i||{},typeof i.type=="string"&&i.type!==this.type&&i.type!=="mixed")throw new I(`Graph.copy: cannot create an incompatible copy from "${this.type}" type to "${i.type}" because this would mean losing information about the current graph.`);if(typeof i.multi=="boolean"&&i.multi!==this.multi&&i.multi!==!0)throw new I("Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.");if(typeof i.allowSelfLoops=="boolean"&&i.allowSelfLoops!==this.allowSelfLoops&&i.allowSelfLoops!==!0)throw new I("Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.");const t=this.emptyCopy(i),e=this._edges.values();let r,a;for(;r=e.next(),r.done!==!0;)a=r.value,Ri(t,"copy",!1,a.undirected,a.key,a.source.key,a.target.key,Z({},a.attributes));return t}toJSON(){return this.export()}toString(){return"[object Graph]"}inspect(){const i={};this._nodes.forEach((a,o)=>{i[o]=a.attributes});const t={},e={};this._edges.forEach((a,o)=>{const s=a.undirected?"--":"->";let u="",h=a.source.key,d=a.target.key,l;a.undirected&&h>d&&(l=h,h=d,d=l);const c=`(${h})${s}(${d})`;o.startsWith("geid_")?this.multi&&(typeof e[c]>"u"?e[c]=0:e[c]++,u+=`${e[c]}. `):u+=`[${o}]: `,u+=c,t[u]=a.attributes});const r={};for(const a in this)this.hasOwnProperty(a)&&!zt.has(a)&&typeof this[a]!="function"&&typeof a!="symbol"&&(r[a]=this[a]);return r.attributes=this._attributes,r.nodes=i,r.edges=t,ae(r,"constructor",this.constructor),r}}typeof Symbol<"u"&&(W.prototype[Symbol.for("nodejs.util.inspect.custom")]=W.prototype.inspect);dn.forEach(n=>{["add","merge","update"].forEach(i=>{const t=n.name(i),e=i==="add"?Ri:fn;n.generateKey?W.prototype[t]=function(r,a,o){return e(this,t,!0,(n.type||this.type)==="undirected",null,r,a,o,i==="update")}:W.prototype[t]=function(r,a,o,s){return e(this,t,!1,(n.type||this.type)==="undirected",r,a,o,s,i==="update")}})});Er(W);Gr(W);Kr(W);rn(W);class Ai extends W{constructor(i){const t=Z({type:"directed"},i);if("multi"in t&&t.multi!==!1)throw new x("DirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="directed")throw new x('DirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class ki extends W{constructor(i){const t=Z({type:"undirected"},i);if("multi"in t&&t.multi!==!1)throw new x("UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(t.type!=="undirected")throw new x('UndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class xi extends W{constructor(i){const t=Z({multi:!0},i);if("multi"in t&&t.multi!==!0)throw new x("MultiGraph.from: inconsistent indication that the graph should be simple in given options!");super(t)}}class Di extends W{constructor(i){const t=Z({type:"directed",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new x("MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="directed")throw new x('MultiDirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}class Li extends W{constructor(i){const t=Z({type:"undirected",multi:!0},i);if("multi"in t&&t.multi!==!0)throw new x("MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(t.type!=="undirected")throw new x('MultiUndirectedGraph.from: inconsistent "'+t.type+'" type in given options!');super(t)}}function Fe(n){n.from=function(i,t){const e=Z({},i.options,t),r=new n(e);return r.import(i),r}}Fe(W);Fe(Ai);Fe(ki);Fe(xi);Fe(Di);Fe(Li);W.Graph=W;W.DirectedGraph=Ai;W.UndirectedGraph=ki;W.MultiGraph=xi;W.MultiDirectedGraph=Di;W.MultiUndirectedGraph=Li;W.InvalidArgumentsGraphError=x;W.NotFoundGraphError=k;W.UsageGraphError=I;function gn(n,i){if(typeof n!="object"||!n)return n;var t=n[Symbol.toPrimitive];if(t!==void 0){var e=t.call(n,i);if(typeof e!="object")return e;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(n)}function We(n){var i=gn(n,"string");return typeof i=="symbol"?i:i+""}function Q(n,i){if(!(n instanceof i))throw new TypeError("Cannot call a class as a function")}function Bt(n,i){for(var t=0;tn.length)&&(i=n.length);for(var t=0,e=Array(i);t>>16,t=(n&65280)>>>8,e=n&255,r=255,a=Pi(i,t,e,r);return ft[n]=a,a}function Mt(n,i,t,e){return t+(i<<8)+(n<<16)}function Ht(n,i,t,e,r,a){var o=Math.floor(t/a*r),s=Math.floor(n.drawingBufferHeight/a-e/a*r),u=new Uint8Array(4);n.bindFramebuffer(n.FRAMEBUFFER,i),n.readPixels(o,s,1,1,n.RGBA,n.UNSIGNED_BYTE,u);var h=De(u,4),d=h[0],l=h[1],c=h[2],g=h[3];return[d,l,c,g]}function E(n,i,t){return(i=We(i))in n?Object.defineProperty(n,i,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[i]=t,n}function Wt(n,i){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(n);i&&(e=e.filter(function(r){return Object.getOwnPropertyDescriptor(n,r).enumerable})),t.push.apply(t,e)}return t}function L(n){for(var i=1;i0&&e.jsx(W,{penalties:s.top_penalties}),e.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[e.jsxs(c,{children:[e.jsx(d,{children:e.jsx(o,{children:a("health.brainMetrics")})}),e.jsx(m,{children:r?e.jsx(x,{className:"h-80 w-full"}):e.jsx(k,{width:"100%",height:320,children:e.jsxs(S,{data:n,children:[e.jsx(A,{stroke:"var(--color-border)"}),e.jsx(G,{dataKey:"metric",tick:{fill:"var(--color-muted-foreground)",fontSize:12}}),e.jsx(O,{angle:90,domain:[0,100],tick:{fill:"var(--color-muted-foreground)",fontSize:10}}),e.jsx(F,{name:a("health.radarName"),dataKey:"value",stroke:"var(--color-primary)",fill:"var(--color-primary)",fillOpacity:.2,strokeWidth:2})]})})})]}),e.jsxs(c,{children:[e.jsx(d,{children:e.jsx(o,{children:a("health.warnings")})}),e.jsx(m,{children:r?e.jsx("div",{className:"space-y-3",children:Array.from({length:4}).map((i,l)=>e.jsx(x,{className:"h-10 w-full"},l))}):e.jsxs("div",{className:"space-y-4",children:[s?.warnings&&s.warnings.length>0?e.jsx("div",{className:"space-y-2",children:s.warnings.map((i,l)=>e.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-border p-3",children:[e.jsx(u,{variant:i.severity==="critical"?"destructive":i.severity==="warning"?"warning":"secondary",className:"mt-0.5 shrink-0",children:i.severity}),e.jsx("span",{className:"text-sm",children:i.message})]},l))}):e.jsx("p",{className:"text-sm text-muted-foreground",children:a("health.noWarnings")}),s?.recommendations&&s.recommendations.length>0&&e.jsxs("div",{className:"mt-4 space-y-2",children:[e.jsx("h3",{className:"text-sm font-medium text-muted-foreground",children:a("health.recommendations")}),e.jsx("ul",{className:"space-y-1 text-sm",children:s.recommendations.map((i,l)=>e.jsxs("li",{className:"flex gap-2",children:[e.jsx("span",{className:"text-primary",children:"-"}),e.jsx("span",{children:i})]},l))})]})]})})]})]}),e.jsx(K,{})]})}function W({penalties:s}){const{t:r}=j();return e.jsxs(c,{className:"border-amber-500/30 bg-amber-500/5",children:[e.jsx(d,{className:"pb-3",children:e.jsxs(o,{className:"flex items-center gap-2 text-base",children:[e.jsx(w,{className:"size-5 text-amber-500"}),r("health.topPenalties")]})}),e.jsx(m,{children:e.jsx("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-3",children:s.map((a,t)=>e.jsx(B,{penalty:a,rank:t+1},a.component))})})]})}function B({penalty:s,rank:r}){const{t:a}=j(),t=Math.round(s.current_score*100),n=Math.round(s.weight*100),i=s.penalty_points.toFixed(1),l=s.estimated_gain.toFixed(1),p=t>=60?"bg-amber-500":t>=30?"bg-orange-500":"bg-red-500";return e.jsxs("div",{className:"rounded-lg border border-border bg-card p-4 transition-shadow hover:shadow-md",children:[e.jsxs("div",{className:"mb-3 flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"flex size-6 items-center justify-center rounded-full bg-amber-500/15 text-xs font-bold text-amber-600",children:r}),e.jsx("h4",{className:"text-sm font-semibold capitalize",children:s.component})]}),e.jsx(u,{variant:"outline",className:"text-xs text-red-500 border-red-500/30",children:a("health.penaltyPoints",{points:i})})]}),e.jsxs("div",{className:"mb-3",children:[e.jsxs("div",{className:"mb-1 flex items-center justify-between text-xs text-muted-foreground",children:[e.jsx("span",{children:a("health.currentScore",{score:t})}),e.jsx("span",{children:a("health.weight",{weight:n})})]}),e.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full bg-muted",children:e.jsx("div",{className:`h-full rounded-full transition-all ${p}`,style:{width:`${t}%`}})})]}),e.jsxs("div",{className:"mb-3 flex items-center gap-1.5 rounded-md bg-emerald-500/10 px-2.5 py-1.5",children:[e.jsx(R,{className:"size-3.5 text-emerald-500"}),e.jsx("span",{className:"text-xs font-medium text-emerald-600",children:a("health.estimatedGain",{gain:l})})]}),e.jsxs("div",{className:"flex items-start gap-1.5 text-xs text-muted-foreground",children:[e.jsx(E,{className:"mt-0.5 size-3 shrink-0 text-primary"}),e.jsx("span",{children:s.action})]})]})}function K(){const[s,r]=b.useState(!1),{t:a}=j();return e.jsxs(c,{children:[e.jsxs(d,{className:"pb-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(o,{className:"flex items-center gap-2",children:[e.jsx(N,{className:"size-5 text-primary"}),a("health.enrichTitle")]}),e.jsxs(C,{variant:"ghost",size:"sm",onClick:()=>r(t=>!t),"aria-label":a(s?"health.collapseTips":"health.expandTips"),children:[s?e.jsx(_,{className:"size-4"}):e.jsx(T,{className:"size-4"}),e.jsx("span",{className:"ml-1 text-xs",children:a(s?"health.less":"health.more")})]})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:a("health.enrichDesc")})]}),e.jsx(m,{children:e.jsx("div",{className:`grid grid-cols-1 gap-4 ${s?"md:grid-cols-2":"md:grid-cols-4"}`,children:D.map((t,n)=>{const i=I[n],l=M[n],p=a(`enrichment.${t}Title`),f=a(`enrichment.${t}Tips`,{returnObjects:!0});return e.jsxs("div",{className:"rounded-lg border border-border p-4 transition-shadow hover:shadow-sm",children:[e.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[e.jsx("div",{className:"flex size-8 items-center justify-center rounded-lg",style:{backgroundColor:`${l}15`},children:e.jsx(i,{className:"size-4",style:{color:l}})}),e.jsx("h3",{className:"text-sm font-semibold",children:p})]}),e.jsx("ul",{className:"space-y-2",children:(s?f:f.slice(0,2)).map((h,v)=>e.jsxs("li",{className:"flex gap-2 text-xs leading-relaxed",children:[e.jsx("span",{className:"mt-0.5 shrink-0 text-muted-foreground",children:"-"}),e.jsx("span",{className:h.startsWith("BAD:")||h.startsWith("TỆ:")?"text-destructive":h.startsWith("GOOD:")||h.startsWith("TỐT:")?"text-primary":"",children:h})]},v))})]},t)})})})]})}export{Z as default}; +import{j as e}from"./vendor-query-CqA1cBNl.js";import{r as b}from"./vendor-react-BfuodpLv.js";import{g as y,f as j,B as g,a as w}from"./index-DXL5wCpD.js";import{C as c,a as d,b as o,c as m}from"./card-Duzfr-hx.js";import{S as x}from"./skeleton-CBW-y0cP.js";import{B as C,c as N,J as _,K as T,L as $,H as z,D as P,e as R,M as E}from"./vendor-icons-C6dhS1UE.js";import{R as k,a as S,P as A,b as M,c as O,d as D}from"./vendor-recharts-BkwZfCWA.js";import"./vendor-ui-Qm4_4bAc.js";const F=[N,$,z,P],G=["#6366f1","#f59e0b","#059669","#06b6d4"],H=["remember","causal","diverse","train"],u={A:{color:"#059669",bg:"#05966915",variant:"success"},B:{color:"#6366f1",bg:"#6366f115",variant:"secondary"},C:{color:"#f59e0b",bg:"#f59e0b15",variant:"warning"},D:{color:"#ef4444",bg:"#ef444415",variant:"destructive"},F:{color:"#ef4444",bg:"#ef444415",variant:"destructive"}};function B(s){const r=s.charAt(0).toUpperCase();return u[r]??u.F}function Z(){const{data:s,isLoading:r}=y(),{t:a}=j(),t=s?B(s.grade):u.F,n=s?[{metric:a("health.purity"),value:s.purity_score*100},{metric:a("health.freshness"),value:s.freshness*100},{metric:a("health.connectivity"),value:s.connectivity*100},{metric:a("health.diversity"),value:s.diversity*100},{metric:a("health.consolidation"),value:s.consolidation_ratio*100},{metric:a("health.activation"),value:s.activation_efficiency*100},{metric:a("health.recall"),value:s.recall_confidence*100},{metric:a("health.orphanRate"),value:(1-s.orphan_rate)*100}]:[];return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:a("health.title")}),s&&e.jsx(g,{variant:t.variant,className:"text-lg px-3 py-1",children:s.grade})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2",children:[e.jsxs(c,{children:[e.jsx(d,{className:"pb-2",children:e.jsx(o,{className:"text-sm font-medium text-muted-foreground",children:a("health.conflictRate")})}),e.jsx(m,{children:r?e.jsx(x,{className:"h-8 w-20"}):e.jsx("p",{className:"font-mono text-2xl font-bold",children:`${((s?.conflict_rate??0)*100).toFixed(1)}%`})})]}),e.jsxs(c,{children:[e.jsx(d,{className:"pb-2",children:e.jsx(o,{className:"text-sm font-medium text-muted-foreground",children:a("health.contradictionCount")})}),e.jsx(m,{children:r?e.jsx(x,{className:"h-8 w-16"}):e.jsx("p",{className:"font-mono text-2xl font-bold",children:s?.contradiction_count??0})})]})]}),s&&s.top_penalties&&s.top_penalties.length>0&&e.jsx(I,{penalties:s.top_penalties}),e.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[e.jsxs(c,{children:[e.jsx(d,{children:e.jsx(o,{children:a("health.brainMetrics")})}),e.jsx(m,{children:r?e.jsx(x,{className:"h-80 w-full"}):e.jsx(k,{width:"100%",height:320,children:e.jsxs(S,{data:n,children:[e.jsx(A,{stroke:"var(--color-border)"}),e.jsx(M,{dataKey:"metric",tick:{fill:"var(--color-muted-foreground)",fontSize:12}}),e.jsx(O,{angle:90,domain:[0,100],tick:{fill:"var(--color-muted-foreground)",fontSize:10}}),e.jsx(D,{name:a("health.radarName"),dataKey:"value",stroke:"var(--color-primary)",fill:"var(--color-primary)",fillOpacity:.2,strokeWidth:2})]})})})]}),e.jsxs(c,{children:[e.jsx(d,{children:e.jsx(o,{children:a("health.warnings")})}),e.jsx(m,{children:r?e.jsx("div",{className:"space-y-3",children:Array.from({length:4}).map((i,l)=>e.jsx(x,{className:"h-10 w-full"},l))}):e.jsxs("div",{className:"space-y-4",children:[s?.warnings&&s.warnings.length>0?e.jsx("div",{className:"space-y-2",children:s.warnings.map((i,l)=>e.jsxs("div",{className:"flex items-start gap-2 rounded-lg border border-border p-3",children:[e.jsx(g,{variant:i.severity==="critical"?"destructive":i.severity==="warning"?"warning":"secondary",className:"mt-0.5 shrink-0",children:i.severity}),e.jsx("span",{className:"text-sm",children:i.message})]},l))}):e.jsx("p",{className:"text-sm text-muted-foreground",children:a("health.noWarnings")}),s?.recommendations&&s.recommendations.length>0&&e.jsxs("div",{className:"mt-4 space-y-2",children:[e.jsx("h3",{className:"text-sm font-medium text-muted-foreground",children:a("health.recommendations")}),e.jsx("ul",{className:"space-y-1 text-sm",children:s.recommendations.map((i,l)=>e.jsxs("li",{className:"flex gap-2",children:[e.jsx("span",{className:"text-primary",children:"-"}),e.jsx("span",{children:i})]},l))})]})]})})]})]}),e.jsx(K,{})]})}function I({penalties:s}){const{t:r}=j();return e.jsxs(c,{className:"border-amber-500/30 bg-amber-500/5",children:[e.jsx(d,{className:"pb-3",children:e.jsxs(o,{className:"flex items-center gap-2 text-base",children:[e.jsx(C,{className:"size-5 text-amber-500"}),r("health.topPenalties")]})}),e.jsx(m,{children:e.jsx("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-3",children:s.map((a,t)=>e.jsx(W,{penalty:a,rank:t+1},a.component))})})]})}function W({penalty:s,rank:r}){const{t:a}=j(),t=Math.round(s.current_score*100),n=Math.round(s.weight*100),i=s.penalty_points.toFixed(1),l=s.estimated_gain.toFixed(1),p=t>=60?"bg-amber-500":t>=30?"bg-orange-500":"bg-red-500";return e.jsxs("div",{className:"rounded-lg border border-border bg-card p-4 transition-shadow hover:shadow-md",children:[e.jsxs("div",{className:"mb-3 flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"flex size-6 items-center justify-center rounded-full bg-amber-500/15 text-xs font-bold text-amber-600",children:r}),e.jsx("h4",{className:"text-sm font-semibold capitalize",children:s.component})]}),e.jsx(g,{variant:"outline",className:"text-xs text-red-500 border-red-500/30",children:a("health.penaltyPoints",{points:i})})]}),e.jsxs("div",{className:"mb-3",children:[e.jsxs("div",{className:"mb-1 flex items-center justify-between text-xs text-muted-foreground",children:[e.jsx("span",{children:a("health.currentScore",{score:t})}),e.jsx("span",{children:a("health.weight",{weight:n})})]}),e.jsx("div",{className:"h-2 w-full overflow-hidden rounded-full bg-muted",children:e.jsx("div",{className:`h-full rounded-full transition-all ${p}`,style:{width:`${t}%`}})})]}),e.jsxs("div",{className:"mb-3 flex items-center gap-1.5 rounded-md bg-emerald-500/10 px-2.5 py-1.5",children:[e.jsx(R,{className:"size-3.5 text-emerald-500"}),e.jsx("span",{className:"text-xs font-medium text-emerald-600",children:a("health.estimatedGain",{gain:l})})]}),e.jsxs("div",{className:"flex items-start gap-1.5 text-xs text-muted-foreground",children:[e.jsx(E,{className:"mt-0.5 size-3 shrink-0 text-primary"}),e.jsx("span",{children:s.action})]})]})}function K(){const[s,r]=b.useState(!1),{t:a}=j();return e.jsxs(c,{children:[e.jsxs(d,{className:"pb-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(o,{className:"flex items-center gap-2",children:[e.jsx(N,{className:"size-5 text-primary"}),a("health.enrichTitle")]}),e.jsxs(w,{variant:"ghost",size:"sm",onClick:()=>r(t=>!t),"aria-label":a(s?"health.collapseTips":"health.expandTips"),children:[s?e.jsx(_,{className:"size-4"}):e.jsx(T,{className:"size-4"}),e.jsx("span",{className:"ml-1 text-xs",children:a(s?"health.less":"health.more")})]})]}),e.jsx("p",{className:"text-sm text-muted-foreground",children:a("health.enrichDesc")})]}),e.jsx(m,{children:e.jsx("div",{className:`grid grid-cols-1 gap-4 ${s?"md:grid-cols-2":"md:grid-cols-4"}`,children:H.map((t,n)=>{const i=F[n],l=G[n],p=a(`enrichment.${t}Title`),f=a(`enrichment.${t}Tips`,{returnObjects:!0});return e.jsxs("div",{className:"rounded-lg border border-border p-4 transition-shadow hover:shadow-sm",children:[e.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[e.jsx("div",{className:"flex size-8 items-center justify-center rounded-lg",style:{backgroundColor:`${l}15`},children:e.jsx(i,{className:"size-4",style:{color:l}})}),e.jsx("h3",{className:"text-sm font-semibold",children:p})]}),e.jsx("ul",{className:"space-y-2",children:(s?f:f.slice(0,2)).map((h,v)=>e.jsxs("li",{className:"flex gap-2 text-xs leading-relaxed",children:[e.jsx("span",{className:"mt-0.5 shrink-0 text-muted-foreground",children:"-"}),e.jsx("span",{className:h.startsWith("BAD:")||h.startsWith("TỆ:")?"text-destructive":h.startsWith("GOOD:")||h.startsWith("TỐT:")?"text-primary":"",children:h})]},v))})]},t)})})})]})}export{Z as default}; diff --git a/src/surreal_memory/server/static/dist/assets/OraclePage-BOi3rQAz.js b/src/surreal_memory/server/static/dist/assets/OraclePage-BOi3rQAz.js new file mode 100644 index 00000000..0c7cf424 --- /dev/null +++ b/src/surreal_memory/server/static/dist/assets/OraclePage-BOi3rQAz.js @@ -0,0 +1 @@ +import{j as s}from"./vendor-query-CqA1cBNl.js";import{r as d}from"./vendor-react-BfuodpLv.js";import{h as _,Y as F,Z as Y,_ as K,C as H,$ as G,a0 as q}from"./vendor-icons-C6dhS1UE.js";import{f as j,i as V,b as J}from"./index-DXL5wCpD.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";const X=[{key:"daily",labelKey:"oracle.dailyReading",icon:_},{key:"whatif",labelKey:"oracle.whatif",icon:F},{key:"matchup",labelKey:"oracle.matchup",icon:Y}];function Z({mode:e,onModeChange:n}){const{t}=j();return s.jsx("div",{className:"flex gap-2",children:X.map(({key:r,labelKey:o,icon:a})=>s.jsxs("button",{onClick:()=>n(r),className:`flex cursor-pointer items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-all ${e===r?"bg-primary/15 text-primary ring-1 ring-primary/30":"text-muted-foreground hover:bg-accent hover:text-foreground"}`,children:[s.jsx(a,{className:"size-4"}),t(o)]},r))})}function Q({card:e,className:n=""}){return s.jsxs("div",{className:`relative overflow-hidden rounded-2xl border border-white/10 bg-[#16140f] p-5 ${n}`,style:{backfaceVisibility:"hidden"},children:[s.jsx("div",{className:`absolute inset-0 bg-gradient-to-b ${e.suit.bg} opacity-60`}),s.jsx("div",{className:"absolute right-3 top-3 opacity-10",children:s.jsx("span",{className:"text-7xl font-bold",style:{color:e.suit.color},children:e.suit.symbol})}),s.jsxs("div",{className:"relative z-10 flex h-full flex-col",children:[s.jsx("div",{className:"mb-1 text-center",children:s.jsxs("span",{className:"text-xs font-semibold uppercase tracking-[0.2em]",style:{color:e.suit.color},children:["✦ ",e.title," ✦"]})}),s.jsx("div",{className:"my-4 flex justify-center",children:s.jsx("div",{className:"flex size-16 items-center justify-center rounded-full border-2",style:{borderColor:e.suit.color+"40",backgroundColor:e.suit.color+"15"},children:s.jsx("span",{className:"text-3xl",style:{color:e.suit.color},children:e.suit.symbol})})}),s.jsx("div",{className:"mx-auto mb-3 h-px w-3/4",style:{backgroundColor:e.suit.color+"30"}}),s.jsx("div",{className:"mb-auto flex-1",children:s.jsxs("p",{className:"line-clamp-3 text-center text-sm leading-relaxed text-white/80",children:["“",e.content,"”"]})}),s.jsxs("div",{className:"mt-4 flex items-center justify-between text-xs text-white/50",children:[s.jsxs("span",{"aria-label":`Activation ${e.activation}`,children:[s.jsx("span",{"aria-hidden":"true",children:"⚡"})," ",e.activation]}),s.jsxs("span",{"aria-label":`Connections ${e.connectionCount}`,children:[s.jsx("span",{"aria-hidden":"true",children:"🔗"})," ",e.connectionCount]}),s.jsxs("span",{"aria-label":`Age ${e.age}`,children:[s.jsx("span",{"aria-hidden":"true",children:"📅"})," ",e.age]})]}),s.jsx("div",{className:"mt-2 text-center",children:s.jsxs("span",{className:"inline-block rounded-full px-3 py-0.5 text-xs font-medium",style:{backgroundColor:e.suit.color+"20",color:e.suit.color},children:[e.suit.symbol," ",e.suitKey]})})]})]})}function ee({className:e=""}){return s.jsxs("div",{className:`relative overflow-hidden rounded-2xl border border-white/10 bg-[#16140f] ${e}`,style:{backfaceVisibility:"hidden"},children:[s.jsxs("div",{className:"absolute inset-0 opacity-30",children:[s.jsx("div",{className:"absolute inset-0",style:{background:"repeating-conic-gradient(from 0deg at 50% 50%, #818cf8 0deg 30deg, transparent 30deg 60deg)",opacity:.15}}),s.jsx("div",{className:"absolute inset-0",style:{background:"radial-gradient(circle at 50% 50%, transparent 30%, #818cf820 50%, transparent 70%)"}}),s.jsx("div",{className:"absolute inset-0",style:{background:"radial-gradient(circle at 50% 50%, #818cf815 0%, transparent 40%)"}})]}),s.jsx("div",{className:"absolute inset-0 flex items-center justify-center","aria-hidden":"true",children:s.jsxs("div",{className:"relative",children:[s.jsx("div",{className:"text-5xl font-bold opacity-20",style:{color:"#818cf8"},children:"✦"}),s.jsx("div",{className:"absolute inset-0 flex items-center justify-center text-2xl font-bold text-white/40",children:"?"})]})}),s.jsx("div",{className:"absolute inset-0 rounded-2xl ring-1 ring-inset ring-white/5"})]})}function B({card:e,autoFlipDelay:n,onFlip:t,className:r=""}){const[o,a]=d.useState(!1),l=d.useRef(t);l.current=t,d.useEffect(()=>{if(n!==void 0&&n>=0){const i=setTimeout(()=>{a(!0),l.current?.()},n);return()=>clearTimeout(i)}},[n]);const c=()=>{const i=!o;a(i),i&&l.current?.()};return s.jsx("div",{className:`cursor-pointer ${r}`,style:{perspective:"1000px"},onClick:c,role:"button",tabIndex:0,"aria-label":o?`Card: ${e.title} — ${e.content}`:"Tap to reveal card",onKeyDown:i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),c())},children:s.jsxs("div",{className:"relative h-full w-full",style:{transformStyle:"preserve-3d",transform:o?"rotateY(180deg)":"rotateY(0deg)",transitionTimingFunction:"cubic-bezier(0.4, 0, 0.2, 1)",transitionDuration:"600ms"},children:[s.jsx("div",{className:"absolute inset-0",style:{backfaceVisibility:"hidden"},children:s.jsx(ee,{className:"h-full w-full"})}),s.jsx("div",{className:"absolute inset-0",style:{backfaceVisibility:"hidden",transform:"rotateY(180deg)"},children:s.jsx(Q,{card:e,className:"h-full w-full"})})]})})}const b=800,C=420,m=180,w=260,I=24;function te(e,n,t,r,o,a){e.beginPath(),e.moveTo(n+a,t),e.lineTo(n+r-a,t),e.quadraticCurveTo(n+r,t,n+r,t+a),e.lineTo(n+r,t+o-a),e.quadraticCurveTo(n+r,t+o,n+r-a,t+o),e.lineTo(n+a,t+o),e.quadraticCurveTo(n,t+o,n,t+o-a),e.lineTo(n,t+a),e.quadraticCurveTo(n,t,n+a,t),e.closePath()}function ne(e,n,t,r,o){te(e,t,r,m,w,12),e.fillStyle="#1a1814",e.fill(),e.strokeStyle=n.suit.color+"40",e.lineWidth=1.5,e.stroke(),e.fillStyle="#a0a0a0",e.font="bold 10px system-ui, sans-serif",e.textAlign="center",e.fillText(o.toUpperCase(),t+m/2,r-8),e.fillStyle=n.suit.color,e.font="36px system-ui, sans-serif",e.fillText(n.suit.symbol,t+m/2,r+50),e.fillStyle=n.suit.color,e.font="bold 11px system-ui, sans-serif",e.fillText(n.title,t+m/2,r+72),e.strokeStyle=n.suit.color+"30",e.lineWidth=1,e.beginPath(),e.moveTo(t+30,r+82),e.lineTo(t+m-30,r+82),e.stroke(),e.fillStyle="#e0e0e0",e.font="12px system-ui, sans-serif";const a=m-28,l=n.content.split(" ");let c="",i=r+100;const u=5;let f=0;for(const h of l){const p=c+(c?" ":"")+h;if(e.measureText(p).width>a&&c){if(e.fillText(c,t+m/2,i),c=h,i+=16,f++,f>=u){e.fillText(c+"...",t+m/2,i);break}}else c=p}f{ne(t,u,c+f*(m+I),i,a[f])}),t.fillStyle="#606060",t.font="10px system-ui, sans-serif",t.textAlign="center",t.fillText("Surreal-Memory — surrealmemory.dev",b/2,C-10),new Promise(u=>{n.toBlob(f=>u(f),"image/png")})}async function se(e){try{const n=await W(e);return await navigator.clipboard.write([new ClipboardItem({"image/png":n})]),!0}catch{return!1}}async function re(e){const n=await W(e),t=URL.createObjectURL(n),r=document.createElement("a");r.href=t,r.download=`oracle-${e.brainName}-${e.date}.png`,r.click(),URL.revokeObjectURL(t)}function oe({reading:e}){const{t:n}=j(),[t,r]=d.useState(!1),o=async()=>{await se(e)&&(r(!0),setTimeout(()=>r(!1),2e3))},a=()=>{re(e)};return s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("button",{onClick:o,className:"flex cursor-pointer items-center gap-1.5 rounded-lg border border-white/10 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground","aria-label":n("oracle.copyCard"),children:t?s.jsxs(s.Fragment,{children:[s.jsx(K,{className:"size-3.5 text-green-400"}),n("oracle.copied")]}):s.jsxs(s.Fragment,{children:[s.jsx(H,{className:"size-3.5"}),n("oracle.copyCard")]})}),s.jsxs("button",{onClick:a,className:"flex cursor-pointer items-center gap-1.5 rounded-lg border border-white/10 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground","aria-label":n("oracle.downloadCard"),children:[s.jsx(G,{className:"size-3.5"}),n("oracle.downloadCard")]})]})}const ae=["Your past is marked by {past} — {pastContent}. Today, {present} guides your path — {presentContent}. Tomorrow, {future} awaits — {futureContent}.","{past} shaped what came before: {pastContent}. Now {present} holds the key — {presentContent}. The future whispers of {future}: {futureContent}.","From the shadow of {past} ({pastContent}), through the lens of {present} ({presentContent}), your path leads to {future} — {futureContent}.","The memory of {past} echoes: {pastContent}. {present} illuminates the now: {presentContent}. {future} beckons ahead: {futureContent}.","Once, {past} taught you: {pastContent}. Today, {present} reveals: {presentContent}. Soon, {future} will show: {futureContent}.","{past} planted seeds — {pastContent}. {present} tends the garden — {presentContent}. {future} promises the harvest — {futureContent}."],ie=['What if {suitA} and {suitB} collided? Imagine: "{cardA}" meets "{cardB}" — and {wildcardSuit} throws in a twist: "{wildcard}"','In another timeline, {suitA} chose differently: "{cardA}". Meanwhile {suitB} discovered: "{cardB}". The catalyst? {wildcardSuit}: "{wildcard}"',`Picture this: {suitA}'s memory ("{cardA}") suddenly merges with {suitB}'s truth ("{cardB}"). {wildcardSuit} watches from the shadows: "{wildcard}"`,'Two paths diverged — {suitA} whispered "{cardA}" while {suitB} insisted "{cardB}". {wildcardSuit} appeared: "{wildcard}"','What if you had followed {suitA} ("{cardA}") instead of {suitB} ("{cardB}")? {wildcardSuit} holds the answer: "{wildcard}"','Rewind. {suitA} says: "{cardA}". Fast forward. {suitB} replies: "{cardB}". Plot twist by {wildcardSuit}: "{wildcard}"'],le=['Which memory is stronger? {suitA}: "{contentA}" vs {suitB}: "{contentB}"','{suitA} challenges {suitB}! "{contentA}" faces off against "{contentB}" — who wins?','Battle of memories: {suitA} brings "{contentA}", {suitB} counters with "{contentB}"','Your brain asks: is "{contentA}" ({suitA}) more important than "{contentB}" ({suitB})?','Memory arena: {suitA} ("{contentA}") vs {suitB} ("{contentB}") — choose wisely!'];function z(e,n){let t=0;const r=`${e}:${n}`;for(let o=0;o>>16,2246822507),t=Math.imul(t^t>>>13,3266489909),(t^t>>>16)>>>0}function T(e){let n=e|0;return()=>{n=n+1831565813|0;let t=Math.imul(n^n>>>15,1|n);return t=t+Math.imul(t^t>>>7,61|t)^t,((t^t>>>14)>>>0)/4294967296}}function S(e,n,t){const r=[...e],o=[];for(let a=0;a0;a++){const l=Math.floor(t()*r.length);o.push(r[l]),r.splice(l,1)}return o}function M(e,n){return e.length===0?"":e[Math.floor(n()*e.length)]}function R(e,n){return Object.entries(n).reduce((t,[r,o])=>t.replaceAll(`{${r}}`,o),e)}function de(e,n,t){if(e.length<3)return null;const r=new Date().toISOString().slice(0,10),o=z(r,n),a=T(o),l=[...e].sort((A,k)=>k.activation-A.activation),c=l.slice(0,Math.max(Math.ceil(l.length*.6),3)),i=S(c,3,a);if(i.length<3)return null;const[u,f,h]=i,p=R(M(ae,a),{past:u.suit.name,present:f.suit.name,future:h.suit.name,pastContent:u.content,presentContent:f.content,futureContent:h.content});return{past:u,present:f,future:h,interpretation:p,date:r,brainName:n}}function O(e,n){if(e.length<3)return null;const t=T(n??Date.now()),r=S(e,2,t);if(r.length<2)return null;const o=e.filter(i=>!r.includes(i)),a=S(o.length>0?o:e,1,t);if(a.length===0)return null;const l=a[0],c=R(M(ie,t),{cardA:r[0].content,cardB:r[1].content,suitA:r[0].suit.name,suitB:r[1].suit.name,wildcard:l.content,wildcardSuit:l.suit.name});return{decisions:r,error:l,scenario:c}}function $(e,n=1,t=5,r=[],o){if(e.length<2)return null;const a=o??Date.now(),l=T(ce(a,n*7919)),c=e.filter(f=>!r.includes(f.id)),i=c.length>=2?c:e,u=S(i,2,l);return u.length<2?null:{cardA:u[0],cardB:u[1],round:n,score:0,totalRounds:t}}function ue(e,n,t){const r=z(e.id,n.id),o=T(r);return R(M(le,o),{suitA:e.suit.name,suitB:n.suit.name,contentA:e.content,contentB:n.content})}const L="oracle-daily-reading";function fe(){return new Date().toISOString().slice(0,10)}function me(e){try{const n=localStorage.getItem(L);if(!n)return null;const t=JSON.parse(n);return t.date===fe()&&t.brainName===e?t.reading:null}catch{return null}}function he(e){const n={date:e.date,brainName:e.brainName,reading:e};localStorage.setItem(L,JSON.stringify(n))}function pe(e,n){const[t,r]=d.useState(null);return d.useEffect(()=>{if(e.length<3){r(null);return}const o=me(n);if(o){r(o);return}const a=de(e,n);a&&(he(a),r(a))},[e,n]),t}const P=["past","present","future"];function xe({cards:e,brainName:n}){const{t}=j(),r=pe(e,n),[o,a]=d.useState(0);if(!r)return null;const l=[r.past,r.present,r.future];return s.jsxs("div",{className:"flex flex-col items-center gap-8",children:[s.jsx("p",{className:"text-sm text-muted-foreground",children:t("oracle.dailyHint")}),s.jsx("div",{className:"flex flex-wrap justify-center gap-6",children:l.map((c,i)=>s.jsxs("div",{className:"flex flex-col items-center gap-2",children:[s.jsx("span",{className:"text-xs font-medium uppercase tracking-wider text-muted-foreground",children:t(`oracle.${P[i]}`)}),s.jsx(B,{card:c,autoFlipDelay:800+i*500,onFlip:()=>a(u=>Math.max(u,i+1)),className:"h-[340px] w-[240px]"})]},P[i]))}),o>=3&&s.jsxs("div",{className:"max-w-xl animate-in fade-in slide-in-from-bottom-4 duration-700",children:[s.jsxs("div",{className:"rounded-xl border border-primary/20 bg-primary/5 p-5",children:[s.jsx("p",{className:"text-center text-sm leading-relaxed text-foreground/80",children:r.interpretation}),s.jsx("p",{className:"mt-3 text-center text-xs text-muted-foreground",children:t("oracle.readingDate",{date:r.date,brain:r.brainName})})]}),s.jsx("div",{className:"mt-4 flex justify-center",children:s.jsx(oe,{reading:r})})]})]})}function ge({cards:e}){const{t:n}=j(),[t,r]=d.useState(()=>O(e)),[o,a]=d.useState(!1),l=d.useRef(0),c=d.useCallback(()=>{r(O(e,Date.now())),a(!1),l.current=0},[e]),i=d.useCallback(()=>{l.current+=1,l.current>=3&&a(!0)},[]);if(!t)return null;const u=[...t.decisions,t.error];return s.jsxs("div",{className:"flex flex-col items-center gap-6",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("p",{className:"text-sm text-muted-foreground",children:n("oracle.whatifHint")}),s.jsxs("button",{onClick:c,className:"flex cursor-pointer items-center gap-1.5 rounded-lg px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground","aria-label":n("oracle.reshuffle"),children:[s.jsx(F,{className:"size-3.5"}),n("oracle.reshuffle")]})]}),s.jsx("div",{className:"flex flex-wrap justify-center gap-6",children:u.map((f,h)=>s.jsxs("div",{className:"flex flex-col items-center gap-2",children:[s.jsx("span",{className:"text-xs font-medium uppercase tracking-wider text-muted-foreground",children:h<2?n("oracle.memory")+` ${h+1}`:n("oracle.wildcard")}),s.jsx(B,{card:f,onFlip:i,className:"h-[340px] w-[240px]"})]},`slot-${h}`))}),o&&s.jsx("div",{className:"max-w-2xl animate-in fade-in slide-in-from-bottom-4 duration-700",children:s.jsx("div",{className:"rounded-xl border border-amber-500/20 bg-amber-500/5 p-5",children:s.jsx("p",{className:"text-center text-sm leading-relaxed text-foreground/80 italic",children:t.scenario})})})]})}const y=5;function be(e){const n=e.activation,t=Math.min(e.connectionCount,20)/2;return n+t}function ye({cards:e}){const{t:n}=j(),[t,r]=d.useState(()=>$(e,1,y)),[o,a]=d.useState(0),[l,c]=d.useState([]),[i,u]=d.useState(null),[f,h]=d.useState(!1),p=d.useRef(null);d.useEffect(()=>()=>{p.current&&clearTimeout(p.current)},[]);const A=d.useCallback(x=>{if(!t||i)return;u(x);const g=x==="A"?t.cardA:t.cardB,v=o+be(g),N=[...l,t.cardA.id,t.cardB.id];a(v),c(N),p.current=setTimeout(()=>{if(t.round>=y){h(!0);return}const D=$(e,t.round+1,y,N,Date.now());r(D?{...D,score:v}:null),u(null)},1200)},[t,i,o,l,e]),k=d.useCallback(()=>{p.current&&clearTimeout(p.current),r($(e,1,y)),a(0),c([]),u(null),h(!1)},[e]);if(!t)return null;const U=ue(t.cardA,t.cardB);return f?s.jsxs("div",{className:"flex flex-col items-center gap-6 animate-in fade-in duration-500",children:[s.jsx(q,{className:"size-12 text-amber-400","aria-hidden":"true"}),s.jsx("h2",{className:"font-display text-2xl font-bold",children:n("oracle.matchupComplete")}),s.jsx("p",{className:"text-4xl font-bold text-primary",children:Math.round(o)}),s.jsx("p",{className:"text-sm text-muted-foreground",children:n("oracle.matchupScoreDesc")}),s.jsx("button",{onClick:k,className:"cursor-pointer rounded-lg bg-primary px-6 py-2.5 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90",children:n("oracle.playAgain")})]}):s.jsxs("div",{className:"flex flex-col items-center gap-6",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("div",{className:"flex gap-1.5",children:Array.from({length:y},(x,g)=>s.jsx("div",{className:`size-2 rounded-full transition-colors ${g{const g=x==="A"?t.cardA:t.cardB,v=i===x,N=i!==null&&i!==x;return s.jsxs("div",{className:"flex flex-col items-center gap-3",children:[s.jsx("div",{className:`transition-all duration-500 ${v?"scale-105 ring-2 ring-primary ring-offset-2 ring-offset-background rounded-xl":N?"scale-95 opacity-40":""}`,children:s.jsx(B,{card:g,autoFlipDelay:300+(x==="B"?200:0),className:"h-[340px] w-[240px]"})}),!i&&s.jsx("button",{onClick:()=>A(x),className:"cursor-pointer rounded-lg bg-accent px-5 py-2 text-sm font-medium text-foreground transition-all hover:bg-primary hover:text-primary-foreground",children:n("oracle.choose")}),v&&s.jsx("span",{className:"text-xs font-medium text-primary animate-in fade-in",children:n("oracle.chosen")})]},`${t.round}-${x}`)})}),s.jsxs("p",{className:"text-xs text-muted-foreground",children:[n("oracle.score"),": ",s.jsx("span",{className:"font-mono font-bold text-foreground",children:Math.round(o)})]})]})}const E={decision:{name:"The Architect",color:"#fbbf24",symbol:"◆",bg:"from-amber-900/40 to-amber-950/60"},error:{name:"The Shadow",color:"#ef4444",symbol:"♠",bg:"from-red-900/40 to-red-950/60"},insight:{name:"The Oracle",color:"#a78bfa",symbol:"♥",bg:"from-violet-900/40 to-violet-950/60"},fact:{name:"The Scholar",color:"#60a5fa",symbol:"♣",bg:"from-blue-900/40 to-blue-950/60"},workflow:{name:"The Engineer",color:"#34d399",symbol:"★",bg:"from-emerald-900/40 to-emerald-950/60"},concept:{name:"The Dreamer",color:"#22d3ee",symbol:"○",bg:"from-cyan-900/40 to-cyan-950/60"},entity:{name:"The Keeper",color:"#f59e0b",symbol:"△",bg:"from-amber-900/40 to-orange-950/60"},pattern:{name:"The Weaver",color:"#fb7185",symbol:"◇",bg:"from-rose-900/40 to-rose-950/60"},preference:{name:"The Compass",color:"#2dd4bf",symbol:"⊕",bg:"from-teal-900/40 to-teal-950/60"}},je={name:"The Wanderer",color:"#a8a29e",symbol:"?",bg:"from-stone-900/40 to-stone-950/60"};function ve(e){return e in E?{suit:E[e],key:e}:{suit:je,key:"unknown"}}function we(e){const n=new Date(e),r=new Date().getTime()-n.getTime(),o=Math.floor(r/(1e3*60*60*24));return o===0?"today":o===1?"1d":o<30?`${o}d`:o<365?`${Math.floor(o/30)}mo`:`${Math.floor(o/365)}y`}function Ne(e,n){return n.filter(t=>t.source_id===e||t.target_id===e).length}function Ce(e,n=120){return e.length<=n?e:e.slice(0,n).trimEnd()+"..."}function Se(e,n){return e.map(t=>{const{suit:r,key:o}=ve(t.type),a=t.metadata??{},l=typeof a.activation_level=="number"?a.activation_level:.5,c=typeof a.priority=="number"?a.priority:5,i=typeof a.created_at=="string"?a.created_at:new Date().toISOString();return{id:t.id,title:r.name,content:Ce(t.content),suit:r,suitKey:o,activation:Math.round(l*100)/10,connectionCount:Ne(t.id,n),age:we(i),priority:c,createdAt:i}})}function Te(){const{data:e,isLoading:n,error:t}=V(500);return{cards:d.useMemo(()=>e?Se(e.neurons,e.synapses):[],[e]),isLoading:n,error:t}}function De(){const{t:e}=j(),[n,t]=d.useState("daily"),{cards:r,isLoading:o}=Te(),{data:a}=J(),l=a?.active_brain??"default";return o?s.jsxs("div",{className:"space-y-6 p-6",children:[s.jsx("h1",{className:"font-display text-2xl font-bold",children:e("oracle.title")}),s.jsx("p",{className:"text-muted-foreground",children:e("oracle.loading")})]}):r.length<3?s.jsxs("div",{className:"flex flex-col items-center justify-center gap-4 p-6 pt-24",children:[s.jsx(_,{className:"size-12 text-muted-foreground/40"}),s.jsx("h2",{className:"font-display text-xl font-semibold text-muted-foreground",children:e("oracle.needMore")}),s.jsx("p",{className:"max-w-md text-center text-sm text-muted-foreground/70",children:e("oracle.needMoreDesc")})]}):s.jsxs("div",{className:"space-y-6 p-6",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("h1",{className:"font-display text-2xl font-bold",children:e("oracle.title")}),s.jsx(Z,{mode:n,onModeChange:t})]}),s.jsxs("div",{className:"flex flex-col items-center gap-8",children:[n==="daily"&&s.jsx(xe,{cards:r,brainName:l}),n==="whatif"&&s.jsx(ge,{cards:r}),n==="matchup"&&s.jsx(ye,{cards:r})]})]})}export{De as default}; diff --git a/src/surreal_memory/server/static/dist/assets/OraclePage-zAsy8lB5.js b/src/surreal_memory/server/static/dist/assets/OraclePage-zAsy8lB5.js deleted file mode 100644 index b762ef3e..00000000 --- a/src/surreal_memory/server/static/dist/assets/OraclePage-zAsy8lB5.js +++ /dev/null @@ -1 +0,0 @@ -import{j as s}from"./vendor-query-CqA1cBNl.js";import{r as d}from"./vendor-react-BfuodpLv.js";import{h as _,X as F,Y,Z as K,B as H,_ as G,$ as q}from"./vendor-icons-IAbuZhWE.js";import{u as j,i as V,c as J}from"./index-CSMoVcy_.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";const X=[{key:"daily",labelKey:"oracle.dailyReading",icon:_},{key:"whatif",labelKey:"oracle.whatif",icon:F},{key:"matchup",labelKey:"oracle.matchup",icon:Y}];function Z({mode:e,onModeChange:n}){const{t}=j();return s.jsx("div",{className:"flex gap-2",children:X.map(({key:r,labelKey:o,icon:a})=>s.jsxs("button",{onClick:()=>n(r),className:`flex cursor-pointer items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-all ${e===r?"bg-primary/15 text-primary ring-1 ring-primary/30":"text-muted-foreground hover:bg-accent hover:text-foreground"}`,children:[s.jsx(a,{className:"size-4"}),t(o)]},r))})}function Q({card:e,className:n=""}){return s.jsxs("div",{className:`relative overflow-hidden rounded-2xl border border-white/10 bg-[#16140f] p-5 ${n}`,style:{backfaceVisibility:"hidden"},children:[s.jsx("div",{className:`absolute inset-0 bg-gradient-to-b ${e.suit.bg} opacity-60`}),s.jsx("div",{className:"absolute right-3 top-3 opacity-10",children:s.jsx("span",{className:"text-7xl font-bold",style:{color:e.suit.color},children:e.suit.symbol})}),s.jsxs("div",{className:"relative z-10 flex h-full flex-col",children:[s.jsx("div",{className:"mb-1 text-center",children:s.jsxs("span",{className:"text-xs font-semibold uppercase tracking-[0.2em]",style:{color:e.suit.color},children:["✦ ",e.title," ✦"]})}),s.jsx("div",{className:"my-4 flex justify-center",children:s.jsx("div",{className:"flex size-16 items-center justify-center rounded-full border-2",style:{borderColor:e.suit.color+"40",backgroundColor:e.suit.color+"15"},children:s.jsx("span",{className:"text-3xl",style:{color:e.suit.color},children:e.suit.symbol})})}),s.jsx("div",{className:"mx-auto mb-3 h-px w-3/4",style:{backgroundColor:e.suit.color+"30"}}),s.jsx("div",{className:"mb-auto flex-1",children:s.jsxs("p",{className:"line-clamp-3 text-center text-sm leading-relaxed text-white/80",children:["“",e.content,"”"]})}),s.jsxs("div",{className:"mt-4 flex items-center justify-between text-xs text-white/50",children:[s.jsxs("span",{"aria-label":`Activation ${e.activation}`,children:[s.jsx("span",{"aria-hidden":"true",children:"⚡"})," ",e.activation]}),s.jsxs("span",{"aria-label":`Connections ${e.connectionCount}`,children:[s.jsx("span",{"aria-hidden":"true",children:"🔗"})," ",e.connectionCount]}),s.jsxs("span",{"aria-label":`Age ${e.age}`,children:[s.jsx("span",{"aria-hidden":"true",children:"📅"})," ",e.age]})]}),s.jsx("div",{className:"mt-2 text-center",children:s.jsxs("span",{className:"inline-block rounded-full px-3 py-0.5 text-xs font-medium",style:{backgroundColor:e.suit.color+"20",color:e.suit.color},children:[e.suit.symbol," ",e.suitKey]})})]})]})}function ee({className:e=""}){return s.jsxs("div",{className:`relative overflow-hidden rounded-2xl border border-white/10 bg-[#16140f] ${e}`,style:{backfaceVisibility:"hidden"},children:[s.jsxs("div",{className:"absolute inset-0 opacity-30",children:[s.jsx("div",{className:"absolute inset-0",style:{background:"repeating-conic-gradient(from 0deg at 50% 50%, #818cf8 0deg 30deg, transparent 30deg 60deg)",opacity:.15}}),s.jsx("div",{className:"absolute inset-0",style:{background:"radial-gradient(circle at 50% 50%, transparent 30%, #818cf820 50%, transparent 70%)"}}),s.jsx("div",{className:"absolute inset-0",style:{background:"radial-gradient(circle at 50% 50%, #818cf815 0%, transparent 40%)"}})]}),s.jsx("div",{className:"absolute inset-0 flex items-center justify-center","aria-hidden":"true",children:s.jsxs("div",{className:"relative",children:[s.jsx("div",{className:"text-5xl font-bold opacity-20",style:{color:"#818cf8"},children:"✦"}),s.jsx("div",{className:"absolute inset-0 flex items-center justify-center text-2xl font-bold text-white/40",children:"?"})]})}),s.jsx("div",{className:"absolute inset-0 rounded-2xl ring-1 ring-inset ring-white/5"})]})}function $({card:e,autoFlipDelay:n,onFlip:t,className:r=""}){const[o,a]=d.useState(!1),l=d.useRef(t);l.current=t,d.useEffect(()=>{if(n!==void 0&&n>=0){const i=setTimeout(()=>{a(!0),l.current?.()},n);return()=>clearTimeout(i)}},[n]);const c=()=>{const i=!o;a(i),i&&l.current?.()};return s.jsx("div",{className:`cursor-pointer ${r}`,style:{perspective:"1000px"},onClick:c,role:"button",tabIndex:0,"aria-label":o?`Card: ${e.title} — ${e.content}`:"Tap to reveal card",onKeyDown:i=>{(i.key==="Enter"||i.key===" ")&&(i.preventDefault(),c())},children:s.jsxs("div",{className:"relative h-full w-full",style:{transformStyle:"preserve-3d",transform:o?"rotateY(180deg)":"rotateY(0deg)",transitionTimingFunction:"cubic-bezier(0.4, 0, 0.2, 1)",transitionDuration:"600ms"},children:[s.jsx("div",{className:"absolute inset-0",style:{backfaceVisibility:"hidden"},children:s.jsx(ee,{className:"h-full w-full"})}),s.jsx("div",{className:"absolute inset-0",style:{backfaceVisibility:"hidden",transform:"rotateY(180deg)"},children:s.jsx(Q,{card:e,className:"h-full w-full"})})]})})}const b=800,C=420,m=180,w=260,I=24;function te(e,n,t,r,o,a){e.beginPath(),e.moveTo(n+a,t),e.lineTo(n+r-a,t),e.quadraticCurveTo(n+r,t,n+r,t+a),e.lineTo(n+r,t+o-a),e.quadraticCurveTo(n+r,t+o,n+r-a,t+o),e.lineTo(n+a,t+o),e.quadraticCurveTo(n,t+o,n,t+o-a),e.lineTo(n,t+a),e.quadraticCurveTo(n,t,n+a,t),e.closePath()}function ne(e,n,t,r,o){te(e,t,r,m,w,12),e.fillStyle="#1a1814",e.fill(),e.strokeStyle=n.suit.color+"40",e.lineWidth=1.5,e.stroke(),e.fillStyle="#a0a0a0",e.font="bold 10px system-ui, sans-serif",e.textAlign="center",e.fillText(o.toUpperCase(),t+m/2,r-8),e.fillStyle=n.suit.color,e.font="36px system-ui, sans-serif",e.fillText(n.suit.symbol,t+m/2,r+50),e.fillStyle=n.suit.color,e.font="bold 11px system-ui, sans-serif",e.fillText(n.title,t+m/2,r+72),e.strokeStyle=n.suit.color+"30",e.lineWidth=1,e.beginPath(),e.moveTo(t+30,r+82),e.lineTo(t+m-30,r+82),e.stroke(),e.fillStyle="#e0e0e0",e.font="12px system-ui, sans-serif";const a=m-28,l=n.content.split(" ");let c="",i=r+100;const u=5;let f=0;for(const h of l){const p=c+(c?" ":"")+h;if(e.measureText(p).width>a&&c){if(e.fillText(c,t+m/2,i),c=h,i+=16,f++,f>=u){e.fillText(c+"...",t+m/2,i);break}}else c=p}f{ne(t,u,c+f*(m+I),i,a[f])}),t.fillStyle="#606060",t.font="10px system-ui, sans-serif",t.textAlign="center",t.fillText("Surreal-Memory — surrealmemory.dev",b/2,C-10),new Promise(u=>{n.toBlob(f=>u(f),"image/png")})}async function se(e){try{const n=await W(e);return await navigator.clipboard.write([new ClipboardItem({"image/png":n})]),!0}catch{return!1}}async function re(e){const n=await W(e),t=URL.createObjectURL(n),r=document.createElement("a");r.href=t,r.download=`oracle-${e.brainName}-${e.date}.png`,r.click(),URL.revokeObjectURL(t)}function oe({reading:e}){const{t:n}=j(),[t,r]=d.useState(!1),o=async()=>{await se(e)&&(r(!0),setTimeout(()=>r(!1),2e3))},a=()=>{re(e)};return s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("button",{onClick:o,className:"flex cursor-pointer items-center gap-1.5 rounded-lg border border-white/10 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground","aria-label":n("oracle.copyCard"),children:t?s.jsxs(s.Fragment,{children:[s.jsx(K,{className:"size-3.5 text-green-400"}),n("oracle.copied")]}):s.jsxs(s.Fragment,{children:[s.jsx(H,{className:"size-3.5"}),n("oracle.copyCard")]})}),s.jsxs("button",{onClick:a,className:"flex cursor-pointer items-center gap-1.5 rounded-lg border border-white/10 px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground","aria-label":n("oracle.downloadCard"),children:[s.jsx(G,{className:"size-3.5"}),n("oracle.downloadCard")]})]})}const ae=["Your past is marked by {past} — {pastContent}. Today, {present} guides your path — {presentContent}. Tomorrow, {future} awaits — {futureContent}.","{past} shaped what came before: {pastContent}. Now {present} holds the key — {presentContent}. The future whispers of {future}: {futureContent}.","From the shadow of {past} ({pastContent}), through the lens of {present} ({presentContent}), your path leads to {future} — {futureContent}.","The memory of {past} echoes: {pastContent}. {present} illuminates the now: {presentContent}. {future} beckons ahead: {futureContent}.","Once, {past} taught you: {pastContent}. Today, {present} reveals: {presentContent}. Soon, {future} will show: {futureContent}.","{past} planted seeds — {pastContent}. {present} tends the garden — {presentContent}. {future} promises the harvest — {futureContent}."],ie=['What if {suitA} and {suitB} collided? Imagine: "{cardA}" meets "{cardB}" — and {wildcardSuit} throws in a twist: "{wildcard}"','In another timeline, {suitA} chose differently: "{cardA}". Meanwhile {suitB} discovered: "{cardB}". The catalyst? {wildcardSuit}: "{wildcard}"',`Picture this: {suitA}'s memory ("{cardA}") suddenly merges with {suitB}'s truth ("{cardB}"). {wildcardSuit} watches from the shadows: "{wildcard}"`,'Two paths diverged — {suitA} whispered "{cardA}" while {suitB} insisted "{cardB}". {wildcardSuit} appeared: "{wildcard}"','What if you had followed {suitA} ("{cardA}") instead of {suitB} ("{cardB}")? {wildcardSuit} holds the answer: "{wildcard}"','Rewind. {suitA} says: "{cardA}". Fast forward. {suitB} replies: "{cardB}". Plot twist by {wildcardSuit}: "{wildcard}"'],le=['Which memory is stronger? {suitA}: "{contentA}" vs {suitB}: "{contentB}"','{suitA} challenges {suitB}! "{contentA}" faces off against "{contentB}" — who wins?','Battle of memories: {suitA} brings "{contentA}", {suitB} counters with "{contentB}"','Your brain asks: is "{contentA}" ({suitA}) more important than "{contentB}" ({suitB})?','Memory arena: {suitA} ("{contentA}") vs {suitB} ("{contentB}") — choose wisely!'];function z(e,n){let t=0;const r=`${e}:${n}`;for(let o=0;o>>16,2246822507),t=Math.imul(t^t>>>13,3266489909),(t^t>>>16)>>>0}function T(e){let n=e|0;return()=>{n=n+1831565813|0;let t=Math.imul(n^n>>>15,1|n);return t=t+Math.imul(t^t>>>7,61|t)^t,((t^t>>>14)>>>0)/4294967296}}function S(e,n,t){const r=[...e],o=[];for(let a=0;a0;a++){const l=Math.floor(t()*r.length);o.push(r[l]),r.splice(l,1)}return o}function M(e,n){return e.length===0?"":e[Math.floor(n()*e.length)]}function R(e,n){return Object.entries(n).reduce((t,[r,o])=>t.replaceAll(`{${r}}`,o),e)}function de(e,n,t){if(e.length<3)return null;const r=new Date().toISOString().slice(0,10),o=z(r,n),a=T(o),l=[...e].sort((A,k)=>k.activation-A.activation),c=l.slice(0,Math.max(Math.ceil(l.length*.6),3)),i=S(c,3,a);if(i.length<3)return null;const[u,f,h]=i,p=R(M(ae,a),{past:u.suit.name,present:f.suit.name,future:h.suit.name,pastContent:u.content,presentContent:f.content,futureContent:h.content});return{past:u,present:f,future:h,interpretation:p,date:r,brainName:n}}function O(e,n){if(e.length<3)return null;const t=T(n??Date.now()),r=S(e,2,t);if(r.length<2)return null;const o=e.filter(i=>!r.includes(i)),a=S(o.length>0?o:e,1,t);if(a.length===0)return null;const l=a[0],c=R(M(ie,t),{cardA:r[0].content,cardB:r[1].content,suitA:r[0].suit.name,suitB:r[1].suit.name,wildcard:l.content,wildcardSuit:l.suit.name});return{decisions:r,error:l,scenario:c}}function B(e,n=1,t=5,r=[],o){if(e.length<2)return null;const a=o??Date.now(),l=T(ce(a,n*7919)),c=e.filter(f=>!r.includes(f.id)),i=c.length>=2?c:e,u=S(i,2,l);return u.length<2?null:{cardA:u[0],cardB:u[1],round:n,score:0,totalRounds:t}}function ue(e,n,t){const r=z(e.id,n.id),o=T(r);return R(M(le,o),{suitA:e.suit.name,suitB:n.suit.name,contentA:e.content,contentB:n.content})}const L="oracle-daily-reading";function fe(){return new Date().toISOString().slice(0,10)}function me(e){try{const n=localStorage.getItem(L);if(!n)return null;const t=JSON.parse(n);return t.date===fe()&&t.brainName===e?t.reading:null}catch{return null}}function he(e){const n={date:e.date,brainName:e.brainName,reading:e};localStorage.setItem(L,JSON.stringify(n))}function pe(e,n){const[t,r]=d.useState(null);return d.useEffect(()=>{if(e.length<3){r(null);return}const o=me(n);if(o){r(o);return}const a=de(e,n);a&&(he(a),r(a))},[e,n]),t}const P=["past","present","future"];function xe({cards:e,brainName:n}){const{t}=j(),r=pe(e,n),[o,a]=d.useState(0);if(!r)return null;const l=[r.past,r.present,r.future];return s.jsxs("div",{className:"flex flex-col items-center gap-8",children:[s.jsx("p",{className:"text-sm text-muted-foreground",children:t("oracle.dailyHint")}),s.jsx("div",{className:"flex flex-wrap justify-center gap-6",children:l.map((c,i)=>s.jsxs("div",{className:"flex flex-col items-center gap-2",children:[s.jsx("span",{className:"text-xs font-medium uppercase tracking-wider text-muted-foreground",children:t(`oracle.${P[i]}`)}),s.jsx($,{card:c,autoFlipDelay:800+i*500,onFlip:()=>a(u=>Math.max(u,i+1)),className:"h-[340px] w-[240px]"})]},P[i]))}),o>=3&&s.jsxs("div",{className:"max-w-xl animate-in fade-in slide-in-from-bottom-4 duration-700",children:[s.jsxs("div",{className:"rounded-xl border border-primary/20 bg-primary/5 p-5",children:[s.jsx("p",{className:"text-center text-sm leading-relaxed text-foreground/80",children:r.interpretation}),s.jsx("p",{className:"mt-3 text-center text-xs text-muted-foreground",children:t("oracle.readingDate",{date:r.date,brain:r.brainName})})]}),s.jsx("div",{className:"mt-4 flex justify-center",children:s.jsx(oe,{reading:r})})]})]})}function ge({cards:e}){const{t:n}=j(),[t,r]=d.useState(()=>O(e)),[o,a]=d.useState(!1),l=d.useRef(0),c=d.useCallback(()=>{r(O(e,Date.now())),a(!1),l.current=0},[e]),i=d.useCallback(()=>{l.current+=1,l.current>=3&&a(!0)},[]);if(!t)return null;const u=[...t.decisions,t.error];return s.jsxs("div",{className:"flex flex-col items-center gap-6",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("p",{className:"text-sm text-muted-foreground",children:n("oracle.whatifHint")}),s.jsxs("button",{onClick:c,className:"flex cursor-pointer items-center gap-1.5 rounded-lg px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground","aria-label":n("oracle.reshuffle"),children:[s.jsx(F,{className:"size-3.5"}),n("oracle.reshuffle")]})]}),s.jsx("div",{className:"flex flex-wrap justify-center gap-6",children:u.map((f,h)=>s.jsxs("div",{className:"flex flex-col items-center gap-2",children:[s.jsx("span",{className:"text-xs font-medium uppercase tracking-wider text-muted-foreground",children:h<2?n("oracle.memory")+` ${h+1}`:n("oracle.wildcard")}),s.jsx($,{card:f,onFlip:i,className:"h-[340px] w-[240px]"})]},`slot-${h}`))}),o&&s.jsx("div",{className:"max-w-2xl animate-in fade-in slide-in-from-bottom-4 duration-700",children:s.jsx("div",{className:"rounded-xl border border-amber-500/20 bg-amber-500/5 p-5",children:s.jsx("p",{className:"text-center text-sm leading-relaxed text-foreground/80 italic",children:t.scenario})})})]})}const y=5;function be(e){const n=e.activation,t=Math.min(e.connectionCount,20)/2;return n+t}function ye({cards:e}){const{t:n}=j(),[t,r]=d.useState(()=>B(e,1,y)),[o,a]=d.useState(0),[l,c]=d.useState([]),[i,u]=d.useState(null),[f,h]=d.useState(!1),p=d.useRef(null);d.useEffect(()=>()=>{p.current&&clearTimeout(p.current)},[]);const A=d.useCallback(x=>{if(!t||i)return;u(x);const g=x==="A"?t.cardA:t.cardB,v=o+be(g),N=[...l,t.cardA.id,t.cardB.id];a(v),c(N),p.current=setTimeout(()=>{if(t.round>=y){h(!0);return}const D=B(e,t.round+1,y,N,Date.now());r(D?{...D,score:v}:null),u(null)},1200)},[t,i,o,l,e]),k=d.useCallback(()=>{p.current&&clearTimeout(p.current),r(B(e,1,y)),a(0),c([]),u(null),h(!1)},[e]);if(!t)return null;const U=ue(t.cardA,t.cardB);return f?s.jsxs("div",{className:"flex flex-col items-center gap-6 animate-in fade-in duration-500",children:[s.jsx(q,{className:"size-12 text-amber-400","aria-hidden":"true"}),s.jsx("h2",{className:"font-display text-2xl font-bold",children:n("oracle.matchupComplete")}),s.jsx("p",{className:"text-4xl font-bold text-primary",children:Math.round(o)}),s.jsx("p",{className:"text-sm text-muted-foreground",children:n("oracle.matchupScoreDesc")}),s.jsx("button",{onClick:k,className:"cursor-pointer rounded-lg bg-primary px-6 py-2.5 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90",children:n("oracle.playAgain")})]}):s.jsxs("div",{className:"flex flex-col items-center gap-6",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("div",{className:"flex gap-1.5",children:Array.from({length:y},(x,g)=>s.jsx("div",{className:`size-2 rounded-full transition-colors ${g{const g=x==="A"?t.cardA:t.cardB,v=i===x,N=i!==null&&i!==x;return s.jsxs("div",{className:"flex flex-col items-center gap-3",children:[s.jsx("div",{className:`transition-all duration-500 ${v?"scale-105 ring-2 ring-primary ring-offset-2 ring-offset-background rounded-xl":N?"scale-95 opacity-40":""}`,children:s.jsx($,{card:g,autoFlipDelay:300+(x==="B"?200:0),className:"h-[340px] w-[240px]"})}),!i&&s.jsx("button",{onClick:()=>A(x),className:"cursor-pointer rounded-lg bg-accent px-5 py-2 text-sm font-medium text-foreground transition-all hover:bg-primary hover:text-primary-foreground",children:n("oracle.choose")}),v&&s.jsx("span",{className:"text-xs font-medium text-primary animate-in fade-in",children:n("oracle.chosen")})]},`${t.round}-${x}`)})}),s.jsxs("p",{className:"text-xs text-muted-foreground",children:[n("oracle.score"),": ",s.jsx("span",{className:"font-mono font-bold text-foreground",children:Math.round(o)})]})]})}const E={decision:{name:"The Architect",color:"#fbbf24",symbol:"◆",bg:"from-amber-900/40 to-amber-950/60"},error:{name:"The Shadow",color:"#ef4444",symbol:"♠",bg:"from-red-900/40 to-red-950/60"},insight:{name:"The Oracle",color:"#a78bfa",symbol:"♥",bg:"from-violet-900/40 to-violet-950/60"},fact:{name:"The Scholar",color:"#60a5fa",symbol:"♣",bg:"from-blue-900/40 to-blue-950/60"},workflow:{name:"The Engineer",color:"#34d399",symbol:"★",bg:"from-emerald-900/40 to-emerald-950/60"},concept:{name:"The Dreamer",color:"#22d3ee",symbol:"○",bg:"from-cyan-900/40 to-cyan-950/60"},entity:{name:"The Keeper",color:"#f59e0b",symbol:"△",bg:"from-amber-900/40 to-orange-950/60"},pattern:{name:"The Weaver",color:"#fb7185",symbol:"◇",bg:"from-rose-900/40 to-rose-950/60"},preference:{name:"The Compass",color:"#2dd4bf",symbol:"⊕",bg:"from-teal-900/40 to-teal-950/60"}},je={name:"The Wanderer",color:"#a8a29e",symbol:"?",bg:"from-stone-900/40 to-stone-950/60"};function ve(e){return e in E?{suit:E[e],key:e}:{suit:je,key:"unknown"}}function we(e){const n=new Date(e),r=new Date().getTime()-n.getTime(),o=Math.floor(r/(1e3*60*60*24));return o===0?"today":o===1?"1d":o<30?`${o}d`:o<365?`${Math.floor(o/30)}mo`:`${Math.floor(o/365)}y`}function Ne(e,n){return n.filter(t=>t.source_id===e||t.target_id===e).length}function Ce(e,n=120){return e.length<=n?e:e.slice(0,n).trimEnd()+"..."}function Se(e,n){return e.map(t=>{const{suit:r,key:o}=ve(t.type),a=t.metadata??{},l=typeof a.activation_level=="number"?a.activation_level:.5,c=typeof a.priority=="number"?a.priority:5,i=typeof a.created_at=="string"?a.created_at:new Date().toISOString();return{id:t.id,title:r.name,content:Ce(t.content),suit:r,suitKey:o,activation:Math.round(l*100)/10,connectionCount:Ne(t.id,n),age:we(i),priority:c,createdAt:i}})}function Te(){const{data:e,isLoading:n,error:t}=V(500);return{cards:d.useMemo(()=>e?Se(e.neurons,e.synapses):[],[e]),isLoading:n,error:t}}function De(){const{t:e}=j(),[n,t]=d.useState("daily"),{cards:r,isLoading:o}=Te(),{data:a}=J(),l=a?.active_brain??"default";return o?s.jsxs("div",{className:"space-y-6 p-6",children:[s.jsx("h1",{className:"font-display text-2xl font-bold",children:e("oracle.title")}),s.jsx("p",{className:"text-muted-foreground",children:e("oracle.loading")})]}):r.length<3?s.jsxs("div",{className:"flex flex-col items-center justify-center gap-4 p-6 pt-24",children:[s.jsx(_,{className:"size-12 text-muted-foreground/40"}),s.jsx("h2",{className:"font-display text-xl font-semibold text-muted-foreground",children:e("oracle.needMore")}),s.jsx("p",{className:"max-w-md text-center text-sm text-muted-foreground/70",children:e("oracle.needMoreDesc")})]}):s.jsxs("div",{className:"space-y-6 p-6",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("h1",{className:"font-display text-2xl font-bold",children:e("oracle.title")}),s.jsx(Z,{mode:n,onModeChange:t})]}),s.jsxs("div",{className:"flex flex-col items-center gap-8",children:[n==="daily"&&s.jsx(xe,{cards:r,brainName:l}),n==="whatif"&&s.jsx(ge,{cards:r}),n==="matchup"&&s.jsx(ye,{cards:r})]})]})}export{De as default}; diff --git a/src/surreal_memory/server/static/dist/assets/OverviewPage-Bd8oQbjM.js b/src/surreal_memory/server/static/dist/assets/OverviewPage-Bd8oQbjM.js deleted file mode 100644 index c8315249..00000000 --- a/src/surreal_memory/server/static/dist/assets/OverviewPage-Bd8oQbjM.js +++ /dev/null @@ -1 +0,0 @@ -import{j as e}from"./vendor-query-CqA1cBNl.js";import{r as j}from"./vendor-react-BfuodpLv.js";import{u as y,B as h,a as z,b,t as x,c as C,d as B,e as L,f as $}from"./index-CSMoVcy_.js";import{C as v,a as k,b as S,c as p}from"./card-DAwbJLqc.js";import{S as u}from"./skeleton-CAu64_35.js";import{x as _,y as E,z as T,A,B as D,C as R,D as G,E as I,c as V,F,p as H,G as O,H as U}from"./vendor-icons-IAbuZhWE.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";function P({open:a,title:r,description:i,confirmLabel:o,cancelLabel:n,variant:m="default",onConfirm:l,onCancel:d}){const s=j.useRef(null),{t:f}=y();return j.useEffect(()=>{const c=s.current;c&&(a&&!c.open&&c.showModal(),!a&&c.open&&c.close())},[a]),a?e.jsx("dialog",{ref:s,className:"fixed inset-0 z-50 m-auto max-w-md rounded-xl border border-border bg-card p-0 shadow-lg backdrop:bg-black/50",onClose:d,onClick:c=>{c.target===s.current&&d()},children:e.jsxs("div",{className:"p-6",children:[e.jsx("h2",{className:"font-display text-lg font-bold text-card-foreground",children:r}),e.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:i}),e.jsxs("div",{className:"mt-6 flex justify-end gap-3",children:[e.jsx(h,{variant:"outline",size:"sm",onClick:d,children:n??f("common.cancel")}),e.jsx(h,{variant:m==="destructive"?"destructive":"default",size:"sm",onClick:l,children:o??f("common.confirm")})]})]})}):null}const Q={configured:{icon:_,badgeVariant:"success",label:"Configured"},warning:{icon:A,badgeVariant:"warning",label:"Warning"},not_configured:{icon:T,badgeVariant:"destructive",label:"Not configured"},info:{icon:E,badgeVariant:"secondary",label:"Info"}};function K({item:a}){const{icon:r,badgeVariant:i,label:o}=Q[a.status],n=async()=>{try{await navigator.clipboard.writeText(a.command),x.success("Copied to clipboard")}catch{x.error("Failed to copy")}};return e.jsxs("div",{className:"space-y-1.5 py-3 first:pt-0 last:pb-0",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[e.jsx(r,{className:`size-4 shrink-0 ${a.status==="configured"?"text-health-good":a.status==="warning"?"text-health-warn":a.status==="not_configured"?"text-destructive":"text-muted-foreground"}`,"aria-hidden":"true"}),e.jsx("span",{className:"text-sm font-medium",children:a.label})]}),e.jsx(b,{variant:i,className:"shrink-0 text-xs",children:o})]}),a.description&&e.jsx("p",{className:"pl-6 text-xs text-muted-foreground",children:a.description}),a.command&&e.jsxs("div",{className:"flex items-center gap-2 pl-6",children:[e.jsx("code",{className:"min-w-0 flex-1 truncate rounded-md border border-border bg-muted px-2.5 py-1.5 font-mono text-xs",children:a.command}),e.jsx(h,{variant:"ghost",size:"icon",className:"size-7 shrink-0 text-muted-foreground hover:text-foreground",onClick:n,"aria-label":`Copy command: ${a.command}`,children:e.jsx(D,{className:"size-3.5","aria-hidden":"true"})})]})]})}function M(){return e.jsx("div",{className:"space-y-4",children:Array.from({length:3}).map((a,r)=>e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(u,{className:"size-4 rounded-full"}),e.jsx(u,{className:"h-4 w-32"})]}),e.jsx(u,{className:"h-5 w-20 rounded-md"})]}),e.jsx(u,{className:"ml-6 h-3 w-48"}),e.jsx(u,{className:"ml-6 h-7 w-full"})]},r))})}function W(){const{data:a,isLoading:r}=z(),i=a?.items??[];if(!r&&i.length===0)return null;const o=i.length>0&&i.every(n=>n.status==="configured");return e.jsxs(v,{children:[e.jsx(k,{className:"pb-2",children:e.jsx(S,{className:"text-base",children:"Quick Actions"})}),e.jsx(p,{children:r?e.jsx(M,{}):o?e.jsxs("div",{className:"flex items-center gap-2 py-2 text-sm text-health-good",children:[e.jsx(_,{className:"size-4","aria-hidden":"true"}),e.jsx("span",{children:"All features configured"})]}):e.jsx("div",{className:"grid grid-cols-1 divide-y divide-border sm:grid-cols-2 sm:divide-x sm:divide-y-0",children:i.map((n,m)=>{const l=m%2===1;return e.jsx("div",{className:`${l?"sm:pl-4":"sm:pr-4"}`,children:e.jsx(K,{item:n})},n.key)})})})]})}const q="https://github.com/acidkill/surreal-memory/blob/main/docs/guides/quickstart-guide.md",w="smem-guide-card-dismissed",Y=50;function J(){const{data:a,isLoading:r}=C(),[i,o]=j.useState(()=>{try{return localStorage.getItem(w)==="1"}catch{return!1}});if(r)return null;const n=a?.total_neurons??0;if(i||n>=Y)return null;const m=()=>{localStorage.setItem(w,"1"),o(!0)};return e.jsx(v,{className:"relative overflow-hidden border-primary/30 bg-gradient-to-r from-primary/5 to-primary/10",children:e.jsxs(p,{className:"flex items-center gap-4 p-4 sm:p-5",children:[e.jsx("div",{className:"flex size-10 shrink-0 items-center justify-center rounded-lg bg-primary/15",children:e.jsx(R,{className:"size-5 text-primary","aria-hidden":"true"})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"text-sm font-semibold",children:"Quickstart Guide"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Learn setup, recall, cognitive tools & more"})]}),e.jsx(h,{variant:"outline",size:"sm",className:"shrink-0 gap-1.5",asChild:!0,children:e.jsxs("a",{href:q,target:"_blank",rel:"noopener noreferrer",children:["Open Guide",e.jsx(G,{className:"size-3.5","aria-hidden":"true"})]})}),e.jsx(h,{variant:"ghost",size:"icon",className:"absolute right-2 top-2 size-7 text-muted-foreground hover:text-foreground",onClick:m,"aria-label":"Dismiss guide card",children:e.jsx(I,{className:"size-3.5","aria-hidden":"true"})})]})})}function g({label:a,value:r,icon:i,loading:o}){return e.jsx(v,{children:e.jsxs(p,{className:"flex items-center gap-4 p-6",children:[e.jsx("div",{className:"flex size-12 items-center justify-center rounded-lg bg-primary/10",children:e.jsx(i,{className:"size-6 text-primary","aria-hidden":"true"})}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:a}),o?e.jsx(u,{className:"mt-1 h-7 w-20"}):e.jsx("p",{className:"font-mono text-2xl font-bold tracking-tight",children:typeof r=="number"?r.toLocaleString():r})]})]})})}function ne(){const{data:a,isLoading:r}=C(),{data:i,isLoading:o}=B(),n=L(),m=$(),[l,d]=j.useState(null),{t:s}=y(),f=t=>{n.mutate(t,{onSuccess:()=>x.success(s("overview.switchedTo",{name:t})),onError:()=>x.error(s("overview.switchFailed"))})},c=()=>{l&&m.mutate(l.id,{onSuccess:()=>{x.success(s("overview.deleted",{name:l.name})),d(null)},onError:()=>{x.error(s("overview.deleteFailed")),d(null)}})};return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:s("overview.title")}),e.jsx(J,{}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[e.jsx(g,{label:s("overview.neurons"),value:a?.total_neurons??0,icon:V,loading:r}),e.jsx(g,{label:s("overview.synapses"),value:a?.total_synapses??0,icon:F,loading:r}),e.jsx(g,{label:s("overview.fibers"),value:a?.total_fibers??0,icon:H,loading:r}),e.jsx(g,{label:s("overview.brains"),value:a?.total_brains??0,icon:O,loading:r})]}),e.jsx(W,{}),e.jsxs(v,{children:[e.jsx(k,{children:e.jsx(S,{children:s("overview.brainList")})}),e.jsx(p,{children:o?e.jsx("div",{className:"space-y-3",children:Array.from({length:3}).map((t,N)=>e.jsx(u,{className:"h-12 w-full"},N))}):i&&i.length>0?e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-border text-left text-muted-foreground",children:[e.jsx("th",{className:"pb-2 font-medium",children:s("overview.name")}),e.jsx("th",{className:"pb-2 font-medium",children:s("overview.neurons")}),e.jsx("th",{className:"pb-2 font-medium",children:s("overview.synapses")}),e.jsx("th",{className:"pb-2 font-medium",children:s("overview.fibers")}),e.jsx("th",{className:"pb-2 font-medium",children:s("overview.grade")}),e.jsx("th",{className:"pb-2 font-medium",children:s("overview.status")}),e.jsx("th",{className:"pb-2 font-medium",children:s("overview.actions")})]})}),e.jsx("tbody",{children:i.map(t=>e.jsxs("tr",{className:`border-b border-border/50 last:border-0 transition-colors ${t.is_active?"":"cursor-pointer hover:bg-accent/50"}`,onClick:()=>{t.is_active||f(t.name)},title:t.is_active?s("overview.currentBrain"):s("overview.switchTo",{name:t.name}),children:[e.jsx("td",{className:"py-3 font-mono font-medium",children:t.name}),e.jsx("td",{className:"py-3 font-mono",children:t.neuron_count.toLocaleString()}),e.jsx("td",{className:"py-3 font-mono",children:t.synapse_count.toLocaleString()}),e.jsx("td",{className:"py-3 font-mono",children:t.fiber_count.toLocaleString()}),e.jsx("td",{className:"py-3",children:e.jsx(b,{variant:t.grade==="A"||t.grade==="A+"?"success":t.grade==="B"||t.grade==="B+"?"secondary":"warning",children:t.grade})}),e.jsx("td",{className:"py-3",children:t.is_active?e.jsx(b,{variant:"default",children:s("common.active")}):e.jsx("span",{className:"text-muted-foreground",children:"-"})}),e.jsx("td",{className:"py-3",children:!t.is_active&&e.jsx(h,{variant:"ghost",size:"icon",className:"size-8 text-muted-foreground hover:text-destructive",onClick:N=>{N.stopPropagation(),d({id:t.id,name:t.name})},"aria-label":s("overview.deleteBrain",{name:t.name}),children:e.jsx(U,{className:"size-4"})})})]},t.id))})]})}):e.jsx("p",{className:"text-sm text-muted-foreground",children:s("overview.noBrains")})})]}),e.jsx(P,{open:!!l,title:s("overview.deleteBrainTitle"),description:s("overview.deleteBrainDesc",{name:l?.name}),confirmLabel:s("common.delete"),variant:"destructive",onConfirm:c,onCancel:()=>d(null)})]})}export{ne as default}; diff --git a/src/surreal_memory/server/static/dist/assets/OverviewPage-BixPEj84.js b/src/surreal_memory/server/static/dist/assets/OverviewPage-BixPEj84.js new file mode 100644 index 00000000..ab099aeb --- /dev/null +++ b/src/surreal_memory/server/static/dist/assets/OverviewPage-BixPEj84.js @@ -0,0 +1 @@ +import{j as e}from"./vendor-query-CqA1cBNl.js";import{r as N}from"./vendor-react-BfuodpLv.js";import{u as k,B as p,a as h,t as d,b,c as z,d as B,e as L,f as $}from"./index-DXL5wCpD.js";import{C as g,a as w,b as y,c as f}from"./card-Duzfr-hx.js";import{S as c}from"./skeleton-CBW-y0cP.js";import{C as T}from"./confirm-dialog-DE0Sgk6_.js";import{y as C,z as A,A as D,B as E,C as I,D as R,E as G,F as V,c as F,G as H,q as O,H as U,I as P}from"./vendor-icons-C6dhS1UE.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";const Q={configured:{icon:C,badgeVariant:"success",label:"Configured"},warning:{icon:E,badgeVariant:"warning",label:"Warning"},not_configured:{icon:D,badgeVariant:"destructive",label:"Not configured"},info:{icon:A,badgeVariant:"secondary",label:"Info"}};function q({item:t}){const{icon:r,badgeVariant:i,label:o}=Q[t.status],n=async()=>{try{await navigator.clipboard.writeText(t.command),d.success("Copied to clipboard")}catch{d.error("Failed to copy")}};return e.jsxs("div",{className:"space-y-1.5 py-3 first:pt-0 last:pb-0",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[e.jsx(r,{className:`size-4 shrink-0 ${t.status==="configured"?"text-health-good":t.status==="warning"?"text-health-warn":t.status==="not_configured"?"text-destructive":"text-muted-foreground"}`,"aria-hidden":"true"}),e.jsx("span",{className:"text-sm font-medium",children:t.label})]}),e.jsx(p,{variant:i,className:"shrink-0 text-xs",children:o})]}),t.description&&e.jsx("p",{className:"pl-6 text-xs text-muted-foreground",children:t.description}),t.command&&e.jsxs("div",{className:"flex items-center gap-2 pl-6",children:[e.jsx("code",{className:"min-w-0 flex-1 truncate rounded-md border border-border bg-muted px-2.5 py-1.5 font-mono text-xs",children:t.command}),e.jsx(h,{variant:"ghost",size:"icon",className:"size-7 shrink-0 text-muted-foreground hover:text-foreground",onClick:n,"aria-label":`Copy command: ${t.command}`,children:e.jsx(I,{className:"size-3.5","aria-hidden":"true"})})]})]})}function K(){return e.jsx("div",{className:"space-y-4",children:Array.from({length:3}).map((t,r)=>e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(c,{className:"size-4 rounded-full"}),e.jsx(c,{className:"h-4 w-32"})]}),e.jsx(c,{className:"h-5 w-20 rounded-md"})]}),e.jsx(c,{className:"ml-6 h-3 w-48"}),e.jsx(c,{className:"ml-6 h-7 w-full"})]},r))})}function W(){const{data:t,isLoading:r}=k(),i=t?.items??[];if(!r&&i.length===0)return null;const o=i.length>0&&i.every(n=>n.status==="configured");return e.jsxs(g,{children:[e.jsx(w,{className:"pb-2",children:e.jsx(y,{className:"text-base",children:"Quick Actions"})}),e.jsx(f,{children:r?e.jsx(K,{}):o?e.jsxs("div",{className:"flex items-center gap-2 py-2 text-sm text-health-good",children:[e.jsx(C,{className:"size-4","aria-hidden":"true"}),e.jsx("span",{children:"All features configured"})]}):e.jsx("div",{className:"grid grid-cols-1 divide-y divide-border sm:grid-cols-2 sm:divide-x sm:divide-y-0",children:i.map((n,m)=>{const l=m%2===1;return e.jsx("div",{className:`${l?"sm:pl-4":"sm:pr-4"}`,children:e.jsx(q,{item:n})},n.key)})})})]})}const M="https://github.com/acidkill/surreal-memory/blob/main/docs/guides/quickstart-guide.md",j="smem-guide-card-dismissed",Y=50;function J(){const{data:t,isLoading:r}=b(),[i,o]=N.useState(()=>{try{return localStorage.getItem(j)==="1"}catch{return!1}});if(r)return null;const n=t?.total_neurons??0;if(i||n>=Y)return null;const m=()=>{localStorage.setItem(j,"1"),o(!0)};return e.jsx(g,{className:"relative overflow-hidden border-primary/30 bg-gradient-to-r from-primary/5 to-primary/10",children:e.jsxs(f,{className:"flex items-center gap-4 p-4 sm:p-5",children:[e.jsx("div",{className:"flex size-10 shrink-0 items-center justify-center rounded-lg bg-primary/15",children:e.jsx(R,{className:"size-5 text-primary","aria-hidden":"true"})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"text-sm font-semibold",children:"Quickstart Guide"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Learn setup, recall, cognitive tools & more"})]}),e.jsx(h,{variant:"outline",size:"sm",className:"shrink-0 gap-1.5",asChild:!0,children:e.jsxs("a",{href:M,target:"_blank",rel:"noopener noreferrer",children:["Open Guide",e.jsx(G,{className:"size-3.5","aria-hidden":"true"})]})}),e.jsx(h,{variant:"ghost",size:"icon",className:"absolute right-2 top-2 size-7 text-muted-foreground hover:text-foreground",onClick:m,"aria-label":"Dismiss guide card",children:e.jsx(V,{className:"size-3.5","aria-hidden":"true"})})]})})}function x({label:t,value:r,icon:i,loading:o}){return e.jsx(g,{children:e.jsxs(f,{className:"flex items-center gap-4 p-6",children:[e.jsx("div",{className:"flex size-12 items-center justify-center rounded-lg bg-primary/10",children:e.jsx(i,{className:"size-6 text-primary","aria-hidden":"true"})}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:t}),o?e.jsx(c,{className:"mt-1 h-7 w-20"}):e.jsx("p",{className:"font-mono text-2xl font-bold tracking-tight",children:typeof r=="number"?r.toLocaleString():r})]})]})})}function oe(){const{data:t,isLoading:r}=b(),{data:i,isLoading:o}=z(),n=B(),m=L(),[l,u]=N.useState(null),{t:s}=$(),S=a=>{n.mutate(a,{onSuccess:()=>d.success(s("overview.switchedTo",{name:a})),onError:()=>d.error(s("overview.switchFailed"))})},_=()=>{l&&m.mutate(l.id,{onSuccess:()=>{d.success(s("overview.deleted",{name:l.name})),u(null)},onError:()=>{d.error(s("overview.deleteFailed")),u(null)}})};return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:s("overview.title")}),e.jsx(J,{}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[e.jsx(x,{label:s("overview.neurons"),value:t?.total_neurons??0,icon:F,loading:r}),e.jsx(x,{label:s("overview.synapses"),value:t?.total_synapses??0,icon:H,loading:r}),e.jsx(x,{label:s("overview.fibers"),value:t?.total_fibers??0,icon:O,loading:r}),e.jsx(x,{label:s("overview.brains"),value:t?.total_brains??0,icon:U,loading:r})]}),e.jsx(W,{}),e.jsxs(g,{children:[e.jsx(w,{children:e.jsx(y,{children:s("overview.brainList")})}),e.jsx(f,{children:o?e.jsx("div",{className:"space-y-3",children:Array.from({length:3}).map((a,v)=>e.jsx(c,{className:"h-12 w-full"},v))}):i&&i.length>0?e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-border text-left text-muted-foreground",children:[e.jsx("th",{className:"pb-2 font-medium",children:s("overview.name")}),e.jsx("th",{className:"pb-2 font-medium",children:s("overview.neurons")}),e.jsx("th",{className:"pb-2 font-medium",children:s("overview.synapses")}),e.jsx("th",{className:"pb-2 font-medium",children:s("overview.fibers")}),e.jsx("th",{className:"pb-2 font-medium",children:s("overview.grade")}),e.jsx("th",{className:"pb-2 font-medium",children:s("overview.status")}),e.jsx("th",{className:"pb-2 font-medium",children:s("overview.actions")})]})}),e.jsx("tbody",{children:i.map(a=>e.jsxs("tr",{className:`border-b border-border/50 last:border-0 transition-colors ${a.is_active?"":"cursor-pointer hover:bg-accent/50"}`,onClick:()=>{a.is_active||S(a.name)},title:a.is_active?s("overview.currentBrain"):s("overview.switchTo",{name:a.name}),children:[e.jsx("td",{className:"py-3 font-mono font-medium",children:a.name}),e.jsx("td",{className:"py-3 font-mono",children:a.neuron_count.toLocaleString()}),e.jsx("td",{className:"py-3 font-mono",children:a.synapse_count.toLocaleString()}),e.jsx("td",{className:"py-3 font-mono",children:a.fiber_count.toLocaleString()}),e.jsx("td",{className:"py-3",children:e.jsx(p,{variant:a.grade==="A"||a.grade==="A+"?"success":a.grade==="B"||a.grade==="B+"?"secondary":"warning",children:a.grade})}),e.jsx("td",{className:"py-3",children:a.is_active?e.jsx(p,{variant:"default",children:s("common.active")}):e.jsx("span",{className:"text-muted-foreground",children:"-"})}),e.jsx("td",{className:"py-3",children:!a.is_active&&e.jsx(h,{variant:"ghost",size:"icon",className:"size-8 text-muted-foreground hover:text-destructive",onClick:v=>{v.stopPropagation(),u({id:a.id,name:a.name})},"aria-label":s("overview.deleteBrain",{name:a.name}),children:e.jsx(P,{className:"size-4"})})})]},a.id))})]})}):e.jsx("p",{className:"text-sm text-muted-foreground",children:s("overview.noBrains")})})]}),e.jsx(T,{open:!!l,title:s("overview.deleteBrainTitle"),description:s("overview.deleteBrainDesc",{name:l?.name}),confirmLabel:s("common.delete"),variant:"destructive",onConfirm:_,onCancel:()=>u(null)})]})}export{oe as default}; diff --git a/src/surreal_memory/server/static/dist/assets/ProGate-wWiPatWA.js b/src/surreal_memory/server/static/dist/assets/ProGate-DjphnyL3.js similarity index 71% rename from src/surreal_memory/server/static/dist/assets/ProGate-wWiPatWA.js rename to src/surreal_memory/server/static/dist/assets/ProGate-DjphnyL3.js index d4740717..5af2a294 100644 --- a/src/surreal_memory/server/static/dist/assets/ProGate-wWiPatWA.js +++ b/src/surreal_memory/server/static/dist/assets/ProGate-DjphnyL3.js @@ -1 +1 @@ -import{j as t}from"./vendor-query-CqA1cBNl.js";import"./vendor-react-BfuodpLv.js";import{u as o}from"./index-CSMoVcy_.js";function i({children:r,label:s}){const{t:a}=o();return t.jsx(t.Fragment,{children:r})}export{i as P}; +import{j as t}from"./vendor-query-CqA1cBNl.js";import"./vendor-react-BfuodpLv.js";import{f as o}from"./index-DXL5wCpD.js";function i({children:r,label:s}){const{t:a}=o();return t.jsx(t.Fragment,{children:r})}export{i as P}; diff --git a/src/surreal_memory/server/static/dist/assets/ReasoningPage-BjC1wtHj.js b/src/surreal_memory/server/static/dist/assets/ReasoningPage-BjC1wtHj.js new file mode 100644 index 00000000..1a0fedb5 --- /dev/null +++ b/src/surreal_memory/server/static/dist/assets/ReasoningPage-BjC1wtHj.js @@ -0,0 +1 @@ +import{u as A,a as w,b as z,j as e}from"./vendor-query-CqA1cBNl.js";import{r as f}from"./vendor-react-BfuodpLv.js";import{C as k,a as D,b as F,c as _}from"./card-Duzfr-hx.js";import{o as M,f as Q,a as j,t as c,C as P,D as $,B as W}from"./index-DXL5wCpD.js";import{S as H}from"./skeleton-CBW-y0cP.js";import{I as K,a2 as V}from"./vendor-icons-C6dhS1UE.js";import{C as L}from"./confirm-dialog-DE0Sgk6_.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";const h={status:["reasoning","status"],patterns:["reasoning","patterns"],patternList:(a,n,s,i)=>["reasoning","patterns",a,n,s,i]};function X(){return A({queryKey:h.status,queryFn:()=>M.get("/api/dashboard/reasoning/status"),refetchInterval:a=>a.state.data?.mining.running?3e3:!1})}function O(){const a=w();return z({mutationFn:n=>M.put("/api/dashboard/reasoning/config",n),onMutate:async n=>{await a.cancelQueries({queryKey:h.status});const s=a.getQueryData(h.status);return s&&a.setQueryData(h.status,{...s,config:{...s.config,...n}}),{prev:s}},onError:(n,s,i)=>{i?.prev&&a.setQueryData(h.status,i.prev)},onSettled:()=>a.invalidateQueries({queryKey:h.status})})}function Y(){const a=w();return z({mutationFn:n=>M.post("/api/dashboard/reasoning/mine",n),onSuccess:()=>a.invalidateQueries({queryKey:h.status})})}function ee(a="",n="",s=50,i=0){const l=new URLSearchParams;return a&&l.set("model",a),n&&l.set("category",n),l.set("limit",String(s)),l.set("offset",String(i)),A({queryKey:h.patternList(a,n,s,i),queryFn:()=>M.get(`/api/dashboard/reasoning/patterns?${l.toString()}`)})}function ne(){const a=w();return z({mutationFn:n=>M.delete(`/api/dashboard/reasoning/patterns/${encodeURIComponent(n)}`),onSuccess:()=>{a.invalidateQueries({queryKey:h.status}),a.invalidateQueries({queryKey:h.patterns})}})}function se(){const a=w();return z({mutationFn:n=>M.delete(`/api/dashboard/reasoning/patterns?model=${encodeURIComponent(n)}`),onSuccess:()=>{a.invalidateQueries({queryKey:h.status}),a.invalidateQueries({queryKey:h.patterns})}})}function te(){const a=w();return z({mutationFn:n=>M.delete(`/api/dashboard/reasoning/traces?model=${encodeURIComponent(n)}`),onSuccess:()=>a.invalidateQueries({queryKey:h.status})})}function ae({status:a}){const{t:n}=Q(),s=O(),i=Y(),l=te(),g=a.config.mining_enabled,p=new Set(a.config.mining_models),u=a.mining.running,[m,y]=f.useState(!1),[v,b]=f.useState(null),N=()=>{if(!v)return;const t=v;b(null),l.mutate(t,{onSuccess:r=>c.success(n("reasoning.tracesWiped",{count:r.deleted})),onError:r=>c.error(P(r,n("reasoning.configSaveFailed")))})},C=t=>{s.mutate({mining_enabled:t},{onSuccess:()=>c.success(n("reasoning.configSaved")),onError:r=>c.error(P(r,n("reasoning.configSaveFailed")))})},T=(t,r)=>{const x=new Set(p);r?x.add(t):x.delete(t),s.mutate({mining_models:[...x]},{onSuccess:()=>c.success(n("reasoning.configSaved")),onError:d=>c.error(P(d,n("reasoning.configSaveFailed")))})},E=()=>{i.mutate({backfill:m},{onSuccess:()=>c.success(n("reasoning.miningStarted")),onError:t=>{t instanceof $&&t.status===409?c.error(n("reasoning.miningInProgress")):t instanceof $&&t.status===400?c.error(n("reasoning.miningDisabled")):c.error(n("reasoning.miningFailed"))}})};return e.jsxs(k,{children:[e.jsx(D,{children:e.jsx(F,{children:n("reasoning.miningTitle")})}),e.jsxs(_,{className:"space-y-4 text-sm",children:[e.jsxs("label",{className:"flex cursor-pointer items-center gap-3",children:[e.jsx("input",{type:"checkbox",checked:g,onChange:t=>C(t.target.checked),disabled:s.isPending,className:"size-4 cursor-pointer"}),e.jsx("span",{children:n("reasoning.miningEnabled")})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-xs font-medium text-muted-foreground",children:n("reasoning.miningModels")}),a.detected_models.length===0?e.jsx("p",{className:"text-xs text-muted-foreground",children:n("reasoning.noModels")}):e.jsx("div",{className:"space-y-1.5",children:a.per_model.map(t=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("label",{className:"flex flex-1 items-center gap-2",title:t.has_thinking_text?t.model:n("reasoning.noThinkingText"),children:[e.jsx("input",{type:"checkbox",checked:p.has(t.model),disabled:!t.has_thinking_text||s.isPending,onChange:r=>T(t.model,r.target.checked),className:"size-4 cursor-pointer disabled:cursor-not-allowed"}),e.jsx("span",{className:t.has_thinking_text?"font-mono":"font-mono text-muted-foreground",children:t.model}),!t.has_thinking_text&&e.jsxs("span",{className:"text-xs text-muted-foreground",children:["(",n("reasoning.noThinkingShort"),")"]})]}),t.trace_count>0&&e.jsx(j,{variant:"ghost",size:"icon",onClick:()=>b(t.model),disabled:l.isPending,title:n("reasoning.wipeTraces"),"aria-label":n("reasoning.wipeTraces"),children:e.jsx(K,{className:"size-4"})})]},t.model))}),e.jsx("p",{className:"pt-1 text-xs text-muted-foreground",children:n("reasoning.miningModelsHint")})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3 pt-1",children:[e.jsxs("label",{className:"flex cursor-pointer items-center gap-2 text-xs",children:[e.jsx("input",{type:"checkbox",checked:m,onChange:t=>y(t.target.checked),className:"size-4 cursor-pointer"}),e.jsx("span",{children:n("reasoning.backfill")})]}),e.jsx(j,{size:"sm",onClick:E,disabled:!g||u||i.isPending,children:n(u?"reasoning.miningRunning":"reasoning.runMining")})]})]}),e.jsx(L,{open:v!==null,title:n("reasoning.wipeTracesTitle"),description:n("reasoning.wipeTracesDesc",{model:v??""}),variant:"destructive",confirmLabel:n("reasoning.wipeTraces"),onConfirm:N,onCancel:()=>b(null)})]})}let re=0;const G=()=>`pair-${re++}`,U=a=>Object.entries(a).map(([n,s])=>({id:G(),target:n,source:s}));function ie({status:a}){const{t:n}=Q(),s=O(),i=a.config.injection_enabled,l=a.per_model.filter(t=>t.has_thinking_text).map(t=>t.model),[g,p]=f.useState(()=>U(a.config.injection_map)),[u,m]=f.useState(!1),[y,v]=f.useState(a.config.injection_map);a.config.injection_map!==y&&(v(a.config.injection_map),p(U(a.config.injection_map)),m(!1));const b=t=>{s.mutate({injection_enabled:t},{onSuccess:()=>c.success(n("reasoning.configSaved")),onError:r=>c.error(P(r,n("reasoning.configSaveFailed")))})},N=(t,r)=>{p(x=>x.map(d=>d.id===t?{...d,...r}:d)),m(!0)},C=()=>{p(t=>[...t,{id:G(),target:"",source:l[0]??""}]),m(!0)},T=t=>{p(r=>r.filter(x=>x.id!==t)),m(!0)},E=()=>{const t=new Set,r={};for(const x of g){const d=x.target.trim(),q=x.source.trim();if(!(!d||!q)){if(t.has(d)){c.error(n("reasoning.duplicateTarget",{target:d}));return}t.add(d),r[d]=q}}s.mutate({injection_map:r},{onSuccess:()=>{c.success(n("reasoning.configSaved")),m(!1)},onError:x=>c.error(P(x,n("reasoning.configSaveFailed")))})};return e.jsxs(k,{children:[e.jsx(D,{children:e.jsx(F,{children:n("reasoning.injectionTitle")})}),e.jsxs(_,{className:"space-y-4 text-sm",children:[e.jsxs("label",{className:"flex cursor-pointer items-center gap-3",children:[e.jsx("input",{type:"checkbox",checked:i,onChange:t=>b(t.target.checked),disabled:s.isPending,className:"size-4 cursor-pointer"}),e.jsx("span",{children:n("reasoning.injectionEnabled")})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-xs font-medium text-muted-foreground",children:n("reasoning.injectionMap")}),g.length===0&&e.jsx("p",{className:"text-xs text-muted-foreground",children:n("reasoning.noMappings")}),g.map(t=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:t.source,onChange:r=>N(t.id,{source:r.target.value}),className:"w-40 rounded-md border border-border bg-background px-2 py-1.5 font-mono text-xs","aria-label":n("reasoning.source"),children:[!l.includes(t.source)&&t.source&&e.jsx("option",{value:t.source,children:t.source}),l.map(r=>e.jsx("option",{value:r,children:r},r))]}),e.jsx("span",{className:"text-muted-foreground",children:"→"}),e.jsx("input",{type:"text",value:t.target,onChange:r=>N(t.id,{target:r.target.value}),placeholder:n("reasoning.targetPlaceholder"),className:"w-40 rounded-md border border-border bg-background px-2 py-1.5 font-mono text-xs","aria-label":n("reasoning.target")}),e.jsx(j,{variant:"ghost",size:"icon",onClick:()=>T(t.id),"aria-label":n("common.delete"),children:e.jsx(K,{className:"size-4"})})]},t.id)),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsxs(j,{variant:"outline",size:"sm",onClick:C,disabled:l.length===0,children:[e.jsx(V,{className:"size-4"})," ",n("reasoning.addMapping")]}),e.jsx(j,{size:"sm",onClick:E,disabled:!u||s.isPending,children:n("reasoning.save")})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:n("reasoning.injectionMapHint")})]})]})]})}const S=20;function oe({detectedModels:a,categories:n}){const{t:s}=Q(),[i,l]=f.useState(""),[g,p]=f.useState(""),[u,m]=f.useState(0),[y,v]=f.useState(null),[b,N]=f.useState(null),{data:C,isLoading:T,isError:E,refetch:t}=ee(i,g,S,u),r=ne(),x=se(),d=C?.total??0,q=C?.patterns??[];C&&u>0&&u>=d&&m(Math.max(0,d-S));const B=()=>m(0),Z=()=>{if(!y)return;const o=y.id;v(null),r.mutate(o,{onSuccess:()=>c.success(s("reasoning.patternDeleted")),onError:()=>c.error(s("reasoning.patternDeleteFailed"))})},J=()=>{if(!b)return;const o=b;N(null),x.mutate(o,{onSuccess:I=>c.success(s("reasoning.patternsDeletedCount",{count:I.deleted})),onError:I=>c.error(P(I,s("reasoning.patternDeleteFailed")))})};return e.jsxs(k,{children:[e.jsx(D,{children:e.jsx(F,{children:s("reasoning.patternsTitle")})}),e.jsxs(_,{className:"space-y-4 text-sm",children:[e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsxs("select",{value:i,onChange:o=>{l(o.target.value),B()},className:"rounded-md border border-border bg-background px-2 py-1.5 text-xs","aria-label":s("reasoning.filterModel"),children:[e.jsx("option",{value:"",children:s("reasoning.allModels")}),a.map(o=>e.jsx("option",{value:o,children:o},o))]}),e.jsxs("select",{value:g,onChange:o=>{p(o.target.value),B()},className:"rounded-md border border-border bg-background px-2 py-1.5 text-xs","aria-label":s("reasoning.filterCategory"),children:[e.jsx("option",{value:"",children:s("reasoning.allCategories")}),n.map(o=>e.jsx("option",{value:o,children:o},o))]}),i&&e.jsxs(j,{variant:"outline",size:"sm",className:"text-destructive",onClick:()=>N(i),disabled:x.isPending,children:[e.jsx(K,{className:"size-4"})," ",s("reasoning.deleteAllForModel")]})]}),T?e.jsx(H,{className:"h-32 w-full"}):E?e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-sm text-destructive",children:s("reasoning.patternsError")}),e.jsx(j,{variant:"outline",size:"sm",onClick:()=>t(),children:s("common.retry")})]}):q.length===0?e.jsx("p",{className:"text-sm text-muted-foreground",children:s("reasoning.noPatterns")}):e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b text-left text-muted-foreground",children:[e.jsx("th",{className:"py-2 pr-3 font-medium",children:s("reasoning.colTitle")}),e.jsx("th",{className:"py-2 pr-3 font-medium",children:s("reasoning.colModel")}),e.jsx("th",{className:"py-2 pr-3 font-medium",children:s("reasoning.colCategory")}),e.jsx("th",{className:"py-2 pr-3 text-right font-medium",children:s("reasoning.colConfidence")}),e.jsx("th",{className:"py-2 pr-3 text-right font-medium",children:s("reasoning.colFrequency")}),e.jsx("th",{className:"py-2 font-medium"})]})}),e.jsx("tbody",{children:q.map(o=>e.jsxs("tr",{className:"border-b border-border/50",children:[e.jsx("td",{className:"py-2 pr-3",children:o.title}),e.jsx("td",{className:"py-2 pr-3 font-mono text-xs",children:o.source_model}),e.jsx("td",{className:"py-2 pr-3",children:e.jsx(W,{variant:"secondary",children:o.category})}),e.jsxs("td",{className:"py-2 pr-3 text-right font-mono",children:[Math.round(o.confidence*100),"%"]}),e.jsx("td",{className:"py-2 pr-3 text-right font-mono",children:o.frequency}),e.jsx("td",{className:"py-2 text-right",children:e.jsx(j,{variant:"ghost",size:"icon",onClick:()=>v(o),"aria-label":s("common.delete"),children:e.jsx(K,{className:"size-4"})})})]},o.id))})]})}),d>S&&e.jsxs("div",{className:"flex items-center justify-between text-xs text-muted-foreground",children:[e.jsxs("span",{children:[u+1,"–",Math.min(u+S,d)," / ",d]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(j,{variant:"outline",size:"sm",disabled:u===0,onClick:()=>m(Math.max(0,u-S)),children:s("common.prev")}),e.jsx(j,{variant:"outline",size:"sm",disabled:u+S>=d,onClick:()=>m(u+S),children:s("common.next")})]})]})]}),e.jsx(L,{open:y!==null,title:s("reasoning.deletePatternTitle"),description:s("reasoning.deletePatternDesc",{title:y?.title??""}),variant:"destructive",confirmLabel:s("common.delete"),onConfirm:Z,onCancel:()=>v(null)}),e.jsx(L,{open:b!==null,title:s("reasoning.deleteAllTitle"),description:s("reasoning.deleteAllDesc",{model:b??""}),variant:"destructive",confirmLabel:s("common.delete"),onConfirm:J,onCancel:()=>N(null)})]})}function R({label:a,value:n}){return e.jsxs(k,{children:[e.jsx(D,{className:"pb-2",children:e.jsx(F,{className:"text-sm font-medium text-muted-foreground",children:a})}),e.jsx(_,{children:e.jsx("p",{className:"font-mono text-2xl font-bold",children:n.toLocaleString()})})]})}function le({status:a}){const{t:n}=Q(),s=a.per_model.filter(i=>i.pattern_count>0);return s.length===0?null:e.jsxs(k,{children:[e.jsx(D,{children:e.jsx(F,{children:n("reasoning.coverageTitle")})}),e.jsx(_,{className:"space-y-4 text-sm",children:s.map(i=>{const l=a.coverage_by_model[i.model]??[];return e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"font-mono text-xs",children:i.model}),e.jsxs("span",{className:"font-mono text-xs text-muted-foreground",children:[i.coverage_percent,"%"]})]}),e.jsx("div",{className:"h-2 overflow-hidden rounded-full bg-muted",children:e.jsx("div",{className:"h-full rounded-full bg-primary transition-all duration-500",style:{width:`${i.coverage_percent}%`}})}),l.length>0&&e.jsx("div",{className:"flex flex-wrap gap-1 pt-1",children:l.map(g=>e.jsxs(W,{variant:g.covered?"success":"outline",children:[g.category," (",g.pattern_count,")"]},g.category))})]},i.model)})})]})}function je(){const{t:a}=Q(),n=w(),{data:s,isLoading:i,isError:l,refetch:g}=X(),p=s?.mining.running??!1,u=f.useRef(p);return f.useEffect(()=>{u.current&&!p&&n.invalidateQueries({queryKey:["reasoning","patterns"]}),u.current=p},[p,n]),e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:a("reasoning.pageTitle")}),e.jsx("p",{className:"text-sm text-muted-foreground",children:a("reasoning.pageSubtitle")})]}),i?e.jsx("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-4",children:[0,1,2,3].map(m=>e.jsx(H,{className:"h-24 w-full"},m))}):l||!s?e.jsx(k,{children:e.jsxs(_,{className:"space-y-2 p-6",children:[e.jsx("p",{className:"text-sm text-destructive",children:a("reasoning.statusError")}),e.jsx(j,{variant:"outline",size:"sm",onClick:()=>g(),children:a("common.retry")})]})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-4",children:[e.jsx(R,{label:a("reasoning.kpiTraces"),value:s.total_traces}),e.jsx(R,{label:a("reasoning.kpiUnprocessed"),value:s.unprocessed_traces}),e.jsx(R,{label:a("reasoning.kpiPatterns"),value:s.total_patterns}),e.jsx(R,{label:a("reasoning.kpiModels"),value:s.detected_models.length})]}),s.total_traces===0&&!s.mining.running&&e.jsx(k,{children:e.jsx(_,{className:"p-6 text-sm text-muted-foreground",children:a("reasoning.emptyState")})}),e.jsx(le,{status:s}),e.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[e.jsx(ae,{status:s}),e.jsx(ie,{status:s})]}),e.jsx(oe,{detectedModels:s.detected_models,categories:s.config.categories})]})]})}export{je as default}; diff --git a/src/surreal_memory/server/static/dist/assets/SettingsPage-BD10gAE1.js b/src/surreal_memory/server/static/dist/assets/SettingsPage-CcFz-Brq.js similarity index 93% rename from src/surreal_memory/server/static/dist/assets/SettingsPage-BD10gAE1.js rename to src/surreal_memory/server/static/dist/assets/SettingsPage-CcFz-Brq.js index 8c493d06..5b62b48e 100644 --- a/src/surreal_memory/server/static/dist/assets/SettingsPage-BD10gAE1.js +++ b/src/surreal_memory/server/static/dist/assets/SettingsPage-CcFz-Brq.js @@ -1 +1 @@ -import{u as B,b as T,j as e}from"./vendor-query-CqA1cBNl.js";import{o as C,a as L,u as w,b as p,p as P,q as D,r as M,B as _,t as d,s as z,c as A,v as R,w as U,x as O,y as I}from"./index-CSMoVcy_.js";import{C as u,a as x,b as g,c as h}from"./card-DAwbJLqc.js";import{Q as K,R as $,S as q,D as G}from"./vendor-icons-IAbuZhWE.js";import{S as y}from"./skeleton-CAu64_35.js";import{r as S}from"./vendor-react-BfuodpLv.js";import{P as H}from"./ProGate-wWiPatWA.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";const Q={status:["telegram","status"]};function V(){return B({queryKey:Q.status,queryFn:()=>C.get("/api/dashboard/telegram/status"),retry:!1})}function W(){return T({mutationFn:()=>C.post("/api/dashboard/telegram/test",{})})}function Y(){return T({mutationFn:t=>C.post("/api/dashboard/telegram/backup",{brain:t})})}const J={configured:"success",warning:"warning",not_configured:"secondary",info:"default"};function X(){const{data:t,isLoading:l}=L(),{t:o}=w();return e.jsxs(u,{children:[e.jsx(x,{children:e.jsx(g,{children:o("settings.configStatus")})}),e.jsx(h,{children:l?e.jsx("div",{className:"space-y-3",children:Array.from({length:4}).map((a,n)=>e.jsx(y,{className:"h-14 w-full"},n))}):e.jsx("div",{className:"space-y-2",children:t?.items.map(a=>e.jsxs("div",{className:"rounded-lg border border-border/50 px-3 py-2 space-y-1",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-sm font-medium",children:a.label}),e.jsx(p,{variant:J[a.status],children:a.status})]}),a.value&&e.jsx("p",{className:"font-mono text-xs text-foreground/80",children:a.value}),a.description&&e.jsx("p",{className:"text-xs text-muted-foreground",children:a.description}),a.command&&e.jsx("p",{className:"font-mono text-xs text-muted-foreground",children:a.command})]},a.key))})})]})}const Z=[{value:"sentence_transformer",label:"Sentence Transformer (Local)"},{value:"ollama",label:"Ollama (Local)"},{value:"gemini",label:"Gemini (Google)"},{value:"openai",label:"OpenAI"},{value:"openrouter",label:"OpenRouter"}],F={sentence_transformer:"all-MiniLM-L6-v2",ollama:"nomic-embed-text",gemini:"text-embedding-004",openai:"text-embedding-3-small",openrouter:"openai/text-embedding-3-small"};function ee(){const{t}=w(),{data:l}=P(),o=D(),a=M(),[n,f]=S.useState({enabled:!1,provider:"sentence_transformer",model:F.sentence_transformer,similarity_threshold:.7}),[b,m]=S.useState(!1);S.useEffect(()=>{if(!l)return;const r={enabled:l.enabled,provider:l.provider??"sentence_transformer",model:l.model,similarity_threshold:l.similarity_threshold};f(r),m(!1)},[l]);function s(r,i){f(c=>{const j={...c,[r]:i};return r==="provider"&&(j.model=F[i]),j}),m(!0)}const v=()=>{a.mutate(void 0,{onSuccess:r=>{r.status==="ok"?d.success(t("settings.embeddingTestOk",{provider:r.provider,dimension:r.dimension})):d.error(t("settings.embeddingTestFail",{error:r.error??"Unknown error"}))},onError:()=>d.error(t("settings.embeddingTestFail",{error:"Network error"}))})},k=()=>{o.mutate({embedding:{enabled:n.enabled,provider:n.provider,model:n.model,similarity_threshold:n.similarity_threshold}},{onSuccess:()=>{d.success(t("settings.embeddingSaved")),m(!1)},onError:()=>d.error(t("settings.embeddingSaveFailed"))})};return e.jsx(H,{label:t("settings.proFeature"),children:e.jsxs(u,{children:[e.jsx(x,{children:e.jsx(g,{children:t("settings.embeddingConfig")})}),e.jsxs(h,{className:"space-y-4 text-sm",children:[e.jsxs("label",{className:"flex items-center gap-3 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n.enabled,onChange:r=>s("enabled",r.target.checked),className:"size-4 cursor-pointer"}),e.jsx("span",{children:t("settings.embeddingEnabled")})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",htmlFor:"embedding-provider",children:t("settings.embeddingProvider")}),e.jsx("select",{id:"embedding-provider",value:n.provider,onChange:r=>s("provider",r.target.value),className:"w-full rounded-md border border-border bg-background px-3 py-2 text-sm cursor-pointer focus:outline-none focus:ring-2 focus:ring-ring",children:Z.map(r=>e.jsx("option",{value:r.value,children:r.label},r.value))})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",htmlFor:"embedding-model",children:t("settings.embeddingModel")}),e.jsx("input",{id:"embedding-model",type:"text",value:n.model,onChange:r=>s("model",r.target.value),className:"w-full rounded-md border border-border bg-background px-3 py-2 text-sm font-mono focus:outline-none focus:ring-2 focus:ring-ring"})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",htmlFor:"embedding-threshold",children:t("settings.embeddingThreshold")}),e.jsx("span",{className:"font-mono text-xs",children:n.similarity_threshold.toFixed(2)})]}),e.jsx("input",{id:"embedding-threshold",type:"range",min:"0",max:"1",step:"0.05",value:n.similarity_threshold,onChange:r=>s("similarity_threshold",parseFloat(r.target.value)),className:"w-full cursor-pointer accent-primary"})]}),e.jsxs("div",{className:"flex gap-2 pt-1",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:v,disabled:a.isPending,className:"cursor-pointer",children:a.isPending?t("settings.embeddingTesting"):t("settings.embeddingTest")}),e.jsx(_,{size:"sm",onClick:k,disabled:!b||o.isPending,className:"cursor-pointer",children:o.isPending?t("settings.embeddingSaving"):t("settings.embeddingSave")})]})]})]})})}function se(){const{data:t,isLoading:l}=z(),{t:o}=w(),a=()=>t?t.running?e.jsx(p,{variant:"success",children:o("settings.watcherRunning")}):t.enabled?e.jsx(p,{variant:"warning",children:o("settings.watcherStopped")}):e.jsx(p,{variant:"secondary",children:o("settings.watcherDisabled")}):null;return e.jsxs(u,{children:[e.jsx(x,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(g,{children:o("settings.watcher")}),l?e.jsx(y,{className:"h-5 w-16"}):a()]})}),e.jsx(h,{className:"space-y-4 text-sm",children:l?e.jsxs("div",{className:"space-y-2",children:[e.jsx(y,{className:"h-4 w-full"}),e.jsx(y,{className:"h-4 w-3/4"})]}):t?e.jsxs(e.Fragment,{children:[t.paths.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"mb-1.5 text-xs font-medium text-muted-foreground uppercase tracking-wide",children:o("settings.watcherPaths")}),e.jsx("div",{className:"space-y-1",children:t.paths.map(n=>e.jsx("p",{className:"font-mono text-xs truncate text-foreground",title:n,children:n},n))})]}),e.jsxs("div",{children:[e.jsx("p",{className:"mb-1.5 text-xs font-medium text-muted-foreground uppercase tracking-wide",children:o("settings.watcherRecent")}),t.recent.length>0?e.jsx("div",{className:"space-y-1",children:t.recent.slice(0,5).map((n,f)=>e.jsxs("div",{className:"flex items-center justify-between rounded border border-border/50 px-2 py-1.5",children:[e.jsx("span",{className:"font-mono text-xs truncate max-w-[200px] text-foreground",title:n.path,children:n.path.split(/[/\\]/).pop()}),e.jsxs("span",{className:"shrink-0 ml-2 font-mono text-xs text-muted-foreground",children:["+",n.neurons_created]})]},f))}):e.jsx("p",{className:"text-xs text-muted-foreground",children:o("settings.watcherNoActivity")})]})]}):null})]})}const te=[K,$,q],ne=["#ef4444","#6366f1","#a8a29e"],re=["reportBug","featureRequest","discussions"],ae=["https://github.com/acidkill/surreal-memory/issues/new?template=bug_report.md","https://github.com/acidkill/surreal-memory/issues/new?template=feature_request.md","https://github.com/acidkill/surreal-memory/discussions"];function he(){const{data:t}=A(),{data:l}=R(),{data:o}=U(),{data:a}=O(),{data:n,isLoading:f}=V(),b=W(),m=Y(),{t:s}=w(),v=i=>{if(i===0)return"0 B";const c=1024,j=["B","KB","MB","GB"],N=Math.floor(Math.log(i)/Math.log(c));return`${(i/Math.pow(c,N)).toFixed(1)} ${j[N]}`},k=()=>{b.mutate(void 0,{onSuccess:i=>{i.status==="success"?d.success(s("settings.testSuccess")):d.error(s("settings.testPartial"))},onError:()=>{d.error(s("settings.testFailed"))}})},r=()=>{m.mutate(void 0,{onSuccess:i=>{i.sent_to>0?d.success(s("settings.backupSuccess",{brain:i.brain,size:i.size_mb,count:i.sent_to})):d.error(s("settings.backupSendFailed"))},onError:()=>{d.error(s("settings.backupFailed"))}})};return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:s("settings.title")}),e.jsx(X,{}),e.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[e.jsxs(u,{children:[e.jsx(x,{children:e.jsx(g,{children:s("settings.general")})}),e.jsxs(h,{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.version")}),e.jsx("span",{className:"font-mono",children:l?.version??"-"})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.activeBrain")}),e.jsx("span",{className:"font-mono",children:t?.active_brain??"-"})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.totalBrains")}),e.jsx("span",{className:"font-mono",children:t?.total_brains??"-"})]}),e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsx("span",{className:"text-muted-foreground",children:s("license.tier","License")}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{variant:a?.is_pro?"success":"secondary",children:(a?.tier??"free").toUpperCase()}),!a?.is_pro&&e.jsx("button",{onClick:I,className:"text-xs font-medium text-primary hover:text-primary/80 transition-colors cursor-pointer",children:s("upgrade.title","Upgrade")})]})]})]})]}),e.jsxs(u,{children:[e.jsx(x,{children:e.jsx(g,{children:s("settings.brainFiles")})}),e.jsx(h,{className:"space-y-3 text-sm",children:o?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.brainsDirectory")}),e.jsx("span",{className:"font-mono text-xs max-w-[200px] truncate",title:o.brains_dir,children:o.brains_dir})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.totalDiskUsage")}),e.jsx("span",{className:"font-mono",children:v(o.total_size_bytes)})]}),o.brains.length>0&&e.jsx("div",{className:"mt-3 space-y-2",children:o.brains.map(i=>e.jsxs("div",{className:"flex items-center justify-between rounded-lg border border-border/50 px-3 py-2",children:[e.jsx("span",{className:"font-mono font-medium",children:i.name}),e.jsx("span",{className:"font-mono text-xs text-muted-foreground",children:v(i.size_bytes)})]},i.name))})]}):e.jsx("p",{className:"text-muted-foreground",children:s("common.loading")})})]}),e.jsxs(u,{children:[e.jsx(x,{children:e.jsx(g,{children:s("settings.telegramBackup")})}),e.jsx(h,{className:"space-y-4 text-sm",children:f?e.jsx("p",{className:"text-muted-foreground",children:s("common.loading")}):n?.configured?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{variant:"success",children:s("settings.connected")}),n.bot_name&&e.jsxs("span",{className:"text-muted-foreground",children:[n.bot_name,n.bot_username&&e.jsxs("span",{className:"font-mono text-xs",children:[" @",n.bot_username]})]})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.chatIds")}),e.jsx("span",{className:"font-mono text-xs",children:n.chat_ids.length>0?n.chat_ids.join(", "):s("common.none")})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.autoBackup")}),e.jsx("span",{className:"font-mono",children:n.backup_on_consolidation?s("common.yes"):s("common.no")})]}),e.jsxs("div",{className:"flex gap-2 pt-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:k,disabled:b.isPending,className:"cursor-pointer",children:b.isPending?s("settings.sending"):s("settings.sendTest")}),e.jsx(_,{size:"sm",onClick:r,disabled:m.isPending,className:"cursor-pointer",children:m.isPending?s("settings.backingUp"):s("settings.backupNow")})]})]}):e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(p,{variant:"warning",children:s("settings.notConfigured")})}),n?.error&&e.jsx("p",{className:"text-xs text-destructive",children:n.error}),e.jsx("p",{className:"text-xs text-muted-foreground",dangerouslySetInnerHTML:{__html:s("settings.telegramSetup")}})]})})]}),e.jsx(se,{}),e.jsx(ee,{}),e.jsxs(u,{children:[e.jsx(x,{children:e.jsx(g,{children:s("settings.feedbackTitle")})}),e.jsx(h,{className:"space-y-3",children:re.map((i,c)=>{const j=te[c],N=ne[c],E=ae[c];return e.jsxs("a",{href:E,target:"_blank",rel:"noopener noreferrer",className:"flex items-start gap-3 rounded-lg border border-border/50 p-3 transition-colors hover:bg-accent cursor-pointer",children:[e.jsx("div",{className:"flex size-8 shrink-0 items-center justify-center rounded-lg",style:{backgroundColor:`${N}15`},children:e.jsx(j,{className:"size-4",style:{color:N}})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium",children:s(`settings.${i}`)}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s(`settings.${i}Desc`)})]}),e.jsx(G,{className:"size-3.5 shrink-0 text-muted-foreground mt-0.5"})]},i)})})]})]})]})}export{he as default}; +import{u as B,b as T,j as e}from"./vendor-query-CqA1cBNl.js";import{o as C,u as L,f as w,B as p,p as P,q as M,r as z,a as _,t as d,s as D,b as A,v as R,w as U,x as O,y as I}from"./index-DXL5wCpD.js";import{C as u,a as x,b as g,c as h}from"./card-Duzfr-hx.js";import{R as K,S as $,T as q,E as G}from"./vendor-icons-C6dhS1UE.js";import{S as y}from"./skeleton-CBW-y0cP.js";import{r as S}from"./vendor-react-BfuodpLv.js";import{P as H}from"./ProGate-DjphnyL3.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";const V={status:["telegram","status"]};function W(){return B({queryKey:V.status,queryFn:()=>C.get("/api/dashboard/telegram/status"),retry:!1})}function Q(){return T({mutationFn:()=>C.post("/api/dashboard/telegram/test",{})})}function Y(){return T({mutationFn:t=>C.post("/api/dashboard/telegram/backup",{brain:t})})}const J={configured:"success",warning:"warning",not_configured:"secondary",info:"default"};function X(){const{data:t,isLoading:l}=L(),{t:o}=w();return e.jsxs(u,{children:[e.jsx(x,{children:e.jsx(g,{children:o("settings.configStatus")})}),e.jsx(h,{children:l?e.jsx("div",{className:"space-y-3",children:Array.from({length:4}).map((a,n)=>e.jsx(y,{className:"h-14 w-full"},n))}):e.jsx("div",{className:"space-y-2",children:t?.items.map(a=>e.jsxs("div",{className:"rounded-lg border border-border/50 px-3 py-2 space-y-1",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-sm font-medium",children:a.label}),e.jsx(p,{variant:J[a.status],children:a.status})]}),a.value&&e.jsx("p",{className:"font-mono text-xs text-foreground/80",children:a.value}),a.description&&e.jsx("p",{className:"text-xs text-muted-foreground",children:a.description}),a.command&&e.jsx("p",{className:"font-mono text-xs text-muted-foreground",children:a.command})]},a.key))})})]})}const Z=[{value:"sentence_transformer",label:"Sentence Transformer (Local)"},{value:"ollama",label:"Ollama (Local)"},{value:"gemini",label:"Gemini (Google)"},{value:"openai",label:"OpenAI"},{value:"openrouter",label:"OpenRouter"}],F={sentence_transformer:"all-MiniLM-L6-v2",ollama:"nomic-embed-text",gemini:"text-embedding-004",openai:"text-embedding-3-small",openrouter:"openai/text-embedding-3-small"};function ee(){const{t}=w(),{data:l}=P(),o=M(),a=z(),[n,f]=S.useState({enabled:!1,provider:"sentence_transformer",model:F.sentence_transformer,similarity_threshold:.7}),[b,m]=S.useState(!1);S.useEffect(()=>{if(!l)return;const r={enabled:l.enabled,provider:l.provider??"sentence_transformer",model:l.model,similarity_threshold:l.similarity_threshold};f(r),m(!1)},[l]);function s(r,i){f(c=>{const j={...c,[r]:i};return r==="provider"&&(j.model=F[i]),j}),m(!0)}const v=()=>{a.mutate(void 0,{onSuccess:r=>{r.status==="ok"?d.success(t("settings.embeddingTestOk",{provider:r.provider,dimension:r.dimension})):d.error(t("settings.embeddingTestFail",{error:r.error??"Unknown error"}))},onError:()=>d.error(t("settings.embeddingTestFail",{error:"Network error"}))})},k=()=>{o.mutate({embedding:{enabled:n.enabled,provider:n.provider,model:n.model,similarity_threshold:n.similarity_threshold}},{onSuccess:()=>{d.success(t("settings.embeddingSaved")),m(!1)},onError:()=>d.error(t("settings.embeddingSaveFailed"))})};return e.jsx(H,{label:t("settings.proFeature"),children:e.jsxs(u,{children:[e.jsx(x,{children:e.jsx(g,{children:t("settings.embeddingConfig")})}),e.jsxs(h,{className:"space-y-4 text-sm",children:[e.jsxs("label",{className:"flex items-center gap-3 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n.enabled,onChange:r=>s("enabled",r.target.checked),className:"size-4 cursor-pointer"}),e.jsx("span",{children:t("settings.embeddingEnabled")})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",htmlFor:"embedding-provider",children:t("settings.embeddingProvider")}),e.jsx("select",{id:"embedding-provider",value:n.provider,onChange:r=>s("provider",r.target.value),className:"w-full rounded-md border border-border bg-background px-3 py-2 text-sm cursor-pointer focus:outline-none focus:ring-2 focus:ring-ring",children:Z.map(r=>e.jsx("option",{value:r.value,children:r.label},r.value))})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",htmlFor:"embedding-model",children:t("settings.embeddingModel")}),e.jsx("input",{id:"embedding-model",type:"text",value:n.model,onChange:r=>s("model",r.target.value),className:"w-full rounded-md border border-border bg-background px-3 py-2 text-sm font-mono focus:outline-none focus:ring-2 focus:ring-ring"})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("label",{className:"text-xs font-medium text-muted-foreground",htmlFor:"embedding-threshold",children:t("settings.embeddingThreshold")}),e.jsx("span",{className:"font-mono text-xs",children:n.similarity_threshold.toFixed(2)})]}),e.jsx("input",{id:"embedding-threshold",type:"range",min:"0",max:"1",step:"0.05",value:n.similarity_threshold,onChange:r=>s("similarity_threshold",parseFloat(r.target.value)),className:"w-full cursor-pointer accent-primary"})]}),e.jsxs("div",{className:"flex gap-2 pt-1",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:v,disabled:a.isPending,className:"cursor-pointer",children:a.isPending?t("settings.embeddingTesting"):t("settings.embeddingTest")}),e.jsx(_,{size:"sm",onClick:k,disabled:!b||o.isPending,className:"cursor-pointer",children:o.isPending?t("settings.embeddingSaving"):t("settings.embeddingSave")})]})]})]})})}function se(){const{data:t,isLoading:l}=D(),{t:o}=w(),a=()=>t?t.running?e.jsx(p,{variant:"success",children:o("settings.watcherRunning")}):t.enabled?e.jsx(p,{variant:"warning",children:o("settings.watcherStopped")}):e.jsx(p,{variant:"secondary",children:o("settings.watcherDisabled")}):null;return e.jsxs(u,{children:[e.jsx(x,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(g,{children:o("settings.watcher")}),l?e.jsx(y,{className:"h-5 w-16"}):a()]})}),e.jsx(h,{className:"space-y-4 text-sm",children:l?e.jsxs("div",{className:"space-y-2",children:[e.jsx(y,{className:"h-4 w-full"}),e.jsx(y,{className:"h-4 w-3/4"})]}):t?e.jsxs(e.Fragment,{children:[t.paths.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"mb-1.5 text-xs font-medium text-muted-foreground uppercase tracking-wide",children:o("settings.watcherPaths")}),e.jsx("div",{className:"space-y-1",children:t.paths.map(n=>e.jsx("p",{className:"font-mono text-xs truncate text-foreground",title:n,children:n},n))})]}),e.jsxs("div",{children:[e.jsx("p",{className:"mb-1.5 text-xs font-medium text-muted-foreground uppercase tracking-wide",children:o("settings.watcherRecent")}),t.recent.length>0?e.jsx("div",{className:"space-y-1",children:t.recent.slice(0,5).map((n,f)=>e.jsxs("div",{className:"flex items-center justify-between rounded border border-border/50 px-2 py-1.5",children:[e.jsx("span",{className:"font-mono text-xs truncate max-w-[200px] text-foreground",title:n.path,children:n.path.split(/[/\\]/).pop()}),e.jsxs("span",{className:"shrink-0 ml-2 font-mono text-xs text-muted-foreground",children:["+",n.neurons_created]})]},f))}):e.jsx("p",{className:"text-xs text-muted-foreground",children:o("settings.watcherNoActivity")})]})]}):null})]})}const te=[K,$,q],ne=["#ef4444","#6366f1","#a8a29e"],re=["reportBug","featureRequest","discussions"],ae=["https://github.com/acidkill/surreal-memory/issues/new?template=bug_report.md","https://github.com/acidkill/surreal-memory/issues/new?template=feature_request.md","https://github.com/acidkill/surreal-memory/discussions"];function he(){const{data:t}=A(),{data:l}=R(),{data:o}=U(),{data:a}=O(),{data:n,isLoading:f}=W(),b=Q(),m=Y(),{t:s}=w(),v=i=>{if(i===0)return"0 B";const c=1024,j=["B","KB","MB","GB"],N=Math.floor(Math.log(i)/Math.log(c));return`${(i/Math.pow(c,N)).toFixed(1)} ${j[N]}`},k=()=>{b.mutate(void 0,{onSuccess:i=>{i.status==="success"?d.success(s("settings.testSuccess")):d.error(s("settings.testPartial"))},onError:()=>{d.error(s("settings.testFailed"))}})},r=()=>{m.mutate(void 0,{onSuccess:i=>{i.sent_to>0?d.success(s("settings.backupSuccess",{brain:i.brain,size:i.size_mb,count:i.sent_to})):d.error(s("settings.backupSendFailed"))},onError:()=>{d.error(s("settings.backupFailed"))}})};return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:s("settings.title")}),e.jsx(X,{}),e.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[e.jsxs(u,{children:[e.jsx(x,{children:e.jsx(g,{children:s("settings.general")})}),e.jsxs(h,{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.version")}),e.jsx("span",{className:"font-mono",children:l?.version??"-"})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.activeBrain")}),e.jsx("span",{className:"font-mono",children:t?.active_brain??"-"})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.totalBrains")}),e.jsx("span",{className:"font-mono",children:t?.total_brains??"-"})]}),e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsx("span",{className:"text-muted-foreground",children:s("license.tier","License")}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{variant:a?.is_pro?"success":"secondary",children:(a?.tier??"free").toUpperCase()}),!a?.is_pro&&e.jsx("button",{onClick:I,className:"text-xs font-medium text-primary hover:text-primary/80 transition-colors cursor-pointer",children:s("upgrade.title","Upgrade")})]})]})]})]}),e.jsxs(u,{children:[e.jsx(x,{children:e.jsx(g,{children:s("settings.brainFiles")})}),e.jsx(h,{className:"space-y-3 text-sm",children:o?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.brainsDirectory")}),e.jsx("span",{className:"font-mono text-xs max-w-[200px] truncate",title:o.brains_dir,children:o.brains_dir})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.totalDiskUsage")}),e.jsx("span",{className:"font-mono",children:v(o.total_size_bytes)})]}),o.brains.length>0&&e.jsx("div",{className:"mt-3 space-y-2",children:o.brains.map(i=>e.jsxs("div",{className:"flex items-center justify-between rounded-lg border border-border/50 px-3 py-2",children:[e.jsx("span",{className:"font-mono font-medium",children:i.name}),e.jsx("span",{className:"font-mono text-xs text-muted-foreground",children:v(i.size_bytes)})]},i.name))})]}):e.jsx("p",{className:"text-muted-foreground",children:s("common.loading")})})]}),e.jsxs(u,{children:[e.jsx(x,{children:e.jsx(g,{children:s("settings.telegramBackup")})}),e.jsx(h,{className:"space-y-4 text-sm",children:f?e.jsx("p",{className:"text-muted-foreground",children:s("common.loading")}):n?.configured?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{variant:"success",children:s("settings.connected")}),n.bot_name&&e.jsxs("span",{className:"text-muted-foreground",children:[n.bot_name,n.bot_username&&e.jsxs("span",{className:"font-mono text-xs",children:[" @",n.bot_username]})]})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.chatIds")}),e.jsx("span",{className:"font-mono text-xs",children:n.chat_ids.length>0?n.chat_ids.join(", "):s("common.none")})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("settings.autoBackup")}),e.jsx("span",{className:"font-mono",children:n.backup_on_consolidation?s("common.yes"):s("common.no")})]}),e.jsxs("div",{className:"flex gap-2 pt-2",children:[e.jsx(_,{variant:"outline",size:"sm",onClick:k,disabled:b.isPending,className:"cursor-pointer",children:b.isPending?s("settings.sending"):s("settings.sendTest")}),e.jsx(_,{size:"sm",onClick:r,disabled:m.isPending,className:"cursor-pointer",children:m.isPending?s("settings.backingUp"):s("settings.backupNow")})]})]}):e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(p,{variant:"warning",children:s("settings.notConfigured")})}),n?.error&&e.jsx("p",{className:"text-xs text-destructive",children:n.error}),e.jsx("p",{className:"text-xs text-muted-foreground",dangerouslySetInnerHTML:{__html:s("settings.telegramSetup")}})]})})]}),e.jsx(se,{}),e.jsx(ee,{}),e.jsxs(u,{children:[e.jsx(x,{children:e.jsx(g,{children:s("settings.feedbackTitle")})}),e.jsx(h,{className:"space-y-3",children:re.map((i,c)=>{const j=te[c],N=ne[c],E=ae[c];return e.jsxs("a",{href:E,target:"_blank",rel:"noopener noreferrer",className:"flex items-start gap-3 rounded-lg border border-border/50 p-3 transition-colors hover:bg-accent cursor-pointer",children:[e.jsx("div",{className:"flex size-8 shrink-0 items-center justify-center rounded-lg",style:{backgroundColor:`${N}15`},children:e.jsx(j,{className:"size-4",style:{color:N}})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium",children:s(`settings.${i}`)}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s(`settings.${i}Desc`)})]}),e.jsx(G,{className:"size-3.5 shrink-0 text-muted-foreground mt-0.5"})]},i)})})]})]})]})}export{he as default}; diff --git a/src/surreal_memory/server/static/dist/assets/StoragePage-B_CEarTZ.js b/src/surreal_memory/server/static/dist/assets/StoragePage-BsRzooql.js similarity index 88% rename from src/surreal_memory/server/static/dist/assets/StoragePage-B_CEarTZ.js rename to src/surreal_memory/server/static/dist/assets/StoragePage-BsRzooql.js index 68bad672..3ce2286b 100644 --- a/src/surreal_memory/server/static/dist/assets/StoragePage-B_CEarTZ.js +++ b/src/surreal_memory/server/static/dist/assets/StoragePage-BsRzooql.js @@ -1 +1 @@ -import{u as c,j as e}from"./vendor-query-CqA1cBNl.js";import{o as x,u as i,b as n}from"./index-CSMoVcy_.js";import{C as m,a as u,b as h,c as g}from"./card-DAwbJLqc.js";import{a0 as d,x as f,z as N,p as b}from"./vendor-icons-IAbuZhWE.js";import{S as o}from"./skeleton-CAu64_35.js";import"./vendor-react-BfuodpLv.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";const j={status:["storage","status"],tierStats:["storage","tier-stats"]};function y(){return c({queryKey:j.status,queryFn:()=>x.get("/api/dashboard/storage/status")})}function v(){return c({queryKey:j.tierStats,queryFn:()=>x.get("/api/dashboard/tier-stats")})}function S({status:s}){const{t:a}=i();return e.jsxs(m,{children:[e.jsx(u,{className:"pb-3",children:e.jsxs(h,{className:"flex items-center gap-2 text-base",children:[e.jsx(d,{className:"size-5","aria-hidden":"true"}),a("storage.currentBackend","Storage Backend")]})}),e.jsxs(g,{className:"space-y-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx(n,{variant:"default",className:"text-sm px-3 py-1",children:e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(d,{className:"size-3.5","aria-hidden":"true"}),"SurrealDB"]})}),e.jsx(n,{variant:s.healthy?"outline":"destructive",className:"text-xs",children:s.healthy?a("storage.connected","Connected"):a("storage.disconnected","Disconnected")}),s.health_grade&&e.jsxs(n,{variant:"secondary",className:"text-xs",children:[a("storage.grade","Grade"),": ",s.health_grade]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[s.healthy?e.jsx(f,{className:"size-4 shrink-0 text-green-500","aria-hidden":"true"}):e.jsx(N,{className:"size-4 shrink-0 text-destructive","aria-hidden":"true"}),e.jsx("span",{className:"text-muted-foreground break-all",children:s.url||a("storage.urlUnknown","URL unknown")})]}),(s.namespace||s.database)&&e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-sm text-muted-foreground",children:[e.jsxs("div",{children:[e.jsx("span",{className:"font-medium text-foreground",children:a("storage.namespace","Namespace")}),e.jsx("p",{className:"truncate",children:s.namespace||"—"})]}),e.jsxs("div",{children:[e.jsx("span",{className:"font-medium text-foreground",children:a("storage.database","Database")}),e.jsx("p",{className:"truncate",children:s.database||"—"})]})]}),e.jsxs("dl",{className:"grid grid-cols-3 gap-3 text-center",children:[e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-muted-foreground",children:a("storage.neurons","Neurons")}),e.jsx("dd",{className:"text-lg font-semibold",children:s.neuron_count.toLocaleString()})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-muted-foreground",children:a("storage.synapses","Synapses")}),e.jsx("dd",{className:"text-lg font-semibold",children:s.synapse_count.toLocaleString()})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-muted-foreground",children:a("storage.fibers","Fibers")}),e.jsx("dd",{className:"text-lg font-semibold",children:s.fiber_count.toLocaleString()})]})]})]})]})}function l({label:s,count:a,total:t,color:r}){const p=t>0?a/t*100:0;return e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("div",{className:"flex items-center justify-between text-sm",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"inline-block size-2.5 rounded-full",style:{backgroundColor:r},"aria-hidden":"true"}),s]}),e.jsx("span",{className:"font-mono font-semibold tabular-nums",children:a})]}),e.jsx("div",{className:"h-2 rounded-full bg-muted overflow-hidden",children:e.jsx("div",{className:"h-full rounded-full transition-all duration-500",style:{width:`${p}%`,backgroundColor:r}})})]})}function k({data:s}){const{t:a}=i();return e.jsxs(m,{children:[e.jsx(u,{className:"pb-3",children:e.jsxs(h,{className:"flex items-center gap-2 text-base",children:[e.jsx(b,{className:"size-5","aria-hidden":"true"}),a("storage.tierDistribution")]})}),e.jsxs(g,{className:"space-y-4",children:[e.jsx(l,{label:a("storage.tierHot"),count:s.hot,total:s.total,color:"#ef4444"}),e.jsx(l,{label:a("storage.tierWarm"),count:s.warm,total:s.total,color:"#f59e0b"}),e.jsx(l,{label:a("storage.tierCold"),count:s.cold,total:s.total,color:"#3b82f6"}),e.jsxs("div",{className:"pt-2 border-t text-sm text-muted-foreground",children:[a("storage.totalMemories"),": ",e.jsx("span",{className:"font-mono font-semibold text-foreground",children:s.total})]})]})]})}function q(){const{data:s,isLoading:a}=y(),{data:t}=v(),{t:r}=i();return a||!s?e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsx("h1",{className:"text-2xl font-bold",children:r("storage.title")}),e.jsxs("div",{className:"grid gap-6 md:grid-cols-2",children:[e.jsx(o,{className:"h-48"}),e.jsx(o,{className:"h-48"})]})]}):e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsx("h1",{className:"text-2xl font-bold",children:r("storage.title")}),e.jsxs("div",{className:"grid gap-6 md:grid-cols-2",children:[e.jsx(S,{status:s}),t&&t.total>0&&e.jsx(k,{data:t})]})]})}export{q as default}; +import{u as c,j as e}from"./vendor-query-CqA1cBNl.js";import{o as x,f as i,B as n}from"./index-DXL5wCpD.js";import{C as m,a as u,b as h,c as g}from"./card-Duzfr-hx.js";import{a1 as d,y as p,A as N,q as b}from"./vendor-icons-C6dhS1UE.js";import{S as o}from"./skeleton-CBW-y0cP.js";import"./vendor-react-BfuodpLv.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";const j={status:["storage","status"],tierStats:["storage","tier-stats"]};function y(){return c({queryKey:j.status,queryFn:()=>x.get("/api/dashboard/storage/status")})}function v(){return c({queryKey:j.tierStats,queryFn:()=>x.get("/api/dashboard/tier-stats")})}function S({status:s}){const{t:a}=i();return e.jsxs(m,{children:[e.jsx(u,{className:"pb-3",children:e.jsxs(h,{className:"flex items-center gap-2 text-base",children:[e.jsx(d,{className:"size-5","aria-hidden":"true"}),a("storage.currentBackend","Storage Backend")]})}),e.jsxs(g,{className:"space-y-4",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx(n,{variant:"default",className:"text-sm px-3 py-1",children:e.jsxs("span",{className:"flex items-center gap-1.5",children:[e.jsx(d,{className:"size-3.5","aria-hidden":"true"}),"SurrealDB"]})}),e.jsx(n,{variant:s.healthy?"outline":"destructive",className:"text-xs",children:s.healthy?a("storage.connected","Connected"):a("storage.disconnected","Disconnected")}),s.health_grade&&e.jsxs(n,{variant:"secondary",className:"text-xs",children:[a("storage.grade","Grade"),": ",s.health_grade]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[s.healthy?e.jsx(p,{className:"size-4 shrink-0 text-green-500","aria-hidden":"true"}):e.jsx(N,{className:"size-4 shrink-0 text-destructive","aria-hidden":"true"}),e.jsx("span",{className:"text-muted-foreground break-all",children:s.url||a("storage.urlUnknown","URL unknown")})]}),(s.namespace||s.database)&&e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-sm text-muted-foreground",children:[e.jsxs("div",{children:[e.jsx("span",{className:"font-medium text-foreground",children:a("storage.namespace","Namespace")}),e.jsx("p",{className:"truncate",children:s.namespace||"—"})]}),e.jsxs("div",{children:[e.jsx("span",{className:"font-medium text-foreground",children:a("storage.database","Database")}),e.jsx("p",{className:"truncate",children:s.database||"—"})]})]}),e.jsxs("dl",{className:"grid grid-cols-3 gap-3 text-center",children:[e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-muted-foreground",children:a("storage.neurons","Neurons")}),e.jsx("dd",{className:"text-lg font-semibold",children:s.neuron_count.toLocaleString()})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-muted-foreground",children:a("storage.synapses","Synapses")}),e.jsx("dd",{className:"text-lg font-semibold",children:s.synapse_count.toLocaleString()})]}),e.jsxs("div",{children:[e.jsx("dt",{className:"text-xs text-muted-foreground",children:a("storage.fibers","Fibers")}),e.jsx("dd",{className:"text-lg font-semibold",children:s.fiber_count.toLocaleString()})]})]})]})]})}function l({label:s,count:a,total:t,color:r}){const f=t>0?a/t*100:0;return e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("div",{className:"flex items-center justify-between text-sm",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"inline-block size-2.5 rounded-full",style:{backgroundColor:r},"aria-hidden":"true"}),s]}),e.jsx("span",{className:"font-mono font-semibold tabular-nums",children:a})]}),e.jsx("div",{className:"h-2 rounded-full bg-muted overflow-hidden",children:e.jsx("div",{className:"h-full rounded-full transition-all duration-500",style:{width:`${f}%`,backgroundColor:r}})})]})}function k({data:s}){const{t:a}=i();return e.jsxs(m,{children:[e.jsx(u,{className:"pb-3",children:e.jsxs(h,{className:"flex items-center gap-2 text-base",children:[e.jsx(b,{className:"size-5","aria-hidden":"true"}),a("storage.tierDistribution")]})}),e.jsxs(g,{className:"space-y-4",children:[e.jsx(l,{label:a("storage.tierHot"),count:s.hot,total:s.total,color:"#ef4444"}),e.jsx(l,{label:a("storage.tierWarm"),count:s.warm,total:s.total,color:"#f59e0b"}),e.jsx(l,{label:a("storage.tierCold"),count:s.cold,total:s.total,color:"#3b82f6"}),e.jsxs("div",{className:"pt-2 border-t text-sm text-muted-foreground",children:[a("storage.totalMemories"),": ",e.jsx("span",{className:"font-mono font-semibold text-foreground",children:s.total})]})]})]})}function _(){const{data:s,isLoading:a}=y(),{data:t}=v(),{t:r}=i();return a||!s?e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsx("h1",{className:"text-2xl font-bold",children:r("storage.title")}),e.jsxs("div",{className:"grid gap-6 md:grid-cols-2",children:[e.jsx(o,{className:"h-48"}),e.jsx(o,{className:"h-48"})]})]}):e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsx("h1",{className:"text-2xl font-bold",children:r("storage.title")}),e.jsxs("div",{className:"grid gap-6 md:grid-cols-2",children:[e.jsx(S,{status:s}),t&&t.total>0&&e.jsx(k,{data:t})]})]})}export{_ as default}; diff --git a/src/surreal_memory/server/static/dist/assets/SyncPage-XGbJa_ff.js b/src/surreal_memory/server/static/dist/assets/SyncPage-BRERoUGJ.js similarity index 92% rename from src/surreal_memory/server/static/dist/assets/SyncPage-XGbJa_ff.js rename to src/surreal_memory/server/static/dist/assets/SyncPage-BRERoUGJ.js index 01427d57..dc07fa86 100644 --- a/src/surreal_memory/server/static/dist/assets/SyncPage-XGbJa_ff.js +++ b/src/surreal_memory/server/static/dist/assets/SyncPage-BRERoUGJ.js @@ -1 +1 @@ -import{u as z,a as L,b as E,j as e}from"./vendor-query-CqA1cBNl.js";import{r as y}from"./vendor-react-BfuodpLv.js";import{o as N,u as P,B as i,b as p,t as a}from"./index-CSMoVcy_.js";import{C as o,a as d,b as u,c as m}from"./card-DAwbJLqc.js";import{T as q,g as D,U as F,u as R,V as T,W as B}from"./vendor-icons-IAbuZhWE.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";const b={status:["sync","status"]};function H(){return z({queryKey:b.status,queryFn:()=>N.get("/api/dashboard/sync-status"),refetchInterval:3e4})}function K(){const t=L();return E({mutationFn:x=>N.post("/api/dashboard/sync-config",x),onSuccess:()=>{t.invalidateQueries({queryKey:b.status})}})}const A="",I="https://your-worker.your-subdomain.workers.dev",Q={prefer_recent:"Prefer Recent",prefer_local:"Prefer Local",prefer_remote:"Prefer Remote",prefer_stronger:"Prefer Stronger"};function J(){const{data:t,isLoading:x,refetch:v}=H(),r=K(),{t:s}=P(),[f,_]=y.useState(""),[j,g]=y.useState(""),[C,h]=y.useState(!1),k=()=>{const n=f.trim()||A,l=j.trim();if(!l){a.error(s("sync.keyRequired"));return}if(!l.startsWith("nmk_")){a.error(s("sync.keyInvalid"));return}r.mutate({hub_url:n,api_key:l,enabled:!0},{onSuccess:()=>{a.success(s("sync.connected")),h(!1),g("")},onError:()=>a.error(s("sync.connectFailed"))})},S=()=>{r.mutate({enabled:!1,api_key:"",hub_url:""},{onSuccess:()=>a.success(s("sync.disconnected")),onError:()=>a.error(s("sync.disconnectFailed"))})},w=n=>{r.mutate({conflict_strategy:n},{onSuccess:()=>a.success(s("sync.strategyUpdated")),onError:()=>a.error(s("sync.updateFailed"))})},U=n=>n?new Date(n).toLocaleString():s("sync.never");if(x)return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:s("sync.title")}),e.jsx("p",{className:"text-muted-foreground",children:s("common.loading")})]});const c=t?.enabled&&t.api_key!=="(not set)";return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:s("sync.title")}),e.jsxs(i,{variant:"outline",size:"sm",onClick:()=>v(),className:"cursor-pointer",children:[e.jsx(q,{className:"mr-2 size-4"}),s("sync.refresh")]})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs(u,{className:"flex items-center gap-2",children:[c?e.jsx(D,{className:"size-5 text-emerald-500"}):e.jsx(F,{className:"size-5 text-muted-foreground"}),s("sync.connectionStatus")]})}),e.jsxs(m,{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.status")}),e.jsx(p,{variant:c?"success":"warning",children:s(c?"sync.cloudConnected":"sync.notConnected")})]}),c&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.hubUrl")}),e.jsx("span",{className:"max-w-[200px] truncate font-mono text-xs",title:t.hub_url,children:t.hub_url})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.apiKey")}),e.jsx("span",{className:"font-mono text-xs",children:t.api_key})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.deviceId")}),e.jsxs("span",{className:"font-mono text-xs",children:[t.device_id?.slice(0,12),"..."]})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.syncMode")}),e.jsx(p,{variant:"success",children:s("sync.merkleDelta")})]})]}),e.jsx("div",{className:"flex gap-2 pt-2",children:c?e.jsx(i,{variant:"destructive",size:"sm",onClick:S,disabled:r.isPending,className:"cursor-pointer",children:s("sync.disconnect")}):e.jsx(i,{size:"sm",onClick:()=>h(!0),className:"cursor-pointer",children:s("sync.setupCloud")})})]})]}),C&&!c&&e.jsxs(o,{children:[e.jsx(d,{children:e.jsx(u,{children:s("sync.setupTitle")})}),e.jsxs(m,{className:"space-y-4 text-sm",children:[e.jsx("p",{className:"text-muted-foreground",children:s("sync.setupDesc")}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"hub-url",className:"text-xs font-medium text-muted-foreground",children:s("sync.hubUrl")}),e.jsx("input",{id:"hub-url",type:"url",value:f,onChange:n=>_(n.target.value),placeholder:I,className:"w-full rounded-md border border-border bg-background px-3 py-2 text-sm font-mono focus:outline-none focus:ring-2 focus:ring-ring"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"api-key",className:"text-xs font-medium text-muted-foreground",children:s("sync.apiKey")}),e.jsx("input",{id:"api-key",type:"password",value:j,onChange:n=>g(n.target.value),placeholder:"nmk_...",className:"w-full rounded-md border border-border bg-background px-3 py-2 text-sm font-mono focus:outline-none focus:ring-2 focus:ring-ring"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s("sync.keyHint")})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(i,{size:"sm",onClick:k,disabled:r.isPending,className:"cursor-pointer",children:r.isPending?s("sync.connecting"):s("sync.connect")}),e.jsx(i,{variant:"outline",size:"sm",onClick:()=>h(!1),className:"cursor-pointer",children:s("common.cancel")})]})]})]}),c&&e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs(u,{className:"flex items-center gap-2",children:[e.jsx(R,{className:"size-5"}),s("sync.devices")," (",t.device_count,")"]})}),e.jsx(m,{className:"space-y-3 text-sm",children:t.devices.length>0?t.devices.map(n=>e.jsxs("div",{className:"flex items-center justify-between rounded-lg border border-border/50 px-3 py-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"font-mono text-xs font-medium",children:n.device_name||n.device_id.slice(0,12)}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[s("sync.lastSync"),": ",U(n.last_sync_at)]})]}),e.jsxs(p,{variant:"outline",className:"shrink-0",children:["seq ",n.last_sync_sequence]})]},n.device_id)):e.jsx("p",{className:"text-muted-foreground",children:s("sync.noDevices")})})]}),c&&t.change_log&&e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs(u,{className:"flex items-center gap-2",children:[e.jsx(T,{className:"size-5"}),s("sync.changeLog")]})}),e.jsxs(m,{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.totalChanges")}),e.jsx("span",{className:"font-mono",children:t.change_log.total_changes})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.synced")}),e.jsx("span",{className:"font-mono text-emerald-500",children:t.change_log.synced_changes})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.pending")}),e.jsx("span",{className:"font-mono text-amber-500",children:t.change_log.unsynced_changes})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.latestSequence")}),e.jsx("span",{className:"font-mono",children:t.change_log.latest_sequence})]})]})]}),c&&e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs(u,{className:"flex items-center gap-2",children:[e.jsx(B,{className:"size-5"}),s("sync.conflictStrategy")]})}),e.jsxs(m,{className:"space-y-3 text-sm",children:[e.jsx("p",{className:"text-muted-foreground",children:s("sync.conflictDesc")}),e.jsx("div",{className:"grid grid-cols-2 gap-2",children:Object.entries(Q).map(([n,l])=>e.jsx("button",{onClick:()=>w(n),disabled:r.isPending,className:`cursor-pointer rounded-lg border px-3 py-2 text-xs font-medium transition-colors ${t.conflict_strategy===n?"border-primary bg-primary/10 text-primary":"border-border hover:bg-accent"}`,children:l},n))})]})]})]})]})}export{J as default}; +import{u as z,a as L,b as E,j as e}from"./vendor-query-CqA1cBNl.js";import{r as y}from"./vendor-react-BfuodpLv.js";import{o as N,f as P,a as i,B as p,t as a}from"./index-DXL5wCpD.js";import{C as o,a as d,b as u,c as m}from"./card-Duzfr-hx.js";import{U as q,g as D,V as F,v as R,W as B,X as H}from"./vendor-icons-C6dhS1UE.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";const b={status:["sync","status"]};function K(){return z({queryKey:b.status,queryFn:()=>N.get("/api/dashboard/sync-status"),refetchInterval:3e4})}function T(){const t=L();return E({mutationFn:x=>N.post("/api/dashboard/sync-config",x),onSuccess:()=>{t.invalidateQueries({queryKey:b.status})}})}const A="",I="https://your-worker.your-subdomain.workers.dev",Q={prefer_recent:"Prefer Recent",prefer_local:"Prefer Local",prefer_remote:"Prefer Remote",prefer_stronger:"Prefer Stronger"};function Y(){const{data:t,isLoading:x,refetch:v}=K(),r=T(),{t:s}=P(),[f,_]=y.useState(""),[j,g]=y.useState(""),[C,h]=y.useState(!1),k=()=>{const n=f.trim()||A,l=j.trim();if(!l){a.error(s("sync.keyRequired"));return}if(!l.startsWith("nmk_")){a.error(s("sync.keyInvalid"));return}r.mutate({hub_url:n,api_key:l,enabled:!0},{onSuccess:()=>{a.success(s("sync.connected")),h(!1),g("")},onError:()=>a.error(s("sync.connectFailed"))})},S=()=>{r.mutate({enabled:!1,api_key:"",hub_url:""},{onSuccess:()=>a.success(s("sync.disconnected")),onError:()=>a.error(s("sync.disconnectFailed"))})},w=n=>{r.mutate({conflict_strategy:n},{onSuccess:()=>a.success(s("sync.strategyUpdated")),onError:()=>a.error(s("sync.updateFailed"))})},U=n=>n?new Date(n).toLocaleString():s("sync.never");if(x)return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:s("sync.title")}),e.jsx("p",{className:"text-muted-foreground",children:s("common.loading")})]});const c=t?.enabled&&t.api_key!=="(not set)";return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:s("sync.title")}),e.jsxs(i,{variant:"outline",size:"sm",onClick:()=>v(),className:"cursor-pointer",children:[e.jsx(q,{className:"mr-2 size-4"}),s("sync.refresh")]})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs(u,{className:"flex items-center gap-2",children:[c?e.jsx(D,{className:"size-5 text-emerald-500"}):e.jsx(F,{className:"size-5 text-muted-foreground"}),s("sync.connectionStatus")]})}),e.jsxs(m,{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.status")}),e.jsx(p,{variant:c?"success":"warning",children:s(c?"sync.cloudConnected":"sync.notConnected")})]}),c&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.hubUrl")}),e.jsx("span",{className:"max-w-[200px] truncate font-mono text-xs",title:t.hub_url,children:t.hub_url})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.apiKey")}),e.jsx("span",{className:"font-mono text-xs",children:t.api_key})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.deviceId")}),e.jsxs("span",{className:"font-mono text-xs",children:[t.device_id?.slice(0,12),"..."]})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.syncMode")}),e.jsx(p,{variant:"success",children:s("sync.merkleDelta")})]})]}),e.jsx("div",{className:"flex gap-2 pt-2",children:c?e.jsx(i,{variant:"destructive",size:"sm",onClick:S,disabled:r.isPending,className:"cursor-pointer",children:s("sync.disconnect")}):e.jsx(i,{size:"sm",onClick:()=>h(!0),className:"cursor-pointer",children:s("sync.setupCloud")})})]})]}),C&&!c&&e.jsxs(o,{children:[e.jsx(d,{children:e.jsx(u,{children:s("sync.setupTitle")})}),e.jsxs(m,{className:"space-y-4 text-sm",children:[e.jsx("p",{className:"text-muted-foreground",children:s("sync.setupDesc")}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"hub-url",className:"text-xs font-medium text-muted-foreground",children:s("sync.hubUrl")}),e.jsx("input",{id:"hub-url",type:"url",value:f,onChange:n=>_(n.target.value),placeholder:I,className:"w-full rounded-md border border-border bg-background px-3 py-2 text-sm font-mono focus:outline-none focus:ring-2 focus:ring-ring"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"api-key",className:"text-xs font-medium text-muted-foreground",children:s("sync.apiKey")}),e.jsx("input",{id:"api-key",type:"password",value:j,onChange:n=>g(n.target.value),placeholder:"nmk_...",className:"w-full rounded-md border border-border bg-background px-3 py-2 text-sm font-mono focus:outline-none focus:ring-2 focus:ring-ring"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:s("sync.keyHint")})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(i,{size:"sm",onClick:k,disabled:r.isPending,className:"cursor-pointer",children:r.isPending?s("sync.connecting"):s("sync.connect")}),e.jsx(i,{variant:"outline",size:"sm",onClick:()=>h(!1),className:"cursor-pointer",children:s("common.cancel")})]})]})]}),c&&e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs(u,{className:"flex items-center gap-2",children:[e.jsx(R,{className:"size-5"}),s("sync.devices")," (",t.device_count,")"]})}),e.jsx(m,{className:"space-y-3 text-sm",children:t.devices.length>0?t.devices.map(n=>e.jsxs("div",{className:"flex items-center justify-between rounded-lg border border-border/50 px-3 py-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"font-mono text-xs font-medium",children:n.device_name||n.device_id.slice(0,12)}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[s("sync.lastSync"),": ",U(n.last_sync_at)]})]}),e.jsxs(p,{variant:"outline",className:"shrink-0",children:["seq ",n.last_sync_sequence]})]},n.device_id)):e.jsx("p",{className:"text-muted-foreground",children:s("sync.noDevices")})})]}),c&&t.change_log&&e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs(u,{className:"flex items-center gap-2",children:[e.jsx(B,{className:"size-5"}),s("sync.changeLog")]})}),e.jsxs(m,{className:"space-y-3 text-sm",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.totalChanges")}),e.jsx("span",{className:"font-mono",children:t.change_log.total_changes})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.synced")}),e.jsx("span",{className:"font-mono text-emerald-500",children:t.change_log.synced_changes})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.pending")}),e.jsx("span",{className:"font-mono text-amber-500",children:t.change_log.unsynced_changes})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:s("sync.latestSequence")}),e.jsx("span",{className:"font-mono",children:t.change_log.latest_sequence})]})]})]}),c&&e.jsxs(o,{children:[e.jsx(d,{children:e.jsxs(u,{className:"flex items-center gap-2",children:[e.jsx(H,{className:"size-5"}),s("sync.conflictStrategy")]})}),e.jsxs(m,{className:"space-y-3 text-sm",children:[e.jsx("p",{className:"text-muted-foreground",children:s("sync.conflictDesc")}),e.jsx("div",{className:"grid grid-cols-2 gap-2",children:Object.entries(Q).map(([n,l])=>e.jsx("button",{onClick:()=>w(n),disabled:r.isPending,className:`cursor-pointer rounded-lg border px-3 py-2 text-xs font-medium transition-colors ${t.conflict_strategy===n?"border-primary bg-primary/10 text-primary":"border-border hover:bg-accent"}`,children:l},n))})]})]})]})]})}export{Y as default}; diff --git a/src/surreal_memory/server/static/dist/assets/TimelinePage-ByrSgpuo.js b/src/surreal_memory/server/static/dist/assets/TimelinePage-2mV1L6iZ.js similarity index 87% rename from src/surreal_memory/server/static/dist/assets/TimelinePage-ByrSgpuo.js rename to src/surreal_memory/server/static/dist/assets/TimelinePage-2mV1L6iZ.js index 3695d6a8..db57973f 100644 --- a/src/surreal_memory/server/static/dist/assets/TimelinePage-ByrSgpuo.js +++ b/src/surreal_memory/server/static/dist/assets/TimelinePage-2mV1L6iZ.js @@ -1 +1 @@ -import{j as e}from"./vendor-query-CqA1cBNl.js";import{r as p}from"./vendor-react-BfuodpLv.js";import{j as E,k as P,u as T,b as z}from"./index-CSMoVcy_.js";import{C as f,a as v,b,c as u}from"./card-DAwbJLqc.js";import{S as y}from"./skeleton-CAu64_35.js";import{c as L,p as R,G as K,P as G}from"./vendor-icons-IAbuZhWE.js";import{R as k,A as M,C as B,X as S,Y as C,T as D,e as N,B as $,f as W,g as Y}from"./vendor-recharts-BkwZfCWA.js";import"./vendor-ui-Qm4_4bAc.js";const F=[{days:7,key:"range7d"},{days:30,key:"range30d"},{days:90,key:"range90d"},{days:365,key:"rangeAll"}],I={entity:"var(--color-chart-1)",concept:"var(--color-chart-2)",action:"var(--color-chart-3)",intent:"var(--color-chart-4)",time:"var(--color-chart-5, #8b5cf6)",spatial:"#f59e0b",state:"#06b6d4",sensory:"#ec4899"};function h({label:d,value:n,icon:s,loading:o}){return e.jsx(f,{children:e.jsxs(u,{className:"flex items-center gap-4 p-5",children:[e.jsx("div",{className:"flex size-10 items-center justify-center rounded-lg bg-primary/10",children:e.jsx(s,{className:"size-5 text-primary","aria-hidden":"true"})}),e.jsxs("div",{children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:d}),o?e.jsx(y,{className:"mt-1 h-6 w-16"}):e.jsx("p",{className:"font-mono text-xl font-bold tracking-tight",children:typeof n=="number"?n.toLocaleString():n})]})]})})}function ee(){const[d,n]=p.useState(30),{data:s,isLoading:o}=E(d),{data:l,isLoading:O}=P(20,0),{t:r}=T(),x=p.useMemo(()=>{if(!s||s.length===0)return{today:0,total:0,avgPerDay:0,activeDays:0};const t=new Date().toISOString().slice(0,10),a=s.find(c=>c.date===t),i=a?a.fibers_created:0,m=s.reduce((c,A)=>c+A.fibers_created,0),g=s.filter(c=>c.fibers_created>0).length,w=g>0?Math.round(m/g):0;return{today:i,total:m,avgPerDay:w,activeDays:g}},[s]),j=p.useMemo(()=>{if(!s)return[];const t={};for(const a of s)for(const[i,m]of Object.entries(a.neuron_types))t[i]=(t[i]??0)+m;return Object.entries(t).map(([a,i])=>({type:a,count:i})).sort((a,i)=>i.count-a.count)},[s]),_=p.useMemo(()=>s?s.map(t=>({date:t.date.slice(5),neurons:t.neurons_created,fibers:t.fibers_created,synapses:t.synapses_created})):[],[s]);return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:r("timeline.title")}),e.jsx("div",{className:"flex gap-1 rounded-lg border border-border p-1",children:F.map(t=>e.jsx("button",{onClick:()=>n(t.days),className:`cursor-pointer rounded-md px-3 py-1.5 text-xs font-medium transition-colors ${d===t.days?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-accent/50"}`,children:r(`timeline.${t.key}`)},t.days))})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4 lg:grid-cols-4",children:[e.jsx(h,{label:r("timeline.todayMemories"),value:x.today,icon:L,loading:o}),e.jsx(h,{label:r("timeline.totalPeriod"),value:x.total,icon:R,loading:o}),e.jsx(h,{label:r("timeline.avgPerDay"),value:x.avgPerDay,icon:K,loading:o}),e.jsx(h,{label:r("timeline.activeDays"),value:x.activeDays,icon:G,loading:o})]}),e.jsxs(f,{children:[e.jsx(v,{children:e.jsx(b,{children:r("timeline.activityTrend")})}),e.jsx(u,{children:o?e.jsx(y,{className:"h-72 w-full"}):e.jsx(k,{width:"100%",height:280,children:e.jsxs(M,{data:_,children:[e.jsxs("defs",{children:[e.jsxs("linearGradient",{id:"colorNeurons",x1:"0",y1:"0",x2:"0",y2:"1",children:[e.jsx("stop",{offset:"5%",stopColor:"var(--color-chart-1)",stopOpacity:.3}),e.jsx("stop",{offset:"95%",stopColor:"var(--color-chart-1)",stopOpacity:0})]}),e.jsxs("linearGradient",{id:"colorFibers",x1:"0",y1:"0",x2:"0",y2:"1",children:[e.jsx("stop",{offset:"5%",stopColor:"var(--color-chart-2)",stopOpacity:.3}),e.jsx("stop",{offset:"95%",stopColor:"var(--color-chart-2)",stopOpacity:0})]}),e.jsxs("linearGradient",{id:"colorSynapses",x1:"0",y1:"0",x2:"0",y2:"1",children:[e.jsx("stop",{offset:"5%",stopColor:"var(--color-chart-4)",stopOpacity:.3}),e.jsx("stop",{offset:"95%",stopColor:"var(--color-chart-4)",stopOpacity:0})]})]}),e.jsx(B,{strokeDasharray:"3 3",stroke:"var(--color-border)",opacity:.3}),e.jsx(S,{dataKey:"date",tick:{fill:"var(--color-muted-foreground)",fontSize:11},interval:"preserveStartEnd"}),e.jsx(C,{tick:{fill:"var(--color-muted-foreground)",fontSize:11},width:40}),e.jsx(D,{contentStyle:{backgroundColor:"var(--color-card)",border:"1px solid var(--color-border)",borderRadius:"8px",fontSize:"12px"}}),e.jsx(N,{type:"monotone",dataKey:"neurons",name:r("timeline.neurons"),stroke:"var(--color-chart-1)",fill:"url(#colorNeurons)",strokeWidth:2}),e.jsx(N,{type:"monotone",dataKey:"fibers",name:r("timeline.fibers"),stroke:"var(--color-chart-2)",fill:"url(#colorFibers)",strokeWidth:2}),e.jsx(N,{type:"monotone",dataKey:"synapses",name:r("timeline.synapses"),stroke:"var(--color-chart-4)",fill:"url(#colorSynapses)",strokeWidth:2})]})})})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[e.jsxs(f,{children:[e.jsx(v,{children:e.jsx(b,{children:r("timeline.neuronDistribution")})}),e.jsx(u,{children:o?e.jsx(y,{className:"h-64 w-full"}):j.length>0?e.jsx(k,{width:"100%",height:260,children:e.jsxs($,{data:j,layout:"vertical",children:[e.jsx(S,{type:"number",tick:{fill:"var(--color-muted-foreground)",fontSize:11}}),e.jsx(C,{dataKey:"type",type:"category",tick:{fill:"var(--color-muted-foreground)",fontSize:11},width:70}),e.jsx(D,{contentStyle:{backgroundColor:"var(--color-card)",border:"1px solid var(--color-border)",borderRadius:"8px",fontSize:"12px"}}),e.jsx(W,{dataKey:"count",radius:[0,4,4,0],children:j.map(t=>e.jsx(Y,{fill:I[t.type]??"var(--color-chart-1)"},t.type))})]})}):e.jsx("p",{className:"text-sm text-muted-foreground",children:r("timeline.noEntries")})})]}),e.jsxs(f,{children:[e.jsx(v,{children:e.jsxs(b,{children:[r("timeline.recentActivity"),l&&e.jsx("span",{className:"ml-2 text-sm font-normal text-muted-foreground",children:r("timeline.entries",{total:l.total.toLocaleString()})})]})}),e.jsx(u,{children:O?e.jsx("div",{className:"space-y-3",children:Array.from({length:5}).map((t,a)=>e.jsx(y,{className:"h-14 w-full"},a))}):l?.entries&&l.entries.length>0?e.jsx("div",{className:"max-h-96 space-y-2 overflow-y-auto",children:l.entries.map(t=>e.jsxs("div",{className:"flex items-start gap-3 rounded-lg border border-border/50 p-3 transition-colors hover:bg-accent/30",children:[e.jsx(z,{variant:"outline",className:"mt-0.5 shrink-0",children:t.neuron_type}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"text-sm leading-relaxed line-clamp-2",children:t.content}),e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:t.created_at?new Date(t.created_at).toLocaleString():"-"})]})]},t.id))}):e.jsx("p",{className:"text-sm text-muted-foreground",children:r("timeline.noEntries")})})]})]})]})}export{ee as default}; +import{j as e}from"./vendor-query-CqA1cBNl.js";import{r as p}from"./vendor-react-BfuodpLv.js";import{j as E,k as T,f as z,B as L}from"./index-DXL5wCpD.js";import{C as f,a as v,b,c as u}from"./card-Duzfr-hx.js";import{S as y}from"./skeleton-CBW-y0cP.js";import{c as P,q as R,H as K,Q as B}from"./vendor-icons-C6dhS1UE.js";import{R as k,A as G,C as M,X as S,Y as C,T as D,e as N,B as $,f as W,g as Y}from"./vendor-recharts-BkwZfCWA.js";import"./vendor-ui-Qm4_4bAc.js";const F=[{days:7,key:"range7d"},{days:30,key:"range30d"},{days:90,key:"range90d"},{days:365,key:"rangeAll"}],H={entity:"var(--color-chart-1)",concept:"var(--color-chart-2)",action:"var(--color-chart-3)",intent:"var(--color-chart-4)",time:"var(--color-chart-5, #8b5cf6)",spatial:"#f59e0b",state:"#06b6d4",sensory:"#ec4899"};function h({label:d,value:n,icon:s,loading:o}){return e.jsx(f,{children:e.jsxs(u,{className:"flex items-center gap-4 p-5",children:[e.jsx("div",{className:"flex size-10 items-center justify-center rounded-lg bg-primary/10",children:e.jsx(s,{className:"size-5 text-primary","aria-hidden":"true"})}),e.jsxs("div",{children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:d}),o?e.jsx(y,{className:"mt-1 h-6 w-16"}):e.jsx("p",{className:"font-mono text-xl font-bold tracking-tight",children:typeof n=="number"?n.toLocaleString():n})]})]})})}function ee(){const[d,n]=p.useState(30),{data:s,isLoading:o}=E(d),{data:l,isLoading:O}=T(20,0),{t:r}=z(),x=p.useMemo(()=>{if(!s||s.length===0)return{today:0,total:0,avgPerDay:0,activeDays:0};const t=new Date().toISOString().slice(0,10),a=s.find(c=>c.date===t),i=a?a.fibers_created:0,m=s.reduce((c,A)=>c+A.fibers_created,0),g=s.filter(c=>c.fibers_created>0).length,w=g>0?Math.round(m/g):0;return{today:i,total:m,avgPerDay:w,activeDays:g}},[s]),j=p.useMemo(()=>{if(!s)return[];const t={};for(const a of s)for(const[i,m]of Object.entries(a.neuron_types))t[i]=(t[i]??0)+m;return Object.entries(t).map(([a,i])=>({type:a,count:i})).sort((a,i)=>i.count-a.count)},[s]),_=p.useMemo(()=>s?s.map(t=>({date:t.date.slice(5),neurons:t.neurons_created,fibers:t.fibers_created,synapses:t.synapses_created})):[],[s]);return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:r("timeline.title")}),e.jsx("div",{className:"flex gap-1 rounded-lg border border-border p-1",children:F.map(t=>e.jsx("button",{onClick:()=>n(t.days),className:`cursor-pointer rounded-md px-3 py-1.5 text-xs font-medium transition-colors ${d===t.days?"bg-primary text-primary-foreground":"text-muted-foreground hover:bg-accent/50"}`,children:r(`timeline.${t.key}`)},t.days))})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4 lg:grid-cols-4",children:[e.jsx(h,{label:r("timeline.todayMemories"),value:x.today,icon:P,loading:o}),e.jsx(h,{label:r("timeline.totalPeriod"),value:x.total,icon:R,loading:o}),e.jsx(h,{label:r("timeline.avgPerDay"),value:x.avgPerDay,icon:K,loading:o}),e.jsx(h,{label:r("timeline.activeDays"),value:x.activeDays,icon:B,loading:o})]}),e.jsxs(f,{children:[e.jsx(v,{children:e.jsx(b,{children:r("timeline.activityTrend")})}),e.jsx(u,{children:o?e.jsx(y,{className:"h-72 w-full"}):e.jsx(k,{width:"100%",height:280,children:e.jsxs(G,{data:_,children:[e.jsxs("defs",{children:[e.jsxs("linearGradient",{id:"colorNeurons",x1:"0",y1:"0",x2:"0",y2:"1",children:[e.jsx("stop",{offset:"5%",stopColor:"var(--color-chart-1)",stopOpacity:.3}),e.jsx("stop",{offset:"95%",stopColor:"var(--color-chart-1)",stopOpacity:0})]}),e.jsxs("linearGradient",{id:"colorFibers",x1:"0",y1:"0",x2:"0",y2:"1",children:[e.jsx("stop",{offset:"5%",stopColor:"var(--color-chart-2)",stopOpacity:.3}),e.jsx("stop",{offset:"95%",stopColor:"var(--color-chart-2)",stopOpacity:0})]}),e.jsxs("linearGradient",{id:"colorSynapses",x1:"0",y1:"0",x2:"0",y2:"1",children:[e.jsx("stop",{offset:"5%",stopColor:"var(--color-chart-4)",stopOpacity:.3}),e.jsx("stop",{offset:"95%",stopColor:"var(--color-chart-4)",stopOpacity:0})]})]}),e.jsx(M,{strokeDasharray:"3 3",stroke:"var(--color-border)",opacity:.3}),e.jsx(S,{dataKey:"date",tick:{fill:"var(--color-muted-foreground)",fontSize:11},interval:"preserveStartEnd"}),e.jsx(C,{tick:{fill:"var(--color-muted-foreground)",fontSize:11},width:40}),e.jsx(D,{contentStyle:{backgroundColor:"var(--color-card)",border:"1px solid var(--color-border)",borderRadius:"8px",fontSize:"12px"}}),e.jsx(N,{type:"monotone",dataKey:"neurons",name:r("timeline.neurons"),stroke:"var(--color-chart-1)",fill:"url(#colorNeurons)",strokeWidth:2}),e.jsx(N,{type:"monotone",dataKey:"fibers",name:r("timeline.fibers"),stroke:"var(--color-chart-2)",fill:"url(#colorFibers)",strokeWidth:2}),e.jsx(N,{type:"monotone",dataKey:"synapses",name:r("timeline.synapses"),stroke:"var(--color-chart-4)",fill:"url(#colorSynapses)",strokeWidth:2})]})})})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[e.jsxs(f,{children:[e.jsx(v,{children:e.jsx(b,{children:r("timeline.neuronDistribution")})}),e.jsx(u,{children:o?e.jsx(y,{className:"h-64 w-full"}):j.length>0?e.jsx(k,{width:"100%",height:260,children:e.jsxs($,{data:j,layout:"vertical",children:[e.jsx(S,{type:"number",tick:{fill:"var(--color-muted-foreground)",fontSize:11}}),e.jsx(C,{dataKey:"type",type:"category",tick:{fill:"var(--color-muted-foreground)",fontSize:11},width:70}),e.jsx(D,{contentStyle:{backgroundColor:"var(--color-card)",border:"1px solid var(--color-border)",borderRadius:"8px",fontSize:"12px"}}),e.jsx(W,{dataKey:"count",radius:[0,4,4,0],children:j.map(t=>e.jsx(Y,{fill:H[t.type]??"var(--color-chart-1)"},t.type))})]})}):e.jsx("p",{className:"text-sm text-muted-foreground",children:r("timeline.noEntries")})})]}),e.jsxs(f,{children:[e.jsx(v,{children:e.jsxs(b,{children:[r("timeline.recentActivity"),l&&e.jsx("span",{className:"ml-2 text-sm font-normal text-muted-foreground",children:r("timeline.entries",{total:l.total.toLocaleString()})})]})}),e.jsx(u,{children:O?e.jsx("div",{className:"space-y-3",children:Array.from({length:5}).map((t,a)=>e.jsx(y,{className:"h-14 w-full"},a))}):l?.entries&&l.entries.length>0?e.jsx("div",{className:"max-h-96 space-y-2 overflow-y-auto",children:l.entries.map(t=>e.jsxs("div",{className:"flex items-start gap-3 rounded-lg border border-border/50 p-3 transition-colors hover:bg-accent/30",children:[e.jsx(L,{variant:"outline",className:"mt-0.5 shrink-0",children:t.neuron_type}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("p",{className:"text-sm leading-relaxed line-clamp-2",children:t.content}),e.jsx("p",{className:"mt-1 text-xs text-muted-foreground",children:t.created_at?new Date(t.created_at).toLocaleString():"-"})]})]},t.id))}):e.jsx("p",{className:"text-sm text-muted-foreground",children:r("timeline.noEntries")})})]})]})]})}export{ee as default}; diff --git a/src/surreal_memory/server/static/dist/assets/ToolStatsPage-C3TV9sEV.js b/src/surreal_memory/server/static/dist/assets/ToolStatsPage-yrXaz2Sj.js similarity index 95% rename from src/surreal_memory/server/static/dist/assets/ToolStatsPage-C3TV9sEV.js rename to src/surreal_memory/server/static/dist/assets/ToolStatsPage-yrXaz2Sj.js index bc2f51fc..092f5ffe 100644 --- a/src/surreal_memory/server/static/dist/assets/ToolStatsPage-C3TV9sEV.js +++ b/src/surreal_memory/server/static/dist/assets/ToolStatsPage-yrXaz2Sj.js @@ -1 +1 @@ -import{j as t}from"./vendor-query-CqA1cBNl.js";import{r as u}from"./vendor-react-BfuodpLv.js";import{z as w,u as T,B as R,b as k}from"./index-CSMoVcy_.js";import{C as l,a as c,b as d,c as i}from"./card-DAwbJLqc.js";import{S as x}from"./skeleton-CAu64_35.js";import{R as g,B as D,C as N,X as b,Y as y,T as S,f as M,g as B,L,p as z}from"./vendor-recharts-BkwZfCWA.js";import"./vendor-icons-IAbuZhWE.js";import"./vendor-ui-Qm4_4bAc.js";const A=[7,14,30,90],v=["#6366f1","#10b981","#f59e0b","#ef4444","#06b6d4","#8b5cf6","#ec4899","#14b8a6","#f97316","#64748b"];function O(o){return o<1e3?`${Math.round(o)}ms`:`${(o/1e3).toFixed(1)}s`}function _(o){return`${Math.round(o*100)}%`}function E(o){return o>=.95?"success":o>=.8?"warning":"destructive"}function H(){const[o,C]=u.useState(30),{data:j,isLoading:n}=w(o),{t:a}=T(),r=j?.summary,f=j?.daily??[],p=u.useMemo(()=>{const s=new Map;for(const e of f){const m=s.get(e.date);m?(m.count+=e.count,m.successes+=Math.round(e.count*e.success_rate)):s.set(e.date,{date:e.date,count:e.count,successes:Math.round(e.count*e.success_rate)})}return Array.from(s.values()).sort((e,m)=>e.date.localeCompare(m.date)).map(e=>({date:e.date.slice(5),count:e.count,successRate:e.count>0?Math.round(e.successes/e.count*100):0}))},[f]),h=u.useMemo(()=>r?.top_tools?r.top_tools.slice(0,10).map(s=>({...s,shortName:s.tool_name.replace(/^smem_/,"")})):[],[r]);return t.jsxs("div",{className:"space-y-6 p-6",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("h1",{className:"font-display text-2xl font-bold",children:a("toolStats.title")}),t.jsx("div",{className:"flex gap-1",children:A.map(s=>t.jsxs(R,{variant:o===s?"default":"outline",size:"sm",onClick:()=>C(s),className:"cursor-pointer",children:[s,"d"]},s))})]}),t.jsxs("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-3",children:[t.jsxs(l,{children:[t.jsx(c,{className:"pb-2",children:t.jsx(d,{className:"text-sm font-medium text-muted-foreground",children:a("toolStats.totalEvents")})}),t.jsx(i,{children:n?t.jsx(x,{className:"h-8 w-24"}):t.jsx("p",{className:"font-mono text-2xl font-bold",children:(r?.total_events??0).toLocaleString()})})]}),t.jsxs(l,{children:[t.jsx(c,{className:"pb-2",children:t.jsx(d,{className:"text-sm font-medium text-muted-foreground",children:a("toolStats.successRate")})}),t.jsx(i,{children:n?t.jsx(x,{className:"h-8 w-20"}):t.jsx("p",{className:"font-mono text-2xl font-bold",children:_(r?.success_rate??0)})})]}),t.jsxs(l,{children:[t.jsx(c,{className:"pb-2",children:t.jsx(d,{className:"text-sm font-medium text-muted-foreground",children:a("toolStats.uniqueTools")})}),t.jsx(i,{children:n?t.jsx(x,{className:"h-8 w-16"}):t.jsx("p",{className:"font-mono text-2xl font-bold",children:r?.top_tools?.length??0})})]})]}),t.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[t.jsxs(l,{children:[t.jsx(c,{children:t.jsx(d,{className:"text-base",children:a("toolStats.topTools")})}),t.jsx(i,{children:n?t.jsx(x,{className:"h-72 w-full"}):h.length===0?t.jsx("p",{className:"py-12 text-center text-sm text-muted-foreground",children:a("toolStats.noData")}):t.jsx(g,{width:"100%",height:Math.max(h.length*36,200),children:t.jsxs(D,{data:h,layout:"vertical",margin:{left:80,right:20},children:[t.jsx(N,{strokeDasharray:"3 3",opacity:.1}),t.jsx(b,{type:"number"}),t.jsx(y,{type:"category",dataKey:"shortName",tick:{fontSize:12},width:80}),t.jsx(S,{contentStyle:{background:"hsl(var(--card))",border:"1px solid hsl(var(--border))",borderRadius:8}}),t.jsx(M,{dataKey:"count",radius:[0,4,4,0],children:h.map((s,e)=>t.jsx(B,{fill:v[e%v.length]},e))})]})})})]}),t.jsxs(l,{children:[t.jsx(c,{children:t.jsx(d,{className:"text-base",children:a("toolStats.usageOverTime")})}),t.jsx(i,{children:n?t.jsx(x,{className:"h-72 w-full"}):p.length===0?t.jsx("p",{className:"py-12 text-center text-sm text-muted-foreground",children:a("toolStats.noData")}):t.jsx(g,{width:"100%",height:300,children:t.jsxs(L,{data:p,margin:{left:10,right:20},children:[t.jsx(N,{strokeDasharray:"3 3",opacity:.1}),t.jsx(b,{dataKey:"date",tick:{fontSize:11}}),t.jsx(y,{tick:{fontSize:11}}),t.jsx(S,{contentStyle:{background:"hsl(var(--card))",border:"1px solid hsl(var(--border))",borderRadius:8}}),t.jsx(z,{type:"monotone",dataKey:"count",stroke:"#6366f1",strokeWidth:2,dot:!1,name:a("toolStats.calls")})]})})})]})]}),t.jsxs(l,{children:[t.jsx(c,{children:t.jsx(d,{className:"text-base",children:a("toolStats.detailTable")})}),t.jsx(i,{children:n?t.jsx(x,{className:"h-48 w-full"}):r?.top_tools?.length?t.jsx("div",{className:"overflow-x-auto",children:t.jsxs("table",{className:"w-full text-sm",children:[t.jsx("thead",{children:t.jsxs("tr",{className:"border-b text-left text-muted-foreground",children:[t.jsx("th",{className:"pb-3 font-medium",children:a("toolStats.tool")}),t.jsx("th",{className:"pb-3 font-medium text-right",children:a("toolStats.calls")}),t.jsx("th",{className:"pb-3 font-medium text-right",children:a("toolStats.successRate")}),t.jsx("th",{className:"pb-3 font-medium text-right",children:a("toolStats.avgDuration")}),t.jsx("th",{className:"pb-3 font-medium",children:a("toolStats.server")})]})}),t.jsx("tbody",{children:r.top_tools.map(s=>t.jsxs("tr",{className:"border-b border-border/50",children:[t.jsx("td",{className:"py-2.5 font-mono text-xs",children:s.tool_name}),t.jsx("td",{className:"py-2.5 text-right font-mono",children:s.count}),t.jsx("td",{className:"py-2.5 text-right",children:t.jsx(k,{variant:E(s.success_rate),children:_(s.success_rate)})}),t.jsx("td",{className:"py-2.5 text-right font-mono text-xs text-muted-foreground",children:O(s.avg_duration_ms)}),t.jsx("td",{className:"py-2.5 text-xs text-muted-foreground",children:s.server_name||"—"})]},s.tool_name))})]})}):t.jsx("p",{className:"py-8 text-center text-sm text-muted-foreground",children:a("toolStats.noData")})})]})]})}export{H as default}; +import{j as t}from"./vendor-query-CqA1cBNl.js";import{r as u}from"./vendor-react-BfuodpLv.js";import{z as w,f as T,a as R,B as k}from"./index-DXL5wCpD.js";import{C as l,a as c,b as d,c as i}from"./card-Duzfr-hx.js";import{S as x}from"./skeleton-CBW-y0cP.js";import{R as g,B as D,C as N,X as b,Y as y,T as S,f as M,g as B,L,p as z}from"./vendor-recharts-BkwZfCWA.js";import"./vendor-icons-C6dhS1UE.js";import"./vendor-ui-Qm4_4bAc.js";const A=[7,14,30,90],v=["#6366f1","#10b981","#f59e0b","#ef4444","#06b6d4","#8b5cf6","#ec4899","#14b8a6","#f97316","#64748b"];function O(o){return o<1e3?`${Math.round(o)}ms`:`${(o/1e3).toFixed(1)}s`}function _(o){return`${Math.round(o*100)}%`}function E(o){return o>=.95?"success":o>=.8?"warning":"destructive"}function H(){const[o,C]=u.useState(30),{data:j,isLoading:n}=w(o),{t:a}=T(),r=j?.summary,f=j?.daily??[],p=u.useMemo(()=>{const s=new Map;for(const e of f){const m=s.get(e.date);m?(m.count+=e.count,m.successes+=Math.round(e.count*e.success_rate)):s.set(e.date,{date:e.date,count:e.count,successes:Math.round(e.count*e.success_rate)})}return Array.from(s.values()).sort((e,m)=>e.date.localeCompare(m.date)).map(e=>({date:e.date.slice(5),count:e.count,successRate:e.count>0?Math.round(e.successes/e.count*100):0}))},[f]),h=u.useMemo(()=>r?.top_tools?r.top_tools.slice(0,10).map(s=>({...s,shortName:s.tool_name.replace(/^smem_/,"")})):[],[r]);return t.jsxs("div",{className:"space-y-6 p-6",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("h1",{className:"font-display text-2xl font-bold",children:a("toolStats.title")}),t.jsx("div",{className:"flex gap-1",children:A.map(s=>t.jsxs(R,{variant:o===s?"default":"outline",size:"sm",onClick:()=>C(s),className:"cursor-pointer",children:[s,"d"]},s))})]}),t.jsxs("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-3",children:[t.jsxs(l,{children:[t.jsx(c,{className:"pb-2",children:t.jsx(d,{className:"text-sm font-medium text-muted-foreground",children:a("toolStats.totalEvents")})}),t.jsx(i,{children:n?t.jsx(x,{className:"h-8 w-24"}):t.jsx("p",{className:"font-mono text-2xl font-bold",children:(r?.total_events??0).toLocaleString()})})]}),t.jsxs(l,{children:[t.jsx(c,{className:"pb-2",children:t.jsx(d,{className:"text-sm font-medium text-muted-foreground",children:a("toolStats.successRate")})}),t.jsx(i,{children:n?t.jsx(x,{className:"h-8 w-20"}):t.jsx("p",{className:"font-mono text-2xl font-bold",children:_(r?.success_rate??0)})})]}),t.jsxs(l,{children:[t.jsx(c,{className:"pb-2",children:t.jsx(d,{className:"text-sm font-medium text-muted-foreground",children:a("toolStats.uniqueTools")})}),t.jsx(i,{children:n?t.jsx(x,{className:"h-8 w-16"}):t.jsx("p",{className:"font-mono text-2xl font-bold",children:r?.top_tools?.length??0})})]})]}),t.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[t.jsxs(l,{children:[t.jsx(c,{children:t.jsx(d,{className:"text-base",children:a("toolStats.topTools")})}),t.jsx(i,{children:n?t.jsx(x,{className:"h-72 w-full"}):h.length===0?t.jsx("p",{className:"py-12 text-center text-sm text-muted-foreground",children:a("toolStats.noData")}):t.jsx(g,{width:"100%",height:Math.max(h.length*36,200),children:t.jsxs(D,{data:h,layout:"vertical",margin:{left:80,right:20},children:[t.jsx(N,{strokeDasharray:"3 3",opacity:.1}),t.jsx(b,{type:"number"}),t.jsx(y,{type:"category",dataKey:"shortName",tick:{fontSize:12},width:80}),t.jsx(S,{contentStyle:{background:"hsl(var(--card))",border:"1px solid hsl(var(--border))",borderRadius:8}}),t.jsx(M,{dataKey:"count",radius:[0,4,4,0],children:h.map((s,e)=>t.jsx(B,{fill:v[e%v.length]},e))})]})})})]}),t.jsxs(l,{children:[t.jsx(c,{children:t.jsx(d,{className:"text-base",children:a("toolStats.usageOverTime")})}),t.jsx(i,{children:n?t.jsx(x,{className:"h-72 w-full"}):p.length===0?t.jsx("p",{className:"py-12 text-center text-sm text-muted-foreground",children:a("toolStats.noData")}):t.jsx(g,{width:"100%",height:300,children:t.jsxs(L,{data:p,margin:{left:10,right:20},children:[t.jsx(N,{strokeDasharray:"3 3",opacity:.1}),t.jsx(b,{dataKey:"date",tick:{fontSize:11}}),t.jsx(y,{tick:{fontSize:11}}),t.jsx(S,{contentStyle:{background:"hsl(var(--card))",border:"1px solid hsl(var(--border))",borderRadius:8}}),t.jsx(z,{type:"monotone",dataKey:"count",stroke:"#6366f1",strokeWidth:2,dot:!1,name:a("toolStats.calls")})]})})})]})]}),t.jsxs(l,{children:[t.jsx(c,{children:t.jsx(d,{className:"text-base",children:a("toolStats.detailTable")})}),t.jsx(i,{children:n?t.jsx(x,{className:"h-48 w-full"}):r?.top_tools?.length?t.jsx("div",{className:"overflow-x-auto",children:t.jsxs("table",{className:"w-full text-sm",children:[t.jsx("thead",{children:t.jsxs("tr",{className:"border-b text-left text-muted-foreground",children:[t.jsx("th",{className:"pb-3 font-medium",children:a("toolStats.tool")}),t.jsx("th",{className:"pb-3 font-medium text-right",children:a("toolStats.calls")}),t.jsx("th",{className:"pb-3 font-medium text-right",children:a("toolStats.successRate")}),t.jsx("th",{className:"pb-3 font-medium text-right",children:a("toolStats.avgDuration")}),t.jsx("th",{className:"pb-3 font-medium",children:a("toolStats.server")})]})}),t.jsx("tbody",{children:r.top_tools.map(s=>t.jsxs("tr",{className:"border-b border-border/50",children:[t.jsx("td",{className:"py-2.5 font-mono text-xs",children:s.tool_name}),t.jsx("td",{className:"py-2.5 text-right font-mono",children:s.count}),t.jsx("td",{className:"py-2.5 text-right",children:t.jsx(k,{variant:E(s.success_rate),children:_(s.success_rate)})}),t.jsx("td",{className:"py-2.5 text-right font-mono text-xs text-muted-foreground",children:O(s.avg_duration_ms)}),t.jsx("td",{className:"py-2.5 text-xs text-muted-foreground",children:s.server_name||"—"})]},s.tool_name))})]})}):t.jsx("p",{className:"py-8 text-center text-sm text-muted-foreground",children:a("toolStats.noData")})})]})]})}export{H as default}; diff --git a/src/surreal_memory/server/static/dist/assets/UncertaintyPage-B1-YQ66j.js b/src/surreal_memory/server/static/dist/assets/UncertaintyPage-B1-YQ66j.js deleted file mode 100644 index bbd3fce2..00000000 --- a/src/surreal_memory/server/static/dist/assets/UncertaintyPage-B1-YQ66j.js +++ /dev/null @@ -1 +0,0 @@ -import{j as e}from"./vendor-query-CqA1cBNl.js";import{h as S,u as g,b}from"./index-CSMoVcy_.js";import{C as o,a as x,b as m,c as u}from"./card-DAwbJLqc.js";import{S as h}from"./skeleton-CAu64_35.js";import{A as C,M as T,y as z,b as I,N as A,O as E}from"./vendor-icons-IAbuZhWE.js";import"./vendor-react-BfuodpLv.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";const p=14,j=16,R={low:"success",medium:"warning",high:"destructive"};function i(t){return t.length>j?`${t.slice(0,j)}…`:t}function f(t){return`${(t*100).toFixed(1)}%`}function P(){const{data:t,isLoading:r}=S(p),{t:s}=g(),a=t?.counts,c=t?.samples;return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-4",children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:s("uncertainty.title")}),t&&e.jsx(b,{variant:R[t.level],className:"px-3 py-1 text-sm capitalize",children:s(`uncertainty.level.${t.level}`)}),e.jsx("span",{className:"text-sm text-muted-foreground",children:s("uncertainty.window",{days:p})})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[e.jsx(y,{label:s("uncertainty.contradictionRate"),value:t?f(t.contradiction_rate):void 0,isLoading:r}),e.jsx(y,{label:s("uncertainty.totalMemories"),value:t?t.total_memories.toLocaleString():void 0,isLoading:r}),e.jsx(N,{icon:e.jsx(C,{className:"size-4 text-red-500"}),label:s("uncertainty.contradictions"),count:a?.contradictions,isLoading:r}),e.jsx(N,{icon:e.jsx(T,{className:"size-4 text-amber-500"}),label:s("uncertainty.expiring"),count:a?.expiring,isLoading:r})]}),t?.scan.typed_scan_truncated&&e.jsxs("p",{className:"flex items-start gap-2 text-xs text-muted-foreground",children:[e.jsx(z,{className:"mt-0.5 size-3.5 shrink-0","aria-hidden":"true"}),e.jsx("span",{children:s("uncertainty.truncatedNote",{count:t.scan.typed_scanned})})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-3",children:[e.jsx(l,{icon:e.jsx(I,{className:"size-5 text-orange-500"}),title:s("uncertainty.lowTrust"),count:a?.low_evidence,isLoading:r,isEmpty:!c?.low_evidence.length,children:e.jsx(d,{columns:[s("uncertainty.fiberId"),s("uncertainty.trustScore")],rows:c?.low_evidence??[],renderRow:n=>e.jsxs(e.Fragment,{children:[e.jsx("td",{className:"py-2 pr-2 font-mono text-xs",title:n.fiber_id,children:i(n.fiber_id)}),e.jsx("td",{className:"py-2 text-right font-mono text-xs",children:n.trust_score.toFixed(2)})]})})}),e.jsx(l,{icon:e.jsx(A,{className:"size-5 text-indigo-500"}),title:s("uncertainty.superseded"),count:a?.superseded,isLoading:r,isEmpty:!c?.superseded.length,children:e.jsx(d,{columns:[s("uncertainty.fiberId"),s("uncertainty.supersededBy")],rows:c?.superseded??[],renderRow:n=>e.jsxs(e.Fragment,{children:[e.jsx("td",{className:"py-2 pr-2 font-mono text-xs",title:n.fiber_id,children:i(n.fiber_id)}),e.jsx("td",{className:"py-2 text-right font-mono text-xs",title:n.superseded_by,children:i(n.superseded_by)})]})})}),e.jsx(l,{icon:e.jsx(E,{className:"size-5 text-cyan-500"}),title:s("uncertainty.drift"),count:a?.drift_clusters,isLoading:r,isEmpty:!c?.drift_clusters.length,emptyLabel:a?.drift_clusters===0?s("uncertainty.driftSqliteOnly"):void 0,children:e.jsx(d,{columns:[s("uncertainty.canonical"),s("uncertainty.confidence")],rows:c?.drift_clusters??[],renderRow:n=>e.jsxs(e.Fragment,{children:[e.jsx("td",{className:"py-2 pr-2 text-xs",title:n.canonical??"",children:n.canonical?i(n.canonical):"—"}),e.jsx("td",{className:"py-2 text-right font-mono text-xs",children:n.confidence!=null?f(n.confidence):"—"})]})})})]})]})}function y({label:t,value:r,isLoading:s}){return e.jsxs(o,{children:[e.jsx(x,{className:"pb-2",children:e.jsx(m,{className:"text-sm font-medium text-muted-foreground",children:t})}),e.jsx(u,{children:s?e.jsx(h,{className:"h-8 w-24"}):e.jsx("p",{className:"font-mono text-2xl font-bold",children:r??"—"})})]})}function N({icon:t,label:r,count:s,isLoading:a}){return e.jsxs(o,{children:[e.jsx(x,{className:"pb-2",children:e.jsxs(m,{className:"flex items-center gap-1.5 text-sm font-medium text-muted-foreground",children:[t,r]})}),e.jsx(u,{children:a?e.jsx(h,{className:"h-8 w-16"}):e.jsx("p",{className:"font-mono text-2xl font-bold",children:s??0})})]})}function l({icon:t,title:r,count:s,isLoading:a,isEmpty:c,emptyLabel:n,children:_}){const{t:v}=g();return e.jsxs(o,{children:[e.jsx(x,{className:"pb-3",children:e.jsxs(m,{className:"flex items-center justify-between text-base",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[t,r]}),!a&&e.jsx(b,{variant:"secondary",className:"font-mono",children:s??0})]})}),e.jsx(u,{children:a?e.jsx("div",{className:"space-y-2",children:Array.from({length:4}).map(($,w)=>e.jsx(h,{className:"h-6 w-full"},w))}):c?e.jsx("p",{className:"py-6 text-center text-sm text-muted-foreground",children:n??v("uncertainty.noSamples")}):_})]})}function d({columns:t,rows:r,renderRow:s}){return e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b text-left text-muted-foreground",children:[e.jsx("th",{className:"pb-2 font-medium",children:t[0]}),e.jsx("th",{className:"pb-2 text-right font-medium",children:t[1]})]})}),e.jsx("tbody",{children:r.map((a,c)=>e.jsx("tr",{className:"border-b border-border/50",children:s(a)},c))})]})})}export{P as default}; diff --git a/src/surreal_memory/server/static/dist/assets/UncertaintyPage-CdFbDPD5.js b/src/surreal_memory/server/static/dist/assets/UncertaintyPage-CdFbDPD5.js new file mode 100644 index 00000000..cf740049 --- /dev/null +++ b/src/surreal_memory/server/static/dist/assets/UncertaintyPage-CdFbDPD5.js @@ -0,0 +1 @@ +import{j as e}from"./vendor-query-CqA1cBNl.js";import{h as S,f as g,B as b}from"./index-DXL5wCpD.js";import{C as o,a as x,b as m,c as u}from"./card-Duzfr-hx.js";import{S as h}from"./skeleton-CBW-y0cP.js";import{B as z,N as C,z as T,b as I,O as E,P as R}from"./vendor-icons-C6dhS1UE.js";import"./vendor-react-BfuodpLv.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";const p=14,j=16,$={low:"success",medium:"warning",high:"destructive"};function i(t){return t.length>j?`${t.slice(0,j)}…`:t}function f(t){return`${(t*100).toFixed(1)}%`}function O(){const{data:t,isLoading:r}=S(p),{t:s}=g(),a=t?.counts,c=t?.samples;return e.jsxs("div",{className:"space-y-6 p-6",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-4",children:[e.jsx("h1",{className:"font-display text-2xl font-bold",children:s("uncertainty.title")}),t&&e.jsx(b,{variant:$[t.level],className:"px-3 py-1 text-sm capitalize",children:s(`uncertainty.level.${t.level}`)}),e.jsx("span",{className:"text-sm text-muted-foreground",children:s("uncertainty.window",{days:p})})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[e.jsx(y,{label:s("uncertainty.contradictionRate"),value:t?f(t.contradiction_rate):void 0,isLoading:r}),e.jsx(y,{label:s("uncertainty.totalMemories"),value:t?t.total_memories.toLocaleString():void 0,isLoading:r}),e.jsx(N,{icon:e.jsx(z,{className:"size-4 text-red-500"}),label:s("uncertainty.contradictions"),count:a?.contradictions,isLoading:r}),e.jsx(N,{icon:e.jsx(C,{className:"size-4 text-amber-500"}),label:s("uncertainty.expiring"),count:a?.expiring,isLoading:r})]}),t?.scan.typed_scan_truncated&&e.jsxs("p",{className:"flex items-start gap-2 text-xs text-muted-foreground",children:[e.jsx(T,{className:"mt-0.5 size-3.5 shrink-0","aria-hidden":"true"}),e.jsx("span",{children:s("uncertainty.truncatedNote",{count:t.scan.typed_scanned})})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-3",children:[e.jsx(l,{icon:e.jsx(I,{className:"size-5 text-orange-500"}),title:s("uncertainty.lowTrust"),count:a?.low_evidence,isLoading:r,isEmpty:!c?.low_evidence.length,children:e.jsx(d,{columns:[s("uncertainty.fiberId"),s("uncertainty.trustScore")],rows:c?.low_evidence??[],renderRow:n=>e.jsxs(e.Fragment,{children:[e.jsx("td",{className:"py-2 pr-2 font-mono text-xs",title:n.fiber_id,children:i(n.fiber_id)}),e.jsx("td",{className:"py-2 text-right font-mono text-xs",children:n.trust_score.toFixed(2)})]})})}),e.jsx(l,{icon:e.jsx(E,{className:"size-5 text-indigo-500"}),title:s("uncertainty.superseded"),count:a?.superseded,isLoading:r,isEmpty:!c?.superseded.length,children:e.jsx(d,{columns:[s("uncertainty.fiberId"),s("uncertainty.supersededBy")],rows:c?.superseded??[],renderRow:n=>e.jsxs(e.Fragment,{children:[e.jsx("td",{className:"py-2 pr-2 font-mono text-xs",title:n.fiber_id,children:i(n.fiber_id)}),e.jsx("td",{className:"py-2 text-right font-mono text-xs",title:n.superseded_by,children:i(n.superseded_by)})]})})}),e.jsx(l,{icon:e.jsx(R,{className:"size-5 text-cyan-500"}),title:s("uncertainty.drift"),count:a?.drift_clusters,isLoading:r,isEmpty:!c?.drift_clusters.length,emptyLabel:a?.drift_clusters===0?s("uncertainty.driftSqliteOnly"):void 0,children:e.jsx(d,{columns:[s("uncertainty.canonical"),s("uncertainty.confidence")],rows:c?.drift_clusters??[],renderRow:n=>e.jsxs(e.Fragment,{children:[e.jsx("td",{className:"py-2 pr-2 text-xs",title:n.canonical??"",children:n.canonical?i(n.canonical):"—"}),e.jsx("td",{className:"py-2 text-right font-mono text-xs",children:n.confidence!=null?f(n.confidence):"—"})]})})})]})]})}function y({label:t,value:r,isLoading:s}){return e.jsxs(o,{children:[e.jsx(x,{className:"pb-2",children:e.jsx(m,{className:"text-sm font-medium text-muted-foreground",children:t})}),e.jsx(u,{children:s?e.jsx(h,{className:"h-8 w-24"}):e.jsx("p",{className:"font-mono text-2xl font-bold",children:r??"—"})})]})}function N({icon:t,label:r,count:s,isLoading:a}){return e.jsxs(o,{children:[e.jsx(x,{className:"pb-2",children:e.jsxs(m,{className:"flex items-center gap-1.5 text-sm font-medium text-muted-foreground",children:[t,r]})}),e.jsx(u,{children:a?e.jsx(h,{className:"h-8 w-16"}):e.jsx("p",{className:"font-mono text-2xl font-bold",children:s??0})})]})}function l({icon:t,title:r,count:s,isLoading:a,isEmpty:c,emptyLabel:n,children:_}){const{t:v}=g();return e.jsxs(o,{children:[e.jsx(x,{className:"pb-3",children:e.jsxs(m,{className:"flex items-center justify-between text-base",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[t,r]}),!a&&e.jsx(b,{variant:"secondary",className:"font-mono",children:s??0})]})}),e.jsx(u,{children:a?e.jsx("div",{className:"space-y-2",children:Array.from({length:4}).map((A,w)=>e.jsx(h,{className:"h-6 w-full"},w))}):c?e.jsx("p",{className:"py-6 text-center text-sm text-muted-foreground",children:n??v("uncertainty.noSamples")}):_})]})}function d({columns:t,rows:r,renderRow:s}){return e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b text-left text-muted-foreground",children:[e.jsx("th",{className:"pb-2 font-medium",children:t[0]}),e.jsx("th",{className:"pb-2 text-right font-medium",children:t[1]})]})}),e.jsx("tbody",{children:r.map((a,c)=>e.jsx("tr",{className:"border-b border-border/50",children:s(a)},c))})]})})}export{O as default}; diff --git a/src/surreal_memory/server/static/dist/assets/VisualizePage-6HaaRoFH.js b/src/surreal_memory/server/static/dist/assets/VisualizePage-6HaaRoFH.js deleted file mode 100644 index 628c3042..00000000 --- a/src/surreal_memory/server/static/dist/assets/VisualizePage-6HaaRoFH.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/embed-gLOWnRXV.js","assets/vendor-recharts-BkwZfCWA.js","assets/vendor-react-BfuodpLv.js","assets/vendor-ui-Qm4_4bAc.js","assets/timer-DWAvo6M8.js"])))=>i.map(i=>d[i]); -import{j as r}from"./vendor-query-CqA1cBNl.js";import{P as _}from"./ProGate-wWiPatWA.js";import{u,A as b,_ as y,B as N}from"./index-CSMoVcy_.js";import{r as n}from"./vendor-react-BfuodpLv.js";import{C as w,a as z,b as C,c as k}from"./card-DAwbJLqc.js";import"./vendor-icons-IAbuZhWE.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";function P({query:s="",chartType:m,format:p="vega_lite",limit:x=20,compact:f=!1}){const{t:l}=u(),a=n.useRef(null),i=b(),[o,h]=n.useState(s),[e,g]=n.useState(null),d=()=>{o.trim()&&i.mutate({query:o.trim(),chart_type:m,format:p,limit:x},{onSuccess:t=>g(t)})};n.useEffect(()=>{if(!e?.vega_lite||!a.current)return;let t=!1;return y(()=>import("./embed-gLOWnRXV.js"),__vite__mapDeps([0,1,2,3,4])).then(v=>{t||!a.current||v.default(a.current,e.vega_lite,{actions:{export:!0,source:!1,compiled:!1,editor:!1},theme:document.documentElement.classList.contains("dark")?"dark":void 0,renderer:"svg"}).catch(j=>console.error("Vega render error:",j))}),()=>{t=!0}},[e?.vega_lite]);const c=r.jsxs("div",{className:"space-y-3",children:[r.jsxs("div",{className:"flex gap-2",children:[r.jsx("input",{type:"text",value:o,onChange:t=>h(t.target.value),onKeyDown:t=>t.key==="Enter"&&d(),placeholder:l("commandPalette.placeholder"),className:"flex-1 rounded-md border border-border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring","aria-label":"Chart query"}),r.jsx(N,{size:"sm",onClick:d,disabled:i.isPending||!o.trim(),className:"cursor-pointer",children:i.isPending?l("common.loading"):"Visualize"})]}),e&&r.jsxs("div",{className:"space-y-2",children:[e.vega_lite&&r.jsx("div",{ref:a,className:"w-full min-h-[200px] rounded-md border border-border bg-background p-2"}),e.markdown&&!e.vega_lite&&r.jsx("pre",{className:"whitespace-pre-wrap rounded-md border border-border bg-muted p-3 text-xs font-mono overflow-x-auto",children:e.markdown}),e.ascii&&!e.vega_lite&&r.jsx("pre",{className:"whitespace-pre rounded-md border border-border bg-muted p-3 text-xs font-mono overflow-x-auto",children:e.ascii}),e.message&&!e.vega_lite&&!e.markdown&&!e.ascii&&r.jsx("p",{className:"text-sm text-muted-foreground",children:e.message}),e.memories&&e.memories.length>0&&r.jsx("div",{className:"space-y-1",children:e.memories.map(t=>r.jsxs("div",{className:"text-xs text-muted-foreground truncate",children:[r.jsxs("span",{className:"font-mono text-[10px] opacity-50",children:["[",t.type,"]"]})," ",t.content]},t.id))}),e.data_points_count!=null&&e.data_points_count>0&&r.jsxs("p",{className:"text-[11px] text-muted-foreground",children:[e.data_points_count," data points · ",e.chart_type]})]})]});return f?c:r.jsxs(w,{children:[r.jsx(z,{children:r.jsx(C,{className:"text-sm",children:"Memory Visualizer"})}),r.jsx(k,{children:c})]})}function B(){const{t:s}=u();return r.jsx(_,{label:s("license.pro_feature","Pro Feature"),children:r.jsxs("div",{className:"space-y-6 p-6",children:[r.jsxs("div",{children:[r.jsx("h1",{className:"font-display text-2xl font-bold",children:s("visualize.title","Memory Visualizer")}),r.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:s("visualize.description","Query your memories and generate charts from stored data.")})]}),r.jsx(P,{})]})})}export{B as default}; diff --git a/src/surreal_memory/server/static/dist/assets/VisualizePage-CayiR_fG.js b/src/surreal_memory/server/static/dist/assets/VisualizePage-CayiR_fG.js new file mode 100644 index 00000000..48b8f9cd --- /dev/null +++ b/src/surreal_memory/server/static/dist/assets/VisualizePage-CayiR_fG.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/embed-gLOWnRXV.js","assets/vendor-recharts-BkwZfCWA.js","assets/vendor-react-BfuodpLv.js","assets/vendor-ui-Qm4_4bAc.js","assets/timer-DWAvo6M8.js"])))=>i.map(i=>d[i]); +import{j as r}from"./vendor-query-CqA1cBNl.js";import{P as _}from"./ProGate-DjphnyL3.js";import{f as u,A as b,_ as y,a as N}from"./index-DXL5wCpD.js";import{r as n}from"./vendor-react-BfuodpLv.js";import{C as w,a as z,b as C,c as k}from"./card-Duzfr-hx.js";import"./vendor-icons-C6dhS1UE.js";import"./vendor-ui-Qm4_4bAc.js";import"./vendor-recharts-BkwZfCWA.js";function P({query:s="",chartType:m,format:p="vega_lite",limit:x=20,compact:f=!1}){const{t:l}=u(),a=n.useRef(null),i=b(),[o,h]=n.useState(s),[e,g]=n.useState(null),d=()=>{o.trim()&&i.mutate({query:o.trim(),chart_type:m,format:p,limit:x},{onSuccess:t=>g(t)})};n.useEffect(()=>{if(!e?.vega_lite||!a.current)return;let t=!1;return y(()=>import("./embed-gLOWnRXV.js"),__vite__mapDeps([0,1,2,3,4])).then(v=>{t||!a.current||v.default(a.current,e.vega_lite,{actions:{export:!0,source:!1,compiled:!1,editor:!1},theme:document.documentElement.classList.contains("dark")?"dark":void 0,renderer:"svg"}).catch(j=>console.error("Vega render error:",j))}),()=>{t=!0}},[e?.vega_lite]);const c=r.jsxs("div",{className:"space-y-3",children:[r.jsxs("div",{className:"flex gap-2",children:[r.jsx("input",{type:"text",value:o,onChange:t=>h(t.target.value),onKeyDown:t=>t.key==="Enter"&&d(),placeholder:l("commandPalette.placeholder"),className:"flex-1 rounded-md border border-border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring","aria-label":"Chart query"}),r.jsx(N,{size:"sm",onClick:d,disabled:i.isPending||!o.trim(),className:"cursor-pointer",children:i.isPending?l("common.loading"):"Visualize"})]}),e&&r.jsxs("div",{className:"space-y-2",children:[e.vega_lite&&r.jsx("div",{ref:a,className:"w-full min-h-[200px] rounded-md border border-border bg-background p-2"}),e.markdown&&!e.vega_lite&&r.jsx("pre",{className:"whitespace-pre-wrap rounded-md border border-border bg-muted p-3 text-xs font-mono overflow-x-auto",children:e.markdown}),e.ascii&&!e.vega_lite&&r.jsx("pre",{className:"whitespace-pre rounded-md border border-border bg-muted p-3 text-xs font-mono overflow-x-auto",children:e.ascii}),e.message&&!e.vega_lite&&!e.markdown&&!e.ascii&&r.jsx("p",{className:"text-sm text-muted-foreground",children:e.message}),e.memories&&e.memories.length>0&&r.jsx("div",{className:"space-y-1",children:e.memories.map(t=>r.jsxs("div",{className:"text-xs text-muted-foreground truncate",children:[r.jsxs("span",{className:"font-mono text-[10px] opacity-50",children:["[",t.type,"]"]})," ",t.content]},t.id))}),e.data_points_count!=null&&e.data_points_count>0&&r.jsxs("p",{className:"text-[11px] text-muted-foreground",children:[e.data_points_count," data points · ",e.chart_type]})]})]});return f?c:r.jsxs(w,{children:[r.jsx(z,{children:r.jsx(C,{className:"text-sm",children:"Memory Visualizer"})}),r.jsx(k,{children:c})]})}function D(){const{t:s}=u();return r.jsx(_,{label:s("license.pro_feature","Pro Feature"),children:r.jsxs("div",{className:"space-y-6 p-6",children:[r.jsxs("div",{children:[r.jsx("h1",{className:"font-display text-2xl font-bold",children:s("visualize.title","Memory Visualizer")}),r.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:s("visualize.description","Query your memories and generate charts from stored data.")})]}),r.jsx(P,{})]})})}export{D as default}; diff --git a/src/surreal_memory/server/static/dist/assets/card-DAwbJLqc.js b/src/surreal_memory/server/static/dist/assets/card-Duzfr-hx.js similarity index 86% rename from src/surreal_memory/server/static/dist/assets/card-DAwbJLqc.js rename to src/surreal_memory/server/static/dist/assets/card-Duzfr-hx.js index 238c3bda..a84002b6 100644 --- a/src/surreal_memory/server/static/dist/assets/card-DAwbJLqc.js +++ b/src/surreal_memory/server/static/dist/assets/card-Duzfr-hx.js @@ -1 +1 @@ -import{j as s}from"./vendor-query-CqA1cBNl.js";import{r as d}from"./vendor-react-BfuodpLv.js";import{C as o}from"./index-CSMoVcy_.js";const t=d.forwardRef(({className:a,...r},e)=>s.jsx("div",{ref:e,className:o("rounded-xl border border-border bg-card text-card-foreground shadow-sm",a),...r}));t.displayName="Card";const i=d.forwardRef(({className:a,...r},e)=>s.jsx("div",{ref:e,className:o("flex flex-col space-y-1.5 p-6",a),...r}));i.displayName="CardHeader";const n=d.forwardRef(({className:a,...r},e)=>s.jsx("div",{ref:e,className:o("font-display text-lg font-semibold leading-none tracking-tight",a),...r}));n.displayName="CardTitle";const m=d.forwardRef(({className:a,...r},e)=>s.jsx("div",{ref:e,className:o("text-sm text-muted-foreground",a),...r}));m.displayName="CardDescription";const c=d.forwardRef(({className:a,...r},e)=>s.jsx("div",{ref:e,className:o("p-6 pt-0",a),...r}));c.displayName="CardContent";export{t as C,i as a,n as b,c}; +import{j as s}from"./vendor-query-CqA1cBNl.js";import{r as d}from"./vendor-react-BfuodpLv.js";import{E as o}from"./index-DXL5wCpD.js";const t=d.forwardRef(({className:a,...r},e)=>s.jsx("div",{ref:e,className:o("rounded-xl border border-border bg-card text-card-foreground shadow-sm",a),...r}));t.displayName="Card";const i=d.forwardRef(({className:a,...r},e)=>s.jsx("div",{ref:e,className:o("flex flex-col space-y-1.5 p-6",a),...r}));i.displayName="CardHeader";const n=d.forwardRef(({className:a,...r},e)=>s.jsx("div",{ref:e,className:o("font-display text-lg font-semibold leading-none tracking-tight",a),...r}));n.displayName="CardTitle";const m=d.forwardRef(({className:a,...r},e)=>s.jsx("div",{ref:e,className:o("text-sm text-muted-foreground",a),...r}));m.displayName="CardDescription";const c=d.forwardRef(({className:a,...r},e)=>s.jsx("div",{ref:e,className:o("p-6 pt-0",a),...r}));c.displayName="CardContent";export{t as C,i as a,n as b,c}; diff --git a/src/surreal_memory/server/static/dist/assets/confirm-dialog-DE0Sgk6_.js b/src/surreal_memory/server/static/dist/assets/confirm-dialog-DE0Sgk6_.js new file mode 100644 index 00000000..f72487fc --- /dev/null +++ b/src/surreal_memory/server/static/dist/assets/confirm-dialog-DE0Sgk6_.js @@ -0,0 +1 @@ +import{j as r}from"./vendor-query-CqA1cBNl.js";import{r as a}from"./vendor-react-BfuodpLv.js";import{f as x,a as n}from"./index-DXL5wCpD.js";function j({open:t,title:l,description:d,confirmLabel:c,cancelLabel:m,variant:f="default",onConfirm:u,onCancel:s}){const o=a.useRef(null),{t:i}=x();return a.useEffect(()=>{const e=o.current;e&&(t&&!e.open&&e.showModal(),!t&&e.open&&e.close())},[t]),t?r.jsx("dialog",{ref:o,className:"fixed inset-0 z-50 m-auto max-w-md rounded-xl border border-border bg-card p-0 shadow-lg backdrop:bg-black/50",onClose:s,onClick:e=>{e.target===o.current&&s()},children:r.jsxs("div",{className:"p-6",children:[r.jsx("h2",{className:"font-display text-lg font-bold text-card-foreground",children:l}),r.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:d}),r.jsxs("div",{className:"mt-6 flex justify-end gap-3",children:[r.jsx(n,{variant:"outline",size:"sm",onClick:s,children:m??i("common.cancel")}),r.jsx(n,{variant:f==="destructive"?"destructive":"default",size:"sm",onClick:u,children:c??i("common.confirm")})]})]})}):null}export{j as C}; diff --git a/src/surreal_memory/server/static/dist/assets/index-BgBv2qcr.css b/src/surreal_memory/server/static/dist/assets/index-BgBv2qcr.css new file mode 100644 index 00000000..89f60f49 --- /dev/null +++ b/src/surreal_memory/server/static/dist/assets/index-BgBv2qcr.css @@ -0,0 +1 @@ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-divide-x-reverse:0}}}@layer theme{:root,:host{--font-sans:"Inter", ui-sans-serif, system-ui, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, monospace;--color-red-500:oklch(63.7% .237 25.331);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-900:oklch(37.8% .077 168.94);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-900:oklch(38.6% .063 188.416);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-900:oklch(39.8% .07 227.392);--color-cyan-950:oklch(30.2% .056 229.695);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-violet-900:oklch(38% .189 293.745);--color-violet-950:oklch(28.3% .141 291.089);--color-rose-900:oklch(41% .159 10.272);--color-rose-950:oklch(27.1% .105 12.094);--color-stone-900:oklch(21.6% .006 56.043);--color-stone-950:oklch(14.7% .004 49.25);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:8px;--radius-lg:12px;--radius-xl:16px;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-background:#faf8f3;--color-foreground:#1a1714;--color-card:#f5f0ea;--color-card-foreground:#1a1714;--color-primary:#6366f1;--color-primary-foreground:#fff;--color-secondary:#ede5d8;--color-secondary-foreground:#1a1714;--color-muted:#ede5d8;--color-muted-foreground:#78716c;--color-accent:#e8e0d4;--color-accent-foreground:#1a1714;--color-destructive:#dc2626;--color-destructive-foreground:#fff;--color-border:#d4ccc2;--color-input:#d4ccc2;--color-ring:#6366f1;--color-health-good:#059669;--color-health-warn:#f59e0b;--color-chart-1:#6366f1;--color-chart-2:#8b5cf6;--color-chart-3:#06b6d4;--color-chart-4:#f59e0b;--color-chart-5:#059669;--font-display:"Space Grotesk", ui-sans-serif, system-ui, sans-serif;--transition-normal:.25s ease;--color-sidebar:#f0ebe4;--color-sidebar-foreground:#1a1714;--color-sidebar-border:#d4ccc2;--color-sidebar-accent:#e8e0d4;--color-sidebar-primary:#6366f1}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.bottom-12{bottom:calc(var(--spacing) * 12)}.left-0{left:calc(var(--spacing) * 0)}.left-3{left:calc(var(--spacing) * 3)}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[100\]{z-index:100}.m-auto{margin:auto}.mx-auto{margin-inline:auto}.my-4{margin-block:calc(var(--spacing) * 4)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-auto{margin-bottom:auto}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-16{margin-left:calc(var(--spacing) * 16)}.ml-56{margin-left:calc(var(--spacing) * 56)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.h-0\.5{height:calc(var(--spacing) * .5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-24{height:calc(var(--spacing) * 24)}.h-28{height:calc(var(--spacing) * 28)}.h-32{height:calc(var(--spacing) * 32)}.h-48{height:calc(var(--spacing) * 48)}.h-64{height:calc(var(--spacing) * 64)}.h-72{height:calc(var(--spacing) * 72)}.h-80{height:calc(var(--spacing) * 80)}.h-\[340px\]{height:340px}.h-\[calc\(100vh-3\.5rem\)\]{height:calc(100vh - 3.5rem)}.h-\[calc\(100vh-14rem\)\]{height:calc(100vh - 14rem)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[200px\]{min-height:200px}.min-h-\[500px\]{min-height:500px}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-9{width:calc(var(--spacing) * 9)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-\[240px\]{width:240px}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\[200px\]{max-width:200px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-105{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.\!border-0{border-style:var(--tw-border-style)!important;border-width:0!important}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.\!border-border{border-color:var(--color-border)!important}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.border-border{border-color:var(--color-border)}.border-border\/50{border-color:#d4ccc280}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,var(--color-border) 50%,transparent)}}.border-input{border-color:var(--color-input)}.border-muted-foreground{border-color:var(--color-muted-foreground)}.border-primary{border-color:var(--color-primary)}.border-primary\/20{border-color:#6366f133}@supports (color:color-mix(in lab,red,red)){.border-primary\/20{border-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.border-primary\/30{border-color:#6366f14d}@supports (color:color-mix(in lab,red,red)){.border-primary\/30{border-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500) 30%,transparent)}}.border-sidebar-border{border-color:var(--color-sidebar-border)}.border-transparent{border-color:#0000}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-t-transparent{border-top-color:#0000}.\!bg-card{background-color:var(--color-card)!important}.\!bg-transparent{background-color:#0000!important}.bg-\[\#16140f\]{background-color:#16140f}.bg-accent{background-color:var(--color-accent)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/5{background-color:color-mix(in oklab,var(--color-amber-500) 5%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.bg-background{background-color:var(--color-background)}.bg-background\/80{background-color:#faf8f3cc}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,var(--color-background) 80%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-card{background-color:var(--color-card)}.bg-card\/90{background-color:#f5f0eae6}@supports (color:color-mix(in lab,red,red)){.bg-card\/90{background-color:color-mix(in oklab,var(--color-card) 90%,transparent)}}.bg-destructive{background-color:var(--color-destructive)}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-health-good\/10{background-color:#0596691a}@supports (color:color-mix(in lab,red,red)){.bg-health-good\/10{background-color:color-mix(in oklab,var(--color-health-good) 10%,transparent)}}.bg-health-warn\/10{background-color:#f59e0b1a}@supports (color:color-mix(in lab,red,red)){.bg-health-warn\/10{background-color:color-mix(in oklab,var(--color-health-warn) 10%,transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-muted\/20{background-color:#ede5d833}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,var(--color-muted) 20%,transparent)}}.bg-muted\/30{background-color:#ede5d84d}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,var(--color-muted) 30%,transparent)}}.bg-orange-500{background-color:var(--color-orange-500)}.bg-primary{background-color:var(--color-primary)}.bg-primary\/5{background-color:#6366f10d}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,var(--color-primary) 5%,transparent)}}.bg-primary\/10{background-color:#6366f11a}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-primary\/15{background-color:#6366f126}@supports (color:color-mix(in lab,red,red)){.bg-primary\/15{background-color:color-mix(in oklab,var(--color-primary) 15%,transparent)}}.bg-primary\/90{background-color:#6366f1e6}@supports (color:color-mix(in lab,red,red)){.bg-primary\/90{background-color:color-mix(in oklab,var(--color-primary) 90%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-secondary{background-color:var(--color-secondary)}.bg-sidebar{background-color:var(--color-sidebar)}.bg-sidebar-accent{background-color:var(--color-sidebar-accent)}.bg-transparent{background-color:#0000}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-amber-900\/40{--tw-gradient-from:#7b330666}@supports (color:color-mix(in lab,red,red)){.from-amber-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-amber-900) 40%, transparent)}}.from-amber-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-900\/40{--tw-gradient-from:#1c398e66}@supports (color:color-mix(in lab,red,red)){.from-blue-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-blue-900) 40%, transparent)}}.from-blue-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-900\/40{--tw-gradient-from:#104e6466}@supports (color:color-mix(in lab,red,red)){.from-cyan-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-900) 40%, transparent)}}.from-cyan-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-emerald-900\/40{--tw-gradient-from:#004e3b66}@supports (color:color-mix(in lab,red,red)){.from-emerald-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-emerald-900) 40%, transparent)}}.from-emerald-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary\/5{--tw-gradient-from:#6366f10d}@supports (color:color-mix(in lab,red,red)){.from-primary\/5{--tw-gradient-from:color-mix(in oklab, var(--color-primary) 5%, transparent)}}.from-primary\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-red-900\/40{--tw-gradient-from:#82181a66}@supports (color:color-mix(in lab,red,red)){.from-red-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-red-900) 40%, transparent)}}.from-red-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-rose-900\/40{--tw-gradient-from:#8b083666}@supports (color:color-mix(in lab,red,red)){.from-rose-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-rose-900) 40%, transparent)}}.from-rose-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-stone-900\/40{--tw-gradient-from:#1c191766}@supports (color:color-mix(in lab,red,red)){.from-stone-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-stone-900) 40%, transparent)}}.from-stone-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-900\/40{--tw-gradient-from:#0b4f4a66}@supports (color:color-mix(in lab,red,red)){.from-teal-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-teal-900) 40%, transparent)}}.from-teal-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-violet-900\/40{--tw-gradient-from:#4d179a66}@supports (color:color-mix(in lab,red,red)){.from-violet-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-violet-900) 40%, transparent)}}.from-violet-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-amber-950\/60{--tw-gradient-to:#46190199}@supports (color:color-mix(in lab,red,red)){.to-amber-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-amber-950) 60%, transparent)}}.to-amber-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-950\/60{--tw-gradient-to:#16245699}@supports (color:color-mix(in lab,red,red)){.to-blue-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-blue-950) 60%, transparent)}}.to-blue-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-950\/60{--tw-gradient-to:#05334599}@supports (color:color-mix(in lab,red,red)){.to-cyan-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-950) 60%, transparent)}}.to-cyan-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-emerald-950\/60{--tw-gradient-to:#002c2299}@supports (color:color-mix(in lab,red,red)){.to-emerald-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-emerald-950) 60%, transparent)}}.to-emerald-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-950\/60{--tw-gradient-to:#44130699}@supports (color:color-mix(in lab,red,red)){.to-orange-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-orange-950) 60%, transparent)}}.to-orange-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary\/10{--tw-gradient-to:#6366f11a}@supports (color:color-mix(in lab,red,red)){.to-primary\/10{--tw-gradient-to:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.to-primary\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-red-950\/60{--tw-gradient-to:#46080999}@supports (color:color-mix(in lab,red,red)){.to-red-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-red-950) 60%, transparent)}}.to-red-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-rose-950\/60{--tw-gradient-to:#4d021899}@supports (color:color-mix(in lab,red,red)){.to-rose-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-rose-950) 60%, transparent)}}.to-rose-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-stone-950\/60{--tw-gradient-to:#0c0a0999}@supports (color:color-mix(in lab,red,red)){.to-stone-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-stone-950) 60%, transparent)}}.to-stone-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-teal-950\/60{--tw-gradient-to:#022f2e99}@supports (color:color-mix(in lab,red,red)){.to-teal-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-teal-950) 60%, transparent)}}.to-teal-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-violet-950\/60{--tw-gradient-to:#2f0d6899}@supports (color:color-mix(in lab,red,red)){.to-violet-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-violet-950) 60%, transparent)}}.to-violet-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-0{padding-inline:calc(var(--spacing) * 0)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[15vh\]{padding-top:15vh}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pl-6{padding-left:calc(var(--spacing) * 6)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-display{font-family:var(--font-display)}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-400{color:var(--color-amber-400)}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-card-foreground{color:var(--color-card-foreground)}.text-cyan-500{color:var(--color-cyan-500)}.text-destructive{color:var(--color-destructive)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-foreground{color:var(--color-foreground)}.text-foreground\/80{color:#1a1714cc}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,var(--color-foreground) 80%,transparent)}}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-health-good{color:var(--color-health-good)}.text-health-warn{color:var(--color-health-warn)}.text-indigo-500{color:var(--color-indigo-500)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-muted-foreground\/40{color:#78716c66}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,var(--color-muted-foreground) 40%,transparent)}}.text-muted-foreground\/70{color:#78716cb3}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,var(--color-muted-foreground) 70%,transparent)}}.text-orange-500{color:var(--color-orange-500)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-sidebar-foreground{color:var(--color-sidebar-foreground)}.text-sidebar-foreground\/50{color:#1a171480}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/50{color:color-mix(in oklab,var(--color-sidebar-foreground) 50%,transparent)}}.text-sidebar-foreground\/70{color:#1a1714b3}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/70{color:color-mix(in oklab,var(--color-sidebar-foreground) 70%,transparent)}}.text-sidebar-primary{color:var(--color-sidebar-primary)}.text-white\/40{color:#fff6}@supports (color:color-mix(in lab,red,red)){.text-white\/40{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline-offset-4{text-underline-offset:4px}.accent-primary{accent-color:var(--color-primary)}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.\!shadow-sm{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000000d)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px var(--tw-shadow-color,#00000012);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-primary{--tw-ring-color:var(--color-primary)}.ring-primary\/30{--tw-ring-color:#6366f14d}@supports (color:color-mix(in lab,red,red)){.ring-primary\/30{--tw-ring-color:color-mix(in oklab, var(--color-primary) 30%, transparent)}}.ring-white\/5{--tw-ring-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.ring-white\/5{--tw-ring-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-background{--tw-ring-offset-color:var(--color-background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-700{--tw-duration:.7s;transition-duration:.7s}.duration-\[var\(--transition-normal\)\]{--tw-duration:var(--transition-normal);transition-duration:var(--transition-normal)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}@media(hover:hover){.group-hover\:bg-primary:is(:where(.group):hover *){background-color:var(--color-primary)}.group-hover\:text-foreground:is(:where(.group):hover *){color:var(--color-foreground)}}.placeholder\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}.backdrop\:bg-black\/50::backdrop{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.backdrop\:bg-black\/50::backdrop{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.first\:pt-0:first-child{padding-top:calc(var(--spacing) * 0)}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}.last\:pb-0:last-child{padding-bottom:calc(var(--spacing) * 0)}@media(hover:hover){.hover\:border-primary\/40:hover{border-color:#6366f166}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab,var(--color-primary) 40%,transparent)}}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-accent\/30:hover{background-color:#e8e0d44d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/30:hover{background-color:color-mix(in oklab,var(--color-accent) 30%,transparent)}}.hover\:bg-accent\/50:hover{background-color:#e8e0d480}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.hover\:bg-destructive\/90:hover{background-color:#dc2626e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--color-destructive) 90%,transparent)}}.hover\:bg-primary:hover{background-color:var(--color-primary)}.hover\:bg-primary\/90:hover{background-color:#6366f1e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--color-primary) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:#ede5d8cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--color-secondary) 80%,transparent)}}.hover\:bg-sidebar-accent:hover{background-color:var(--color-sidebar-accent)}.hover\:text-accent-foreground:hover{color:var(--color-accent-foreground)}.hover\:text-destructive:hover{color:var(--color-destructive)}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:text-primary-foreground:hover{color:var(--color-primary-foreground)}.hover\:text-primary\/80:hover{color:#6366f1cc}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,var(--color-primary) 80%,transparent)}}.hover\:text-sidebar-foreground:hover{color:var(--color-sidebar-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px var(--tw-shadow-color,#00000012);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--color-ring)}.focus\:outline-2:focus{outline-style:var(--tw-outline-style);outline-width:2px}.focus\:outline-offset-2:focus{outline-offset:2px}.focus\:outline-ring:focus{outline-color:var(--color-ring)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--color-ring)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.aria-selected\:bg-accent[aria-selected=true]{background-color:var(--color-accent)}.aria-selected\:opacity-100[aria-selected=true]{opacity:1}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:inline-flex{display:inline-flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}:where(.sm\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.sm\:divide-y-0>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px * var(--tw-divide-y-reverse));border-bottom-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)))}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:pr-4{padding-right:calc(var(--spacing) * 4)}.sm\:pl-4{padding-left:calc(var(--spacing) * 4)}}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&\>button\]\:\!border-border>button{border-color:var(--color-border)!important}.\[\&\>button\]\:\!bg-card>button{background-color:var(--color-card)!important}.\[\&\>button\]\:\!fill-foreground>button{fill:var(--color-foreground)!important}}:root.dark{--color-background:#0c0b09;--color-foreground:#f5f0ea;--color-card:#16140f;--color-card-foreground:#f0ebe4;--color-popover:#1a1814;--color-popover-foreground:#f5f0ea;--color-primary:#818cf8;--color-primary-foreground:#0c0b09;--color-secondary:#1e1b16;--color-secondary-foreground:#f5f0ea;--color-muted:#1e1b16;--color-muted-foreground:#a8a29e;--color-accent:#292520;--color-accent-foreground:#f5f0ea;--color-destructive:#ef4444;--color-destructive-foreground:#fff;--color-border:#2e2a24;--color-input:#342f28;--color-ring:#818cf8;--color-health-good:#34d399;--color-health-warn:#fbbf24;--color-health-bad:#f87171;--shadow-sm:0 1px 3px #0006, 0 1px 2px #0000004d;--shadow-md:0 4px 12px #00000080, 0 2px 4px #00000059;--shadow-lg:0 12px 28px #0000008c, 0 4px 8px #0006;--color-sidebar:#0e0d0a;--color-sidebar-foreground:#f5f0ea;--color-sidebar-border:#2e2a24;--color-sidebar-accent:#1e1b16;--color-sidebar-accent-foreground:#f5f0ea;--color-sidebar-primary:#818cf8;--color-sidebar-primary-foreground:#0c0b09;--color-sidebar-ring:#818cf8}body{font-family:var(--font-sans);background-color:var(--color-background);color:var(--color-foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.font-display{font-family:var(--font-display)}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:9999px}::-webkit-scrollbar-thumb:hover{background:var(--color-muted-foreground)}.dark .border{border-color:#ffffff0f}.dark .rounded-xl{background-image:linear-gradient(#ffffff06,#0000 50%);box-shadow:0 0 0 1px #ffffff0a,0 2px 8px #0006}.dark aside{box-shadow:1px 0 12px #00000080}.dark header{box-shadow:0 1px 8px #0006}:focus-visible{outline:2px solid var(--color-ring);outline-offset:2px}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/src/surreal_memory/server/static/dist/assets/index-CSMoVcy_.js b/src/surreal_memory/server/static/dist/assets/index-CSMoVcy_.js deleted file mode 100644 index b07c26a6..00000000 --- a/src/surreal_memory/server/static/dist/assets/index-CSMoVcy_.js +++ /dev/null @@ -1,54 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OverviewPage-Bd8oQbjM.js","assets/vendor-query-CqA1cBNl.js","assets/vendor-react-BfuodpLv.js","assets/card-DAwbJLqc.js","assets/skeleton-CAu64_35.js","assets/vendor-icons-IAbuZhWE.js","assets/vendor-ui-Qm4_4bAc.js","assets/vendor-recharts-BkwZfCWA.js","assets/HealthPage-WgJz4uYi.js","assets/UncertaintyPage-B1-YQ66j.js","assets/GraphPage-DnkZu_wH.js","assets/TimelinePage-ByrSgpuo.js","assets/EvolutionPage-_rzMyZka.js","assets/ProGate-wWiPatWA.js","assets/DiagramsPage-7MxRvurw.js","assets/timer-DWAvo6M8.js","assets/DiagramsPage-BZV40eAE.css","assets/SettingsPage-BD10gAE1.js","assets/SyncPage-XGbJa_ff.js","assets/OraclePage-zAsy8lB5.js","assets/ToolStatsPage-C3TV9sEV.js","assets/VisualizePage-6HaaRoFH.js","assets/StoragePage-B_CEarTZ.js"])))=>i.map(i=>d[i]); -import{j as T,u as it,a as fc,b as Hi,Q as Ny,c as Ay}from"./vendor-query-CqA1cBNl.js";import{a as Dy,c as wy,d as Y,e as ig,r as y,N as zy,R as dc,b as sg,u as Ry,O as My,f as _y,h as dt,i as jy,B as Ly}from"./vendor-react-BfuodpLv.js";import{c as rg,n as ug,a as og,b as Uy,s as cg,d as fg,e as dg,f as hg,g as mg,h as gg,i as pg,j as By,k as Hy,l as vg,m as om,o as qy,p as Vy,q as cm,r as fm,t as Yy,u as Ky,v as ky,w as Gy}from"./vendor-icons-IAbuZhWE.js";import{t as Qy,c as Xy,a as yg}from"./vendor-ui-Qm4_4bAc.js";import{r as Zy}from"./vendor-recharts-BkwZfCWA.js";(function(){const l=document.createElement("link").relList;if(l&&l.supports&&l.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))u(c);new MutationObserver(c=>{for(const f of c)if(f.type==="childList")for(const m of f.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&u(m)}).observe(document,{childList:!0,subtree:!0});function r(c){const f={};return c.integrity&&(f.integrity=c.integrity),c.referrerPolicy&&(f.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?f.credentials="include":c.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function u(c){if(c.ep)return;c.ep=!0;const f=r(c);fetch(c.href,f)}})();var qo={exports:{}},wi={},Vo={exports:{}},Yo={};var dm;function Fy(){return dm||(dm=1,(function(i){function l(A,V){var $=A.length;A.push(V);e:for(;0<$;){var de=$-1>>>1,ue=A[de];if(0>>1;dec(q,$))Gc(K,q)?(A[de]=K,A[G]=$,de=G):(A[de]=q,A[_]=$,de=_);else if(Gc(K,$))A[de]=K,A[G]=$,de=G;else break e}}return V}function c(A,V){var $=A.sortIndex-V.sortIndex;return $!==0?$:A.id-V.id}if(i.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var f=performance;i.unstable_now=function(){return f.now()}}else{var m=Date,h=m.now();i.unstable_now=function(){return m.now()-h}}var b=[],v=[],x=1,g=null,D=3,R=!1,j=!1,B=!1,k=!1,U=typeof setTimeout=="function"?setTimeout:null,Q=typeof clearTimeout=="function"?clearTimeout:null,Z=typeof setImmediate<"u"?setImmediate:null;function I(A){for(var V=r(v);V!==null;){if(V.callback===null)u(v);else if(V.startTime<=A)u(v),V.sortIndex=V.expirationTime,l(b,V);else break;V=r(v)}}function ee(A){if(B=!1,I(A),!j)if(r(b)!==null)j=!0,J||(J=!0,re());else{var V=r(v);V!==null&&je(ee,V.startTime-A)}}var J=!1,X=-1,ve=5,ae=-1;function te(){return k?!0:!(i.unstable_now()-aeA&&te());){var de=g.callback;if(typeof de=="function"){g.callback=null,D=g.priorityLevel;var ue=de(g.expirationTime<=A);if(A=i.unstable_now(),typeof ue=="function"){g.callback=ue,I(A),V=!0;break t}g===r(b)&&u(b),I(A)}else u(b);g=r(b)}if(g!==null)V=!0;else{var me=r(v);me!==null&&je(ee,me.startTime-A),V=!1}}break e}finally{g=null,D=$,R=!1}V=void 0}}finally{V?re():J=!1}}}var re;if(typeof Z=="function")re=function(){Z(fe)};else if(typeof MessageChannel<"u"){var Ee=new MessageChannel,Te=Ee.port2;Ee.port1.onmessage=fe,re=function(){Te.postMessage(null)}}else re=function(){U(fe,0)};function je(A,V){X=U(function(){A(i.unstable_now())},V)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(A){A.callback=null},i.unstable_forceFrameRate=function(A){0>A||125de?(A.sortIndex=$,l(v,A),r(b)===null&&A===r(v)&&(B?(Q(X),X=-1):B=!0,je(ee,$-de))):(A.sortIndex=ue,l(b,A),j||R||(j=!0,J||(J=!0,re()))),A},i.unstable_shouldYield=te,i.unstable_wrapCallback=function(A){var V=D;return function(){var $=D;D=V;try{return A.apply(this,arguments)}finally{D=$}}}})(Yo)),Yo}var hm;function Jy(){return hm||(hm=1,Vo.exports=Fy()),Vo.exports}var mm;function $y(){if(mm)return wi;mm=1;var i=Jy(),l=Dy(),r=wy();function u(e){var t="https://react.dev/errors/"+e;if(1ue||(e.current=de[ue],de[ue]=null,ue--)}function q(e,t){ue++,de[ue]=e.current,e.current=t}var G=me(null),K=me(null),le=me(null),Se=me(null);function oe(e,t){switch(q(le,t),q(K,e),q(G,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Mh(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Mh(t),e=_h(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}_(G),q(G,e)}function Ae(){_(G),_(K),_(le)}function Ct(e){e.memoizedState!==null&&q(Se,e);var t=G.current,n=_h(t,e.type);t!==n&&(q(K,e),q(G,n))}function dn(e){K.current===e&&(_(G),_(K)),Se.current===e&&(_(Se),Ci._currentValue=$)}var tn,Yi;function Zt(e){if(tn===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);tn=t&&t[1]||"",Yi=-1)":-1s||S[a]!==N[s]){var M=` -`+S[a].replace(" at new "," at ");return e.displayName&&M.includes("")&&(M=M.replace("",e.displayName)),M}while(1<=a&&0<=s);break}}}finally{jl=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?Zt(n):""}function ca(e,t){switch(e.tag){case 26:case 27:case 5:return Zt(e.type);case 16:return Zt("Lazy");case 13:return e.child!==t&&t!==null?Zt("Suspense Fallback"):Zt("Suspense");case 19:return Zt("SuspenseList");case 0:case 15:return Ha(e.type,!1);case 11:return Ha(e.type.render,!1);case 1:return Ha(e.type,!0);case 31:return Zt("Activity");default:return""}}function Ll(e){try{var t="",n=null;do t+=ca(e,n),n=e,e=e.return;while(e);return t}catch(a){return` -Error generating stack: `+a.message+` -`+a.stack}}var Nt=Object.prototype.hasOwnProperty,Ul=i.unstable_scheduleCallback,Bl=i.unstable_cancelCallback,ut=i.unstable_shouldYield,_n=i.unstable_requestPaint,ot=i.unstable_now,Nr=i.unstable_getCurrentPriorityLevel,fa=i.unstable_ImmediatePriority,Ki=i.unstable_UserBlockingPriority,da=i.unstable_NormalPriority,Hl=i.unstable_LowPriority,hn=i.unstable_IdlePriority,ki=i.log,jn=i.unstable_setDisableYieldValue,ha=null,ct=null;function Ft(e){if(typeof ki=="function"&&jn(e),ct&&typeof ct.setStrictMode=="function")try{ct.setStrictMode(ha,e)}catch{}}var st=Math.clz32?Math.clz32:nn,Ar=Math.log,ql=Math.LN2;function nn(e){return e>>>=0,e===0?32:31-(Ar(e)/ql|0)|0}var qa=256,Va=262144,ma=4194304;function an(e){var t=e&42;if(t!==0)return t;switch(e&-e){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:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ie(e,t,n){var a=e.pendingLanes;if(a===0)return 0;var s=0,o=e.suspendedLanes,d=e.pingedLanes;e=e.warmLanes;var p=a&134217727;return p!==0?(a=p&~o,a!==0?s=an(a):(d&=p,d!==0?s=an(d):n||(n=p&~e,n!==0&&(s=an(n))))):(p=a&~o,p!==0?s=an(p):d!==0?s=an(d):n||(n=a&~e,n!==0&&(s=an(n)))),s===0?0:t!==0&&t!==s&&(t&o)===0&&(o=s&-s,n=t&-t,o>=n||o===32&&(n&4194048)!==0)?t:s}function Be(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function We(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32: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+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function rt(){var e=ma;return ma<<=1,(ma&62914560)===0&&(ma=4194304),e}function Ln(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ve(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function mt(e,t,n,a,s,o){var d=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var p=e.entanglements,S=e.expirationTimes,N=e.hiddenUpdates;for(n=d&~n;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var Sp=/[\n"\\]/g;function Ht(e){return e.replace(Sp,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Mr(e,t,n,a,s,o,d,p){e.name="",d!=null&&typeof d!="function"&&typeof d!="symbol"&&typeof d!="boolean"?e.type=d:e.removeAttribute("type"),t!=null?d==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Bt(t)):e.value!==""+Bt(t)&&(e.value=""+Bt(t)):d!=="submit"&&d!=="reset"||e.removeAttribute("value"),t!=null?_r(e,d,Bt(t)):n!=null?_r(e,d,Bt(n)):a!=null&&e.removeAttribute("value"),s==null&&o!=null&&(e.defaultChecked=!!o),s!=null&&(e.checked=s&&typeof s!="function"&&typeof s!="symbol"),p!=null&&typeof p!="function"&&typeof p!="symbol"&&typeof p!="boolean"?e.name=""+Bt(p):e.removeAttribute("name")}function Cc(e,t,n,a,s,o,d,p){if(o!=null&&typeof o!="function"&&typeof o!="symbol"&&typeof o!="boolean"&&(e.type=o),t!=null||n!=null){if(!(o!=="submit"&&o!=="reset"||t!=null)){Rr(e);return}n=n!=null?""+Bt(n):"",t=t!=null?""+Bt(t):n,p||t===e.value||(e.value=t),e.defaultValue=t}a=a??s,a=typeof a!="function"&&typeof a!="symbol"&&!!a,e.checked=p?e.checked:!!a,e.defaultChecked=!!a,d!=null&&typeof d!="function"&&typeof d!="symbol"&&typeof d!="boolean"&&(e.name=d),Rr(e)}function _r(e,t,n){t==="number"&&Xi(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function Za(e,t,n,a){if(e=e.options,t){t={};for(var s=0;s"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Hr=!1;if(pn)try{var kl={};Object.defineProperty(kl,"passive",{get:function(){Hr=!0}}),window.addEventListener("test",kl,kl),window.removeEventListener("test",kl,kl)}catch{Hr=!1}var Bn=null,qr=null,Fi=null;function Mc(){if(Fi)return Fi;var e,t=qr,n=t.length,a,s="value"in Bn?Bn.value:Bn.textContent,o=s.length;for(e=0;e=Xl),Hc=" ",qc=!1;function Vc(e,t){switch(e){case"keyup":return Fp.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Yc(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Wa=!1;function $p(e,t){switch(e){case"compositionend":return Yc(t);case"keypress":return t.which!==32?null:(qc=!0,Hc);case"textInput":return e=t.data,e===Hc&&qc?null:e;default:return null}}function Wp(e,t){if(Wa)return e==="compositionend"||!Gr&&Vc(e,t)?(e=Mc(),Fi=qr=Bn=null,Wa=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=a}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Jc(n)}}function Wc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Wc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Ic(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Xi(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Xi(e.document)}return t}function Zr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var iv=pn&&"documentMode"in document&&11>=document.documentMode,Ia=null,Fr=null,$l=null,Jr=!1;function Pc(e,t,n){var a=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Jr||Ia==null||Ia!==Xi(a)||(a=Ia,"selectionStart"in a&&Zr(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}),$l&&Jl($l,a)||($l=a,a=Ys(Fr,"onSelect"),0>=d,s-=d,ln=1<<32-st(t)+s|n<he?(be=W,W=null):be=W.sibling;var Ce=w(O,W,C[he],L);if(Ce===null){W===null&&(W=be);break}e&&W&&Ce.alternate===null&&t(O,W),E=o(Ce,E,he),Oe===null?P=Ce:Oe.sibling=Ce,Oe=Ce,W=be}if(he===C.length)return n(O,W),xe&&yn(O,he),P;if(W===null){for(;hehe?(be=W,W=null):be=W.sibling;var ia=w(O,W,Ce.value,L);if(ia===null){W===null&&(W=be);break}e&&W&&ia.alternate===null&&t(O,W),E=o(ia,E,he),Oe===null?P=ia:Oe.sibling=ia,Oe=ia,W=be}if(Ce.done)return n(O,W),xe&&yn(O,he),P;if(W===null){for(;!Ce.done;he++,Ce=C.next())Ce=H(O,Ce.value,L),Ce!==null&&(E=o(Ce,E,he),Oe===null?P=Ce:Oe.sibling=Ce,Oe=Ce);return xe&&yn(O,he),P}for(W=a(W);!Ce.done;he++,Ce=C.next())Ce=z(W,O,he,Ce.value,L),Ce!==null&&(e&&Ce.alternate!==null&&W.delete(Ce.key===null?he:Ce.key),E=o(Ce,E,he),Oe===null?P=Ce:Oe.sibling=Ce,Oe=Ce);return e&&W.forEach(function(Cy){return t(O,Cy)}),xe&&yn(O,he),P}function Me(O,E,C,L){if(typeof C=="object"&&C!==null&&C.type===B&&C.key===null&&(C=C.props.children),typeof C=="object"&&C!==null){switch(C.$$typeof){case R:e:{for(var P=C.key;E!==null;){if(E.key===P){if(P=C.type,P===B){if(E.tag===7){n(O,E.sibling),L=s(E,C.props.children),L.return=O,O=L;break e}}else if(E.elementType===P||typeof P=="object"&&P!==null&&P.$$typeof===ve&&Na(P)===E.type){n(O,E.sibling),L=s(E,C.props),ni(L,C),L.return=O,O=L;break e}n(O,E);break}else t(O,E);E=E.sibling}C.type===B?(L=xa(C.props.children,O.mode,L,C.key),L.return=O,O=L):(L=ls(C.type,C.key,C.props,null,O.mode,L),ni(L,C),L.return=O,O=L)}return d(O);case j:e:{for(P=C.key;E!==null;){if(E.key===P)if(E.tag===4&&E.stateNode.containerInfo===C.containerInfo&&E.stateNode.implementation===C.implementation){n(O,E.sibling),L=s(E,C.children||[]),L.return=O,O=L;break e}else{n(O,E);break}else t(O,E);E=E.sibling}L=nu(C,O.mode,L),L.return=O,O=L}return d(O);case ve:return C=Na(C),Me(O,E,C,L)}if(je(C))return F(O,E,C,L);if(re(C)){if(P=re(C),typeof P!="function")throw Error(u(150));return C=P.call(C),ne(O,E,C,L)}if(typeof C.then=="function")return Me(O,E,fs(C),L);if(C.$$typeof===Z)return Me(O,E,rs(O,C),L);ds(O,C)}return typeof C=="string"&&C!==""||typeof C=="number"||typeof C=="bigint"?(C=""+C,E!==null&&E.tag===6?(n(O,E.sibling),L=s(E,C),L.return=O,O=L):(n(O,E),L=tu(C,O.mode,L),L.return=O,O=L),d(O)):n(O,E)}return function(O,E,C,L){try{ti=0;var P=Me(O,E,C,L);return ol=null,P}catch(W){if(W===ul||W===os)throw W;var Oe=Dt(29,W,null,O.mode);return Oe.lanes=L,Oe.return=O,Oe}}}var Da=Tf(!0),Of=Tf(!1),Kn=!1;function mu(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function gu(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function kn(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Gn(e,t,n){var a=e.updateQueue;if(a===null)return null;if(a=a.shared,(Ne&2)!==0){var s=a.pending;return s===null?t.next=t:(t.next=s.next,s.next=t),a.pending=t,t=as(e),rf(e,null,n),t}return ns(e,a,t,n),as(e)}function ai(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194048)!==0)){var a=t.lanes;a&=e.pendingLanes,n|=a,t.lanes=n,gt(e,n)}}function pu(e,t){var n=e.updateQueue,a=e.alternate;if(a!==null&&(a=a.updateQueue,n===a)){var s=null,o=null;if(n=n.firstBaseUpdate,n!==null){do{var d={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};o===null?s=o=d:o=o.next=d,n=n.next}while(n!==null);o===null?s=o=t:o=o.next=t}else s=o=t;n={baseState:a.baseState,firstBaseUpdate:s,lastBaseUpdate:o,shared:a.shared,callbacks:a.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var vu=!1;function li(){if(vu){var e=rl;if(e!==null)throw e}}function ii(e,t,n,a){vu=!1;var s=e.updateQueue;Kn=!1;var o=s.firstBaseUpdate,d=s.lastBaseUpdate,p=s.shared.pending;if(p!==null){s.shared.pending=null;var S=p,N=S.next;S.next=null,d===null?o=N:d.next=N,d=S;var M=e.alternate;M!==null&&(M=M.updateQueue,p=M.lastBaseUpdate,p!==d&&(p===null?M.firstBaseUpdate=N:p.next=N,M.lastBaseUpdate=S))}if(o!==null){var H=s.baseState;d=0,M=N=S=null,p=o;do{var w=p.lane&-536870913,z=w!==p.lane;if(z?(ye&w)===w:(a&w)===w){w!==0&&w===sl&&(vu=!0),M!==null&&(M=M.next={lane:0,tag:p.tag,payload:p.payload,callback:null,next:null});e:{var F=e,ne=p;w=t;var Me=n;switch(ne.tag){case 1:if(F=ne.payload,typeof F=="function"){H=F.call(Me,H,w);break e}H=F;break e;case 3:F.flags=F.flags&-65537|128;case 0:if(F=ne.payload,w=typeof F=="function"?F.call(Me,H,w):F,w==null)break e;H=g({},H,w);break e;case 2:Kn=!0}}w=p.callback,w!==null&&(e.flags|=64,z&&(e.flags|=8192),z=s.callbacks,z===null?s.callbacks=[w]:z.push(w))}else z={lane:w,tag:p.tag,payload:p.payload,callback:p.callback,next:null},M===null?(N=M=z,S=H):M=M.next=z,d|=w;if(p=p.next,p===null){if(p=s.shared.pending,p===null)break;z=p,p=z.next,z.next=null,s.lastBaseUpdate=z,s.shared.pending=null}}while(!0);M===null&&(S=H),s.baseState=S,s.firstBaseUpdate=N,s.lastBaseUpdate=M,o===null&&(s.shared.lanes=0),Jn|=d,e.lanes=d,e.memoizedState=H}}function Cf(e,t){if(typeof e!="function")throw Error(u(191,e));e.call(t)}function Nf(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;eo?o:8;var d=A.T,p={};A.T=p,Uu(e,!1,t,n);try{var S=s(),N=A.S;if(N!==null&&N(p,S),S!==null&&typeof S=="object"&&typeof S.then=="function"){var M=mv(S,a);ui(e,t,M,_t(e))}else ui(e,t,a,_t(e))}catch(H){ui(e,t,{then:function(){},status:"rejected",reason:H},_t())}finally{V.p=o,d!==null&&p.types!==null&&(d.types=p.types),A.T=d}}function Sv(){}function ju(e,t,n,a){if(e.tag!==5)throw Error(u(476));var s=ld(e).queue;ad(e,s,t,$,n===null?Sv:function(){return id(e),n(a)})}function ld(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:$,baseState:$,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:En,lastRenderedState:$},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:En,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function id(e){var t=ld(e);t.next===null&&(t=e.alternate.memoizedState),ui(e,t.next.queue,{},_t())}function Lu(){return nt(Ci)}function sd(){return Ge().memoizedState}function rd(){return Ge().memoizedState}function xv(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=_t();e=kn(n);var a=Gn(t,e,n);a!==null&&(Tt(a,t,n),ai(a,t,n)),t={cache:cu()},e.payload=t;return}t=t.return}}function Ev(e,t,n){var a=_t();n={lane:a,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Es(e)?od(t,n):(n=Pr(e,t,n,a),n!==null&&(Tt(n,e,a),cd(n,t,a)))}function ud(e,t,n){var a=_t();ui(e,t,n,a)}function ui(e,t,n,a){var s={lane:a,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Es(e))od(t,s);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var d=t.lastRenderedState,p=o(d,n);if(s.hasEagerState=!0,s.eagerState=p,At(p,d))return ns(e,t,s,0),_e===null&&ts(),!1}catch{}if(n=Pr(e,t,s,a),n!==null)return Tt(n,e,a),cd(n,t,a),!0}return!1}function Uu(e,t,n,a){if(a={lane:2,revertLane:go(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},Es(e)){if(t)throw Error(u(479))}else t=Pr(e,n,a,2),t!==null&&Tt(t,e,2)}function Es(e){var t=e.alternate;return e===ce||t!==null&&t===ce}function od(e,t){fl=gs=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function cd(e,t,n){if((n&4194048)!==0){var a=t.lanes;a&=e.pendingLanes,n|=a,t.lanes=n,gt(e,n)}}var oi={readContext:nt,use:ys,useCallback:Ye,useContext:Ye,useEffect:Ye,useImperativeHandle:Ye,useLayoutEffect:Ye,useInsertionEffect:Ye,useMemo:Ye,useReducer:Ye,useRef:Ye,useState:Ye,useDebugValue:Ye,useDeferredValue:Ye,useTransition:Ye,useSyncExternalStore:Ye,useId:Ye,useHostTransitionStatus:Ye,useFormState:Ye,useActionState:Ye,useOptimistic:Ye,useMemoCache:Ye,useCacheRefresh:Ye};oi.useEffectEvent=Ye;var fd={readContext:nt,use:ys,useCallback:function(e,t){return ft().memoizedState=[e,t===void 0?null:t],e},useContext:nt,useEffect:Ff,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,Ss(4194308,4,If.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ss(4194308,4,e,t)},useInsertionEffect:function(e,t){Ss(4,2,e,t)},useMemo:function(e,t){var n=ft();t=t===void 0?null:t;var a=e();if(wa){Ft(!0);try{e()}finally{Ft(!1)}}return n.memoizedState=[a,t],a},useReducer:function(e,t,n){var a=ft();if(n!==void 0){var s=n(t);if(wa){Ft(!0);try{n(t)}finally{Ft(!1)}}}else s=t;return a.memoizedState=a.baseState=s,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:s},a.queue=e,e=e.dispatch=Ev.bind(null,ce,e),[a.memoizedState,e]},useRef:function(e){var t=ft();return e={current:e},t.memoizedState=e},useState:function(e){e=wu(e);var t=e.queue,n=ud.bind(null,ce,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Mu,useDeferredValue:function(e,t){var n=ft();return _u(n,e,t)},useTransition:function(){var e=wu(!1);return e=ad.bind(null,ce,e.queue,!0,!1),ft().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var a=ce,s=ft();if(xe){if(n===void 0)throw Error(u(407));n=n()}else{if(n=t(),_e===null)throw Error(u(349));(ye&127)!==0||Mf(a,t,n)}s.memoizedState=n;var o={value:n,getSnapshot:t};return s.queue=o,Ff(jf.bind(null,a,o,e),[e]),a.flags|=2048,hl(9,{destroy:void 0},_f.bind(null,a,o,n,t),null),n},useId:function(){var e=ft(),t=_e.identifierPrefix;if(xe){var n=sn,a=ln;n=(a&~(1<<32-st(a)-1)).toString(32)+n,t="_"+t+"R_"+n,n=ps++,0<\/script>",o=o.removeChild(o.firstChild);break;case"select":o=typeof a.is=="string"?d.createElement("select",{is:a.is}):d.createElement("select"),a.multiple?o.multiple=!0:a.size&&(o.size=a.size);break;default:o=typeof a.is=="string"?d.createElement(s,{is:a.is}):d.createElement(s)}}o[et]=t,o[vt]=a;e:for(d=t.child;d!==null;){if(d.tag===5||d.tag===6)o.appendChild(d.stateNode);else if(d.tag!==4&&d.tag!==27&&d.child!==null){d.child.return=d,d=d.child;continue}if(d===t)break e;for(;d.sibling===null;){if(d.return===null||d.return===t)break e;d=d.return}d.sibling.return=d.return,d=d.sibling}t.stateNode=o;e:switch(lt(o,s,a),s){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break e;case"img":a=!0;break e;default:a=!1}a&&On(t)}}return Ue(t),$u(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==a&&On(t);else{if(typeof a!="string"&&t.stateNode===null)throw Error(u(166));if(e=le.current,ll(t)){if(e=t.stateNode,n=t.memoizedProps,a=null,s=tt,s!==null)switch(s.tag){case 27:case 5:a=s.memoizedProps}e[et]=t,e=!!(e.nodeValue===n||a!==null&&a.suppressHydrationWarning===!0||zh(e.nodeValue,n)),e||Vn(t,!0)}else e=Ks(e).createTextNode(a),e[et]=t,t.stateNode=e}return Ue(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(a=ll(t),n!==null){if(e===null){if(!a)throw Error(u(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(u(557));e[et]=t}else Ea(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ue(t),e=!1}else n=su(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(zt(t),t):(zt(t),null);if((t.flags&128)!==0)throw Error(u(558))}return Ue(t),null;case 13:if(a=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(s=ll(t),a!==null&&a.dehydrated!==null){if(e===null){if(!s)throw Error(u(318));if(s=t.memoizedState,s=s!==null?s.dehydrated:null,!s)throw Error(u(317));s[et]=t}else Ea(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ue(t),s=!1}else s=su(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=s),s=!0;if(!s)return t.flags&256?(zt(t),t):(zt(t),null)}return zt(t),(t.flags&128)!==0?(t.lanes=n,t):(n=a!==null,e=e!==null&&e.memoizedState!==null,n&&(a=t.child,s=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(s=a.alternate.memoizedState.cachePool.pool),o=null,a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(o=a.memoizedState.cachePool.pool),o!==s&&(a.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),As(t,t.updateQueue),Ue(t),null);case 4:return Ae(),e===null&&bo(t.stateNode.containerInfo),Ue(t),null;case 10:return Sn(t.type),Ue(t),null;case 19:if(_(ke),a=t.memoizedState,a===null)return Ue(t),null;if(s=(t.flags&128)!==0,o=a.rendering,o===null)if(s)fi(a,!1);else{if(Ke!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(o=ms(e),o!==null){for(t.flags|=128,fi(a,!1),e=o.updateQueue,t.updateQueue=e,As(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)uf(n,e),n=n.sibling;return q(ke,ke.current&1|2),xe&&yn(t,a.treeForkCount),t.child}e=e.sibling}a.tail!==null&&ot()>Ms&&(t.flags|=128,s=!0,fi(a,!1),t.lanes=4194304)}else{if(!s)if(e=ms(o),e!==null){if(t.flags|=128,s=!0,e=e.updateQueue,t.updateQueue=e,As(t,e),fi(a,!0),a.tail===null&&a.tailMode==="hidden"&&!o.alternate&&!xe)return Ue(t),null}else 2*ot()-a.renderingStartTime>Ms&&n!==536870912&&(t.flags|=128,s=!0,fi(a,!1),t.lanes=4194304);a.isBackwards?(o.sibling=t.child,t.child=o):(e=a.last,e!==null?e.sibling=o:t.child=o,a.last=o)}return a.tail!==null?(e=a.tail,a.rendering=e,a.tail=e.sibling,a.renderingStartTime=ot(),e.sibling=null,n=ke.current,q(ke,s?n&1|2:n&1),xe&&yn(t,a.treeForkCount),e):(Ue(t),null);case 22:case 23:return zt(t),bu(),a=t.memoizedState!==null,e!==null?e.memoizedState!==null!==a&&(t.flags|=8192):a&&(t.flags|=8192),a?(n&536870912)!==0&&(t.flags&128)===0&&(Ue(t),t.subtreeFlags&6&&(t.flags|=8192)):Ue(t),n=t.updateQueue,n!==null&&As(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),a=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(a=t.memoizedState.cachePool.pool),a!==n&&(t.flags|=2048),e!==null&&_(Ca),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Sn(Qe),Ue(t),null;case 25:return null;case 30:return null}throw Error(u(156,t.tag))}function Av(e,t){switch(lu(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Sn(Qe),Ae(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return dn(t),null;case 31:if(t.memoizedState!==null){if(zt(t),t.alternate===null)throw Error(u(340));Ea()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(zt(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(u(340));Ea()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return _(ke),null;case 4:return Ae(),null;case 10:return Sn(t.type),null;case 22:case 23:return zt(t),bu(),e!==null&&_(Ca),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Sn(Qe),null;case 25:return null;default:return null}}function Ld(e,t){switch(lu(t),t.tag){case 3:Sn(Qe),Ae();break;case 26:case 27:case 5:dn(t);break;case 4:Ae();break;case 31:t.memoizedState!==null&&zt(t);break;case 13:zt(t);break;case 19:_(ke);break;case 10:Sn(t.type);break;case 22:case 23:zt(t),bu(),e!==null&&_(Ca);break;case 24:Sn(Qe)}}function di(e,t){try{var n=t.updateQueue,a=n!==null?n.lastEffect:null;if(a!==null){var s=a.next;n=s;do{if((n.tag&e)===e){a=void 0;var o=n.create,d=n.inst;a=o(),d.destroy=a}n=n.next}while(n!==s)}}catch(p){we(t,t.return,p)}}function Zn(e,t,n){try{var a=t.updateQueue,s=a!==null?a.lastEffect:null;if(s!==null){var o=s.next;a=o;do{if((a.tag&e)===e){var d=a.inst,p=d.destroy;if(p!==void 0){d.destroy=void 0,s=t;var S=n,N=p;try{N()}catch(M){we(s,S,M)}}}a=a.next}while(a!==o)}}catch(M){we(t,t.return,M)}}function Ud(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Nf(t,n)}catch(a){we(e,e.return,a)}}}function Bd(e,t,n){n.props=za(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(a){we(e,t,a)}}function hi(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var a=e.stateNode;break;case 30:a=e.stateNode;break;default:a=e.stateNode}typeof n=="function"?e.refCleanup=n(a):n.current=a}}catch(s){we(e,t,s)}}function rn(e,t){var n=e.ref,a=e.refCleanup;if(n!==null)if(typeof a=="function")try{a()}catch(s){we(e,t,s)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n=="function")try{n(null)}catch(s){we(e,t,s)}else n.current=null}function Hd(e){var t=e.type,n=e.memoizedProps,a=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":n.autoFocus&&a.focus();break e;case"img":n.src?a.src=n.src:n.srcSet&&(a.srcset=n.srcSet)}}catch(s){we(e,e.return,s)}}function Wu(e,t,n){try{var a=e.stateNode;Jv(a,e.type,n,t),a[vt]=t}catch(s){we(e,e.return,s)}}function qd(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&ea(e.type)||e.tag===4}function Iu(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||qd(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&ea(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Pu(e,t,n){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName==="HTML"?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName==="HTML"?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=gn));else if(a!==4&&(a===27&&ea(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Pu(e,t,n),e=e.sibling;e!==null;)Pu(e,t,n),e=e.sibling}function Ds(e,t,n){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(a!==4&&(a===27&&ea(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(Ds(e,t,n),e=e.sibling;e!==null;)Ds(e,t,n),e=e.sibling}function Vd(e){var t=e.stateNode,n=e.memoizedProps;try{for(var a=e.type,s=t.attributes;s.length;)t.removeAttributeNode(s[0]);lt(t,a,n),t[et]=e,t[vt]=n}catch(o){we(e,e.return,o)}}var Cn=!1,Fe=!1,eo=!1,Yd=typeof WeakSet=="function"?WeakSet:Set,Pe=null;function Dv(e,t){if(e=e.containerInfo,Eo=Js,e=Ic(e),Zr(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var a=n.getSelection&&n.getSelection();if(a&&a.rangeCount!==0){n=a.anchorNode;var s=a.anchorOffset,o=a.focusNode;a=a.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var d=0,p=-1,S=-1,N=0,M=0,H=e,w=null;t:for(;;){for(var z;H!==n||s!==0&&H.nodeType!==3||(p=d+s),H!==o||a!==0&&H.nodeType!==3||(S=d+a),H.nodeType===3&&(d+=H.nodeValue.length),(z=H.firstChild)!==null;)w=H,H=z;for(;;){if(H===e)break t;if(w===n&&++N===s&&(p=d),w===o&&++M===a&&(S=d),(z=H.nextSibling)!==null)break;H=w,w=H.parentNode}H=z}n=p===-1||S===-1?null:{start:p,end:S}}else n=null}n=n||{start:0,end:0}}else n=null;for(To={focusedElem:e,selectionRange:n},Js=!1,Pe=t;Pe!==null;)if(t=Pe,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Pe=e;else for(;Pe!==null;){switch(t=Pe,o=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(n=0;n title"))),lt(o,a,n),o[et]=e,Ie(o),a=o;break e;case"link":var d=Zh("link","href",s).get(a+(n.href||""));if(d){for(var p=0;pMe&&(d=Me,Me=ne,ne=d);var O=$c(p,ne),E=$c(p,Me);if(O&&E&&(z.rangeCount!==1||z.anchorNode!==O.node||z.anchorOffset!==O.offset||z.focusNode!==E.node||z.focusOffset!==E.offset)){var C=H.createRange();C.setStart(O.node,O.offset),z.removeAllRanges(),ne>Me?(z.addRange(C),z.extend(E.node,E.offset)):(C.setEnd(E.node,E.offset),z.addRange(C))}}}}for(H=[],z=p;z=z.parentNode;)z.nodeType===1&&H.push({element:z,left:z.scrollLeft,top:z.scrollTop});for(typeof p.focus=="function"&&p.focus(),p=0;pn?32:n,A.T=null,n=ro,ro=null;var o=Wn,d=zn;if(Je=0,yl=Wn=null,zn=0,(Ne&6)!==0)throw Error(u(331));var p=Ne;if(Ne|=4,Id(o.current),Jd(o,o.current,d,n),Ne=p,bi(0,!1),ct&&typeof ct.onPostCommitFiberRoot=="function")try{ct.onPostCommitFiberRoot(ha,o)}catch{}return!0}finally{V.p=s,A.T=a,ph(e,t)}}function yh(e,t,n){t=Vt(n,t),t=Vu(e.stateNode,t,2),e=Gn(e,t,2),e!==null&&(Ve(e,2),un(e))}function we(e,t,n){if(e.tag===3)yh(e,e,n);else for(;t!==null;){if(t.tag===3){yh(t,e,n);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&($n===null||!$n.has(a))){e=Vt(n,e),n=bd(2),a=Gn(t,n,2),a!==null&&(Sd(n,a,t,e),Ve(a,2),un(a));break}}t=t.return}}function fo(e,t,n){var a=e.pingCache;if(a===null){a=e.pingCache=new Rv;var s=new Set;a.set(t,s)}else s=a.get(t),s===void 0&&(s=new Set,a.set(t,s));s.has(n)||(ao=!0,s.add(n),e=Uv.bind(null,e,t,n),t.then(e,e))}function Uv(e,t,n){var a=e.pingCache;a!==null&&a.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,_e===e&&(ye&n)===n&&(Ke===4||Ke===3&&(ye&62914560)===ye&&300>ot()-Rs?(Ne&2)===0&&bl(e,0):lo|=n,vl===ye&&(vl=0)),un(e)}function bh(e,t){t===0&&(t=rt()),e=Sa(e,t),e!==null&&(Ve(e,t),un(e))}function Bv(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),bh(e,n)}function Hv(e,t){var n=0;switch(e.tag){case 31:case 13:var a=e.stateNode,s=e.memoizedState;s!==null&&(n=s.retryLane);break;case 19:a=e.stateNode;break;case 22:a=e.stateNode._retryCache;break;default:throw Error(u(314))}a!==null&&a.delete(t),bh(e,n)}function qv(e,t){return Ul(e,t)}var Hs=null,xl=null,ho=!1,qs=!1,mo=!1,Pn=0;function un(e){e!==xl&&e.next===null&&(xl===null?Hs=xl=e:xl=xl.next=e),qs=!0,ho||(ho=!0,Yv())}function bi(e,t){if(!mo&&qs){mo=!0;do for(var n=!1,a=Hs;a!==null;){if(e!==0){var s=a.pendingLanes;if(s===0)var o=0;else{var d=a.suspendedLanes,p=a.pingedLanes;o=(1<<31-st(42|e)+1)-1,o&=s&~(d&~p),o=o&201326741?o&201326741|1:o?o|2:0}o!==0&&(n=!0,Th(a,o))}else o=ye,o=ie(a,a===_e?o:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(o&3)===0||Be(a,o)||(n=!0,Th(a,o));a=a.next}while(n);mo=!1}}function Vv(){Sh()}function Sh(){qs=ho=!1;var e=0;Pn!==0&&Wv()&&(e=Pn);for(var t=ot(),n=null,a=Hs;a!==null;){var s=a.next,o=xh(a,t);o===0?(a.next=null,n===null?Hs=s:n.next=s,s===null&&(xl=n)):(n=a,(e!==0||(o&3)!==0)&&(qs=!0)),a=s}Je!==0&&Je!==5||bi(e),Pn!==0&&(Pn=0)}function xh(e,t){for(var n=e.suspendedLanes,a=e.pingedLanes,s=e.expirationTimes,o=e.pendingLanes&-62914561;0p)break;var M=S.transferSize,H=S.initiatorType;M&&Rh(H)&&(S=S.responseEnd,d+=M*(S"u"?null:document;function kh(e,t,n){var a=El;if(a&&typeof t=="string"&&t){var s=Ht(t);s='link[rel="'+e+'"][href="'+s+'"]',typeof n=="string"&&(s+='[crossorigin="'+n+'"]'),Kh.has(s)||(Kh.add(s),e={rel:e,crossOrigin:n,href:t},a.querySelector(s)===null&&(t=a.createElement("link"),lt(t,"link",e),Ie(t),a.head.appendChild(t)))}}function sy(e){Rn.D(e),kh("dns-prefetch",e,null)}function ry(e,t){Rn.C(e,t),kh("preconnect",e,t)}function uy(e,t,n){Rn.L(e,t,n);var a=El;if(a&&e&&t){var s='link[rel="preload"][as="'+Ht(t)+'"]';t==="image"&&n&&n.imageSrcSet?(s+='[imagesrcset="'+Ht(n.imageSrcSet)+'"]',typeof n.imageSizes=="string"&&(s+='[imagesizes="'+Ht(n.imageSizes)+'"]')):s+='[href="'+Ht(e)+'"]';var o=s;switch(t){case"style":o=Tl(e);break;case"script":o=Ol(e)}Xt.has(o)||(e=g({rel:"preload",href:t==="image"&&n&&n.imageSrcSet?void 0:e,as:t},n),Xt.set(o,e),a.querySelector(s)!==null||t==="style"&&a.querySelector(Ti(o))||t==="script"&&a.querySelector(Oi(o))||(t=a.createElement("link"),lt(t,"link",e),Ie(t),a.head.appendChild(t)))}}function oy(e,t){Rn.m(e,t);var n=El;if(n&&e){var a=t&&typeof t.as=="string"?t.as:"script",s='link[rel="modulepreload"][as="'+Ht(a)+'"][href="'+Ht(e)+'"]',o=s;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":o=Ol(e)}if(!Xt.has(o)&&(e=g({rel:"modulepreload",href:e},t),Xt.set(o,e),n.querySelector(s)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(n.querySelector(Oi(o)))return}a=n.createElement("link"),lt(a,"link",e),Ie(a),n.head.appendChild(a)}}}function cy(e,t,n){Rn.S(e,t,n);var a=El;if(a&&e){var s=Qa(a).hoistableStyles,o=Tl(e);t=t||"default";var d=s.get(o);if(!d){var p={loading:0,preload:null};if(d=a.querySelector(Ti(o)))p.loading=5;else{e=g({rel:"stylesheet",href:e,"data-precedence":t},n),(n=Xt.get(o))&&zo(e,n);var S=d=a.createElement("link");Ie(S),lt(S,"link",e),S._p=new Promise(function(N,M){S.onload=N,S.onerror=M}),S.addEventListener("load",function(){p.loading|=1}),S.addEventListener("error",function(){p.loading|=2}),p.loading|=4,Gs(d,t,a)}d={type:"stylesheet",instance:d,count:1,state:p},s.set(o,d)}}}function fy(e,t){Rn.X(e,t);var n=El;if(n&&e){var a=Qa(n).hoistableScripts,s=Ol(e),o=a.get(s);o||(o=n.querySelector(Oi(s)),o||(e=g({src:e,async:!0},t),(t=Xt.get(s))&&Ro(e,t),o=n.createElement("script"),Ie(o),lt(o,"link",e),n.head.appendChild(o)),o={type:"script",instance:o,count:1,state:null},a.set(s,o))}}function dy(e,t){Rn.M(e,t);var n=El;if(n&&e){var a=Qa(n).hoistableScripts,s=Ol(e),o=a.get(s);o||(o=n.querySelector(Oi(s)),o||(e=g({src:e,async:!0,type:"module"},t),(t=Xt.get(s))&&Ro(e,t),o=n.createElement("script"),Ie(o),lt(o,"link",e),n.head.appendChild(o)),o={type:"script",instance:o,count:1,state:null},a.set(s,o))}}function Gh(e,t,n,a){var s=(s=le.current)?ks(s):null;if(!s)throw Error(u(446));switch(e){case"meta":case"title":return null;case"style":return typeof n.precedence=="string"&&typeof n.href=="string"?(t=Tl(n.href),n=Qa(s).hoistableStyles,a=n.get(t),a||(a={type:"style",instance:null,count:0,state:null},n.set(t,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(n.rel==="stylesheet"&&typeof n.href=="string"&&typeof n.precedence=="string"){e=Tl(n.href);var o=Qa(s).hoistableStyles,d=o.get(e);if(d||(s=s.ownerDocument||s,d={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},o.set(e,d),(o=s.querySelector(Ti(e)))&&!o._p&&(d.instance=o,d.state.loading=5),Xt.has(e)||(n={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},Xt.set(e,n),o||hy(s,e,n,d.state))),t&&a===null)throw Error(u(528,""));return d}if(t&&a!==null)throw Error(u(529,""));return null;case"script":return t=n.async,n=n.src,typeof n=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Ol(n),n=Qa(s).hoistableScripts,a=n.get(t),a||(a={type:"script",instance:null,count:0,state:null},n.set(t,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(u(444,e))}}function Tl(e){return'href="'+Ht(e)+'"'}function Ti(e){return'link[rel="stylesheet"]['+e+"]"}function Qh(e){return g({},e,{"data-precedence":e.precedence,precedence:null})}function hy(e,t,n,a){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?a.loading=1:(t=e.createElement("link"),a.preload=t,t.addEventListener("load",function(){return a.loading|=1}),t.addEventListener("error",function(){return a.loading|=2}),lt(t,"link",n),Ie(t),e.head.appendChild(t))}function Ol(e){return'[src="'+Ht(e)+'"]'}function Oi(e){return"script[async]"+e}function Xh(e,t,n){if(t.count++,t.instance===null)switch(t.type){case"style":var a=e.querySelector('style[data-href~="'+Ht(n.href)+'"]');if(a)return t.instance=a,Ie(a),a;var s=g({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return a=(e.ownerDocument||e).createElement("style"),Ie(a),lt(a,"style",s),Gs(a,n.precedence,e),t.instance=a;case"stylesheet":s=Tl(n.href);var o=e.querySelector(Ti(s));if(o)return t.state.loading|=4,t.instance=o,Ie(o),o;a=Qh(n),(s=Xt.get(s))&&zo(a,s),o=(e.ownerDocument||e).createElement("link"),Ie(o);var d=o;return d._p=new Promise(function(p,S){d.onload=p,d.onerror=S}),lt(o,"link",a),t.state.loading|=4,Gs(o,n.precedence,e),t.instance=o;case"script":return o=Ol(n.src),(s=e.querySelector(Oi(o)))?(t.instance=s,Ie(s),s):(a=n,(s=Xt.get(o))&&(a=g({},n),Ro(a,s)),e=e.ownerDocument||e,s=e.createElement("script"),Ie(s),lt(s,"link",a),e.head.appendChild(s),t.instance=s);case"void":return null;default:throw Error(u(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(a=t.instance,t.state.loading|=4,Gs(a,n.precedence,e));return t.instance}function Gs(e,t,n){for(var a=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),s=a.length?a[a.length-1]:null,o=s,d=0;d title"):null)}function my(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;return t.rel==="stylesheet"?(e=t.disabled,typeof t.precedence=="string"&&e==null):!0;case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function Jh(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function gy(e,t,n,a){if(n.type==="stylesheet"&&(typeof a.media!="string"||matchMedia(a.media).matches!==!1)&&(n.state.loading&4)===0){if(n.instance===null){var s=Tl(a.href),o=t.querySelector(Ti(s));if(o){t=o._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=Xs.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=o,Ie(o);return}o=t.ownerDocument||t,a=Qh(a),(s=Xt.get(s))&&zo(a,s),o=o.createElement("link"),Ie(o);var d=o;d._p=new Promise(function(p,S){d.onload=p,d.onerror=S}),lt(o,"link",a),n.instance=o}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&(n.state.loading&3)===0&&(e.count++,n=Xs.bind(e),t.addEventListener("load",n),t.addEventListener("error",n))}}var Mo=0;function py(e,t){return e.stylesheets&&e.count===0&&Fs(e,e.stylesheets),0Mo?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(a),clearTimeout(s)}}:null}function Xs(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Fs(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Zs=null;function Fs(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Zs=new Map,t.forEach(vy,e),Zs=null,Xs.call(e))}function vy(e,t){if(!(t.state.loading&4)){var n=Zs.get(e);if(n)var a=n.get(null);else{n=new Map,Zs.set(e,n);for(var s=e.querySelectorAll("link[data-precedence],style[data-precedence]"),o=0;o"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(l){console.error(l)}}return i(),qo.exports=$y(),qo.exports}var Iy=Wy();function Py(i){if(typeof document>"u")return;let l=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",l.appendChild(r),r.styleSheet?r.styleSheet.cssText=i:r.appendChild(document.createTextNode(i))}const e0=i=>{switch(i){case"success":return a0;case"info":return i0;case"warning":return l0;case"error":return s0;default:return null}},t0=Array(12).fill(0),n0=({visible:i,className:l})=>Y.createElement("div",{className:["sonner-loading-wrapper",l].filter(Boolean).join(" "),"data-visible":i},Y.createElement("div",{className:"sonner-spinner"},t0.map((r,u)=>Y.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${u}`})))),a0=Y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},Y.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),l0=Y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},Y.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),i0=Y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},Y.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),s0=Y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},Y.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),r0=Y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},Y.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),Y.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),u0=()=>{const[i,l]=Y.useState(document.hidden);return Y.useEffect(()=>{const r=()=>{l(document.hidden)};return document.addEventListener("visibilitychange",r),()=>window.removeEventListener("visibilitychange",r)},[]),i};let tc=1;class o0{constructor(){this.subscribe=l=>(this.subscribers.push(l),()=>{const r=this.subscribers.indexOf(l);this.subscribers.splice(r,1)}),this.publish=l=>{this.subscribers.forEach(r=>r(l))},this.addToast=l=>{this.publish(l),this.toasts=[...this.toasts,l]},this.create=l=>{var r;const{message:u,...c}=l,f=typeof l?.id=="number"||((r=l.id)==null?void 0:r.length)>0?l.id:tc++,m=this.toasts.find(b=>b.id===f),h=l.dismissible===void 0?!0:l.dismissible;return this.dismissedToasts.has(f)&&this.dismissedToasts.delete(f),m?this.toasts=this.toasts.map(b=>b.id===f?(this.publish({...b,...l,id:f,title:u}),{...b,...l,id:f,dismissible:h,title:u}):b):this.addToast({title:u,...c,dismissible:h,id:f}),f},this.dismiss=l=>(l?(this.dismissedToasts.add(l),requestAnimationFrame(()=>this.subscribers.forEach(r=>r({id:l,dismiss:!0})))):this.toasts.forEach(r=>{this.subscribers.forEach(u=>u({id:r.id,dismiss:!0}))}),l),this.message=(l,r)=>this.create({...r,message:l}),this.error=(l,r)=>this.create({...r,message:l,type:"error"}),this.success=(l,r)=>this.create({...r,type:"success",message:l}),this.info=(l,r)=>this.create({...r,type:"info",message:l}),this.warning=(l,r)=>this.create({...r,type:"warning",message:l}),this.loading=(l,r)=>this.create({...r,type:"loading",message:l}),this.promise=(l,r)=>{if(!r)return;let u;r.loading!==void 0&&(u=this.create({...r,promise:l,type:"loading",message:r.loading,description:typeof r.description!="function"?r.description:void 0}));const c=Promise.resolve(l instanceof Function?l():l);let f=u!==void 0,m;const h=c.then(async v=>{if(m=["resolve",v],Y.isValidElement(v))f=!1,this.create({id:u,type:"default",message:v});else if(f0(v)&&!v.ok){f=!1;const g=typeof r.error=="function"?await r.error(`HTTP error! status: ${v.status}`):r.error,D=typeof r.description=="function"?await r.description(`HTTP error! status: ${v.status}`):r.description,j=typeof g=="object"&&!Y.isValidElement(g)?g:{message:g};this.create({id:u,type:"error",description:D,...j})}else if(v instanceof Error){f=!1;const g=typeof r.error=="function"?await r.error(v):r.error,D=typeof r.description=="function"?await r.description(v):r.description,j=typeof g=="object"&&!Y.isValidElement(g)?g:{message:g};this.create({id:u,type:"error",description:D,...j})}else if(r.success!==void 0){f=!1;const g=typeof r.success=="function"?await r.success(v):r.success,D=typeof r.description=="function"?await r.description(v):r.description,j=typeof g=="object"&&!Y.isValidElement(g)?g:{message:g};this.create({id:u,type:"success",description:D,...j})}}).catch(async v=>{if(m=["reject",v],r.error!==void 0){f=!1;const x=typeof r.error=="function"?await r.error(v):r.error,g=typeof r.description=="function"?await r.description(v):r.description,R=typeof x=="object"&&!Y.isValidElement(x)?x:{message:x};this.create({id:u,type:"error",description:g,...R})}}).finally(()=>{f&&(this.dismiss(u),u=void 0),r.finally==null||r.finally.call(r)}),b=()=>new Promise((v,x)=>h.then(()=>m[0]==="reject"?x(m[1]):v(m[1])).catch(x));return typeof u!="string"&&typeof u!="number"?{unwrap:b}:Object.assign(u,{unwrap:b})},this.custom=(l,r)=>{const u=r?.id||tc++;return this.create({jsx:l(u),id:u,...r}),u},this.getActiveToasts=()=>this.toasts.filter(l=>!this.dismissedToasts.has(l.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}}const Ot=new o0,c0=(i,l)=>{const r=l?.id||tc++;return Ot.addToast({title:i,...l,id:r}),r},f0=i=>i&&typeof i=="object"&&"ok"in i&&typeof i.ok=="boolean"&&"status"in i&&typeof i.status=="number",d0=c0,h0=()=>Ot.toasts,m0=()=>Ot.getActiveToasts(),OE=Object.assign(d0,{success:Ot.success,info:Ot.info,warning:Ot.warning,error:Ot.error,custom:Ot.custom,message:Ot.message,promise:Ot.promise,dismiss:Ot.dismiss,loading:Ot.loading},{getHistory:h0,getToasts:m0});Py("[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}");function nr(i){return i.label!==void 0}const g0=3,p0="24px",v0="16px",pm=4e3,y0=356,b0=14,S0=45,x0=200;function on(...i){return i.filter(Boolean).join(" ")}function E0(i){const[l,r]=i.split("-"),u=[];return l&&u.push(l),r&&u.push(r),u}const T0=i=>{var l,r,u,c,f,m,h,b,v;const{invert:x,toast:g,unstyled:D,interacting:R,setHeights:j,visibleToasts:B,heights:k,index:U,toasts:Q,expanded:Z,removeToast:I,defaultRichColors:ee,closeButton:J,style:X,cancelButtonStyle:ve,actionButtonStyle:ae,className:te="",descriptionClassName:fe="",duration:re,position:Ee,gap:Te,expandByDefault:je,classNames:A,icons:V,closeButtonAriaLabel:$="Close toast"}=i,[de,ue]=Y.useState(null),[me,_]=Y.useState(null),[q,G]=Y.useState(!1),[K,le]=Y.useState(!1),[Se,oe]=Y.useState(!1),[Ae,Ct]=Y.useState(!1),[dn,tn]=Y.useState(!1),[Yi,Zt]=Y.useState(0),[jl,Ha]=Y.useState(0),ca=Y.useRef(g.duration||re||pm),Ll=Y.useRef(null),Nt=Y.useRef(null),Ul=U===0,Bl=U+1<=B,ut=g.type,_n=g.dismissible!==!1,ot=g.className||"",Nr=g.descriptionClassName||"",fa=Y.useMemo(()=>k.findIndex(ie=>ie.toastId===g.id)||0,[k,g.id]),Ki=Y.useMemo(()=>{var ie;return(ie=g.closeButton)!=null?ie:J},[g.closeButton,J]),da=Y.useMemo(()=>g.duration||re||pm,[g.duration,re]),Hl=Y.useRef(0),hn=Y.useRef(0),ki=Y.useRef(0),jn=Y.useRef(null),[ha,ct]=Ee.split("-"),Ft=Y.useMemo(()=>k.reduce((ie,Be,We)=>We>=fa?ie:ie+Be.height,0),[k,fa]),st=u0(),Ar=g.invert||x,ql=ut==="loading";hn.current=Y.useMemo(()=>fa*Te+Ft,[fa,Ft]),Y.useEffect(()=>{ca.current=da},[da]),Y.useEffect(()=>{G(!0)},[]),Y.useEffect(()=>{const ie=Nt.current;if(ie){const Be=ie.getBoundingClientRect().height;return Ha(Be),j(We=>[{toastId:g.id,height:Be,position:g.position},...We]),()=>j(We=>We.filter(rt=>rt.toastId!==g.id))}},[j,g.id]),Y.useLayoutEffect(()=>{if(!q)return;const ie=Nt.current,Be=ie.style.height;ie.style.height="auto";const We=ie.getBoundingClientRect().height;ie.style.height=Be,Ha(We),j(rt=>rt.find(Ve=>Ve.toastId===g.id)?rt.map(Ve=>Ve.toastId===g.id?{...Ve,height:We}:Ve):[{toastId:g.id,height:We,position:g.position},...rt])},[q,g.title,g.description,j,g.id,g.jsx,g.action,g.cancel]);const nn=Y.useCallback(()=>{le(!0),Zt(hn.current),j(ie=>ie.filter(Be=>Be.toastId!==g.id)),setTimeout(()=>{I(g)},x0)},[g,I,j,hn]);Y.useEffect(()=>{if(g.promise&&ut==="loading"||g.duration===1/0||g.type==="loading")return;let ie;return Z||R||st?(()=>{if(ki.current{g.onAutoClose==null||g.onAutoClose.call(g,g),nn()},ca.current)),()=>clearTimeout(ie)},[Z,R,g,ut,st,nn]),Y.useEffect(()=>{g.delete&&(nn(),g.onDismiss==null||g.onDismiss.call(g,g))},[nn,g.delete]);function qa(){var ie;if(V?.loading){var Be;return Y.createElement("div",{className:on(A?.loader,g==null||(Be=g.classNames)==null?void 0:Be.loader,"sonner-loader"),"data-visible":ut==="loading"},V.loading)}return Y.createElement(n0,{className:on(A?.loader,g==null||(ie=g.classNames)==null?void 0:ie.loader),visible:ut==="loading"})}const Va=g.icon||V?.[ut]||e0(ut);var ma,an;return Y.createElement("li",{tabIndex:0,ref:Nt,className:on(te,ot,A?.toast,g==null||(l=g.classNames)==null?void 0:l.toast,A?.default,A?.[ut],g==null||(r=g.classNames)==null?void 0:r[ut]),"data-sonner-toast":"","data-rich-colors":(ma=g.richColors)!=null?ma:ee,"data-styled":!(g.jsx||g.unstyled||D),"data-mounted":q,"data-promise":!!g.promise,"data-swiped":dn,"data-removed":K,"data-visible":Bl,"data-y-position":ha,"data-x-position":ct,"data-index":U,"data-front":Ul,"data-swiping":Se,"data-dismissible":_n,"data-type":ut,"data-invert":Ar,"data-swipe-out":Ae,"data-swipe-direction":me,"data-expanded":!!(Z||je&&q),"data-testid":g.testId,style:{"--index":U,"--toasts-before":U,"--z-index":Q.length-U,"--offset":`${K?Yi:hn.current}px`,"--initial-height":je?"auto":`${jl}px`,...X,...g.style},onDragEnd:()=>{oe(!1),ue(null),jn.current=null},onPointerDown:ie=>{ie.button!==2&&(ql||!_n||(Ll.current=new Date,Zt(hn.current),ie.target.setPointerCapture(ie.pointerId),ie.target.tagName!=="BUTTON"&&(oe(!0),jn.current={x:ie.clientX,y:ie.clientY})))},onPointerUp:()=>{var ie,Be,We;if(Ae||!_n)return;jn.current=null;const rt=Number(((ie=Nt.current)==null?void 0:ie.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),Ln=Number(((Be=Nt.current)==null?void 0:Be.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),Ve=new Date().getTime()-((We=Ll.current)==null?void 0:We.getTime()),mt=de==="x"?rt:Ln,ga=Math.abs(mt)/Ve;if(Math.abs(mt)>=S0||ga>.11){Zt(hn.current),g.onDismiss==null||g.onDismiss.call(g,g),_(de==="x"?rt>0?"right":"left":Ln>0?"down":"up"),nn(),Ct(!0);return}else{var gt,pt;(gt=Nt.current)==null||gt.style.setProperty("--swipe-amount-x","0px"),(pt=Nt.current)==null||pt.style.setProperty("--swipe-amount-y","0px")}tn(!1),oe(!1),ue(null)},onPointerMove:ie=>{var Be,We,rt;if(!jn.current||!_n||((Be=window.getSelection())==null?void 0:Be.toString().length)>0)return;const Ve=ie.clientY-jn.current.y,mt=ie.clientX-jn.current.x;var ga;const gt=(ga=i.swipeDirections)!=null?ga:E0(Ee);!de&&(Math.abs(mt)>1||Math.abs(Ve)>1)&&ue(Math.abs(mt)>Math.abs(Ve)?"x":"y");let pt={x:0,y:0};const Ya=Jt=>1/(1.5+Math.abs(Jt)/20);if(de==="y"){if(gt.includes("top")||gt.includes("bottom"))if(gt.includes("top")&&Ve<0||gt.includes("bottom")&&Ve>0)pt.y=Ve;else{const Jt=Ve*Ya(Ve);pt.y=Math.abs(Jt)0)pt.x=mt;else{const Jt=mt*Ya(mt);pt.x=Math.abs(Jt)0||Math.abs(pt.y)>0)&&tn(!0),(We=Nt.current)==null||We.style.setProperty("--swipe-amount-x",`${pt.x}px`),(rt=Nt.current)==null||rt.style.setProperty("--swipe-amount-y",`${pt.y}px`)}},Ki&&!g.jsx&&ut!=="loading"?Y.createElement("button",{"aria-label":$,"data-disabled":ql,"data-close-button":!0,onClick:ql||!_n?()=>{}:()=>{nn(),g.onDismiss==null||g.onDismiss.call(g,g)},className:on(A?.closeButton,g==null||(u=g.classNames)==null?void 0:u.closeButton)},(an=V?.close)!=null?an:r0):null,(ut||g.icon||g.promise)&&g.icon!==null&&(V?.[ut]!==null||g.icon)?Y.createElement("div",{"data-icon":"",className:on(A?.icon,g==null||(c=g.classNames)==null?void 0:c.icon)},g.promise||g.type==="loading"&&!g.icon?g.icon||qa():null,g.type!=="loading"?Va:null):null,Y.createElement("div",{"data-content":"",className:on(A?.content,g==null||(f=g.classNames)==null?void 0:f.content)},Y.createElement("div",{"data-title":"",className:on(A?.title,g==null||(m=g.classNames)==null?void 0:m.title)},g.jsx?g.jsx:typeof g.title=="function"?g.title():g.title),g.description?Y.createElement("div",{"data-description":"",className:on(fe,Nr,A?.description,g==null||(h=g.classNames)==null?void 0:h.description)},typeof g.description=="function"?g.description():g.description):null),Y.isValidElement(g.cancel)?g.cancel:g.cancel&&nr(g.cancel)?Y.createElement("button",{"data-button":!0,"data-cancel":!0,style:g.cancelButtonStyle||ve,onClick:ie=>{nr(g.cancel)&&_n&&(g.cancel.onClick==null||g.cancel.onClick.call(g.cancel,ie),nn())},className:on(A?.cancelButton,g==null||(b=g.classNames)==null?void 0:b.cancelButton)},g.cancel.label):null,Y.isValidElement(g.action)?g.action:g.action&&nr(g.action)?Y.createElement("button",{"data-button":!0,"data-action":!0,style:g.actionButtonStyle||ae,onClick:ie=>{nr(g.action)&&(g.action.onClick==null||g.action.onClick.call(g.action,ie),!ie.defaultPrevented&&nn())},className:on(A?.actionButton,g==null||(v=g.classNames)==null?void 0:v.actionButton)},g.action.label):null)};function vm(){if(typeof window>"u"||typeof document>"u")return"ltr";const i=document.documentElement.getAttribute("dir");return i==="auto"||!i?window.getComputedStyle(document.documentElement).direction:i}function O0(i,l){const r={};return[i,l].forEach((u,c)=>{const f=c===1,m=f?"--mobile-offset":"--offset",h=f?v0:p0;function b(v){["top","right","bottom","left"].forEach(x=>{r[`${m}-${x}`]=typeof v=="number"?`${v}px`:v})}typeof u=="number"||typeof u=="string"?b(u):typeof u=="object"?["top","right","bottom","left"].forEach(v=>{u[v]===void 0?r[`${m}-${v}`]=h:r[`${m}-${v}`]=typeof u[v]=="number"?`${u[v]}px`:u[v]}):b(h)}),r}const C0=Y.forwardRef(function(l,r){const{id:u,invert:c,position:f="bottom-right",hotkey:m=["altKey","KeyT"],expand:h,closeButton:b,className:v,offset:x,mobileOffset:g,theme:D="light",richColors:R,duration:j,style:B,visibleToasts:k=g0,toastOptions:U,dir:Q=vm(),gap:Z=b0,icons:I,containerAriaLabel:ee="Notifications"}=l,[J,X]=Y.useState([]),ve=Y.useMemo(()=>u?J.filter(q=>q.toasterId===u):J.filter(q=>!q.toasterId),[J,u]),ae=Y.useMemo(()=>Array.from(new Set([f].concat(ve.filter(q=>q.position).map(q=>q.position)))),[ve,f]),[te,fe]=Y.useState([]),[re,Ee]=Y.useState(!1),[Te,je]=Y.useState(!1),[A,V]=Y.useState(D!=="system"?D:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),$=Y.useRef(null),de=m.join("+").replace(/Key/g,"").replace(/Digit/g,""),ue=Y.useRef(null),me=Y.useRef(!1),_=Y.useCallback(q=>{X(G=>{var K;return(K=G.find(le=>le.id===q.id))!=null&&K.delete||Ot.dismiss(q.id),G.filter(({id:le})=>le!==q.id)})},[]);return Y.useEffect(()=>Ot.subscribe(q=>{if(q.dismiss){requestAnimationFrame(()=>{X(G=>G.map(K=>K.id===q.id?{...K,delete:!0}:K))});return}setTimeout(()=>{ig.flushSync(()=>{X(G=>{const K=G.findIndex(le=>le.id===q.id);return K!==-1?[...G.slice(0,K),{...G[K],...q},...G.slice(K+1)]:[q,...G]})})})}),[J]),Y.useEffect(()=>{if(D!=="system"){V(D);return}if(D==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?V("dark"):V("light")),typeof window>"u")return;const q=window.matchMedia("(prefers-color-scheme: dark)");try{q.addEventListener("change",({matches:G})=>{V(G?"dark":"light")})}catch{q.addListener(({matches:K})=>{try{V(K?"dark":"light")}catch(le){console.error(le)}})}},[D]),Y.useEffect(()=>{J.length<=1&&Ee(!1)},[J]),Y.useEffect(()=>{const q=G=>{var K;if(m.every(oe=>G[oe]||G.code===oe)){var Se;Ee(!0),(Se=$.current)==null||Se.focus()}G.code==="Escape"&&(document.activeElement===$.current||(K=$.current)!=null&&K.contains(document.activeElement))&&Ee(!1)};return document.addEventListener("keydown",q),()=>document.removeEventListener("keydown",q)},[m]),Y.useEffect(()=>{if($.current)return()=>{ue.current&&(ue.current.focus({preventScroll:!0}),ue.current=null,me.current=!1)}},[$.current]),Y.createElement("section",{ref:r,"aria-label":`${ee} ${de}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0},ae.map((q,G)=>{var K;const[le,Se]=q.split("-");return ve.length?Y.createElement("ol",{key:q,dir:Q==="auto"?vm():Q,tabIndex:-1,ref:$,className:v,"data-sonner-toaster":!0,"data-sonner-theme":A,"data-y-position":le,"data-x-position":Se,style:{"--front-toast-height":`${((K=te[0])==null?void 0:K.height)||0}px`,"--width":`${y0}px`,"--gap":`${Z}px`,...B,...O0(x,g)},onBlur:oe=>{me.current&&!oe.currentTarget.contains(oe.relatedTarget)&&(me.current=!1,ue.current&&(ue.current.focus({preventScroll:!0}),ue.current=null))},onFocus:oe=>{oe.target instanceof HTMLElement&&oe.target.dataset.dismissible==="false"||me.current||(me.current=!0,ue.current=oe.relatedTarget)},onMouseEnter:()=>Ee(!0),onMouseMove:()=>Ee(!0),onMouseLeave:()=>{Te||Ee(!1)},onDragEnd:()=>Ee(!1),onPointerDown:oe=>{oe.target instanceof HTMLElement&&oe.target.dataset.dismissible==="false"||je(!0)},onPointerUp:()=>je(!1)},ve.filter(oe=>!oe.position&&G===0||oe.position===q).map((oe,Ae)=>{var Ct,dn;return Y.createElement(T0,{key:oe.id,icons:I,index:Ae,toast:oe,defaultRichColors:R,duration:(Ct=U?.duration)!=null?Ct:j,className:U?.className,descriptionClassName:U?.descriptionClassName,invert:c,visibleToasts:k,closeButton:(dn=U?.closeButton)!=null?dn:b,interacting:Te,position:q,style:U?.style,unstyled:U?.unstyled,classNames:U?.classNames,cancelButtonStyle:U?.cancelButtonStyle,actionButtonStyle:U?.actionButtonStyle,closeButtonAriaLabel:U?.closeButtonAriaLabel,removeToast:_,toasts:ve.filter(tn=>tn.position==oe.position),heights:te.filter(tn=>tn.position==oe.position),setHeights:fe,expandByDefault:h,gap:Z,expanded:re,swipeDirections:l.swipeDirections})})):null}))}),N0="modulepreload",A0=function(i){return"/"+i},ym={},Ut=function(l,r,u){let c=Promise.resolve();if(r&&r.length>0){let b=function(v){return Promise.all(v.map(x=>Promise.resolve(x).then(g=>({status:"fulfilled",value:g}),g=>({status:"rejected",reason:g}))))};document.getElementsByTagName("link");const m=document.querySelector("meta[property=csp-nonce]"),h=m?.nonce||m?.getAttribute("nonce");c=b(r.map(v=>{if(v=A0(v),v in ym)return;ym[v]=!0;const x=v.endsWith(".css"),g=x?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${v}"]${g}`))return;const D=document.createElement("link");if(D.rel=x?"stylesheet":N0,x||(D.as="script"),D.crossOrigin="",D.href=v,h&&D.setAttribute("nonce",h),document.head.appendChild(D),x)return new Promise((R,j)=>{D.addEventListener("load",R),D.addEventListener("error",()=>j(new Error(`Unable to preload CSS for ${v}`)))})}))}function f(m){const h=new Event("vite:preloadError",{cancelable:!0});if(h.payload=m,window.dispatchEvent(h),!h.defaultPrevented)throw m}return c.then(m=>{for(const h of m||[])h.status==="rejected"&&f(h.reason);return l().catch(f)})};function ji(...i){return Qy(Xy(i))}const bm=i=>{let l;const r=new Set,u=(v,x)=>{const g=typeof v=="function"?v(l):v;if(!Object.is(g,l)){const D=l;l=x??(typeof g!="object"||g===null)?g:Object.assign({},l,g),r.forEach(R=>R(l,D))}},c=()=>l,h={setState:u,getState:c,getInitialState:()=>b,subscribe:v=>(r.add(v),()=>r.delete(v))},b=l=i(u,c,h);return h},D0=(i=>i?bm(i):bm),w0=i=>i;function z0(i,l=w0){const r=Y.useSyncExternalStore(i.subscribe,Y.useCallback(()=>l(i.getState()),[i,l]),Y.useCallback(()=>l(i.getInitialState()),[i,l]));return Y.useDebugValue(r),r}const Sm=i=>{const l=D0(i),r=u=>z0(l,u);return Object.assign(r,l),r},R0=(i=>i?Sm(i):Sm);function bg(){if(typeof window>"u")return"system";const i=localStorage.getItem("nm-theme");return i==="light"||i==="dark"||i==="system"?i:"system"}function hr(i){const l=document.documentElement,r=i==="dark"||i==="system"&&window.matchMedia("(prefers-color-scheme: dark)").matches;l.classList.toggle("dark",r),localStorage.setItem("nm-theme",i)}hr(bg());const br=R0((i,l)=>({sidebarOpen:!0,theme:bg(),toggleSidebar:()=>i(r=>({sidebarOpen:!r.sidebarOpen})),setSidebarOpen:r=>i({sidebarOpen:r}),setTheme:r=>{hr(r),i({theme:r})},cycleTheme:()=>{const r=["light","dark","system"],u=l().theme,c=r[(r.indexOf(u)+1)%r.length];hr(c),i({theme:c})}}));typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{const{theme:i}=br.getState();i==="system"&&hr("system")});const se=i=>typeof i=="string",zi=()=>{let i,l;const r=new Promise((u,c)=>{i=u,l=c});return r.resolve=i,r.reject=l,r},xm=i=>i==null?"":""+i,M0=(i,l,r)=>{i.forEach(u=>{l[u]&&(r[u]=l[u])})},_0=/###/g,Em=i=>i&&i.indexOf("###")>-1?i.replace(_0,"."):i,Tm=i=>!i||se(i),Mi=(i,l,r)=>{const u=se(l)?l.split("."):l;let c=0;for(;c{const{obj:u,k:c}=Mi(i,l,Object);if(u!==void 0||l.length===1){u[c]=r;return}let f=l[l.length-1],m=l.slice(0,l.length-1),h=Mi(i,m,Object);for(;h.obj===void 0&&m.length;)f=`${m[m.length-1]}.${f}`,m=m.slice(0,m.length-1),h=Mi(i,m,Object),h?.obj&&typeof h.obj[`${h.k}.${f}`]<"u"&&(h.obj=void 0);h.obj[`${h.k}.${f}`]=r},j0=(i,l,r,u)=>{const{obj:c,k:f}=Mi(i,l,Object);c[f]=c[f]||[],c[f].push(r)},mr=(i,l)=>{const{obj:r,k:u}=Mi(i,l);if(r&&Object.prototype.hasOwnProperty.call(r,u))return r[u]},L0=(i,l,r)=>{const u=mr(i,r);return u!==void 0?u:mr(l,r)},Sg=(i,l,r)=>{for(const u in l)u!=="__proto__"&&u!=="constructor"&&(u in i?se(i[u])||i[u]instanceof String||se(l[u])||l[u]instanceof String?r&&(i[u]=l[u]):Sg(i[u],l[u],r):i[u]=l[u]);return i},_a=i=>i.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var U0={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};const B0=i=>se(i)?i.replace(/[&<>"'\/]/g,l=>U0[l]):i;class H0{constructor(l){this.capacity=l,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(l){const r=this.regExpMap.get(l);if(r!==void 0)return r;const u=new RegExp(l);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(l,u),this.regExpQueue.push(l),u}}const q0=[" ",",","?","!",";"],V0=new H0(20),Y0=(i,l,r)=>{l=l||"",r=r||"";const u=q0.filter(m=>l.indexOf(m)<0&&r.indexOf(m)<0);if(u.length===0)return!0;const c=V0.getRegExp(`(${u.map(m=>m==="?"?"\\?":m).join("|")})`);let f=!c.test(i);if(!f){const m=i.indexOf(r);m>0&&!c.test(i.substring(0,m))&&(f=!0)}return f},nc=(i,l,r=".")=>{if(!i)return;if(i[l])return Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;const u=l.split(r);let c=i;for(let f=0;f-1&&bi?.replace("_","-"),K0={type:"logger",log(i){this.output("log",i)},warn(i){this.output("warn",i)},error(i){this.output("error",i)},output(i,l){console?.[i]?.apply?.(console,l)}};class gr{constructor(l,r={}){this.init(l,r)}init(l,r={}){this.prefix=r.prefix||"i18next:",this.logger=l||K0,this.options=r,this.debug=r.debug}log(...l){return this.forward(l,"log","",!0)}warn(...l){return this.forward(l,"warn","",!0)}error(...l){return this.forward(l,"error","")}deprecate(...l){return this.forward(l,"warn","WARNING DEPRECATED: ",!0)}forward(l,r,u,c){return c&&!this.debug?null:(se(l[0])&&(l[0]=`${u}${this.prefix} ${l[0]}`),this.logger[r](l))}create(l){return new gr(this.logger,{prefix:`${this.prefix}:${l}:`,...this.options})}clone(l){return l=l||this.options,l.prefix=l.prefix||this.prefix,new gr(this.logger,l)}}var fn=new gr;class Sr{constructor(){this.observers={}}on(l,r){return l.split(" ").forEach(u=>{this.observers[u]||(this.observers[u]=new Map);const c=this.observers[u].get(r)||0;this.observers[u].set(r,c+1)}),this}off(l,r){if(this.observers[l]){if(!r){delete this.observers[l];return}this.observers[l].delete(r)}}emit(l,...r){this.observers[l]&&Array.from(this.observers[l].entries()).forEach(([c,f])=>{for(let m=0;m{for(let m=0;m-1&&this.options.ns.splice(r,1)}getResource(l,r,u,c={}){const f=c.keySeparator!==void 0?c.keySeparator:this.options.keySeparator,m=c.ignoreJSONStructure!==void 0?c.ignoreJSONStructure:this.options.ignoreJSONStructure;let h;l.indexOf(".")>-1?h=l.split("."):(h=[l,r],u&&(Array.isArray(u)?h.push(...u):se(u)&&f?h.push(...u.split(f)):h.push(u)));const b=mr(this.data,h);return!b&&!r&&!u&&l.indexOf(".")>-1&&(l=h[0],r=h[1],u=h.slice(2).join(".")),b||!m||!se(u)?b:nc(this.data?.[l]?.[r],u,f)}addResource(l,r,u,c,f={silent:!1}){const m=f.keySeparator!==void 0?f.keySeparator:this.options.keySeparator;let h=[l,r];u&&(h=h.concat(m?u.split(m):u)),l.indexOf(".")>-1&&(h=l.split("."),c=r,r=h[1]),this.addNamespaces(r),Om(this.data,h,c),f.silent||this.emit("added",l,r,u,c)}addResources(l,r,u,c={silent:!1}){for(const f in u)(se(u[f])||Array.isArray(u[f]))&&this.addResource(l,r,f,u[f],{silent:!0});c.silent||this.emit("added",l,r,u)}addResourceBundle(l,r,u,c,f,m={silent:!1,skipCopy:!1}){let h=[l,r];l.indexOf(".")>-1&&(h=l.split("."),c=u,u=r,r=h[1]),this.addNamespaces(r);let b=mr(this.data,h)||{};m.skipCopy||(u=JSON.parse(JSON.stringify(u))),c?Sg(b,u,f):b={...b,...u},Om(this.data,h,b),m.silent||this.emit("added",l,r,u)}removeResourceBundle(l,r){this.hasResourceBundle(l,r)&&delete this.data[l][r],this.removeNamespaces(r),this.emit("removed",l,r)}hasResourceBundle(l,r){return this.getResource(l,r)!==void 0}getResourceBundle(l,r){return r||(r=this.options.defaultNS),this.getResource(l,r)}getDataByLanguage(l){return this.data[l]}hasLanguageSomeTranslations(l){const r=this.getDataByLanguage(l);return!!(r&&Object.keys(r)||[]).find(c=>r[c]&&Object.keys(r[c]).length>0)}toJSON(){return this.data}}var xg={processors:{},addPostProcessor(i){this.processors[i.name]=i},handle(i,l,r,u,c){return i.forEach(f=>{l=this.processors[f]?.process(l,r,u,c)??l}),l}};const Eg=Symbol("i18next/PATH_KEY");function k0(){const i=[],l=Object.create(null);let r;return l.get=(u,c)=>(r?.revoke?.(),c===Eg?i:(i.push(c),r=Proxy.revocable(u,l),r.proxy)),Proxy.revocable(Object.create(null),l).proxy}function ac(i,l){const{[Eg]:r}=i(k0());return r.join(l?.keySeparator??".")}const Nm={},Ko=i=>!se(i)&&typeof i!="boolean"&&typeof i!="number";class pr extends Sr{constructor(l,r={}){super(),M0(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],l,this),this.options=r,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=fn.create("translator")}changeLanguage(l){l&&(this.language=l)}exists(l,r={interpolation:{}}){const u={...r};if(l==null)return!1;const c=this.resolve(l,u);if(c?.res===void 0)return!1;const f=Ko(c.res);return!(u.returnObjects===!1&&f)}extractFromKey(l,r){let u=r.nsSeparator!==void 0?r.nsSeparator:this.options.nsSeparator;u===void 0&&(u=":");const c=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator;let f=r.ns||this.options.defaultNS||[];const m=u&&l.indexOf(u)>-1,h=!this.options.userDefinedKeySeparator&&!r.keySeparator&&!this.options.userDefinedNsSeparator&&!r.nsSeparator&&!Y0(l,u,c);if(m&&!h){const b=l.match(this.interpolator.nestingRegexp);if(b&&b.length>0)return{key:l,namespaces:se(f)?[f]:f};const v=l.split(u);(u!==c||u===c&&this.options.ns.indexOf(v[0])>-1)&&(f=v.shift()),l=v.join(c)}return{key:l,namespaces:se(f)?[f]:f}}translate(l,r,u){let c=typeof r=="object"?{...r}:r;if(typeof c!="object"&&this.options.overloadTranslationOptionHandler&&(c=this.options.overloadTranslationOptionHandler(arguments)),typeof c=="object"&&(c={...c}),c||(c={}),l==null)return"";typeof l=="function"&&(l=ac(l,{...this.options,...c})),Array.isArray(l)||(l=[String(l)]);const f=c.returnDetails!==void 0?c.returnDetails:this.options.returnDetails,m=c.keySeparator!==void 0?c.keySeparator:this.options.keySeparator,{key:h,namespaces:b}=this.extractFromKey(l[l.length-1],c),v=b[b.length-1];let x=c.nsSeparator!==void 0?c.nsSeparator:this.options.nsSeparator;x===void 0&&(x=":");const g=c.lng||this.language,D=c.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(g?.toLowerCase()==="cimode")return D?f?{res:`${v}${x}${h}`,usedKey:h,exactUsedKey:h,usedLng:g,usedNS:v,usedParams:this.getUsedParamsDetails(c)}:`${v}${x}${h}`:f?{res:h,usedKey:h,exactUsedKey:h,usedLng:g,usedNS:v,usedParams:this.getUsedParamsDetails(c)}:h;const R=this.resolve(l,c);let j=R?.res;const B=R?.usedKey||h,k=R?.exactUsedKey||h,U=["[object Number]","[object Function]","[object RegExp]"],Q=c.joinArrays!==void 0?c.joinArrays:this.options.joinArrays,Z=!this.i18nFormat||this.i18nFormat.handleAsObject,I=c.count!==void 0&&!se(c.count),ee=pr.hasDefaultValue(c),J=I?this.pluralResolver.getSuffix(g,c.count,c):"",X=c.ordinal&&I?this.pluralResolver.getSuffix(g,c.count,{ordinal:!1}):"",ve=I&&!c.ordinal&&c.count===0,ae=ve&&c[`defaultValue${this.options.pluralSeparator}zero`]||c[`defaultValue${J}`]||c[`defaultValue${X}`]||c.defaultValue;let te=j;Z&&!j&&ee&&(te=ae);const fe=Ko(te),re=Object.prototype.toString.apply(te);if(Z&&te&&fe&&U.indexOf(re)<0&&!(se(Q)&&Array.isArray(te))){if(!c.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const Ee=this.options.returnedObjectHandler?this.options.returnedObjectHandler(B,te,{...c,ns:b}):`key '${h} (${this.language})' returned an object instead of string.`;return f?(R.res=Ee,R.usedParams=this.getUsedParamsDetails(c),R):Ee}if(m){const Ee=Array.isArray(te),Te=Ee?[]:{},je=Ee?k:B;for(const A in te)if(Object.prototype.hasOwnProperty.call(te,A)){const V=`${je}${m}${A}`;ee&&!j?Te[A]=this.translate(V,{...c,defaultValue:Ko(ae)?ae[A]:void 0,joinArrays:!1,ns:b}):Te[A]=this.translate(V,{...c,joinArrays:!1,ns:b}),Te[A]===V&&(Te[A]=te[A])}j=Te}}else if(Z&&se(Q)&&Array.isArray(j))j=j.join(Q),j&&(j=this.extendTranslation(j,l,c,u));else{let Ee=!1,Te=!1;!this.isValidLookup(j)&&ee&&(Ee=!0,j=ae),this.isValidLookup(j)||(Te=!0,j=h);const A=(c.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&Te?void 0:j,V=ee&&ae!==j&&this.options.updateMissing;if(Te||Ee||V){if(this.logger.log(V?"updateKey":"missingKey",g,v,h,V?ae:j),m){const me=this.resolve(h,{...c,keySeparator:!1});me&&me.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let $=[];const de=this.languageUtils.getFallbackCodes(this.options.fallbackLng,c.lng||this.language);if(this.options.saveMissingTo==="fallback"&&de&&de[0])for(let me=0;me{const G=ee&&q!==j?q:A;this.options.missingKeyHandler?this.options.missingKeyHandler(me,v,_,G,V,c):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(me,v,_,G,V,c),this.emit("missingKey",me,v,_,j)};this.options.saveMissing&&(this.options.saveMissingPlurals&&I?$.forEach(me=>{const _=this.pluralResolver.getSuffixes(me,c);ve&&c[`defaultValue${this.options.pluralSeparator}zero`]&&_.indexOf(`${this.options.pluralSeparator}zero`)<0&&_.push(`${this.options.pluralSeparator}zero`),_.forEach(q=>{ue([me],h+q,c[`defaultValue${q}`]||ae)})}):ue($,h,ae))}j=this.extendTranslation(j,l,c,R,u),Te&&j===h&&this.options.appendNamespaceToMissingKey&&(j=`${v}${x}${h}`),(Te||Ee)&&this.options.parseMissingKeyHandler&&(j=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${v}${x}${h}`:h,Ee?j:void 0,c))}return f?(R.res=j,R.usedParams=this.getUsedParamsDetails(c),R):j}extendTranslation(l,r,u,c,f){if(this.i18nFormat?.parse)l=this.i18nFormat.parse(l,{...this.options.interpolation.defaultVariables,...u},u.lng||this.language||c.usedLng,c.usedNS,c.usedKey,{resolved:c});else if(!u.skipInterpolation){u.interpolation&&this.interpolator.init({...u,interpolation:{...this.options.interpolation,...u.interpolation}});const b=se(l)&&(u?.interpolation?.skipOnVariables!==void 0?u.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let v;if(b){const g=l.match(this.interpolator.nestingRegexp);v=g&&g.length}let x=u.replace&&!se(u.replace)?u.replace:u;if(this.options.interpolation.defaultVariables&&(x={...this.options.interpolation.defaultVariables,...x}),l=this.interpolator.interpolate(l,x,u.lng||this.language||c.usedLng,u),b){const g=l.match(this.interpolator.nestingRegexp),D=g&&g.length;vf?.[0]===g[0]&&!u.context?(this.logger.warn(`It seems you are nesting recursively key: ${g[0]} in key: ${r[0]}`),null):this.translate(...g,r),u)),u.interpolation&&this.interpolator.reset()}const m=u.postProcess||this.options.postProcess,h=se(m)?[m]:m;return l!=null&&h?.length&&u.applyPostProcessor!==!1&&(l=xg.handle(h,l,r,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...c,usedParams:this.getUsedParamsDetails(u)},...u}:u,this)),l}resolve(l,r={}){let u,c,f,m,h;return se(l)&&(l=[l]),l.forEach(b=>{if(this.isValidLookup(u))return;const v=this.extractFromKey(b,r),x=v.key;c=x;let g=v.namespaces;this.options.fallbackNS&&(g=g.concat(this.options.fallbackNS));const D=r.count!==void 0&&!se(r.count),R=D&&!r.ordinal&&r.count===0,j=r.context!==void 0&&(se(r.context)||typeof r.context=="number")&&r.context!=="",B=r.lngs?r.lngs:this.languageUtils.toResolveHierarchy(r.lng||this.language,r.fallbackLng);g.forEach(k=>{this.isValidLookup(u)||(h=k,!Nm[`${B[0]}-${k}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(h)&&(Nm[`${B[0]}-${k}`]=!0,this.logger.warn(`key "${c}" for languages "${B.join(", ")}" won't get resolved as namespace "${h}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),B.forEach(U=>{if(this.isValidLookup(u))return;m=U;const Q=[x];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(Q,x,U,k,r);else{let I;D&&(I=this.pluralResolver.getSuffix(U,r.count,r));const ee=`${this.options.pluralSeparator}zero`,J=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(D&&(r.ordinal&&I.indexOf(J)===0&&Q.push(x+I.replace(J,this.options.pluralSeparator)),Q.push(x+I),R&&Q.push(x+ee)),j){const X=`${x}${this.options.contextSeparator||"_"}${r.context}`;Q.push(X),D&&(r.ordinal&&I.indexOf(J)===0&&Q.push(X+I.replace(J,this.options.pluralSeparator)),Q.push(X+I),R&&Q.push(X+ee))}}let Z;for(;Z=Q.pop();)this.isValidLookup(u)||(f=Z,u=this.getResource(U,k,Z,r))}))})}),{res:u,usedKey:c,exactUsedKey:f,usedLng:m,usedNS:h}}isValidLookup(l){return l!==void 0&&!(!this.options.returnNull&&l===null)&&!(!this.options.returnEmptyString&&l==="")}getResource(l,r,u,c={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(l,r,u,c):this.resourceStore.getResource(l,r,u,c)}getUsedParamsDetails(l={}){const r=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],u=l.replace&&!se(l.replace);let c=u?l.replace:l;if(u&&typeof l.count<"u"&&(c.count=l.count),this.options.interpolation.defaultVariables&&(c={...this.options.interpolation.defaultVariables,...c}),!u){c={...c};for(const f of r)delete c[f]}return c}static hasDefaultValue(l){const r="defaultValue";for(const u in l)if(Object.prototype.hasOwnProperty.call(l,u)&&r===u.substring(0,r.length)&&l[u]!==void 0)return!0;return!1}}class Am{constructor(l){this.options=l,this.supportedLngs=this.options.supportedLngs||!1,this.logger=fn.create("languageUtils")}getScriptPartFromCode(l){if(l=Li(l),!l||l.indexOf("-")<0)return null;const r=l.split("-");return r.length===2||(r.pop(),r[r.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(r.join("-"))}getLanguagePartFromCode(l){if(l=Li(l),!l||l.indexOf("-")<0)return l;const r=l.split("-");return this.formatLanguageCode(r[0])}formatLanguageCode(l){if(se(l)&&l.indexOf("-")>-1){let r;try{r=Intl.getCanonicalLocales(l)[0]}catch{}return r&&this.options.lowerCaseLng&&(r=r.toLowerCase()),r||(this.options.lowerCaseLng?l.toLowerCase():l)}return this.options.cleanCode||this.options.lowerCaseLng?l.toLowerCase():l}isSupportedCode(l){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(l=this.getLanguagePartFromCode(l)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(l)>-1}getBestMatchFromCodes(l){if(!l)return null;let r;return l.forEach(u=>{if(r)return;const c=this.formatLanguageCode(u);(!this.options.supportedLngs||this.isSupportedCode(c))&&(r=c)}),!r&&this.options.supportedLngs&&l.forEach(u=>{if(r)return;const c=this.getScriptPartFromCode(u);if(this.isSupportedCode(c))return r=c;const f=this.getLanguagePartFromCode(u);if(this.isSupportedCode(f))return r=f;r=this.options.supportedLngs.find(m=>{if(m===f)return m;if(!(m.indexOf("-")<0&&f.indexOf("-")<0)&&(m.indexOf("-")>0&&f.indexOf("-")<0&&m.substring(0,m.indexOf("-"))===f||m.indexOf(f)===0&&f.length>1))return m})}),r||(r=this.getFallbackCodes(this.options.fallbackLng)[0]),r}getFallbackCodes(l,r){if(!l)return[];if(typeof l=="function"&&(l=l(r)),se(l)&&(l=[l]),Array.isArray(l))return l;if(!r)return l.default||[];let u=l[r];return u||(u=l[this.getScriptPartFromCode(r)]),u||(u=l[this.formatLanguageCode(r)]),u||(u=l[this.getLanguagePartFromCode(r)]),u||(u=l.default),u||[]}toResolveHierarchy(l,r){const u=this.getFallbackCodes((r===!1?[]:r)||this.options.fallbackLng||[],l),c=[],f=m=>{m&&(this.isSupportedCode(m)?c.push(m):this.logger.warn(`rejecting language code not found in supportedLngs: ${m}`))};return se(l)&&(l.indexOf("-")>-1||l.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&f(this.formatLanguageCode(l)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&f(this.getScriptPartFromCode(l)),this.options.load!=="currentOnly"&&f(this.getLanguagePartFromCode(l))):se(l)&&f(this.formatLanguageCode(l)),u.forEach(m=>{c.indexOf(m)<0&&f(this.formatLanguageCode(m))}),c}}const Dm={zero:0,one:1,two:2,few:3,many:4,other:5},wm={select:i=>i===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class G0{constructor(l,r={}){this.languageUtils=l,this.options=r,this.logger=fn.create("pluralResolver"),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(l,r={}){const u=Li(l==="dev"?"en":l),c=r.ordinal?"ordinal":"cardinal",f=JSON.stringify({cleanedCode:u,type:c});if(f in this.pluralRulesCache)return this.pluralRulesCache[f];let m;try{m=new Intl.PluralRules(u,{type:c})}catch{if(typeof Intl>"u")return this.logger.error("No Intl support, please use an Intl polyfill!"),wm;if(!l.match(/-|_/))return wm;const b=this.languageUtils.getLanguagePartFromCode(l);m=this.getRule(b,r)}return this.pluralRulesCache[f]=m,m}needsPlural(l,r={}){let u=this.getRule(l,r);return u||(u=this.getRule("dev",r)),u?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(l,r,u={}){return this.getSuffixes(l,u).map(c=>`${r}${c}`)}getSuffixes(l,r={}){let u=this.getRule(l,r);return u||(u=this.getRule("dev",r)),u?u.resolvedOptions().pluralCategories.sort((c,f)=>Dm[c]-Dm[f]).map(c=>`${this.options.prepend}${r.ordinal?`ordinal${this.options.prepend}`:""}${c}`):[]}getSuffix(l,r,u={}){const c=this.getRule(l,u);return c?`${this.options.prepend}${u.ordinal?`ordinal${this.options.prepend}`:""}${c.select(r)}`:(this.logger.warn(`no plural rule found for: ${l}`),this.getSuffix("dev",r,u))}}const zm=(i,l,r,u=".",c=!0)=>{let f=L0(i,l,r);return!f&&c&&se(r)&&(f=nc(i,r,u),f===void 0&&(f=nc(l,r,u))),f},ko=i=>i.replace(/\$/g,"$$$$");class Rm{constructor(l={}){this.logger=fn.create("interpolator"),this.options=l,this.format=l?.interpolation?.format||(r=>r),this.init(l)}init(l={}){l.interpolation||(l.interpolation={escapeValue:!0});const{escape:r,escapeValue:u,useRawValueToEscape:c,prefix:f,prefixEscaped:m,suffix:h,suffixEscaped:b,formatSeparator:v,unescapeSuffix:x,unescapePrefix:g,nestingPrefix:D,nestingPrefixEscaped:R,nestingSuffix:j,nestingSuffixEscaped:B,nestingOptionsSeparator:k,maxReplaces:U,alwaysFormat:Q}=l.interpolation;this.escape=r!==void 0?r:B0,this.escapeValue=u!==void 0?u:!0,this.useRawValueToEscape=c!==void 0?c:!1,this.prefix=f?_a(f):m||"{{",this.suffix=h?_a(h):b||"}}",this.formatSeparator=v||",",this.unescapePrefix=x?"":g||"-",this.unescapeSuffix=this.unescapePrefix?"":x||"",this.nestingPrefix=D?_a(D):R||_a("$t("),this.nestingSuffix=j?_a(j):B||_a(")"),this.nestingOptionsSeparator=k||",",this.maxReplaces=U||1e3,this.alwaysFormat=Q!==void 0?Q:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const l=(r,u)=>r?.source===u?(r.lastIndex=0,r):new RegExp(u,"g");this.regexp=l(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=l(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=l(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(l,r,u,c){let f,m,h;const b=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},v=R=>{if(R.indexOf(this.formatSeparator)<0){const U=zm(r,b,R,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(U,void 0,u,{...c,...r,interpolationkey:R}):U}const j=R.split(this.formatSeparator),B=j.shift().trim(),k=j.join(this.formatSeparator).trim();return this.format(zm(r,b,B,this.options.keySeparator,this.options.ignoreJSONStructure),k,u,{...c,...r,interpolationkey:B})};this.resetRegExp();const x=c?.missingInterpolationHandler||this.options.missingInterpolationHandler,g=c?.interpolation?.skipOnVariables!==void 0?c.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:R=>ko(R)},{regex:this.regexp,safeValue:R=>this.escapeValue?ko(this.escape(R)):ko(R)}].forEach(R=>{for(h=0;f=R.regex.exec(l);){const j=f[1].trim();if(m=v(j),m===void 0)if(typeof x=="function"){const k=x(l,f,c);m=se(k)?k:""}else if(c&&Object.prototype.hasOwnProperty.call(c,j))m="";else if(g){m=f[0];continue}else this.logger.warn(`missed to pass in variable ${j} for interpolating ${l}`),m="";else!se(m)&&!this.useRawValueToEscape&&(m=xm(m));const B=R.safeValue(m);if(l=l.replace(f[0],B),g?(R.regex.lastIndex+=m.length,R.regex.lastIndex-=f[0].length):R.regex.lastIndex=0,h++,h>=this.maxReplaces)break}}),l}nest(l,r,u={}){let c,f,m;const h=(b,v)=>{const x=this.nestingOptionsSeparator;if(b.indexOf(x)<0)return b;const g=b.split(new RegExp(`${_a(x)}[ ]*{`));let D=`{${g[1]}`;b=g[0],D=this.interpolate(D,m);const R=D.match(/'/g),j=D.match(/"/g);((R?.length??0)%2===0&&!j||(j?.length??0)%2!==0)&&(D=D.replace(/'/g,'"'));try{m=JSON.parse(D),v&&(m={...v,...m})}catch(B){return this.logger.warn(`failed parsing options string in nesting for key ${b}`,B),`${b}${x}${D}`}return m.defaultValue&&m.defaultValue.indexOf(this.prefix)>-1&&delete m.defaultValue,b};for(;c=this.nestingRegexp.exec(l);){let b=[];m={...u},m=m.replace&&!se(m.replace)?m.replace:m,m.applyPostProcessor=!1,delete m.defaultValue;const v=/{.*}/.test(c[1])?c[1].lastIndexOf("}")+1:c[1].indexOf(this.formatSeparator);if(v!==-1&&(b=c[1].slice(v).split(this.formatSeparator).map(x=>x.trim()).filter(Boolean),c[1]=c[1].slice(0,v)),f=r(h.call(this,c[1].trim(),m),m),f&&c[0]===l&&!se(f))return f;se(f)||(f=xm(f)),f||(this.logger.warn(`missed to resolve ${c[1]} for nesting ${l}`),f=""),b.length&&(f=b.reduce((x,g)=>this.format(x,g,u.lng,{...u,interpolationkey:c[1].trim()}),f.trim())),l=l.replace(c[0],f),this.regexp.lastIndex=0}return l}}const Q0=i=>{let l=i.toLowerCase().trim();const r={};if(i.indexOf("(")>-1){const u=i.split("(");l=u[0].toLowerCase().trim();const c=u[1].substring(0,u[1].length-1);l==="currency"&&c.indexOf(":")<0?r.currency||(r.currency=c.trim()):l==="relativetime"&&c.indexOf(":")<0?r.range||(r.range=c.trim()):c.split(";").forEach(m=>{if(m){const[h,...b]=m.split(":"),v=b.join(":").trim().replace(/^'+|'+$/g,""),x=h.trim();r[x]||(r[x]=v),v==="false"&&(r[x]=!1),v==="true"&&(r[x]=!0),isNaN(v)||(r[x]=parseInt(v,10))}})}return{formatName:l,formatOptions:r}},Mm=i=>{const l={};return(r,u,c)=>{let f=c;c&&c.interpolationkey&&c.formatParams&&c.formatParams[c.interpolationkey]&&c[c.interpolationkey]&&(f={...f,[c.interpolationkey]:void 0});const m=u+JSON.stringify(f);let h=l[m];return h||(h=i(Li(u),c),l[m]=h),h(r)}},X0=i=>(l,r,u)=>i(Li(r),u)(l);class Z0{constructor(l={}){this.logger=fn.create("formatter"),this.options=l,this.init(l)}init(l,r={interpolation:{}}){this.formatSeparator=r.interpolation.formatSeparator||",";const u=r.cacheInBuiltFormats?Mm:X0;this.formats={number:u((c,f)=>{const m=new Intl.NumberFormat(c,{...f});return h=>m.format(h)}),currency:u((c,f)=>{const m=new Intl.NumberFormat(c,{...f,style:"currency"});return h=>m.format(h)}),datetime:u((c,f)=>{const m=new Intl.DateTimeFormat(c,{...f});return h=>m.format(h)}),relativetime:u((c,f)=>{const m=new Intl.RelativeTimeFormat(c,{...f});return h=>m.format(h,f.range||"day")}),list:u((c,f)=>{const m=new Intl.ListFormat(c,{...f});return h=>m.format(h)})}}add(l,r){this.formats[l.toLowerCase().trim()]=r}addCached(l,r){this.formats[l.toLowerCase().trim()]=Mm(r)}format(l,r,u,c={}){const f=r.split(this.formatSeparator);if(f.length>1&&f[0].indexOf("(")>1&&f[0].indexOf(")")<0&&f.find(h=>h.indexOf(")")>-1)){const h=f.findIndex(b=>b.indexOf(")")>-1);f[0]=[f[0],...f.splice(1,h)].join(this.formatSeparator)}return f.reduce((h,b)=>{const{formatName:v,formatOptions:x}=Q0(b);if(this.formats[v]){let g=h;try{const D=c?.formatParams?.[c.interpolationkey]||{},R=D.locale||D.lng||c.locale||c.lng||u;g=this.formats[v](h,R,{...x,...c,...D})}catch(D){this.logger.warn(D)}return g}else this.logger.warn(`there was no format function for ${v}`);return h},l)}}const F0=(i,l)=>{i.pending[l]!==void 0&&(delete i.pending[l],i.pendingCount--)};class J0 extends Sr{constructor(l,r,u,c={}){super(),this.backend=l,this.store=r,this.services=u,this.languageUtils=u.languageUtils,this.options=c,this.logger=fn.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=c.maxParallelReads||10,this.readingCalls=0,this.maxRetries=c.maxRetries>=0?c.maxRetries:5,this.retryTimeout=c.retryTimeout>=1?c.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(u,c.backend,c)}queueLoad(l,r,u,c){const f={},m={},h={},b={};return l.forEach(v=>{let x=!0;r.forEach(g=>{const D=`${v}|${g}`;!u.reload&&this.store.hasResourceBundle(v,g)?this.state[D]=2:this.state[D]<0||(this.state[D]===1?m[D]===void 0&&(m[D]=!0):(this.state[D]=1,x=!1,m[D]===void 0&&(m[D]=!0),f[D]===void 0&&(f[D]=!0),b[g]===void 0&&(b[g]=!0)))}),x||(h[v]=!0)}),(Object.keys(f).length||Object.keys(m).length)&&this.queue.push({pending:m,pendingCount:Object.keys(m).length,loaded:{},errors:[],callback:c}),{toLoad:Object.keys(f),pending:Object.keys(m),toLoadLanguages:Object.keys(h),toLoadNamespaces:Object.keys(b)}}loaded(l,r,u){const c=l.split("|"),f=c[0],m=c[1];r&&this.emit("failedLoading",f,m,r),!r&&u&&this.store.addResourceBundle(f,m,u,void 0,void 0,{skipCopy:!0}),this.state[l]=r?-1:2,r&&u&&(this.state[l]=0);const h={};this.queue.forEach(b=>{j0(b.loaded,[f],m),F0(b,l),r&&b.errors.push(r),b.pendingCount===0&&!b.done&&(Object.keys(b.loaded).forEach(v=>{h[v]||(h[v]={});const x=b.loaded[v];x.length&&x.forEach(g=>{h[v][g]===void 0&&(h[v][g]=!0)})}),b.done=!0,b.errors.length?b.callback(b.errors):b.callback())}),this.emit("loaded",h),this.queue=this.queue.filter(b=>!b.done)}read(l,r,u,c=0,f=this.retryTimeout,m){if(!l.length)return m(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:l,ns:r,fcName:u,tried:c,wait:f,callback:m});return}this.readingCalls++;const h=(v,x)=>{if(this.readingCalls--,this.waitingReads.length>0){const g=this.waitingReads.shift();this.read(g.lng,g.ns,g.fcName,g.tried,g.wait,g.callback)}if(v&&x&&c{this.read.call(this,l,r,u,c+1,f*2,m)},f);return}m(v,x)},b=this.backend[u].bind(this.backend);if(b.length===2){try{const v=b(l,r);v&&typeof v.then=="function"?v.then(x=>h(null,x)).catch(h):h(null,v)}catch(v){h(v)}return}return b(l,r,h)}prepareLoading(l,r,u={},c){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),c&&c();se(l)&&(l=this.languageUtils.toResolveHierarchy(l)),se(r)&&(r=[r]);const f=this.queueLoad(l,r,u,c);if(!f.toLoad.length)return f.pending.length||c(),null;f.toLoad.forEach(m=>{this.loadOne(m)})}load(l,r,u){this.prepareLoading(l,r,{},u)}reload(l,r,u){this.prepareLoading(l,r,{reload:!0},u)}loadOne(l,r=""){const u=l.split("|"),c=u[0],f=u[1];this.read(c,f,"read",void 0,void 0,(m,h)=>{m&&this.logger.warn(`${r}loading namespace ${f} for language ${c} failed`,m),!m&&h&&this.logger.log(`${r}loaded namespace ${f} for language ${c}`,h),this.loaded(l,m,h)})}saveMissing(l,r,u,c,f,m={},h=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(r)){this.logger.warn(`did not save key "${u}" as the namespace "${r}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(u==null||u==="")){if(this.backend?.create){const b={...m,isUpdate:f},v=this.backend.create.bind(this.backend);if(v.length<6)try{let x;v.length===5?x=v(l,r,u,c,b):x=v(l,r,u,c),x&&typeof x.then=="function"?x.then(g=>h(null,g)).catch(h):h(null,x)}catch(x){h(x)}else v(l,r,u,c,h,b)}!l||!l[0]||this.store.addResource(l[0],r,u,c)}}}const Go=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:i=>{let l={};if(typeof i[1]=="object"&&(l=i[1]),se(i[1])&&(l.defaultValue=i[1]),se(i[2])&&(l.tDescription=i[2]),typeof i[2]=="object"||typeof i[3]=="object"){const r=i[3]||i[2];Object.keys(r).forEach(u=>{l[u]=r[u]})}return l},interpolation:{escapeValue:!0,format:i=>i,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),_m=i=>(se(i.ns)&&(i.ns=[i.ns]),se(i.fallbackLng)&&(i.fallbackLng=[i.fallbackLng]),se(i.fallbackNS)&&(i.fallbackNS=[i.fallbackNS]),i.supportedLngs?.indexOf?.("cimode")<0&&(i.supportedLngs=i.supportedLngs.concat(["cimode"])),typeof i.initImmediate=="boolean"&&(i.initAsync=i.initImmediate),i),ar=()=>{},$0=i=>{Object.getOwnPropertyNames(Object.getPrototypeOf(i)).forEach(r=>{typeof i[r]=="function"&&(i[r]=i[r].bind(i))})},Tg="__i18next_supportNoticeShown",W0=()=>typeof globalThis<"u"&&!!globalThis[Tg],I0=()=>{typeof globalThis<"u"&&(globalThis[Tg]=!0)},P0=i=>!!(i?.modules?.backend?.name?.indexOf("Locize")>0||i?.modules?.backend?.constructor?.name?.indexOf("Locize")>0||i?.options?.backend?.backends&&i.options.backend.backends.some(l=>l?.name?.indexOf("Locize")>0||l?.constructor?.name?.indexOf("Locize")>0)||i?.options?.backend?.projectId||i?.options?.backend?.backendOptions&&i.options.backend.backendOptions.some(l=>l?.projectId));class _i extends Sr{constructor(l={},r){if(super(),this.options=_m(l),this.services={},this.logger=fn,this.modules={external:[]},$0(this),r&&!this.isInitialized&&!l.isClone){if(!this.options.initAsync)return this.init(l,r),this;setTimeout(()=>{this.init(l,r)},0)}}init(l={},r){this.isInitializing=!0,typeof l=="function"&&(r=l,l={}),l.defaultNS==null&&l.ns&&(se(l.ns)?l.defaultNS=l.ns:l.ns.indexOf("translation")<0&&(l.defaultNS=l.ns[0]));const u=Go();this.options={...u,...this.options,..._m(l)},this.options.interpolation={...u.interpolation,...this.options.interpolation},l.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=l.keySeparator),l.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=l.nsSeparator),typeof this.options.overloadTranslationOptionHandler!="function"&&(this.options.overloadTranslationOptionHandler=u.overloadTranslationOptionHandler),this.options.showSupportNotice!==!1&&!P0(this)&&!W0()&&(typeof console<"u"&&typeof console.info<"u"&&console.info("🌐 i18next is maintained with support from Locize — consider powering your project with managed localization (AI, CDN, integrations): https://locize.com 💙"),I0());const c=v=>v?typeof v=="function"?new v:v:null;if(!this.options.isClone){this.modules.logger?fn.init(c(this.modules.logger),this.options):fn.init(null,this.options);let v;this.modules.formatter?v=this.modules.formatter:v=Z0;const x=new Am(this.options);this.store=new Cm(this.options.resources,this.options);const g=this.services;g.logger=fn,g.resourceStore=this.store,g.languageUtils=x,g.pluralResolver=new G0(x,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==u.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),v&&(!this.options.interpolation.format||this.options.interpolation.format===u.interpolation.format)&&(g.formatter=c(v),g.formatter.init&&g.formatter.init(g,this.options),this.options.interpolation.format=g.formatter.format.bind(g.formatter)),g.interpolator=new Rm(this.options),g.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},g.backendConnector=new J0(c(this.modules.backend),g.resourceStore,g,this.options),g.backendConnector.on("*",(R,...j)=>{this.emit(R,...j)}),this.modules.languageDetector&&(g.languageDetector=c(this.modules.languageDetector),g.languageDetector.init&&g.languageDetector.init(g,this.options.detection,this.options)),this.modules.i18nFormat&&(g.i18nFormat=c(this.modules.i18nFormat),g.i18nFormat.init&&g.i18nFormat.init(this)),this.translator=new pr(this.services,this.options),this.translator.on("*",(R,...j)=>{this.emit(R,...j)}),this.modules.external.forEach(R=>{R.init&&R.init(this)})}if(this.format=this.options.interpolation.format,r||(r=ar),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const v=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);v.length>0&&v[0]!=="dev"&&(this.options.lng=v[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(v=>{this[v]=(...x)=>this.store[v](...x)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(v=>{this[v]=(...x)=>(this.store[v](...x),this)});const h=zi(),b=()=>{const v=(x,g)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),h.resolve(g),r(x,g)};if(this.languages&&!this.isInitialized)return v(null,this.t.bind(this));this.changeLanguage(this.options.lng,v)};return this.options.resources||!this.options.initAsync?b():setTimeout(b,0),h}loadResources(l,r=ar){let u=r;const c=se(l)?l:this.language;if(typeof l=="function"&&(u=l),!this.options.resources||this.options.partialBundledLanguages){if(c?.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return u();const f=[],m=h=>{if(!h||h==="cimode")return;this.services.languageUtils.toResolveHierarchy(h).forEach(v=>{v!=="cimode"&&f.indexOf(v)<0&&f.push(v)})};c?m(c):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(b=>m(b)),this.options.preload?.forEach?.(h=>m(h)),this.services.backendConnector.load(f,this.options.ns,h=>{!h&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),u(h)})}else u(null)}reloadResources(l,r,u){const c=zi();return typeof l=="function"&&(u=l,l=void 0),typeof r=="function"&&(u=r,r=void 0),l||(l=this.languages),r||(r=this.options.ns),u||(u=ar),this.services.backendConnector.reload(l,r,f=>{c.resolve(),u(f)}),c}use(l){if(!l)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!l.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return l.type==="backend"&&(this.modules.backend=l),(l.type==="logger"||l.log&&l.warn&&l.error)&&(this.modules.logger=l),l.type==="languageDetector"&&(this.modules.languageDetector=l),l.type==="i18nFormat"&&(this.modules.i18nFormat=l),l.type==="postProcessor"&&xg.addPostProcessor(l),l.type==="formatter"&&(this.modules.formatter=l),l.type==="3rdParty"&&this.modules.external.push(l),this}setResolvedLanguage(l){if(!(!l||!this.languages)&&!(["cimode","dev"].indexOf(l)>-1)){for(let r=0;r-1)&&this.store.hasLanguageSomeTranslations(u)){this.resolvedLanguage=u;break}}!this.resolvedLanguage&&this.languages.indexOf(l)<0&&this.store.hasLanguageSomeTranslations(l)&&(this.resolvedLanguage=l,this.languages.unshift(l))}}changeLanguage(l,r){this.isLanguageChangingTo=l;const u=zi();this.emit("languageChanging",l);const c=h=>{this.language=h,this.languages=this.services.languageUtils.toResolveHierarchy(h),this.resolvedLanguage=void 0,this.setResolvedLanguage(h)},f=(h,b)=>{b?this.isLanguageChangingTo===l&&(c(b),this.translator.changeLanguage(b),this.isLanguageChangingTo=void 0,this.emit("languageChanged",b),this.logger.log("languageChanged",b)):this.isLanguageChangingTo=void 0,u.resolve((...v)=>this.t(...v)),r&&r(h,(...v)=>this.t(...v))},m=h=>{!l&&!h&&this.services.languageDetector&&(h=[]);const b=se(h)?h:h&&h[0],v=this.store.hasLanguageSomeTranslations(b)?b:this.services.languageUtils.getBestMatchFromCodes(se(h)?[h]:h);v&&(this.language||c(v),this.translator.language||this.translator.changeLanguage(v),this.services.languageDetector?.cacheUserLanguage?.(v)),this.loadResources(v,x=>{f(x,v)})};return!l&&this.services.languageDetector&&!this.services.languageDetector.async?m(this.services.languageDetector.detect()):!l&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(m):this.services.languageDetector.detect(m):m(l),u}getFixedT(l,r,u){const c=(f,m,...h)=>{let b;typeof m!="object"?b=this.options.overloadTranslationOptionHandler([f,m].concat(h)):b={...m},b.lng=b.lng||c.lng,b.lngs=b.lngs||c.lngs,b.ns=b.ns||c.ns,b.keyPrefix!==""&&(b.keyPrefix=b.keyPrefix||u||c.keyPrefix);const v=this.options.keySeparator||".";let x;return b.keyPrefix&&Array.isArray(f)?x=f.map(g=>(typeof g=="function"&&(g=ac(g,{...this.options,...m})),`${b.keyPrefix}${v}${g}`)):(typeof f=="function"&&(f=ac(f,{...this.options,...m})),x=b.keyPrefix?`${b.keyPrefix}${v}${f}`:f),this.t(x,b)};return se(l)?c.lng=l:c.lngs=l,c.ns=r,c.keyPrefix=u,c}t(...l){return this.translator?.translate(...l)}exists(...l){return this.translator?.exists(...l)}setDefaultNamespace(l){this.options.defaultNS=l}hasLoadedNamespace(l,r={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const u=r.lng||this.resolvedLanguage||this.languages[0],c=this.options?this.options.fallbackLng:!1,f=this.languages[this.languages.length-1];if(u.toLowerCase()==="cimode")return!0;const m=(h,b)=>{const v=this.services.backendConnector.state[`${h}|${b}`];return v===-1||v===0||v===2};if(r.precheck){const h=r.precheck(this,m);if(h!==void 0)return h}return!!(this.hasResourceBundle(u,l)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||m(u,l)&&(!c||m(f,l)))}loadNamespaces(l,r){const u=zi();return this.options.ns?(se(l)&&(l=[l]),l.forEach(c=>{this.options.ns.indexOf(c)<0&&this.options.ns.push(c)}),this.loadResources(c=>{u.resolve(),r&&r(c)}),u):(r&&r(),Promise.resolve())}loadLanguages(l,r){const u=zi();se(l)&&(l=[l]);const c=this.options.preload||[],f=l.filter(m=>c.indexOf(m)<0&&this.services.languageUtils.isSupportedCode(m));return f.length?(this.options.preload=c.concat(f),this.loadResources(m=>{u.resolve(),r&&r(m)}),u):(r&&r(),Promise.resolve())}dir(l){if(l||(l=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language)),!l)return"rtl";try{const c=new Intl.Locale(l);if(c&&c.getTextInfo){const f=c.getTextInfo();if(f&&f.direction)return f.direction}}catch{}const r=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],u=this.services?.languageUtils||new Am(Go());return l.toLowerCase().indexOf("-latn")>1?"ltr":r.indexOf(u.getLanguagePartFromCode(l))>-1||l.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(l={},r){const u=new _i(l,r);return u.createInstance=_i.createInstance,u}cloneInstance(l={},r=ar){const u=l.forkResourceStore;u&&delete l.forkResourceStore;const c={...this.options,...l,isClone:!0},f=new _i(c);if((l.debug!==void 0||l.prefix!==void 0)&&(f.logger=f.logger.clone(l)),["store","services","language"].forEach(h=>{f[h]=this[h]}),f.services={...this.services},f.services.utils={hasLoadedNamespace:f.hasLoadedNamespace.bind(f)},u){const h=Object.keys(this.store.data).reduce((b,v)=>(b[v]={...this.store.data[v]},b[v]=Object.keys(b[v]).reduce((x,g)=>(x[g]={...b[v][g]},x),b[v]),b),{});f.store=new Cm(h,c),f.services.resourceStore=f.store}if(l.interpolation){const b={...Go().interpolation,...this.options.interpolation,...l.interpolation},v={...c,interpolation:b};f.services.interpolator=new Rm(v)}return f.translator=new pr(f.services,c),f.translator.on("*",(h,...b)=>{f.emit(h,...b)}),f.init(c,r),f.translator.options=c,f.translator.backendConnector.services.utils={hasLoadedNamespace:f.hasLoadedNamespace.bind(f)},f}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const ht=_i.createInstance();ht.createInstance;ht.dir;ht.init;ht.loadResources;ht.reloadResources;ht.use;ht.changeLanguage;ht.getFixedT;ht.t;ht.exists;ht.setDefaultNamespace;ht.hasLoadedNamespace;ht.loadNamespaces;ht.loadLanguages;const eb=(i,l,r,u)=>{const c=[r,{code:l,...u||{}}];if(i?.services?.logger?.forward)return i.services.logger.forward(c,"warn","react-i18next::",!0);ja(c[0])&&(c[0]=`react-i18next:: ${c[0]}`),i?.services?.logger?.warn?i.services.logger.warn(...c):console?.warn&&console.warn(...c)},jm={},Og=(i,l,r,u)=>{ja(r)&&jm[r]||(ja(r)&&(jm[r]=new Date),eb(i,l,r,u))},Cg=(i,l)=>()=>{if(i.isInitialized)l();else{const r=()=>{setTimeout(()=>{i.off("initialized",r)},0),l()};i.on("initialized",r)}},lc=(i,l,r)=>{i.loadNamespaces(l,Cg(i,r))},Lm=(i,l,r,u)=>{if(ja(r)&&(r=[r]),i.options.preload&&i.options.preload.indexOf(l)>-1)return lc(i,r,u);r.forEach(c=>{i.options.ns.indexOf(c)<0&&i.options.ns.push(c)}),i.loadLanguages(l,Cg(i,u))},tb=(i,l,r={})=>!l.languages||!l.languages.length?(Og(l,"NO_LANGUAGES","i18n.languages were undefined or empty",{languages:l.languages}),!0):l.hasLoadedNamespace(i,{lng:r.lng,precheck:(u,c)=>{if(r.bindI18n&&r.bindI18n.indexOf("languageChanging")>-1&&u.services.backendConnector.backend&&u.isLanguageChangingTo&&!c(u.isLanguageChangingTo,i))return!1}}),ja=i=>typeof i=="string",nb=i=>typeof i=="object"&&i!==null,ab=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,lb={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},ib=i=>lb[i],sb=i=>i.replace(ab,ib);let ic={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:sb,transDefaultProps:void 0};const rb=(i={})=>{ic={...ic,...i}},ub=()=>ic;let Ng;const ob=i=>{Ng=i},cb=()=>Ng,fb={type:"3rdParty",init(i){rb(i.options.react),ob(i)}},db=y.createContext();class hb{constructor(){this.usedNamespaces={}}addUsedNamespaces(l){l.forEach(r=>{this.usedNamespaces[r]||(this.usedNamespaces[r]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}var mb=Zy();const gb=(i,l)=>ja(l)?l:nb(l)&&ja(l.defaultValue)?l.defaultValue:Array.isArray(i)?i[i.length-1]:i,pb={t:gb,ready:!1},vb=()=>()=>{},xr=(i,l={})=>{const{i18n:r}=l,{i18n:u,defaultNS:c}=y.useContext(db)||{},f=r||u||cb();f&&!f.reportNamespaces&&(f.reportNamespaces=new hb),f||Og(f,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const m=y.useMemo(()=>({...ub(),...f?.options?.react,...l}),[f,l]),{useSuspense:h,keyPrefix:b}=m,v=c||f?.options?.defaultNS,x=ja(v)?[v]:v||["translation"],g=y.useMemo(()=>x,x);f?.reportNamespaces?.addUsedNamespaces?.(g);const D=y.useRef(0),R=y.useCallback(ae=>{if(!f)return vb;const{bindI18n:te,bindI18nStore:fe}=m,re=()=>{D.current+=1,ae()};return te&&f.on(te,re),fe&&f.store.on(fe,re),()=>{te&&te.split(" ").forEach(Ee=>f.off(Ee,re)),fe&&fe.split(" ").forEach(Ee=>f.store.off(Ee,re))}},[f,m]),j=y.useRef(),B=y.useCallback(()=>{if(!f)return pb;const ae=!!(f.isInitialized||f.initializedStoreOnce)&&g.every(je=>tb(je,f,m)),te=l.lng||f.language,fe=D.current,re=j.current;if(re&&re.ready===ae&&re.lng===te&&re.keyPrefix===b&&re.revision===fe)return re;const Te={t:f.getFixedT(te,m.nsMode==="fallback"?g:g[0],b),ready:ae,lng:te,keyPrefix:b,revision:fe};return j.current=Te,Te},[f,g,b,m,l.lng]),[k,U]=y.useState(0),{t:Q,ready:Z}=mb.useSyncExternalStore(R,B,B);y.useEffect(()=>{if(f&&!Z&&!h){const ae=()=>U(te=>te+1);l.lng?Lm(f,l.lng,g,ae):lc(f,g,ae)}},[f,l.lng,g,Z,h,k]);const I=f||{},ee=y.useRef(null),J=y.useRef(),X=ae=>{const te=Object.getOwnPropertyDescriptors(ae);te.__original&&delete te.__original;const fe=Object.create(Object.getPrototypeOf(ae),te);if(!Object.prototype.hasOwnProperty.call(fe,"__original"))try{Object.defineProperty(fe,"__original",{value:ae,writable:!1,enumerable:!1,configurable:!1})}catch{}return fe},ve=y.useMemo(()=>{const ae=I,te=ae?.language;let fe=ae;ae&&(ee.current&&ee.current.__original===ae?J.current!==te?(fe=X(ae),ee.current=fe,J.current=te):fe=ee.current:(fe=X(ae),ee.current=fe,J.current=te));const re=[Q,fe,Z];return re.t=Q,re.i18n=fe,re.ready=Z,re},[Q,I,Z,I.resolvedLanguage,I.language,I.languages]);if(f&&h&&!Z)throw new Promise(ae=>{const te=()=>ae();l.lng?Lm(f,l.lng,g,te):lc(f,g,te)});return ve},yb=[{to:"/",icon:ug,labelKey:"nav.overview"},{to:"/health",icon:og,labelKey:"nav.health"},{to:"/uncertainty",icon:Uy,labelKey:"nav.uncertainty"},{to:"/graph",icon:cg,labelKey:"nav.graph"},{to:"/timeline",icon:fg,labelKey:"nav.timeline"},{to:"/evolution",icon:dg,labelKey:"nav.evolution"},{to:"/diagrams",icon:hg,labelKey:"nav.mindmap"},{to:"/sync",icon:mg,labelKey:"nav.sync"},{to:"/oracle",icon:gg,labelKey:"nav.oracle"},{to:"/tool-stats",icon:pg,labelKey:"nav.toolStats"},{to:"/visualize",icon:By,labelKey:"nav.visualize"},{to:"/storage",icon:Hy,labelKey:"nav.storage"},{to:"/settings",icon:vg,labelKey:"nav.settings"}];function bb(){const i=br(r=>r.sidebarOpen),{t:l}=xr();return T.jsxs("aside",{className:ji("fixed inset-y-0 left-0 z-30 flex flex-col border-r border-sidebar-border bg-sidebar transition-all duration-[var(--transition-normal)]",i?"w-56":"w-16"),children:[T.jsxs("div",{className:"flex h-14 items-center gap-3 border-b border-sidebar-border px-4",children:[T.jsx(rg,{className:"size-6 shrink-0 text-sidebar-primary"}),i&&T.jsx("span",{className:"font-display text-base font-bold text-sidebar-foreground truncate",children:"Surreal-Memory"})]}),T.jsx("nav",{className:"flex-1 space-y-1 p-2","aria-label":l("common.mainNavigation"),children:yb.map(({to:r,icon:u,labelKey:c})=>{const f=l(c);return T.jsxs(zy,{to:r,end:r==="/",className:({isActive:m})=>ji("flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors cursor-pointer",m?"bg-sidebar-accent text-sidebar-primary":"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-foreground",!i&&"justify-center px-0"),title:f,children:[T.jsx(u,{className:"size-5 shrink-0","aria-hidden":"true"}),i&&T.jsx("span",{children:f})]},r)})}),T.jsx("div",{className:"border-t border-sidebar-border p-3",children:i&&T.jsx("p",{className:"text-xs text-sidebar-foreground/50 text-center",children:"Surreal-Memory"})})]})}function Um(i,l){if(typeof i=="function")return i(l);i!=null&&(i.current=l)}function Pt(...i){return l=>{let r=!1;const u=i.map(c=>{const f=Um(c,l);return!r&&typeof f=="function"&&(r=!0),f});if(r)return()=>{for(let c=0;c{let{children:f,...m}=u;Ag(f)&&typeof vr=="function"&&(f=vr(f._payload));const h=y.Children.toArray(f),b=h.find(Cb);if(b){const v=b.props.children,x=h.map(g=>g===b?y.Children.count(v)>1?y.Children.only(null):y.isValidElement(v)?v.props.children:null:g);return T.jsx(l,{...m,ref:c,children:y.isValidElement(v)?y.cloneElement(v,void 0,x):null})}return T.jsx(l,{...m,ref:c,children:f})});return r.displayName=`${i}.Slot`,r}var Eb=Dg("Slot");function Tb(i){const l=y.forwardRef((r,u)=>{let{children:c,...f}=r;if(Ag(c)&&typeof vr=="function"&&(c=vr(c._payload)),y.isValidElement(c)){const m=Ab(c),h=Nb(f,c.props);return c.type!==y.Fragment&&(h.ref=u?Pt(u,m):m),y.cloneElement(c,h)}return y.Children.count(c)>1?y.Children.only(null):null});return l.displayName=`${i}.SlotClone`,l}var Ob=Symbol("radix.slottable");function Cb(i){return y.isValidElement(i)&&typeof i.type=="function"&&"__radixId"in i.type&&i.type.__radixId===Ob}function Nb(i,l){const r={...l};for(const u in l){const c=i[u],f=l[u];/^on[A-Z]/.test(u)?c&&f?r[u]=(...h)=>{const b=f(...h);return c(...h),b}:c&&(r[u]=c):u==="style"?r[u]={...c,...f}:u==="className"&&(r[u]=[c,f].filter(Boolean).join(" "))}return{...i,...r}}function Ab(i){let l=Object.getOwnPropertyDescriptor(i.props,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning;return r?i.ref:(l=Object.getOwnPropertyDescriptor(i,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}const Db=yg("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 cursor-pointer [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-border bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-lg px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),cr=y.forwardRef(({className:i,variant:l,size:r,asChild:u=!1,...c},f)=>{const m=u?Eb:"button";return T.jsx(m,{className:ji(Db({variant:l,size:r,className:i})),ref:f,...c})});cr.displayName="Button";const wb="";class zb extends Error{status;constructor(l,r){super(r),this.name="ApiError",this.status=l}}async function lr(i,l={}){const{brain:r,...u}=l,c=new Headers(u.headers);r&&c.set("X-Brain-ID",r),u.body&&!c.has("Content-Type")&&c.set("Content-Type","application/json");const f=await fetch(`${wb}${i}`,{...u,headers:c});if(!f.ok){const m=await f.text().catch(()=>"Unknown error");throw new zb(f.status,m)}return f.json()}const qe={get:(i,l)=>lr(i,{...l,method:"GET"}),post:(i,l,r)=>lr(i,{...r,method:"POST",body:l?JSON.stringify(l):void 0}),put:(i,l,r)=>lr(i,{...r,method:"PUT",body:l?JSON.stringify(l):void 0}),delete:(i,l)=>lr(i,{...l,method:"DELETE"})},$e={stats:["dashboard","stats"],brains:["dashboard","brains"],health:["dashboard","health"],healthCheck:["health"],toolStats:i=>["dashboard","tool-stats",i],timeline:(i,l)=>["dashboard","timeline",i,l],dailyStats:i=>["dashboard","timeline","daily-stats",i],evolution:["dashboard","evolution"],fibers:["dashboard","fibers"],fiberDiagram:i=>["dashboard","fiber",i,"diagram"],graph:i=>["graph",i],brainFiles:["dashboard","brain-files"],configStatus:["dashboard","config-status"],embeddingConfig:["config","embedding"],watcherStatus:["dashboard","watcher-status"],license:["dashboard","license"],uncertainty:i=>["dashboard","uncertainty",i]};function Rb(){return it({queryKey:$e.stats,queryFn:()=>qe.get("/api/dashboard/stats")})}function Mb(){return it({queryKey:$e.healthCheck,queryFn:()=>qe.get("/health"),staleTime:3e5})}function CE(){return it({queryKey:$e.brains,queryFn:()=>qe.get("/api/dashboard/brains")})}function NE(){const i=fc();return Hi({mutationFn:l=>qe.post("/api/dashboard/brains/switch",{brain_name:l}),onSuccess:()=>{i.invalidateQueries()}})}function AE(){return it({queryKey:$e.health,queryFn:()=>qe.get("/api/dashboard/health")})}function DE(i=14){return it({queryKey:$e.uncertainty(i),queryFn:()=>qe.get(`/api/dashboard/uncertainty?within_days=${i}`)})}function wE(i=100,l=0){return it({queryKey:$e.timeline(i,l),queryFn:()=>qe.get(`/api/dashboard/timeline?limit=${i}&offset=${l}`)})}function zE(i=30){return it({queryKey:$e.dailyStats(i),queryFn:()=>qe.get(`/api/dashboard/timeline/daily-stats?days=${i}`)})}function RE(){return it({queryKey:$e.evolution,queryFn:()=>qe.get("/api/dashboard/evolution")})}function _b(){return it({queryKey:$e.fibers,queryFn:()=>qe.get("/api/dashboard/fibers")})}function ME(i){return it({queryKey:$e.fiberDiagram(i),queryFn:()=>qe.get(`/api/dashboard/fiber/${i}/diagram`),enabled:!!i})}function _E(i=500){return it({queryKey:$e.graph(i),queryFn:()=>qe.get(`/api/graph?limit=${i}`)})}function jE(){const i=fc();return Hi({mutationFn:l=>qe.delete(`/brain/${l}`),onSuccess:()=>{i.invalidateQueries()}})}function LE(i=30){return it({queryKey:$e.toolStats(i),queryFn:()=>qe.get(`/api/dashboard/tool-stats?days=${i}`)})}function UE(){return it({queryKey:$e.brainFiles,queryFn:()=>qe.get("/api/dashboard/brain-files")})}function BE(){return it({queryKey:$e.configStatus,queryFn:()=>qe.get("/api/dashboard/config-status"),staleTime:6e4})}function HE(){return it({queryKey:$e.embeddingConfig,queryFn:()=>qe.get("/api/dashboard/config/embedding"),staleTime:6e4})}function qE(){const i=fc();return Hi({mutationFn:l=>qe.put("/api/dashboard/config",l),onSuccess:()=>{i.invalidateQueries({queryKey:$e.configStatus}),i.invalidateQueries({queryKey:$e.embeddingConfig})}})}function VE(){return it({queryKey:$e.watcherStatus,queryFn:()=>qe.get("/api/dashboard/watcher/status"),staleTime:3e4})}function YE(){return Hi({mutationFn:()=>qe.post("/api/dashboard/config/embedding/test",{})})}function KE(){return Hi({mutationFn:i=>qe.post("/api/dashboard/visualize",i)})}function kE(){return it({queryKey:$e.license,queryFn:()=>qe.get("/api/dashboard/license"),staleTime:6e4})}const jb=yg("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-2 focus:outline-offset-2 focus:outline-ring",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow",secondary:"border-transparent bg-secondary text-secondary-foreground",destructive:"border-transparent bg-destructive text-destructive-foreground shadow",outline:"text-foreground",success:"border-transparent bg-health-good/10 text-health-good",warning:"border-transparent bg-health-warn/10 text-health-warn"}},defaultVariants:{variant:"default"}});function Lb({className:i,variant:l,...r}){return T.jsx("div",{className:ji(jb({variant:l}),i),...r})}var Bm=1,Ub=.9,Bb=.8,Hb=.17,Qo=.1,Xo=.999,qb=.9999,Vb=.99,Yb=/[\\\/_+.#"@\[\(\{&]/,Kb=/[\\\/_+.#"@\[\(\{&]/g,kb=/[\s-]/,wg=/[\s-]/g;function sc(i,l,r,u,c,f,m){if(f===l.length)return c===i.length?Bm:Vb;var h=`${c},${f}`;if(m[h]!==void 0)return m[h];for(var b=u.charAt(f),v=r.indexOf(b,c),x=0,g,D,R,j;v>=0;)g=sc(i,l,r,u,v+1,f+1,m),g>x&&(v===c?g*=Bm:Yb.test(i.charAt(v-1))?(g*=Bb,R=i.slice(c,v-1).match(Kb),R&&c>0&&(g*=Math.pow(Xo,R.length))):kb.test(i.charAt(v-1))?(g*=Ub,j=i.slice(c,v-1).match(wg),j&&c>0&&(g*=Math.pow(Xo,j.length))):(g*=Hb,c>0&&(g*=Math.pow(Xo,v-c))),i.charAt(v)!==l.charAt(f)&&(g*=qb)),(gg&&(g=D*Qo)),g>x&&(x=g),v=r.indexOf(b,v+1);return m[h]=x,x}function Hm(i){return i.toLowerCase().replace(wg," ")}function Gb(i,l,r){return i=r&&r.length>0?`${i+" "+r.join(" ")}`:i,sc(i,l,Hm(i),Hm(l),0,0,{})}function ra(i,l,{checkForDefaultPrevented:r=!0}={}){return function(c){if(i?.(c),r===!1||!c.defaultPrevented)return l?.(c)}}function Qb(i,l){const r=y.createContext(l),u=f=>{const{children:m,...h}=f,b=y.useMemo(()=>h,Object.values(h));return T.jsx(r.Provider,{value:b,children:m})};u.displayName=i+"Provider";function c(f){const m=y.useContext(r);if(m)return m;if(l!==void 0)return l;throw new Error(`\`${f}\` must be used within \`${i}\``)}return[u,c]}function Xb(i,l=[]){let r=[];function u(f,m){const h=y.createContext(m),b=r.length;r=[...r,m];const v=g=>{const{scope:D,children:R,...j}=g,B=D?.[i]?.[b]||h,k=y.useMemo(()=>j,Object.values(j));return T.jsx(B.Provider,{value:k,children:R})};v.displayName=f+"Provider";function x(g,D){const R=D?.[i]?.[b]||h,j=y.useContext(R);if(j)return j;if(m!==void 0)return m;throw new Error(`\`${g}\` must be used within \`${f}\``)}return[v,x]}const c=()=>{const f=r.map(m=>y.createContext(m));return function(h){const b=h?.[i]||f;return y.useMemo(()=>({[`__scope${i}`]:{...h,[i]:b}}),[h,b])}};return c.scopeName=i,[u,Zb(c,...l)]}function Zb(...i){const l=i[0];if(i.length===1)return l;const r=()=>{const u=i.map(c=>({useScope:c(),scopeName:c.scopeName}));return function(f){const m=u.reduce((h,{useScope:b,scopeName:v})=>{const g=b(f)[`__scope${v}`];return{...h,...g}},{});return y.useMemo(()=>({[`__scope${l.scopeName}`]:m}),[m])}};return r.scopeName=l.scopeName,r}var Ui=globalThis?.document?y.useLayoutEffect:()=>{},Fb=dc[" useId ".trim().toString()]||(()=>{}),Jb=0;function Mn(i){const[l,r]=y.useState(Fb());return Ui(()=>{r(u=>u??String(Jb++))},[i]),l?`radix-${l}`:""}var $b=dc[" useInsertionEffect ".trim().toString()]||Ui;function Wb({prop:i,defaultProp:l,onChange:r=()=>{},caller:u}){const[c,f,m]=Ib({defaultProp:l,onChange:r}),h=i!==void 0,b=h?i:c;{const x=y.useRef(i!==void 0);y.useEffect(()=>{const g=x.current;g!==h&&console.warn(`${u} is changing from ${g?"controlled":"uncontrolled"} to ${h?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),x.current=h},[h,u])}const v=y.useCallback(x=>{if(h){const g=Pb(x)?x(i):x;g!==i&&m.current?.(g)}else f(x)},[h,i,f,m]);return[b,v]}function Ib({defaultProp:i,onChange:l}){const[r,u]=y.useState(i),c=y.useRef(r),f=y.useRef(l);return $b(()=>{f.current=l},[l]),y.useEffect(()=>{c.current!==r&&(f.current?.(r),c.current=r)},[r,c]),[r,u,f]}function Pb(i){return typeof i=="function"}function e1(i){const l=t1(i),r=y.forwardRef((u,c)=>{const{children:f,...m}=u,h=y.Children.toArray(f),b=h.find(a1);if(b){const v=b.props.children,x=h.map(g=>g===b?y.Children.count(v)>1?y.Children.only(null):y.isValidElement(v)?v.props.children:null:g);return T.jsx(l,{...m,ref:c,children:y.isValidElement(v)?y.cloneElement(v,void 0,x):null})}return T.jsx(l,{...m,ref:c,children:f})});return r.displayName=`${i}.Slot`,r}function t1(i){const l=y.forwardRef((r,u)=>{const{children:c,...f}=r;if(y.isValidElement(c)){const m=i1(c),h=l1(f,c.props);return c.type!==y.Fragment&&(h.ref=u?Pt(u,m):m),y.cloneElement(c,h)}return y.Children.count(c)>1?y.Children.only(null):null});return l.displayName=`${i}.SlotClone`,l}var n1=Symbol("radix.slottable");function a1(i){return y.isValidElement(i)&&typeof i.type=="function"&&"__radixId"in i.type&&i.type.__radixId===n1}function l1(i,l){const r={...l};for(const u in l){const c=i[u],f=l[u];/^on[A-Z]/.test(u)?c&&f?r[u]=(...h)=>{const b=f(...h);return c(...h),b}:c&&(r[u]=c):u==="style"?r[u]={...c,...f}:u==="className"&&(r[u]=[c,f].filter(Boolean).join(" "))}return{...i,...r}}function i1(i){let l=Object.getOwnPropertyDescriptor(i.props,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning;return r?i.ref:(l=Object.getOwnPropertyDescriptor(i,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}var s1=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],zg=s1.reduce((i,l)=>{const r=e1(`Primitive.${l}`),u=y.forwardRef((c,f)=>{const{asChild:m,...h}=c,b=m?r:l;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),T.jsx(b,{...h,ref:f})});return u.displayName=`Primitive.${l}`,{...i,[l]:u}},{});function r1(i,l){i&&sg.flushSync(()=>i.dispatchEvent(l))}function Bi(i){const l=y.useRef(i);return y.useEffect(()=>{l.current=i}),y.useMemo(()=>(...r)=>l.current?.(...r),[])}function u1(i,l=globalThis?.document){const r=Bi(i);y.useEffect(()=>{const u=c=>{c.key==="Escape"&&r(c)};return l.addEventListener("keydown",u,{capture:!0}),()=>l.removeEventListener("keydown",u,{capture:!0})},[r,l])}var o1="DismissableLayer",rc="dismissableLayer.update",c1="dismissableLayer.pointerDownOutside",f1="dismissableLayer.focusOutside",qm,Rg=y.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),Mg=y.forwardRef((i,l)=>{const{disableOutsidePointerEvents:r=!1,onEscapeKeyDown:u,onPointerDownOutside:c,onFocusOutside:f,onInteractOutside:m,onDismiss:h,...b}=i,v=y.useContext(Rg),[x,g]=y.useState(null),D=x?.ownerDocument??globalThis?.document,[,R]=y.useState({}),j=Ba(l,X=>g(X)),B=Array.from(v.layers),[k]=[...v.layersWithOutsidePointerEventsDisabled].slice(-1),U=B.indexOf(k),Q=x?B.indexOf(x):-1,Z=v.layersWithOutsidePointerEventsDisabled.size>0,I=Q>=U,ee=m1(X=>{const ve=X.target,ae=[...v.branches].some(te=>te.contains(ve));!I||ae||(c?.(X),m?.(X),X.defaultPrevented||h?.())},D),J=g1(X=>{const ve=X.target;[...v.branches].some(te=>te.contains(ve))||(f?.(X),m?.(X),X.defaultPrevented||h?.())},D);return u1(X=>{Q===v.layers.size-1&&(u?.(X),!X.defaultPrevented&&h&&(X.preventDefault(),h()))},D),y.useEffect(()=>{if(x)return r&&(v.layersWithOutsidePointerEventsDisabled.size===0&&(qm=D.body.style.pointerEvents,D.body.style.pointerEvents="none"),v.layersWithOutsidePointerEventsDisabled.add(x)),v.layers.add(x),Vm(),()=>{r&&v.layersWithOutsidePointerEventsDisabled.size===1&&(D.body.style.pointerEvents=qm)}},[x,D,r,v]),y.useEffect(()=>()=>{x&&(v.layers.delete(x),v.layersWithOutsidePointerEventsDisabled.delete(x),Vm())},[x,v]),y.useEffect(()=>{const X=()=>R({});return document.addEventListener(rc,X),()=>document.removeEventListener(rc,X)},[]),T.jsx(zg.div,{...b,ref:j,style:{pointerEvents:Z?I?"auto":"none":void 0,...i.style},onFocusCapture:ra(i.onFocusCapture,J.onFocusCapture),onBlurCapture:ra(i.onBlurCapture,J.onBlurCapture),onPointerDownCapture:ra(i.onPointerDownCapture,ee.onPointerDownCapture)})});Mg.displayName=o1;var d1="DismissableLayerBranch",h1=y.forwardRef((i,l)=>{const r=y.useContext(Rg),u=y.useRef(null),c=Ba(l,u);return y.useEffect(()=>{const f=u.current;if(f)return r.branches.add(f),()=>{r.branches.delete(f)}},[r.branches]),T.jsx(zg.div,{...i,ref:c})});h1.displayName=d1;function m1(i,l=globalThis?.document){const r=Bi(i),u=y.useRef(!1),c=y.useRef(()=>{});return y.useEffect(()=>{const f=h=>{if(h.target&&!u.current){let b=function(){_g(c1,r,v,{discrete:!0})};const v={originalEvent:h};h.pointerType==="touch"?(l.removeEventListener("click",c.current),c.current=b,l.addEventListener("click",c.current,{once:!0})):b()}else l.removeEventListener("click",c.current);u.current=!1},m=window.setTimeout(()=>{l.addEventListener("pointerdown",f)},0);return()=>{window.clearTimeout(m),l.removeEventListener("pointerdown",f),l.removeEventListener("click",c.current)}},[l,r]),{onPointerDownCapture:()=>u.current=!0}}function g1(i,l=globalThis?.document){const r=Bi(i),u=y.useRef(!1);return y.useEffect(()=>{const c=f=>{f.target&&!u.current&&_g(f1,r,{originalEvent:f},{discrete:!1})};return l.addEventListener("focusin",c),()=>l.removeEventListener("focusin",c)},[l,r]),{onFocusCapture:()=>u.current=!0,onBlurCapture:()=>u.current=!1}}function Vm(){const i=new CustomEvent(rc);document.dispatchEvent(i)}function _g(i,l,r,{discrete:u}){const c=r.originalEvent.target,f=new CustomEvent(i,{bubbles:!1,cancelable:!0,detail:r});l&&c.addEventListener(i,l,{once:!0}),u?r1(c,f):c.dispatchEvent(f)}function p1(i){const l=v1(i),r=y.forwardRef((u,c)=>{const{children:f,...m}=u,h=y.Children.toArray(f),b=h.find(b1);if(b){const v=b.props.children,x=h.map(g=>g===b?y.Children.count(v)>1?y.Children.only(null):y.isValidElement(v)?v.props.children:null:g);return T.jsx(l,{...m,ref:c,children:y.isValidElement(v)?y.cloneElement(v,void 0,x):null})}return T.jsx(l,{...m,ref:c,children:f})});return r.displayName=`${i}.Slot`,r}function v1(i){const l=y.forwardRef((r,u)=>{const{children:c,...f}=r;if(y.isValidElement(c)){const m=x1(c),h=S1(f,c.props);return c.type!==y.Fragment&&(h.ref=u?Pt(u,m):m),y.cloneElement(c,h)}return y.Children.count(c)>1?y.Children.only(null):null});return l.displayName=`${i}.SlotClone`,l}var y1=Symbol("radix.slottable");function b1(i){return y.isValidElement(i)&&typeof i.type=="function"&&"__radixId"in i.type&&i.type.__radixId===y1}function S1(i,l){const r={...l};for(const u in l){const c=i[u],f=l[u];/^on[A-Z]/.test(u)?c&&f?r[u]=(...h)=>{const b=f(...h);return c(...h),b}:c&&(r[u]=c):u==="style"?r[u]={...c,...f}:u==="className"&&(r[u]=[c,f].filter(Boolean).join(" "))}return{...i,...r}}function x1(i){let l=Object.getOwnPropertyDescriptor(i.props,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning;return r?i.ref:(l=Object.getOwnPropertyDescriptor(i,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}var E1=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],T1=E1.reduce((i,l)=>{const r=p1(`Primitive.${l}`),u=y.forwardRef((c,f)=>{const{asChild:m,...h}=c,b=m?r:l;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),T.jsx(b,{...h,ref:f})});return u.displayName=`Primitive.${l}`,{...i,[l]:u}},{}),Zo="focusScope.autoFocusOnMount",Fo="focusScope.autoFocusOnUnmount",Ym={bubbles:!1,cancelable:!0},O1="FocusScope",jg=y.forwardRef((i,l)=>{const{loop:r=!1,trapped:u=!1,onMountAutoFocus:c,onUnmountAutoFocus:f,...m}=i,[h,b]=y.useState(null),v=Bi(c),x=Bi(f),g=y.useRef(null),D=Ba(l,B=>b(B)),R=y.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;y.useEffect(()=>{if(u){let B=function(Z){if(R.paused||!h)return;const I=Z.target;h.contains(I)?g.current=I:sa(g.current,{select:!0})},k=function(Z){if(R.paused||!h)return;const I=Z.relatedTarget;I!==null&&(h.contains(I)||sa(g.current,{select:!0}))},U=function(Z){if(document.activeElement===document.body)for(const ee of Z)ee.removedNodes.length>0&&sa(h)};document.addEventListener("focusin",B),document.addEventListener("focusout",k);const Q=new MutationObserver(U);return h&&Q.observe(h,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",B),document.removeEventListener("focusout",k),Q.disconnect()}}},[u,h,R.paused]),y.useEffect(()=>{if(h){km.add(R);const B=document.activeElement;if(!h.contains(B)){const U=new CustomEvent(Zo,Ym);h.addEventListener(Zo,v),h.dispatchEvent(U),U.defaultPrevented||(C1(z1(Lg(h)),{select:!0}),document.activeElement===B&&sa(h))}return()=>{h.removeEventListener(Zo,v),setTimeout(()=>{const U=new CustomEvent(Fo,Ym);h.addEventListener(Fo,x),h.dispatchEvent(U),U.defaultPrevented||sa(B??document.body,{select:!0}),h.removeEventListener(Fo,x),km.remove(R)},0)}}},[h,v,x,R]);const j=y.useCallback(B=>{if(!r&&!u||R.paused)return;const k=B.key==="Tab"&&!B.altKey&&!B.ctrlKey&&!B.metaKey,U=document.activeElement;if(k&&U){const Q=B.currentTarget,[Z,I]=N1(Q);Z&&I?!B.shiftKey&&U===I?(B.preventDefault(),r&&sa(Z,{select:!0})):B.shiftKey&&U===Z&&(B.preventDefault(),r&&sa(I,{select:!0})):U===Q&&B.preventDefault()}},[r,u,R.paused]);return T.jsx(T1.div,{tabIndex:-1,...m,ref:D,onKeyDown:j})});jg.displayName=O1;function C1(i,{select:l=!1}={}){const r=document.activeElement;for(const u of i)if(sa(u,{select:l}),document.activeElement!==r)return}function N1(i){const l=Lg(i),r=Km(l,i),u=Km(l.reverse(),i);return[r,u]}function Lg(i){const l=[],r=document.createTreeWalker(i,NodeFilter.SHOW_ELEMENT,{acceptNode:u=>{const c=u.tagName==="INPUT"&&u.type==="hidden";return u.disabled||u.hidden||c?NodeFilter.FILTER_SKIP:u.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;r.nextNode();)l.push(r.currentNode);return l}function Km(i,l){for(const r of i)if(!A1(r,{upTo:l}))return r}function A1(i,{upTo:l}){if(getComputedStyle(i).visibility==="hidden")return!0;for(;i;){if(l!==void 0&&i===l)return!1;if(getComputedStyle(i).display==="none")return!0;i=i.parentElement}return!1}function D1(i){return i instanceof HTMLInputElement&&"select"in i}function sa(i,{select:l=!1}={}){if(i&&i.focus){const r=document.activeElement;i.focus({preventScroll:!0}),i!==r&&D1(i)&&l&&i.select()}}var km=w1();function w1(){let i=[];return{add(l){const r=i[0];l!==r&&r?.pause(),i=Gm(i,l),i.unshift(l)},remove(l){i=Gm(i,l),i[0]?.resume()}}}function Gm(i,l){const r=[...i],u=r.indexOf(l);return u!==-1&&r.splice(u,1),r}function z1(i){return i.filter(l=>l.tagName!=="A")}function R1(i){const l=M1(i),r=y.forwardRef((u,c)=>{const{children:f,...m}=u,h=y.Children.toArray(f),b=h.find(j1);if(b){const v=b.props.children,x=h.map(g=>g===b?y.Children.count(v)>1?y.Children.only(null):y.isValidElement(v)?v.props.children:null:g);return T.jsx(l,{...m,ref:c,children:y.isValidElement(v)?y.cloneElement(v,void 0,x):null})}return T.jsx(l,{...m,ref:c,children:f})});return r.displayName=`${i}.Slot`,r}function M1(i){const l=y.forwardRef((r,u)=>{const{children:c,...f}=r;if(y.isValidElement(c)){const m=U1(c),h=L1(f,c.props);return c.type!==y.Fragment&&(h.ref=u?Pt(u,m):m),y.cloneElement(c,h)}return y.Children.count(c)>1?y.Children.only(null):null});return l.displayName=`${i}.SlotClone`,l}var _1=Symbol("radix.slottable");function j1(i){return y.isValidElement(i)&&typeof i.type=="function"&&"__radixId"in i.type&&i.type.__radixId===_1}function L1(i,l){const r={...l};for(const u in l){const c=i[u],f=l[u];/^on[A-Z]/.test(u)?c&&f?r[u]=(...h)=>{const b=f(...h);return c(...h),b}:c&&(r[u]=c):u==="style"?r[u]={...c,...f}:u==="className"&&(r[u]=[c,f].filter(Boolean).join(" "))}return{...i,...r}}function U1(i){let l=Object.getOwnPropertyDescriptor(i.props,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning;return r?i.ref:(l=Object.getOwnPropertyDescriptor(i,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}var B1=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],H1=B1.reduce((i,l)=>{const r=R1(`Primitive.${l}`),u=y.forwardRef((c,f)=>{const{asChild:m,...h}=c,b=m?r:l;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),T.jsx(b,{...h,ref:f})});return u.displayName=`Primitive.${l}`,{...i,[l]:u}},{}),q1="Portal",Ug=y.forwardRef((i,l)=>{const{container:r,...u}=i,[c,f]=y.useState(!1);Ui(()=>f(!0),[]);const m=r||c&&globalThis?.document?.body;return m?ig.createPortal(T.jsx(H1.div,{...u,ref:l}),m):null});Ug.displayName=q1;function V1(i,l){return y.useReducer((r,u)=>l[r][u]??r,i)}var Er=i=>{const{present:l,children:r}=i,u=Y1(l),c=typeof r=="function"?r({present:u.isPresent}):y.Children.only(r),f=Ba(u.ref,K1(c));return typeof r=="function"||u.isPresent?y.cloneElement(c,{ref:f}):null};Er.displayName="Presence";function Y1(i){const[l,r]=y.useState(),u=y.useRef(null),c=y.useRef(i),f=y.useRef("none"),m=i?"mounted":"unmounted",[h,b]=V1(m,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return y.useEffect(()=>{const v=ir(u.current);f.current=h==="mounted"?v:"none"},[h]),Ui(()=>{const v=u.current,x=c.current;if(x!==i){const D=f.current,R=ir(v);i?b("MOUNT"):R==="none"||v?.display==="none"?b("UNMOUNT"):b(x&&D!==R?"ANIMATION_OUT":"UNMOUNT"),c.current=i}},[i,b]),Ui(()=>{if(l){let v;const x=l.ownerDocument.defaultView??window,g=R=>{const B=ir(u.current).includes(CSS.escape(R.animationName));if(R.target===l&&B&&(b("ANIMATION_END"),!c.current)){const k=l.style.animationFillMode;l.style.animationFillMode="forwards",v=x.setTimeout(()=>{l.style.animationFillMode==="forwards"&&(l.style.animationFillMode=k)})}},D=R=>{R.target===l&&(f.current=ir(u.current))};return l.addEventListener("animationstart",D),l.addEventListener("animationcancel",g),l.addEventListener("animationend",g),()=>{x.clearTimeout(v),l.removeEventListener("animationstart",D),l.removeEventListener("animationcancel",g),l.removeEventListener("animationend",g)}}else b("ANIMATION_END")},[l,b]),{isPresent:["mounted","unmountSuspended"].includes(h),ref:y.useCallback(v=>{u.current=v?getComputedStyle(v):null,r(v)},[])}}function ir(i){return i?.animationName||"none"}function K1(i){let l=Object.getOwnPropertyDescriptor(i.props,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning;return r?i.ref:(l=Object.getOwnPropertyDescriptor(i,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}function Bg(i){const l=k1(i),r=y.forwardRef((u,c)=>{const{children:f,...m}=u,h=y.Children.toArray(f),b=h.find(Q1);if(b){const v=b.props.children,x=h.map(g=>g===b?y.Children.count(v)>1?y.Children.only(null):y.isValidElement(v)?v.props.children:null:g);return T.jsx(l,{...m,ref:c,children:y.isValidElement(v)?y.cloneElement(v,void 0,x):null})}return T.jsx(l,{...m,ref:c,children:f})});return r.displayName=`${i}.Slot`,r}function k1(i){const l=y.forwardRef((r,u)=>{const{children:c,...f}=r;if(y.isValidElement(c)){const m=Z1(c),h=X1(f,c.props);return c.type!==y.Fragment&&(h.ref=u?Pt(u,m):m),y.cloneElement(c,h)}return y.Children.count(c)>1?y.Children.only(null):null});return l.displayName=`${i}.SlotClone`,l}var G1=Symbol("radix.slottable");function Q1(i){return y.isValidElement(i)&&typeof i.type=="function"&&"__radixId"in i.type&&i.type.__radixId===G1}function X1(i,l){const r={...l};for(const u in l){const c=i[u],f=l[u];/^on[A-Z]/.test(u)?c&&f?r[u]=(...h)=>{const b=f(...h);return c(...h),b}:c&&(r[u]=c):u==="style"?r[u]={...c,...f}:u==="className"&&(r[u]=[c,f].filter(Boolean).join(" "))}return{...i,...r}}function Z1(i){let l=Object.getOwnPropertyDescriptor(i.props,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning;return r?i.ref:(l=Object.getOwnPropertyDescriptor(i,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}var F1=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],qi=F1.reduce((i,l)=>{const r=Bg(`Primitive.${l}`),u=y.forwardRef((c,f)=>{const{asChild:m,...h}=c,b=m?r:l;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),T.jsx(b,{...h,ref:f})});return u.displayName=`Primitive.${l}`,{...i,[l]:u}},{}),Jo=0;function J1(){y.useEffect(()=>{const i=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",i[0]??Qm()),document.body.insertAdjacentElement("beforeend",i[1]??Qm()),Jo++,()=>{Jo===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(l=>l.remove()),Jo--}},[])}function Qm(){const i=document.createElement("span");return i.setAttribute("data-radix-focus-guard",""),i.tabIndex=0,i.style.outline="none",i.style.opacity="0",i.style.position="fixed",i.style.pointerEvents="none",i}var cn=function(){return cn=Object.assign||function(l){for(var r,u=1,c=arguments.length;u"u")return dS;var l=hS(i),r=document.documentElement.clientWidth,u=window.innerWidth;return{left:l[0],top:l[1],right:l[2],gap:Math.max(0,u-r+l[2]-l[0])}},gS=Yg(),_l="data-scroll-locked",pS=function(i,l,r,u){var c=i.left,f=i.top,m=i.right,h=i.gap;return r===void 0&&(r="margin"),` - .`.concat(W1,` { - overflow: hidden `).concat(u,`; - padding-right: `).concat(h,"px ").concat(u,`; - } - body[`).concat(_l,`] { - overflow: hidden `).concat(u,`; - overscroll-behavior: contain; - `).concat([l&&"position: relative ".concat(u,";"),r==="margin"&&` - padding-left: `.concat(c,`px; - padding-top: `).concat(f,`px; - padding-right: `).concat(m,`px; - margin-left:0; - margin-top:0; - margin-right: `).concat(h,"px ").concat(u,`; - `),r==="padding"&&"padding-right: ".concat(h,"px ").concat(u,";")].filter(Boolean).join(""),` - } - - .`).concat(fr,` { - right: `).concat(h,"px ").concat(u,`; - } - - .`).concat(dr,` { - margin-right: `).concat(h,"px ").concat(u,`; - } - - .`).concat(fr," .").concat(fr,` { - right: 0 `).concat(u,`; - } - - .`).concat(dr," .").concat(dr,` { - margin-right: 0 `).concat(u,`; - } - - body[`).concat(_l,`] { - `).concat(I1,": ").concat(h,`px; - } -`)},Zm=function(){var i=parseInt(document.body.getAttribute(_l)||"0",10);return isFinite(i)?i:0},vS=function(){y.useEffect(function(){return document.body.setAttribute(_l,(Zm()+1).toString()),function(){var i=Zm()-1;i<=0?document.body.removeAttribute(_l):document.body.setAttribute(_l,i.toString())}},[])},yS=function(i){var l=i.noRelative,r=i.noImportant,u=i.gapMode,c=u===void 0?"margin":u;vS();var f=y.useMemo(function(){return mS(c)},[c]);return y.createElement(gS,{styles:pS(f,!l,c,r?"":"!important")})},uc=!1;if(typeof window<"u")try{var sr=Object.defineProperty({},"passive",{get:function(){return uc=!0,!0}});window.addEventListener("test",sr,sr),window.removeEventListener("test",sr,sr)}catch{uc=!1}var Nl=uc?{passive:!1}:!1,bS=function(i){return i.tagName==="TEXTAREA"},Kg=function(i,l){if(!(i instanceof Element))return!1;var r=window.getComputedStyle(i);return r[l]!=="hidden"&&!(r.overflowY===r.overflowX&&!bS(i)&&r[l]==="visible")},SS=function(i){return Kg(i,"overflowY")},xS=function(i){return Kg(i,"overflowX")},Fm=function(i,l){var r=l.ownerDocument,u=l;do{typeof ShadowRoot<"u"&&u instanceof ShadowRoot&&(u=u.host);var c=kg(i,u);if(c){var f=Gg(i,u),m=f[1],h=f[2];if(m>h)return!0}u=u.parentNode}while(u&&u!==r.body);return!1},ES=function(i){var l=i.scrollTop,r=i.scrollHeight,u=i.clientHeight;return[l,r,u]},TS=function(i){var l=i.scrollLeft,r=i.scrollWidth,u=i.clientWidth;return[l,r,u]},kg=function(i,l){return i==="v"?SS(l):xS(l)},Gg=function(i,l){return i==="v"?ES(l):TS(l)},OS=function(i,l){return i==="h"&&l==="rtl"?-1:1},CS=function(i,l,r,u,c){var f=OS(i,window.getComputedStyle(l).direction),m=f*u,h=r.target,b=l.contains(h),v=!1,x=m>0,g=0,D=0;do{if(!h)break;var R=Gg(i,h),j=R[0],B=R[1],k=R[2],U=B-k-f*j;(j||U)&&kg(i,h)&&(g+=U,D+=j);var Q=h.parentNode;h=Q&&Q.nodeType===Node.DOCUMENT_FRAGMENT_NODE?Q.host:Q}while(!b&&h!==document.body||b&&(l.contains(h)||l===h));return(x&&Math.abs(g)<1||!x&&Math.abs(D)<1)&&(v=!0),v},rr=function(i){return"changedTouches"in i?[i.changedTouches[0].clientX,i.changedTouches[0].clientY]:[0,0]},Jm=function(i){return[i.deltaX,i.deltaY]},$m=function(i){return i&&"current"in i?i.current:i},NS=function(i,l){return i[0]===l[0]&&i[1]===l[1]},AS=function(i){return` - .block-interactivity-`.concat(i,` {pointer-events: none;} - .allow-interactivity-`).concat(i,` {pointer-events: all;} -`)},DS=0,Al=[];function wS(i){var l=y.useRef([]),r=y.useRef([0,0]),u=y.useRef(),c=y.useState(DS++)[0],f=y.useState(Yg)[0],m=y.useRef(i);y.useEffect(function(){m.current=i},[i]),y.useEffect(function(){if(i.inert){document.body.classList.add("block-interactivity-".concat(c));var B=$1([i.lockRef.current],(i.shards||[]).map($m),!0).filter(Boolean);return B.forEach(function(k){return k.classList.add("allow-interactivity-".concat(c))}),function(){document.body.classList.remove("block-interactivity-".concat(c)),B.forEach(function(k){return k.classList.remove("allow-interactivity-".concat(c))})}}},[i.inert,i.lockRef.current,i.shards]);var h=y.useCallback(function(B,k){if("touches"in B&&B.touches.length===2||B.type==="wheel"&&B.ctrlKey)return!m.current.allowPinchZoom;var U=rr(B),Q=r.current,Z="deltaX"in B?B.deltaX:Q[0]-U[0],I="deltaY"in B?B.deltaY:Q[1]-U[1],ee,J=B.target,X=Math.abs(Z)>Math.abs(I)?"h":"v";if("touches"in B&&X==="h"&&J.type==="range")return!1;var ve=window.getSelection(),ae=ve&&ve.anchorNode,te=ae?ae===J||ae.contains(J):!1;if(te)return!1;var fe=Fm(X,J);if(!fe)return!0;if(fe?ee=X:(ee=X==="v"?"h":"v",fe=Fm(X,J)),!fe)return!1;if(!u.current&&"changedTouches"in B&&(Z||I)&&(u.current=ee),!ee)return!0;var re=u.current||ee;return CS(re,k,B,re==="h"?Z:I)},[]),b=y.useCallback(function(B){var k=B;if(!(!Al.length||Al[Al.length-1]!==f)){var U="deltaY"in k?Jm(k):rr(k),Q=l.current.filter(function(ee){return ee.name===k.type&&(ee.target===k.target||k.target===ee.shadowParent)&&NS(ee.delta,U)})[0];if(Q&&Q.should){k.cancelable&&k.preventDefault();return}if(!Q){var Z=(m.current.shards||[]).map($m).filter(Boolean).filter(function(ee){return ee.contains(k.target)}),I=Z.length>0?h(k,Z[0]):!m.current.noIsolation;I&&k.cancelable&&k.preventDefault()}}},[]),v=y.useCallback(function(B,k,U,Q){var Z={name:B,delta:k,target:U,should:Q,shadowParent:zS(U)};l.current.push(Z),setTimeout(function(){l.current=l.current.filter(function(I){return I!==Z})},1)},[]),x=y.useCallback(function(B){r.current=rr(B),u.current=void 0},[]),g=y.useCallback(function(B){v(B.type,Jm(B),B.target,h(B,i.lockRef.current))},[]),D=y.useCallback(function(B){v(B.type,rr(B),B.target,h(B,i.lockRef.current))},[]);y.useEffect(function(){return Al.push(f),i.setCallbacks({onScrollCapture:g,onWheelCapture:g,onTouchMoveCapture:D}),document.addEventListener("wheel",b,Nl),document.addEventListener("touchmove",b,Nl),document.addEventListener("touchstart",x,Nl),function(){Al=Al.filter(function(B){return B!==f}),document.removeEventListener("wheel",b,Nl),document.removeEventListener("touchmove",b,Nl),document.removeEventListener("touchstart",x,Nl)}},[]);var R=i.removeScrollBar,j=i.inert;return y.createElement(y.Fragment,null,j?y.createElement(f,{styles:AS(c)}):null,R?y.createElement(yS,{noRelative:i.noRelative,gapMode:i.gapMode}):null)}function zS(i){for(var l=null;i!==null;)i instanceof ShadowRoot&&(l=i.host,i=i.host),i=i.parentNode;return l}const RS=iS(Vg,wS);var Qg=y.forwardRef(function(i,l){return y.createElement(Tr,cn({},i,{ref:l,sideCar:RS}))});Qg.classNames=Tr.classNames;var MS=function(i){if(typeof document>"u")return null;var l=Array.isArray(i)?i[0]:i;return l.ownerDocument.body},Dl=new WeakMap,ur=new WeakMap,or={},Po=0,Xg=function(i){return i&&(i.host||Xg(i.parentNode))},_S=function(i,l){return l.map(function(r){if(i.contains(r))return r;var u=Xg(r);return u&&i.contains(u)?u:(console.error("aria-hidden",r,"in not contained inside",i,". Doing nothing"),null)}).filter(function(r){return!!r})},jS=function(i,l,r,u){var c=_S(l,Array.isArray(i)?i:[i]);or[r]||(or[r]=new WeakMap);var f=or[r],m=[],h=new Set,b=new Set(c),v=function(g){!g||h.has(g)||(h.add(g),v(g.parentNode))};c.forEach(v);var x=function(g){!g||b.has(g)||Array.prototype.forEach.call(g.children,function(D){if(h.has(D))x(D);else try{var R=D.getAttribute(u),j=R!==null&&R!=="false",B=(Dl.get(D)||0)+1,k=(f.get(D)||0)+1;Dl.set(D,B),f.set(D,k),m.push(D),B===1&&j&&ur.set(D,!0),k===1&&D.setAttribute(r,"true"),j||D.setAttribute(u,"true")}catch(U){console.error("aria-hidden: cannot operate on ",D,U)}})};return x(l),h.clear(),Po++,function(){m.forEach(function(g){var D=Dl.get(g)-1,R=f.get(g)-1;Dl.set(g,D),f.set(g,R),D||(ur.has(g)||g.removeAttribute(u),ur.delete(g)),R||g.removeAttribute(r)}),Po--,Po||(Dl=new WeakMap,Dl=new WeakMap,ur=new WeakMap,or={})}},LS=function(i,l,r){r===void 0&&(r="data-aria-hidden");var u=Array.from(Array.isArray(i)?i:[i]),c=MS(i);return c?(u.push.apply(u,Array.from(c.querySelectorAll("[aria-live], script"))),jS(u,c,r,"aria-hidden")):function(){return null}},Or="Dialog",[Zg]=Xb(Or),[US,en]=Zg(Or),Fg=i=>{const{__scopeDialog:l,children:r,open:u,defaultOpen:c,onOpenChange:f,modal:m=!0}=i,h=y.useRef(null),b=y.useRef(null),[v,x]=Wb({prop:u,defaultProp:c??!1,onChange:f,caller:Or});return T.jsx(US,{scope:l,triggerRef:h,contentRef:b,contentId:Mn(),titleId:Mn(),descriptionId:Mn(),open:v,onOpenChange:x,onOpenToggle:y.useCallback(()=>x(g=>!g),[x]),modal:m,children:r})};Fg.displayName=Or;var Jg="DialogTrigger",BS=y.forwardRef((i,l)=>{const{__scopeDialog:r,...u}=i,c=en(Jg,r),f=Ba(l,c.triggerRef);return T.jsx(qi.button,{type:"button","aria-haspopup":"dialog","aria-expanded":c.open,"aria-controls":c.contentId,"data-state":gc(c.open),...u,ref:f,onClick:ra(i.onClick,c.onOpenToggle)})});BS.displayName=Jg;var hc="DialogPortal",[HS,$g]=Zg(hc,{forceMount:void 0}),Wg=i=>{const{__scopeDialog:l,forceMount:r,children:u,container:c}=i,f=en(hc,l);return T.jsx(HS,{scope:l,forceMount:r,children:y.Children.map(u,m=>T.jsx(Er,{present:r||f.open,children:T.jsx(Ug,{asChild:!0,container:c,children:m})}))})};Wg.displayName=hc;var yr="DialogOverlay",Ig=y.forwardRef((i,l)=>{const r=$g(yr,i.__scopeDialog),{forceMount:u=r.forceMount,...c}=i,f=en(yr,i.__scopeDialog);return f.modal?T.jsx(Er,{present:u||f.open,children:T.jsx(VS,{...c,ref:l})}):null});Ig.displayName=yr;var qS=Bg("DialogOverlay.RemoveScroll"),VS=y.forwardRef((i,l)=>{const{__scopeDialog:r,...u}=i,c=en(yr,r);return T.jsx(Qg,{as:qS,allowPinchZoom:!0,shards:[c.contentRef],children:T.jsx(qi.div,{"data-state":gc(c.open),...u,ref:l,style:{pointerEvents:"auto",...u.style}})})}),La="DialogContent",Pg=y.forwardRef((i,l)=>{const r=$g(La,i.__scopeDialog),{forceMount:u=r.forceMount,...c}=i,f=en(La,i.__scopeDialog);return T.jsx(Er,{present:u||f.open,children:f.modal?T.jsx(YS,{...c,ref:l}):T.jsx(KS,{...c,ref:l})})});Pg.displayName=La;var YS=y.forwardRef((i,l)=>{const r=en(La,i.__scopeDialog),u=y.useRef(null),c=Ba(l,r.contentRef,u);return y.useEffect(()=>{const f=u.current;if(f)return LS(f)},[]),T.jsx(ep,{...i,ref:c,trapFocus:r.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:ra(i.onCloseAutoFocus,f=>{f.preventDefault(),r.triggerRef.current?.focus()}),onPointerDownOutside:ra(i.onPointerDownOutside,f=>{const m=f.detail.originalEvent,h=m.button===0&&m.ctrlKey===!0;(m.button===2||h)&&f.preventDefault()}),onFocusOutside:ra(i.onFocusOutside,f=>f.preventDefault())})}),KS=y.forwardRef((i,l)=>{const r=en(La,i.__scopeDialog),u=y.useRef(!1),c=y.useRef(!1);return T.jsx(ep,{...i,ref:l,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:f=>{i.onCloseAutoFocus?.(f),f.defaultPrevented||(u.current||r.triggerRef.current?.focus(),f.preventDefault()),u.current=!1,c.current=!1},onInteractOutside:f=>{i.onInteractOutside?.(f),f.defaultPrevented||(u.current=!0,f.detail.originalEvent.type==="pointerdown"&&(c.current=!0));const m=f.target;r.triggerRef.current?.contains(m)&&f.preventDefault(),f.detail.originalEvent.type==="focusin"&&c.current&&f.preventDefault()}})}),ep=y.forwardRef((i,l)=>{const{__scopeDialog:r,trapFocus:u,onOpenAutoFocus:c,onCloseAutoFocus:f,...m}=i,h=en(La,r),b=y.useRef(null),v=Ba(l,b);return J1(),T.jsxs(T.Fragment,{children:[T.jsx(jg,{asChild:!0,loop:!0,trapped:u,onMountAutoFocus:c,onUnmountAutoFocus:f,children:T.jsx(Mg,{role:"dialog",id:h.contentId,"aria-describedby":h.descriptionId,"aria-labelledby":h.titleId,"data-state":gc(h.open),...m,ref:v,onDismiss:()=>h.onOpenChange(!1)})}),T.jsxs(T.Fragment,{children:[T.jsx(XS,{titleId:h.titleId}),T.jsx(FS,{contentRef:b,descriptionId:h.descriptionId})]})]})}),mc="DialogTitle",kS=y.forwardRef((i,l)=>{const{__scopeDialog:r,...u}=i,c=en(mc,r);return T.jsx(qi.h2,{id:c.titleId,...u,ref:l})});kS.displayName=mc;var tp="DialogDescription",GS=y.forwardRef((i,l)=>{const{__scopeDialog:r,...u}=i,c=en(tp,r);return T.jsx(qi.p,{id:c.descriptionId,...u,ref:l})});GS.displayName=tp;var np="DialogClose",QS=y.forwardRef((i,l)=>{const{__scopeDialog:r,...u}=i,c=en(np,r);return T.jsx(qi.button,{type:"button",...u,ref:l,onClick:ra(i.onClick,()=>c.onOpenChange(!1))})});QS.displayName=np;function gc(i){return i?"open":"closed"}var ap="DialogTitleWarning",[GE,lp]=Qb(ap,{contentName:La,titleName:mc,docsSlug:"dialog"}),XS=({titleId:i})=>{const l=lp(ap),r=`\`${l.contentName}\` requires a \`${l.titleName}\` for the component to be accessible for screen reader users. - -If you want to hide the \`${l.titleName}\`, you can wrap it with our VisuallyHidden component. - -For more information, see https://radix-ui.com/primitives/docs/components/${l.docsSlug}`;return y.useEffect(()=>{i&&(document.getElementById(i)||console.error(r))},[r,i]),null},ZS="DialogDescriptionWarning",FS=({contentRef:i,descriptionId:l})=>{const u=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${lp(ZS).contentName}}.`;return y.useEffect(()=>{const c=i.current?.getAttribute("aria-describedby");l&&c&&(document.getElementById(l)||console.warn(u))},[u,i,l]),null},JS=Fg,$S=Wg,WS=Ig,IS=Pg,PS=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],oa=PS.reduce((i,l)=>{const r=Dg(`Primitive.${l}`),u=y.forwardRef((c,f)=>{const{asChild:m,...h}=c,b=m?r:l;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),T.jsx(b,{...h,ref:f})});return u.displayName=`Primitive.${l}`,{...i,[l]:u}},{}),Ri='[cmdk-group=""]',ec='[cmdk-group-items=""]',ex='[cmdk-group-heading=""]',ip='[cmdk-item=""]',Wm=`${ip}:not([aria-disabled="true"])`,oc="cmdk-item-select",Rl="data-value",tx=(i,l,r)=>Gb(i,l,r),sp=y.createContext(void 0),Vi=()=>y.useContext(sp),rp=y.createContext(void 0),pc=()=>y.useContext(rp),up=y.createContext(void 0),op=y.forwardRef((i,l)=>{let r=Ml(()=>{var _,q;return{search:"",value:(q=(_=i.value)!=null?_:i.defaultValue)!=null?q:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),u=Ml(()=>new Set),c=Ml(()=>new Map),f=Ml(()=>new Map),m=Ml(()=>new Set),h=cp(i),{label:b,children:v,value:x,onValueChange:g,filter:D,shouldFilter:R,loop:j,disablePointerSelection:B=!1,vimBindings:k=!0,...U}=i,Q=Mn(),Z=Mn(),I=Mn(),ee=y.useRef(null),J=dx();Ua(()=>{if(x!==void 0){let _=x.trim();r.current.value=_,X.emit()}},[x]),Ua(()=>{J(6,Ee)},[]);let X=y.useMemo(()=>({subscribe:_=>(m.current.add(_),()=>m.current.delete(_)),snapshot:()=>r.current,setState:(_,q,G)=>{var K,le,Se,oe;if(!Object.is(r.current[_],q)){if(r.current[_]=q,_==="search")re(),te(),J(1,fe);else if(_==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let Ae=document.getElementById(I);Ae?Ae.focus():(K=document.getElementById(Q))==null||K.focus()}if(J(7,()=>{var Ae;r.current.selectedItemId=(Ae=Te())==null?void 0:Ae.id,X.emit()}),G||J(5,Ee),((le=h.current)==null?void 0:le.value)!==void 0){let Ae=q??"";(oe=(Se=h.current).onValueChange)==null||oe.call(Se,Ae);return}}X.emit()}},emit:()=>{m.current.forEach(_=>_())}}),[]),ve=y.useMemo(()=>({value:(_,q,G)=>{var K;q!==((K=f.current.get(_))==null?void 0:K.value)&&(f.current.set(_,{value:q,keywords:G}),r.current.filtered.items.set(_,ae(q,G)),J(2,()=>{te(),X.emit()}))},item:(_,q)=>(u.current.add(_),q&&(c.current.has(q)?c.current.get(q).add(_):c.current.set(q,new Set([_]))),J(3,()=>{re(),te(),r.current.value||fe(),X.emit()}),()=>{f.current.delete(_),u.current.delete(_),r.current.filtered.items.delete(_);let G=Te();J(4,()=>{re(),G?.getAttribute("id")===_&&fe(),X.emit()})}),group:_=>(c.current.has(_)||c.current.set(_,new Set),()=>{f.current.delete(_),c.current.delete(_)}),filter:()=>h.current.shouldFilter,label:b||i["aria-label"],getDisablePointerSelection:()=>h.current.disablePointerSelection,listId:Q,inputId:I,labelId:Z,listInnerRef:ee}),[]);function ae(_,q){var G,K;let le=(K=(G=h.current)==null?void 0:G.filter)!=null?K:tx;return _?le(_,r.current.search,q):0}function te(){if(!r.current.search||h.current.shouldFilter===!1)return;let _=r.current.filtered.items,q=[];r.current.filtered.groups.forEach(K=>{let le=c.current.get(K),Se=0;le.forEach(oe=>{let Ae=_.get(oe);Se=Math.max(Ae,Se)}),q.push([K,Se])});let G=ee.current;je().sort((K,le)=>{var Se,oe;let Ae=K.getAttribute("id"),Ct=le.getAttribute("id");return((Se=_.get(Ct))!=null?Se:0)-((oe=_.get(Ae))!=null?oe:0)}).forEach(K=>{let le=K.closest(ec);le?le.appendChild(K.parentElement===le?K:K.closest(`${ec} > *`)):G.appendChild(K.parentElement===G?K:K.closest(`${ec} > *`))}),q.sort((K,le)=>le[1]-K[1]).forEach(K=>{var le;let Se=(le=ee.current)==null?void 0:le.querySelector(`${Ri}[${Rl}="${encodeURIComponent(K[0])}"]`);Se?.parentElement.appendChild(Se)})}function fe(){let _=je().find(G=>G.getAttribute("aria-disabled")!=="true"),q=_?.getAttribute(Rl);X.setState("value",q||void 0)}function re(){var _,q,G,K;if(!r.current.search||h.current.shouldFilter===!1){r.current.filtered.count=u.current.size;return}r.current.filtered.groups=new Set;let le=0;for(let Se of u.current){let oe=(q=(_=f.current.get(Se))==null?void 0:_.value)!=null?q:"",Ae=(K=(G=f.current.get(Se))==null?void 0:G.keywords)!=null?K:[],Ct=ae(oe,Ae);r.current.filtered.items.set(Se,Ct),Ct>0&&le++}for(let[Se,oe]of c.current)for(let Ae of oe)if(r.current.filtered.items.get(Ae)>0){r.current.filtered.groups.add(Se);break}r.current.filtered.count=le}function Ee(){var _,q,G;let K=Te();K&&(((_=K.parentElement)==null?void 0:_.firstChild)===K&&((G=(q=K.closest(Ri))==null?void 0:q.querySelector(ex))==null||G.scrollIntoView({block:"nearest"})),K.scrollIntoView({block:"nearest"}))}function Te(){var _;return(_=ee.current)==null?void 0:_.querySelector(`${ip}[aria-selected="true"]`)}function je(){var _;return Array.from(((_=ee.current)==null?void 0:_.querySelectorAll(Wm))||[])}function A(_){let q=je()[_];q&&X.setState("value",q.getAttribute(Rl))}function V(_){var q;let G=Te(),K=je(),le=K.findIndex(oe=>oe===G),Se=K[le+_];(q=h.current)!=null&&q.loop&&(Se=le+_<0?K[K.length-1]:le+_===K.length?K[0]:K[le+_]),Se&&X.setState("value",Se.getAttribute(Rl))}function $(_){let q=Te(),G=q?.closest(Ri),K;for(;G&&!K;)G=_>0?cx(G,Ri):fx(G,Ri),K=G?.querySelector(Wm);K?X.setState("value",K.getAttribute(Rl)):V(_)}let de=()=>A(je().length-1),ue=_=>{_.preventDefault(),_.metaKey?de():_.altKey?$(1):V(1)},me=_=>{_.preventDefault(),_.metaKey?A(0):_.altKey?$(-1):V(-1)};return y.createElement(oa.div,{ref:l,tabIndex:-1,...U,"cmdk-root":"",onKeyDown:_=>{var q;(q=U.onKeyDown)==null||q.call(U,_);let G=_.nativeEvent.isComposing||_.keyCode===229;if(!(_.defaultPrevented||G))switch(_.key){case"n":case"j":{k&&_.ctrlKey&&ue(_);break}case"ArrowDown":{ue(_);break}case"p":case"k":{k&&_.ctrlKey&&me(_);break}case"ArrowUp":{me(_);break}case"Home":{_.preventDefault(),A(0);break}case"End":{_.preventDefault(),de();break}case"Enter":{_.preventDefault();let K=Te();if(K){let le=new Event(oc);K.dispatchEvent(le)}}}}},y.createElement("label",{"cmdk-label":"",htmlFor:ve.inputId,id:ve.labelId,style:mx},b),Cr(i,_=>y.createElement(rp.Provider,{value:X},y.createElement(sp.Provider,{value:ve},_))))}),nx=y.forwardRef((i,l)=>{var r,u;let c=Mn(),f=y.useRef(null),m=y.useContext(up),h=Vi(),b=cp(i),v=(u=(r=b.current)==null?void 0:r.forceMount)!=null?u:m?.forceMount;Ua(()=>{if(!v)return h.item(c,m?.id)},[v]);let x=fp(c,f,[i.value,i.children,f],i.keywords),g=pc(),D=ua(J=>J.value&&J.value===x.current),R=ua(J=>v||h.filter()===!1?!0:J.search?J.filtered.items.get(c)>0:!0);y.useEffect(()=>{let J=f.current;if(!(!J||i.disabled))return J.addEventListener(oc,j),()=>J.removeEventListener(oc,j)},[R,i.onSelect,i.disabled]);function j(){var J,X;B(),(X=(J=b.current).onSelect)==null||X.call(J,x.current)}function B(){g.setState("value",x.current,!0)}if(!R)return null;let{disabled:k,value:U,onSelect:Q,forceMount:Z,keywords:I,...ee}=i;return y.createElement(oa.div,{ref:Pt(f,l),...ee,id:c,"cmdk-item":"",role:"option","aria-disabled":!!k,"aria-selected":!!D,"data-disabled":!!k,"data-selected":!!D,onPointerMove:k||h.getDisablePointerSelection()?void 0:B,onClick:k?void 0:j},i.children)}),ax=y.forwardRef((i,l)=>{let{heading:r,children:u,forceMount:c,...f}=i,m=Mn(),h=y.useRef(null),b=y.useRef(null),v=Mn(),x=Vi(),g=ua(R=>c||x.filter()===!1?!0:R.search?R.filtered.groups.has(m):!0);Ua(()=>x.group(m),[]),fp(m,h,[i.value,i.heading,b]);let D=y.useMemo(()=>({id:m,forceMount:c}),[c]);return y.createElement(oa.div,{ref:Pt(h,l),...f,"cmdk-group":"",role:"presentation",hidden:g?void 0:!0},r&&y.createElement("div",{ref:b,"cmdk-group-heading":"","aria-hidden":!0,id:v},r),Cr(i,R=>y.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":r?v:void 0},y.createElement(up.Provider,{value:D},R))))}),lx=y.forwardRef((i,l)=>{let{alwaysRender:r,...u}=i,c=y.useRef(null),f=ua(m=>!m.search);return!r&&!f?null:y.createElement(oa.div,{ref:Pt(c,l),...u,"cmdk-separator":"",role:"separator"})}),ix=y.forwardRef((i,l)=>{let{onValueChange:r,...u}=i,c=i.value!=null,f=pc(),m=ua(v=>v.search),h=ua(v=>v.selectedItemId),b=Vi();return y.useEffect(()=>{i.value!=null&&f.setState("search",i.value)},[i.value]),y.createElement(oa.input,{ref:l,...u,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":b.listId,"aria-labelledby":b.labelId,"aria-activedescendant":h,id:b.inputId,type:"text",value:c?i.value:m,onChange:v=>{c||f.setState("search",v.target.value),r?.(v.target.value)}})}),sx=y.forwardRef((i,l)=>{let{children:r,label:u="Suggestions",...c}=i,f=y.useRef(null),m=y.useRef(null),h=ua(v=>v.selectedItemId),b=Vi();return y.useEffect(()=>{if(m.current&&f.current){let v=m.current,x=f.current,g,D=new ResizeObserver(()=>{g=requestAnimationFrame(()=>{let R=v.offsetHeight;x.style.setProperty("--cmdk-list-height",R.toFixed(1)+"px")})});return D.observe(v),()=>{cancelAnimationFrame(g),D.unobserve(v)}}},[]),y.createElement(oa.div,{ref:Pt(f,l),...c,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":h,"aria-label":u,id:b.listId},Cr(i,v=>y.createElement("div",{ref:Pt(m,b.listInnerRef),"cmdk-list-sizer":""},v)))}),rx=y.forwardRef((i,l)=>{let{open:r,onOpenChange:u,overlayClassName:c,contentClassName:f,container:m,...h}=i;return y.createElement(JS,{open:r,onOpenChange:u},y.createElement($S,{container:m},y.createElement(WS,{"cmdk-overlay":"",className:c}),y.createElement(IS,{"aria-label":i.label,"cmdk-dialog":"",className:f},y.createElement(op,{ref:l,...h}))))}),ux=y.forwardRef((i,l)=>ua(r=>r.filtered.count===0)?y.createElement(oa.div,{ref:l,...i,"cmdk-empty":"",role:"presentation"}):null),ox=y.forwardRef((i,l)=>{let{progress:r,children:u,label:c="Loading...",...f}=i;return y.createElement(oa.div,{ref:l,...f,"cmdk-loading":"",role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,"aria-label":c},Cr(i,m=>y.createElement("div",{"aria-hidden":!0},m)))}),jt=Object.assign(op,{List:sx,Item:nx,Input:ix,Group:ax,Separator:lx,Dialog:rx,Empty:ux,Loading:ox});function cx(i,l){let r=i.nextElementSibling;for(;r;){if(r.matches(l))return r;r=r.nextElementSibling}}function fx(i,l){let r=i.previousElementSibling;for(;r;){if(r.matches(l))return r;r=r.previousElementSibling}}function cp(i){let l=y.useRef(i);return Ua(()=>{l.current=i}),l}var Ua=typeof window>"u"?y.useEffect:y.useLayoutEffect;function Ml(i){let l=y.useRef();return l.current===void 0&&(l.current=i()),l}function ua(i){let l=pc(),r=()=>i(l.snapshot());return y.useSyncExternalStore(l.subscribe,r,r)}function fp(i,l,r,u=[]){let c=y.useRef(),f=Vi();return Ua(()=>{var m;let h=(()=>{var v;for(let x of r){if(typeof x=="string")return x.trim();if(typeof x=="object"&&"current"in x)return x.current?(v=x.current.textContent)==null?void 0:v.trim():c.current}})(),b=u.map(v=>v.trim());f.value(i,h,b),(m=l.current)==null||m.setAttribute(Rl,h),c.current=h}),c}var dx=()=>{let[i,l]=y.useState(),r=Ml(()=>new Map);return Ua(()=>{r.current.forEach(u=>u()),r.current=new Map},[i]),(u,c)=>{r.current.set(u,c),l({})}};function hx(i){let l=i.type;return typeof l=="function"?l(i.props):"render"in l?l.render(i.props):i}function Cr({asChild:i,children:l},r){return i&&y.isValidElement(l)?y.cloneElement(hx(l),{ref:l.ref},r(l.props.children)):r(l)}var mx={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};const gx="https://pay.theio.vn",px={vn:{product:"NM-PRO-YEARLY",original:"1.190.000 VND",price:"595.000 VND",method:"Bank Transfer (VietQR)",flag:"🇻🇳"},intl:{product:"NM-PRO-YEARLY",original:"$89 USD",price:"$49 USD",method:"Card / PayPal (Polar)",flag:"🌐"}};let cc=null;function Im(){cc?.()}function vx(){const[i,l]=y.useState(!1),[r,u]=y.useState("choose"),[c,f]=y.useState(""),[m,h]=y.useState(!1),[b,v]=y.useState(!1),[x,g]=y.useState(""),{t:D}=xr();return y.useEffect(()=>(cc=()=>l(!0),()=>{cc=null}),[]),y.useEffect(()=>{i||(u("choose"),f(""),g(""),v(!1))},[i]),y.useEffect(()=>{if(!i)return;const R=j=>{j.key==="Escape"&&l(!1)};return document.addEventListener("keydown",R),()=>document.removeEventListener("keydown",R)},[i]),y.useCallback(async R=>{const j=px[R],B=prompt(D("upgrade.enterEmail","Enter your email for the license:"));if(B){try{const Q=await(await fetch(`${gx}${R==="intl"?"/checkout/polar":"/order/sepay"}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({product:j.product,email:B})})).json();Q.url?window.open(Q.url,"_blank"):Q.qr_url&&window.open(Q.qr_url,"_blank")}catch{R==="intl"&&window.open("https://polar.sh/nhadaututtheky","_blank")}l(!1)}},[D]),y.useCallback(async()=>{const R=c.trim();if(R){h(!0),g("");try{const j=await qe.post("/api/dashboard/license/activate",{license_key:R});j.success?(v(!0),setTimeout(()=>{l(!1),window.location.reload()},1500)):g(j.error||D("upgrade.activationFailed","Activation failed"))}catch{g(D("upgrade.activationFailed","Activation failed. Check key format."))}finally{h(!1)}}},[c,D]),null}const yx=[{path:"/",icon:ug,labelKey:"nav.overview"},{path:"/health",icon:og,labelKey:"nav.health"},{path:"/graph",icon:cg,labelKey:"nav.graph"},{path:"/timeline",icon:fg,labelKey:"nav.timeline"},{path:"/evolution",icon:dg,labelKey:"nav.evolution"},{path:"/diagrams",icon:hg,labelKey:"nav.mindmap"},{path:"/sync",icon:mg,labelKey:"nav.sync"},{path:"/oracle",icon:gg,labelKey:"nav.oracle"},{path:"/tool-stats",icon:pg,labelKey:"nav.toolStats"},{path:"/settings",icon:vg,labelKey:"nav.settings"}],Pm={fact:"#06b6d4",decision:"#f59e0b",error:"#ef4444",insight:"#8b5cf6",preference:"#ec4899",workflow:"#059669",instruction:"#6366f1",pattern:"#14b8a6",concept:"#6366f1",entity:"#06b6d4"};function bx(){const[i,l]=y.useState(!1),[r,u]=y.useState(""),[c,f]=y.useState([]),[m,h]=y.useState(!1),b=y.useRef(null),v=Ry(),{data:x}=_b(),{t:g}=xr();y.useEffect(()=>{const U=Q=>{(Q.metaKey||Q.ctrlKey)&&Q.key==="k"&&(Q.preventDefault(),l(Z=>!Z))};return document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)},[]),y.useEffect(()=>{i||(u(""),f([]))},[i]);const D=y.useCallback(U=>{if(b.current&&clearTimeout(b.current),U.length<2){f([]),h(!1);return}h(!0),b.current=setTimeout(async()=>{try{const Q=await qe.get(`/neurons?content_contains=${encodeURIComponent(U)}&limit=8`);f(Q.neurons??[])}catch{f([])}finally{h(!1)}},300)},[]),R=U=>{u(U),D(U)},j=U=>{v(U),l(!1)},B=x?.fibers??[],k=r.length>0?B.filter(U=>U.summary.toLowerCase().includes(r.toLowerCase())):B.slice(0,5);return T.jsxs(T.Fragment,{children:[T.jsxs("button",{onClick:()=>l(!0),className:"flex items-center gap-2 rounded-lg border border-border bg-card px-3 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground cursor-pointer","aria-label":g("commandPalette.placeholder"),children:[T.jsx(om,{className:"size-3.5","aria-hidden":"true"}),T.jsx("span",{className:"hidden sm:inline",children:g("commandPalette.search")}),T.jsxs("kbd",{className:"pointer-events-none hidden select-none rounded border border-border bg-muted px-1.5 py-0.5 font-mono text-[10px] font-medium sm:inline-flex",children:[T.jsx(qy,{className:"mr-0.5 inline size-2.5","aria-hidden":"true"}),"K"]})]}),i&&sg.createPortal(T.jsx("div",{className:"fixed inset-0 z-[100] flex items-start justify-center pt-[15vh] bg-black/50 backdrop-blur-sm",onClick:U=>{U.target===U.currentTarget&&l(!1)},children:T.jsxs(jt,{className:"w-full max-w-lg rounded-xl border border-border bg-card shadow-lg overflow-hidden",shouldFilter:!1,children:[T.jsxs("div",{className:"flex items-center border-b border-border px-3",children:[T.jsx(om,{className:"mr-2 size-4 shrink-0 text-muted-foreground","aria-hidden":"true"}),T.jsx(jt.Input,{value:r,onValueChange:R,placeholder:g("commandPalette.placeholder"),className:"flex h-11 w-full bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground"}),m&&T.jsx("div",{className:"size-4 shrink-0 animate-spin rounded-full border-2 border-muted-foreground border-t-transparent"})]}),T.jsxs(jt.List,{className:"max-h-80 overflow-y-auto px-2 py-2",children:[T.jsx(jt.Empty,{className:"py-6 text-center text-sm text-muted-foreground",children:g("commandPalette.noResults")}),T.jsx(jt.Group,{heading:T.jsx("span",{className:"px-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground",children:g("commandPalette.pages")}),children:yx.map(({path:U,icon:Q,labelKey:Z})=>T.jsxs(jt.Item,{value:`page-${g(Z)}`,onSelect:()=>j(U),className:"flex items-center gap-3 rounded-lg px-3 py-2 text-sm cursor-pointer aria-selected:bg-accent",children:[T.jsx(Q,{className:"size-4 text-muted-foreground","aria-hidden":"true"}),T.jsx("span",{children:g(Z)})]},U))}),k.length>0&&T.jsx(jt.Group,{heading:T.jsx("span",{className:"px-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground",children:g("commandPalette.fibers")}),children:k.slice(0,6).map(U=>T.jsxs(jt.Item,{value:`fiber-${U.summary}`,onSelect:()=>{v("/diagrams"),l(!1)},className:"flex items-center gap-3 rounded-lg px-3 py-2 text-sm cursor-pointer aria-selected:bg-accent",children:[T.jsx(Vy,{className:"size-4 text-muted-foreground","aria-hidden":"true"}),T.jsx("span",{className:"flex-1 truncate",children:U.summary}),T.jsx("span",{className:"text-[10px] text-muted-foreground font-mono",children:U.neuron_count})]},U.id))}),c.length>0&&T.jsx(jt.Group,{heading:T.jsx("span",{className:"px-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground",children:g("commandPalette.neurons")}),children:c.map(U=>T.jsxs(jt.Item,{value:`neuron-${U.id}`,onSelect:()=>{v("/graph"),l(!1)},className:"flex items-center gap-3 rounded-lg px-3 py-2 text-sm cursor-pointer aria-selected:bg-accent",children:[T.jsx(rg,{className:"size-4 text-muted-foreground","aria-hidden":"true"}),T.jsx("span",{className:"flex-1 truncate text-xs",children:U.content}),T.jsx("span",{className:"shrink-0 rounded-full px-1.5 py-0.5 text-[9px] font-semibold",style:{backgroundColor:`${Pm[U.type]??"#94a3b8"}20`,color:Pm[U.type]??"#94a3b8"},children:U.type})]},U.id))}),T.jsxs(jt.Group,{heading:T.jsx("span",{className:"px-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground",children:"Pro"}),children:[T.jsxs(jt.Item,{value:"pro-semantic-search",onSelect:()=>{l(!1),Im()},className:"flex items-center gap-3 rounded-lg px-3 py-2 text-sm opacity-60 cursor-pointer aria-selected:bg-accent aria-selected:opacity-100",children:[T.jsx(cm,{className:"size-4 text-muted-foreground","aria-hidden":"true"}),T.jsx("span",{className:"flex-1",children:g("commandPalette.semanticSearch")}),T.jsx("span",{className:"rounded-md bg-primary/10 px-1.5 py-0.5 text-[10px] font-semibold text-primary",children:"PRO"})]}),T.jsxs(jt.Item,{value:"pro-cross-brain-search",onSelect:()=>{l(!1),Im()},className:"flex items-center gap-3 rounded-lg px-3 py-2 text-sm opacity-60 cursor-pointer aria-selected:bg-accent aria-selected:opacity-100",children:[T.jsx(cm,{className:"size-4 text-muted-foreground","aria-hidden":"true"}),T.jsx("span",{className:"flex-1",children:g("commandPalette.crossBrainSearch")}),T.jsx("span",{className:"rounded-md bg-primary/10 px-1.5 py-0.5 text-[10px] font-semibold text-primary",children:"PRO"})]})]})]}),T.jsx("div",{className:"flex items-center justify-between border-t border-border px-4 py-2",children:T.jsxs("div",{className:"flex items-center gap-3 text-[10px] text-muted-foreground",children:[T.jsxs("span",{children:[T.jsx("kbd",{className:"rounded border border-border bg-muted px-1 py-0.5 font-mono",children:"↑↓"})," ",g("commandPalette.navigate")]}),T.jsxs("span",{children:[T.jsx("kbd",{className:"rounded border border-border bg-muted px-1 py-0.5 font-mono",children:"↵"})," ",g("commandPalette.select")]}),T.jsxs("span",{children:[T.jsx("kbd",{className:"rounded border border-border bg-muted px-1 py-0.5 font-mono",children:"esc"})," ",g("commandPalette.close")]})]})})]})}),document.body)]})}const Sx={light:Gy,dark:ky,system:Ky},eg={light:"common.lightMode",dark:"common.darkMode",system:"common.systemTheme"};function xx(){const{sidebarOpen:i,toggleSidebar:l,theme:r,cycleTheme:u}=br(),{data:c}=Rb(),{data:f}=Mb(),{t:m}=xr(),h=Sx[r];return T.jsxs("header",{className:"sticky top-0 z-20 flex h-14 items-center gap-4 border-b border-border bg-background/80 px-4 backdrop-blur-sm",children:[T.jsx(cr,{variant:"ghost",size:"icon",onClick:l,"aria-label":m(i?"common.collapseSidebar":"common.expandSidebar"),children:i?T.jsx(fm,{className:"size-5",weight:"bold"}):T.jsx(fm,{className:"size-5"})}),c?.active_brain&&T.jsxs("div",{className:"flex items-center gap-2",children:[T.jsxs("span",{className:"text-sm text-muted-foreground",children:[m("common.brain"),":"]}),T.jsx(Lb,{variant:"secondary",className:"font-mono text-xs",children:c.active_brain})]}),T.jsx(bx,{}),T.jsx("div",{className:"flex-1"}),T.jsx(cr,{variant:"ghost",size:"icon",asChild:!0,"aria-label":"Quickstart Guide",title:"Quickstart Guide",children:T.jsx("a",{href:"https://github.com/acidkill/surreal-memory/blob/main/docs/guides/quickstart-guide.md",target:"_blank",rel:"noopener noreferrer",children:T.jsx(Yy,{className:"size-4"})})}),T.jsx(cr,{variant:"ghost",size:"icon",onClick:u,"aria-label":m(eg[r]),title:m(eg[r]),"data-testid":"theme-toggle",children:T.jsx(h,{className:"size-4"})}),f?.version&&T.jsxs("span",{className:"text-xs text-muted-foreground font-mono",children:["v",f.version]})]})}function Ex(){const i=br(l=>l.sidebarOpen);return T.jsxs("div",{className:"h-screen bg-background overflow-hidden",children:[T.jsx(bb,{}),T.jsxs("div",{className:ji("flex flex-col h-full transition-all duration-[var(--transition-normal)]",i?"ml-56":"ml-16"),children:[T.jsx(xx,{}),T.jsx("main",{className:"flex-1 overflow-auto",children:T.jsx(My,{})})]}),T.jsx(vx,{})]})}function Lt(){return T.jsxs("div",{className:"space-y-6 p-6 animate-pulse",children:[T.jsx("div",{className:"h-8 w-48 rounded-lg bg-muted"}),T.jsx("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",children:Array.from({length:4}).map((i,l)=>T.jsx("div",{className:"h-28 rounded-xl bg-muted"},l))}),T.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[T.jsx("div",{className:"h-64 rounded-xl bg-muted"}),T.jsx("div",{className:"h-64 rounded-xl bg-muted"})]})]})}const Tx=y.lazy(()=>Ut(()=>import("./OverviewPage-Bd8oQbjM.js"),__vite__mapDeps([0,1,2,3,4,5,6,7]))),Ox=y.lazy(()=>Ut(()=>import("./HealthPage-WgJz4uYi.js"),__vite__mapDeps([8,1,2,3,4,5,7,6]))),Cx=y.lazy(()=>Ut(()=>import("./UncertaintyPage-B1-YQ66j.js"),__vite__mapDeps([9,1,2,3,4,5,6,7]))),Nx=y.lazy(()=>Ut(()=>import("./GraphPage-DnkZu_wH.js"),__vite__mapDeps([10,1,2,3,4,5,6,7]))),Ax=y.lazy(()=>Ut(()=>import("./TimelinePage-ByrSgpuo.js"),__vite__mapDeps([11,1,2,3,4,5,7,6]))),Dx=y.lazy(()=>Ut(()=>import("./EvolutionPage-_rzMyZka.js"),__vite__mapDeps([12,1,2,13,3,4,7,6,5]))),wx=y.lazy(()=>Ut(()=>import("./DiagramsPage-7MxRvurw.js"),__vite__mapDeps([14,1,2,3,4,15,7,6,5,16]))),zx=y.lazy(()=>Ut(()=>import("./SettingsPage-BD10gAE1.js"),__vite__mapDeps([17,1,2,3,5,4,13,6,7]))),Rx=y.lazy(()=>Ut(()=>import("./SyncPage-XGbJa_ff.js"),__vite__mapDeps([18,1,2,3,5,6,7]))),Mx=y.lazy(()=>Ut(()=>import("./OraclePage-zAsy8lB5.js"),__vite__mapDeps([19,1,2,5,6,7]))),_x=y.lazy(()=>Ut(()=>import("./ToolStatsPage-C3TV9sEV.js"),__vite__mapDeps([20,1,2,3,4,7,6,5]))),jx=y.lazy(()=>Ut(()=>import("./VisualizePage-6HaaRoFH.js"),__vite__mapDeps([21,1,2,13,3,5,6,7]))),Lx=y.lazy(()=>Ut(()=>import("./StoragePage-B_CEarTZ.js"),__vite__mapDeps([22,1,2,3,5,4,6,7])));function Ux(){return T.jsx(_y,{children:T.jsxs(dt,{element:T.jsx(Ex,{}),children:[T.jsx(dt,{index:!0,element:T.jsx(y.Suspense,{fallback:T.jsx(Lt,{}),children:T.jsx(Tx,{})})}),T.jsx(dt,{path:"health",element:T.jsx(y.Suspense,{fallback:T.jsx(Lt,{}),children:T.jsx(Ox,{})})}),T.jsx(dt,{path:"uncertainty",element:T.jsx(y.Suspense,{fallback:T.jsx(Lt,{}),children:T.jsx(Cx,{})})}),T.jsx(dt,{path:"graph",element:T.jsx(y.Suspense,{fallback:T.jsx(Lt,{}),children:T.jsx(Nx,{})})}),T.jsx(dt,{path:"timeline",element:T.jsx(y.Suspense,{fallback:T.jsx(Lt,{}),children:T.jsx(Ax,{})})}),T.jsx(dt,{path:"evolution",element:T.jsx(y.Suspense,{fallback:T.jsx(Lt,{}),children:T.jsx(Dx,{})})}),T.jsx(dt,{path:"diagrams",element:T.jsx(y.Suspense,{fallback:T.jsx(Lt,{}),children:T.jsx(wx,{})})}),T.jsx(dt,{path:"settings",element:T.jsx(y.Suspense,{fallback:T.jsx(Lt,{}),children:T.jsx(zx,{})})}),T.jsx(dt,{path:"sync",element:T.jsx(y.Suspense,{fallback:T.jsx(Lt,{}),children:T.jsx(Rx,{})})}),T.jsx(dt,{path:"oracle",element:T.jsx(y.Suspense,{fallback:T.jsx(Lt,{}),children:T.jsx(Mx,{})})}),T.jsx(dt,{path:"tool-stats",element:T.jsx(y.Suspense,{fallback:T.jsx(Lt,{}),children:T.jsx(_x,{})})}),T.jsx(dt,{path:"visualize",element:T.jsx(y.Suspense,{fallback:T.jsx(Lt,{}),children:T.jsx(jx,{})})}),T.jsx(dt,{path:"storage",element:T.jsx(y.Suspense,{fallback:T.jsx(Lt,{}),children:T.jsx(Lx,{})})}),T.jsx(dt,{path:"*",element:T.jsx(jy,{to:"/",replace:!0})})]})})}const{slice:Bx,forEach:Hx}=[];function qx(i){return Hx.call(Bx.call(arguments,1),l=>{if(l)for(const r in l)i[r]===void 0&&(i[r]=l[r])}),i}function Vx(i){return typeof i!="string"?!1:[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(r=>r.test(i))}const tg=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,Yx=function(i,l){const u=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{path:"/"},c=encodeURIComponent(l);let f=`${i}=${c}`;if(u.maxAge>0){const m=u.maxAge-0;if(Number.isNaN(m))throw new Error("maxAge should be a Number");f+=`; Max-Age=${Math.floor(m)}`}if(u.domain){if(!tg.test(u.domain))throw new TypeError("option domain is invalid");f+=`; Domain=${u.domain}`}if(u.path){if(!tg.test(u.path))throw new TypeError("option path is invalid");f+=`; Path=${u.path}`}if(u.expires){if(typeof u.expires.toUTCString!="function")throw new TypeError("option expires is invalid");f+=`; Expires=${u.expires.toUTCString()}`}if(u.httpOnly&&(f+="; HttpOnly"),u.secure&&(f+="; Secure"),u.sameSite)switch(typeof u.sameSite=="string"?u.sameSite.toLowerCase():u.sameSite){case!0:f+="; SameSite=Strict";break;case"lax":f+="; SameSite=Lax";break;case"strict":f+="; SameSite=Strict";break;case"none":f+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return u.partitioned&&(f+="; Partitioned"),f},ng={create(i,l,r,u){let c=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:"/",sameSite:"strict"};r&&(c.expires=new Date,c.expires.setTime(c.expires.getTime()+r*60*1e3)),u&&(c.domain=u),document.cookie=Yx(i,l,c)},read(i){const l=`${i}=`,r=document.cookie.split(";");for(let u=0;u-1&&(u=window.location.hash.substring(window.location.hash.indexOf("?")));const f=u.substring(1).split("&");for(let m=0;m0&&f[m].substring(0,h)===l&&(r=f[m].substring(h+1))}}return r}},Gx={name:"hash",lookup(i){let{lookupHash:l,lookupFromHashIndex:r}=i,u;if(typeof window<"u"){const{hash:c}=window.location;if(c&&c.length>2){const f=c.substring(1);if(l){const m=f.split("&");for(let h=0;h0&&m[h].substring(0,b)===l&&(u=m[h].substring(b+1))}}if(u)return u;if(!u&&r>-1){const m=c.match(/\/([a-zA-Z-]*)/g);return Array.isArray(m)?m[typeof r=="number"?r:0]?.replace("/",""):void 0}}}return u}};let wl=null;const ag=()=>{if(wl!==null)return wl;try{if(wl=typeof window<"u"&&window.localStorage!==null,!wl)return!1;const i="i18next.translate.boo";window.localStorage.setItem(i,"foo"),window.localStorage.removeItem(i)}catch{wl=!1}return wl};var Qx={name:"localStorage",lookup(i){let{lookupLocalStorage:l}=i;if(l&&ag())return window.localStorage.getItem(l)||void 0},cacheUserLanguage(i,l){let{lookupLocalStorage:r}=l;r&&ag()&&window.localStorage.setItem(r,i)}};let zl=null;const lg=()=>{if(zl!==null)return zl;try{if(zl=typeof window<"u"&&window.sessionStorage!==null,!zl)return!1;const i="i18next.translate.boo";window.sessionStorage.setItem(i,"foo"),window.sessionStorage.removeItem(i)}catch{zl=!1}return zl};var Xx={name:"sessionStorage",lookup(i){let{lookupSessionStorage:l}=i;if(l&&lg())return window.sessionStorage.getItem(l)||void 0},cacheUserLanguage(i,l){let{lookupSessionStorage:r}=l;r&&lg()&&window.sessionStorage.setItem(r,i)}},Zx={name:"navigator",lookup(i){const l=[];if(typeof navigator<"u"){const{languages:r,userLanguage:u,language:c}=navigator;if(r)for(let f=0;f0?l:void 0}},Fx={name:"htmlTag",lookup(i){let{htmlTag:l}=i,r;const u=l||(typeof document<"u"?document.documentElement:null);return u&&typeof u.getAttribute=="function"&&(r=u.getAttribute("lang")),r}},Jx={name:"path",lookup(i){let{lookupFromPathIndex:l}=i;if(typeof window>"u")return;const r=window.location.pathname.match(/\/([a-zA-Z-]*)/g);return Array.isArray(r)?r[typeof l=="number"?l:0]?.replace("/",""):void 0}},$x={name:"subdomain",lookup(i){let{lookupFromSubdomainIndex:l}=i;const r=typeof l=="number"?l+1:1,u=typeof window<"u"&&window.location?.hostname?.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i);if(u)return u[r]}};let dp=!1;try{document.cookie,dp=!0}catch{}const hp=["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"];dp||hp.splice(1,1);const Wx=()=>({order:hp,lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:i=>i});class mp{constructor(l){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(l,r)}init(){let l=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{languageUtils:{}},r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},u=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=l,this.options=qx(r,this.options||{},Wx()),typeof this.options.convertDetectedLanguage=="string"&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=c=>c.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=u,this.addDetector(Kx),this.addDetector(kx),this.addDetector(Qx),this.addDetector(Xx),this.addDetector(Zx),this.addDetector(Fx),this.addDetector(Jx),this.addDetector($x),this.addDetector(Gx)}addDetector(l){return this.detectors[l.name]=l,this}detect(){let l=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.order,r=[];return l.forEach(u=>{if(this.detectors[u]){let c=this.detectors[u].lookup(this.options);c&&typeof c=="string"&&(c=[c]),c&&(r=r.concat(c))}}),r=r.filter(u=>u!=null&&!Vx(u)).map(u=>this.options.convertDetectedLanguage(u)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes?r:r.length>0?r[0]:null}cacheUserLanguage(l){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.caches;r&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(l)>-1||r.forEach(u=>{this.detectors[u]&&this.detectors[u].cacheUserLanguage(l,this.options)}))}}mp.type="languageDetector";const Ix={overview:"Overview",health:"Health",uncertainty:"Uncertainty",graph:"Graph",timeline:"Timeline",evolution:"Evolution",mindmap:"Mindmap",sync:"Cloud Sync",oracle:"Oracle",toolStats:"Tool Stats",visualize:"Visualize",storage:"Storage",settings:"Settings"},Px={confirm:"Confirm",cancel:"Cancel",delete:"Delete",loading:"Loading...",active:"Active",yes:"Yes",no:"No",none:"(none)",neurons:"neurons",brain:"Brain",collapseSidebar:"Collapse sidebar",expandSidebar:"Expand sidebar",mainNavigation:"Main navigation",lightMode:"Light mode",darkMode:"Dark mode",systemTheme:"System theme"},eE={title:"Overview",neurons:"Neurons",synapses:"Synapses",fibers:"Fibers",brains:"Brains",brainList:"Brains",name:"Name",grade:"Grade",status:"Status",actions:"Actions",currentBrain:"Current active brain",switchTo:"Click to switch to {{name}}",deleteBrain:"Delete brain {{name}}",noBrains:"No brains found.",deleteBrainTitle:"Delete Brain",deleteBrainDesc:'Delete brain "{{name}}"? This will remove all neurons, synapses, and fibers permanently. This cannot be undone.',switchedTo:"Switched to brain: {{name}}",switchFailed:"Failed to switch brain",deleted:"Deleted brain: {{name}}",deleteFailed:"Failed to delete brain"},tE={title:"Health",brainMetrics:"Brain Metrics",purity:"Purity",freshness:"Freshness",connectivity:"Connectivity",diversity:"Diversity",consolidation:"Consolidation",activation:"Activation",recall:"Recall",orphanRate:"Orphan Rate",radarName:"Health",warnings:"Warnings & Recommendations",noWarnings:"No warnings. Brain is healthy!",recommendations:"Recommendations",enrichTitle:"How to Enrich Your Brain",enrichDesc:"A richer brain means better recall. Here's how to build detailed neurons and strong synapses.",collapseTips:"Collapse tips",expandTips:"Expand tips",less:"Less",more:"More",topPenalties:"Top Issues Hurting Your Score",noPenalties:"No significant penalties. Keep it up!",penaltyPoints:"{{points}} pts lost",estimatedGain:"+{{gain}} pts if fixed",currentScore:"Current: {{score}}%",weight:"Weight: {{weight}}%",fixAction:"Fix",conflictRate:"Conflict Rate",contradictionCount:"Contradictions"},nE={title:"Uncertainty",window:"Last {{days}} days",level:{low:"Low",medium:"Medium",high:"High"},contradictionRate:"Contradiction Rate",totalMemories:"Total Memories",contradictions:"Contradictions",lowTrust:"Low-trust",superseded:"Superseded",expiring:"Expiring",drift:"Drift Clusters",driftSqliteOnly:"Drift detection is SQLite-only.",truncatedNote:"Low-trust and superseded reflect only the most-recent {{count}} scanned memories.",fiberId:"Fiber",trustScore:"Trust",supersededBy:"Superseded by",canonical:"Canonical",confidence:"Confidence",noSamples:"Nothing to show."},aE={rememberTitle:"Ask your agent to remember frequently",rememberTips:['After every decision: "Remember that we chose PostgreSQL over MongoDB for the user service"','After debugging: "Remember the root cause was a race condition in the WebSocket handler"','After meetings: "Remember Alice suggested rate limiting at the API gateway level"','After learning: "Remember that Vite HMR requires export default for React components"'],causalTitle:"Use rich, causal language",causalTips:['BAD: "PostgreSQL" → creates a single flat neuron','GOOD: "We chose PostgreSQL over MongoDB because we need ACID transactions for payment processing" → creates concept + entity + decision neurons with CAUSED_BY synapses',"Include WHY, not just WHAT — causal chains create richer neural connections","Mention people, dates, and context — they become separate neurons linked by synapses"],diverseTitle:"Diverse memory types = stronger recall",diverseTips:['Facts: "The API rate limit is 1000 req/min per user"','Decisions: "We decided to use JWT over sessions because of microservice architecture"',`Errors: "Import failed because the column 'email' was renamed to 'user_email' in v3"`,'Insights: "Pattern: always validate webhook signatures before processing payloads"','Workflows: "Deploy process: lint → test → build → push → verify health check"'],trainTitle:"Train from documents for permanent knowledge",trainTips:["Use smem_train to import docs (PDF, DOCX, MD) — trained memories never decay","Use smem_index to index your codebase — enables code-aware recall","Pin critical memories with smem_pin — they skip decay and consolidation","Use smem_eternal for project-level context that should persist across all sessions"]},lE={title:"Neural Graph",nodes:"Nodes:",networkVisualization:"Network Visualization",nodesCount:"{{nodes}} nodes, {{edges}} edges",noNeurons:"No neurons found in this brain.",concept:"concept",entity:"entity",time:"time",action:"action",state:"state",other:"other"},iE={title:"Timeline",memoryTimeline:"Memory Timeline",entries:"{{total}} entries",noEntries:"No timeline entries.",range7d:"7 Days",range30d:"30 Days",range90d:"90 Days",rangeAll:"All",todayMemories:"Today",totalPeriod:"Total",avgPerDay:"Avg/Day",activeDays:"Active Days",activityTrend:"Activity Trend",neuronDistribution:"Neuron Distribution",recentActivity:"Recent Activity",neurons:"Neurons",fibers:"Fibers",synapses:"Synapses"},sE={title:"Evolution",brainMetrics:"Brain Metrics",maturity:"Maturity",plasticity:"Plasticity",semanticRatio:"Semantic Ratio",totalFibers:"Total Fibers",totalNeurons:"Total Neurons",stageDistribution:"Stage Distribution",shortTerm:"Short Term",working:"Working",episodic:"Episodic",semantic:"Semantic"},rE={title:"Mindmap",fibers:"Fibers",noFibers:"No fibers found.",selectFiber:"Select a Fiber",fiberLabel:"Fiber: {{id}}...",neuronsCount:"Neurons:",connectionsCount:"Connections:",selectFiberPrompt:"Select a fiber to view its mindmap"},uE={title:"Settings",general:"General",version:"Version",activeBrain:"Active Brain",totalBrains:"Total Brains",brainFiles:"Brain Files",brainsDirectory:"Brains Directory",totalDiskUsage:"Total Disk Usage",telegramBackup:"Telegram Backup",connected:"Connected",chatIds:"Chat IDs",autoBackup:"Auto-backup on consolidation",sendTest:"Send Test",sending:"Sending...",backupNow:"Backup Now",backingUp:"Backing up...",notConfigured:"Not Configured",telegramSetup:"Set NMEM_TELEGRAM_BOT_TOKEN env var and add [telegram] chat_ids to config.toml.",feedbackTitle:"Feedback & Bug Report",reportBug:"Report a Bug",reportBugDesc:"Found something broken? Open an issue with steps to reproduce.",featureRequest:"Feature Request",featureRequestDesc:"Have an idea to improve Surreal-Memory? We'd love to hear it.",discussions:"GitHub Discussions",discussionsDesc:"Questions, tips, and community support.",testSuccess:"Test message sent successfully",testPartial:"Some messages failed to send",testFailed:"Failed to send test message",backupSuccess:"Backup sent! {{brain}} ({{size}}MB) to {{count}} chat(s)",backupSendFailed:"Backup failed to send",backupFailed:"Backup failed",configStatus:"Configuration Status",embeddingConfig:"Embedding Provider",embeddingProvider:"Provider",embeddingModel:"Model",embeddingEnabled:"Enabled",embeddingThreshold:"Similarity Threshold",embeddingTest:"Test Connection",embeddingTesting:"Testing...",embeddingTestOk:"Connection OK — {{provider}} ({{dimension}}D)",embeddingTestFail:"Test failed: {{error}}",embeddingSave:"Save",embeddingSaving:"Saving...",embeddingSaved:"Embedding settings saved",embeddingSaveFailed:"Failed to save embedding settings",proFeature:"Pro",watcher:"File Watcher",watcherPaths:"Watched Paths",watcherRecent:"Recent Activity",watcherRunning:"Running",watcherStopped:"Stopped",watcherDisabled:"Disabled",watcherNoActivity:"No recent activity"},oE={title:"Cloud Sync",refresh:"Refresh",connectionStatus:"Connection",status:"Status",cloudConnected:"Connected",notConnected:"Not Connected",hubUrl:"Hub URL",apiKey:"API Key",deviceId:"Device ID",disconnect:"Disconnect",setupCloud:"Connect to Cloud",setupTitle:"Connect to Cloud Hub",setupDesc:"Enter your hub URL and API key to sync memories across devices. Register at the hub to get your key.",keyRequired:"API key is required",keyInvalid:"API key must start with nmk_",keyHint:"Get your key by registering at the hub. It starts with nmk_.",connect:"Connect",connecting:"Connecting...",connected:"Cloud sync connected!",connectFailed:"Failed to connect",disconnected:"Cloud sync disconnected",disconnectFailed:"Failed to disconnect",devices:"Devices",lastSync:"Last sync",never:"Never",noDevices:"No devices registered yet. Sync from a device to register it.",changeLog:"Change Log",totalChanges:"Total Changes",synced:"Synced",pending:"Pending",latestSequence:"Latest Sequence",conflictStrategy:"Conflict Resolution",conflictDesc:"How to resolve when the same memory is changed on multiple devices.",strategyUpdated:"Conflict strategy updated",updateFailed:"Failed to update config",syncMode:"Sync Mode",merkleDelta:"Merkle Delta",fullSync:"Full Sync"},cE={title:"Brain Oracle",loading:"Channeling your memories...",needMore:"Your brain needs more memories",needMoreDesc:"The Oracle requires at least 3 memories to unlock. Ask your AI agent to remember decisions, insights, and learnings — then return for your reading.",dailyHint:"Tap each card to reveal your reading",past:"Past",present:"Present",future:"Future",readingDate:"Reading for {{brain}} on {{date}}",whatifHint:"What if these memories collided?",reshuffle:"Reshuffle",memory:"Memory",wildcard:"Wildcard",matchupComplete:"Matchup Complete!",matchupScoreDesc:"Based on activation strength and connections of your chosen memories",playAgain:"Play Again",round:"Round {{current}} / {{total}}",choose:"Choose",chosen:"Chosen!",score:"Score",dailyReading:"Daily Reading",whatif:"What If",matchup:"Matchup",copyCard:"Copy Card",copied:"Copied!",downloadCard:"Download"},fE={search:"Search...",placeholder:"Search pages, fibers, memories...",noResults:"No results found.",pages:"Pages",fibers:"Fibers",neurons:"Memories",semanticSearch:"Semantic Search — find by meaning",crossBrainSearch:"Cross-Brain Search — search all brains",navigate:"navigate",select:"open",close:"close"},dE={title:"Tool Stats",totalEvents:"Total Events",successRate:"Success Rate",uniqueTools:"Unique Tools",topTools:"Top Tools",usageOverTime:"Usage Over Time",detailTable:"Tool Details",tool:"Tool",calls:"Calls",avgDuration:"Avg Duration",server:"Server",noData:"No tool events recorded yet. Use Surreal-Memory tools to start tracking."},hE={title:"Memory Visualizer",description:"Query your memories and generate charts from stored data."},mE={title:"Storage",currentBackend:"Current Backend",brain:"Brain",neurons:"Neurons",synapses:"Synapses",fibers:"Fibers",tierDistribution:"Memory Tiers",tierHot:"HOT — Always in context",tierWarm:"WARM — Semantic match",tierCold:"COLD — Explicit recall only",totalMemories:"Total typed memories"},gE={tier:"License",pro_badge:"PRO",pro_feature:"Pro Feature",free:"Free",pro:"Pro",team:"Team"},pE={title:"Get Surreal-Memory Pro",subtitle:"Choose your payment method",enterKey:"Enter your license key",enterEmail:"Enter your email for the license:",orActivate:"or activate a key",haveKey:"I already have a license key",licenseKey:"License Key",activate:"Activate",activated:"Pro activated!",activationFailed:"Activation failed. Check your key.",back:"Back"},vE={nav:Ix,common:Px,overview:eE,health:tE,uncertainty:nE,enrichment:aE,graph:lE,timeline:iE,evolution:sE,diagrams:rE,settings:uE,sync:oE,oracle:cE,commandPalette:fE,toolStats:dE,visualize:hE,storage:mE,license:gE,upgrade:pE};ht.use(mp).use(fb).init({resources:{en:{translation:vE}},fallbackLng:"en",detection:{order:["localStorage","navigator"],lookupLocalStorage:"smem-lang",caches:["localStorage"]},interpolation:{escapeValue:!1}});const yE=new Ny({defaultOptions:{queries:{staleTime:3e4,retry:1,refetchOnWindowFocus:!1}}});Iy.createRoot(document.getElementById("root")).render(T.jsx(y.StrictMode,{children:T.jsx(Ay,{client:yE,children:T.jsxs(Ly,{basename:window.location.pathname.startsWith("/dashboard")?"/dashboard":"/ui",children:[T.jsx(Ux,{}),T.jsx(C0,{position:"bottom-right",toastOptions:{className:"bg-card text-card-foreground border-border"}})]})})}));export{KE as A,cr as B,ji as C,Ut as _,BE as a,Lb as b,Rb as c,CE as d,NE as e,jE as f,AE as g,DE as h,_E as i,zE as j,wE as k,RE as l,_b as m,ME as n,qe as o,HE as p,qE as q,YE as r,VE as s,OE as t,xr as u,Mb as v,UE as w,kE as x,Im as y,LE as z}; diff --git a/src/surreal_memory/server/static/dist/assets/index-Cc1YGEOX.css b/src/surreal_memory/server/static/dist/assets/index-Cc1YGEOX.css deleted file mode 100644 index 6b53ae34..00000000 --- a/src/surreal_memory/server/static/dist/assets/index-Cc1YGEOX.css +++ /dev/null @@ -1 +0,0 @@ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-divide-x-reverse:0}}}@layer theme{:root,:host{--font-sans:"Inter", ui-sans-serif, system-ui, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, monospace;--color-red-500:oklch(63.7% .237 25.331);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-900:oklch(37.8% .077 168.94);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-900:oklch(38.6% .063 188.416);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-900:oklch(39.8% .07 227.392);--color-cyan-950:oklch(30.2% .056 229.695);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-violet-900:oklch(38% .189 293.745);--color-violet-950:oklch(28.3% .141 291.089);--color-rose-900:oklch(41% .159 10.272);--color-rose-950:oklch(27.1% .105 12.094);--color-stone-900:oklch(21.6% .006 56.043);--color-stone-950:oklch(14.7% .004 49.25);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:8px;--radius-lg:12px;--radius-xl:16px;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-background:#faf8f3;--color-foreground:#1a1714;--color-card:#f5f0ea;--color-card-foreground:#1a1714;--color-primary:#6366f1;--color-primary-foreground:#fff;--color-secondary:#ede5d8;--color-secondary-foreground:#1a1714;--color-muted:#ede5d8;--color-muted-foreground:#78716c;--color-accent:#e8e0d4;--color-accent-foreground:#1a1714;--color-destructive:#dc2626;--color-destructive-foreground:#fff;--color-border:#d4ccc2;--color-input:#d4ccc2;--color-ring:#6366f1;--color-health-good:#059669;--color-health-warn:#f59e0b;--color-chart-1:#6366f1;--color-chart-2:#8b5cf6;--color-chart-3:#06b6d4;--color-chart-4:#f59e0b;--color-chart-5:#059669;--font-display:"Space Grotesk", ui-sans-serif, system-ui, sans-serif;--transition-normal:.25s ease;--color-sidebar:#f0ebe4;--color-sidebar-foreground:#1a1714;--color-sidebar-border:#d4ccc2;--color-sidebar-accent:#e8e0d4;--color-sidebar-primary:#6366f1}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.bottom-12{bottom:calc(var(--spacing) * 12)}.left-0{left:calc(var(--spacing) * 0)}.left-3{left:calc(var(--spacing) * 3)}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[100\]{z-index:100}.m-auto{margin:auto}.mx-auto{margin-inline:auto}.my-4{margin-block:calc(var(--spacing) * 4)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-auto{margin-bottom:auto}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-16{margin-left:calc(var(--spacing) * 16)}.ml-56{margin-left:calc(var(--spacing) * 56)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-16{width:calc(var(--spacing) * 16);height:calc(var(--spacing) * 16)}.h-0\.5{height:calc(var(--spacing) * .5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-28{height:calc(var(--spacing) * 28)}.h-48{height:calc(var(--spacing) * 48)}.h-64{height:calc(var(--spacing) * 64)}.h-72{height:calc(var(--spacing) * 72)}.h-80{height:calc(var(--spacing) * 80)}.h-\[340px\]{height:340px}.h-\[calc\(100vh-3\.5rem\)\]{height:calc(100vh - 3.5rem)}.h-\[calc\(100vh-14rem\)\]{height:calc(100vh - 14rem)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[200px\]{min-height:200px}.min-h-\[500px\]{min-height:500px}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-9{width:calc(var(--spacing) * 9)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-\[240px\]{width:240px}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\[200px\]{max-width:200px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-105{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.\!border-0{border-style:var(--tw-border-style)!important;border-width:0!important}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.\!border-border{border-color:var(--color-border)!important}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.border-border{border-color:var(--color-border)}.border-border\/50{border-color:#d4ccc280}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,var(--color-border) 50%,transparent)}}.border-input{border-color:var(--color-input)}.border-muted-foreground{border-color:var(--color-muted-foreground)}.border-primary{border-color:var(--color-primary)}.border-primary\/20{border-color:#6366f133}@supports (color:color-mix(in lab,red,red)){.border-primary\/20{border-color:color-mix(in oklab,var(--color-primary) 20%,transparent)}}.border-primary\/30{border-color:#6366f14d}@supports (color:color-mix(in lab,red,red)){.border-primary\/30{border-color:color-mix(in oklab,var(--color-primary) 30%,transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500) 30%,transparent)}}.border-sidebar-border{border-color:var(--color-sidebar-border)}.border-transparent{border-color:#0000}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-t-transparent{border-top-color:#0000}.\!bg-card{background-color:var(--color-card)!important}.\!bg-transparent{background-color:#0000!important}.bg-\[\#16140f\]{background-color:#16140f}.bg-accent{background-color:var(--color-accent)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/5{background-color:color-mix(in oklab,var(--color-amber-500) 5%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.bg-background{background-color:var(--color-background)}.bg-background\/80{background-color:#faf8f3cc}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,var(--color-background) 80%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-card{background-color:var(--color-card)}.bg-card\/90{background-color:#f5f0eae6}@supports (color:color-mix(in lab,red,red)){.bg-card\/90{background-color:color-mix(in oklab,var(--color-card) 90%,transparent)}}.bg-destructive{background-color:var(--color-destructive)}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-health-good\/10{background-color:#0596691a}@supports (color:color-mix(in lab,red,red)){.bg-health-good\/10{background-color:color-mix(in oklab,var(--color-health-good) 10%,transparent)}}.bg-health-warn\/10{background-color:#f59e0b1a}@supports (color:color-mix(in lab,red,red)){.bg-health-warn\/10{background-color:color-mix(in oklab,var(--color-health-warn) 10%,transparent)}}.bg-muted{background-color:var(--color-muted)}.bg-muted\/20{background-color:#ede5d833}@supports (color:color-mix(in lab,red,red)){.bg-muted\/20{background-color:color-mix(in oklab,var(--color-muted) 20%,transparent)}}.bg-muted\/30{background-color:#ede5d84d}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,var(--color-muted) 30%,transparent)}}.bg-orange-500{background-color:var(--color-orange-500)}.bg-primary{background-color:var(--color-primary)}.bg-primary\/5{background-color:#6366f10d}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,var(--color-primary) 5%,transparent)}}.bg-primary\/10{background-color:#6366f11a}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--color-primary) 10%,transparent)}}.bg-primary\/15{background-color:#6366f126}@supports (color:color-mix(in lab,red,red)){.bg-primary\/15{background-color:color-mix(in oklab,var(--color-primary) 15%,transparent)}}.bg-primary\/90{background-color:#6366f1e6}@supports (color:color-mix(in lab,red,red)){.bg-primary\/90{background-color:color-mix(in oklab,var(--color-primary) 90%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-secondary{background-color:var(--color-secondary)}.bg-sidebar{background-color:var(--color-sidebar)}.bg-sidebar-accent{background-color:var(--color-sidebar-accent)}.bg-transparent{background-color:#0000}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-amber-900\/40{--tw-gradient-from:#7b330666}@supports (color:color-mix(in lab,red,red)){.from-amber-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-amber-900) 40%, transparent)}}.from-amber-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-blue-900\/40{--tw-gradient-from:#1c398e66}@supports (color:color-mix(in lab,red,red)){.from-blue-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-blue-900) 40%, transparent)}}.from-blue-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-900\/40{--tw-gradient-from:#104e6466}@supports (color:color-mix(in lab,red,red)){.from-cyan-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-900) 40%, transparent)}}.from-cyan-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-emerald-900\/40{--tw-gradient-from:#004e3b66}@supports (color:color-mix(in lab,red,red)){.from-emerald-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-emerald-900) 40%, transparent)}}.from-emerald-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary\/5{--tw-gradient-from:#6366f10d}@supports (color:color-mix(in lab,red,red)){.from-primary\/5{--tw-gradient-from:color-mix(in oklab, var(--color-primary) 5%, transparent)}}.from-primary\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-red-900\/40{--tw-gradient-from:#82181a66}@supports (color:color-mix(in lab,red,red)){.from-red-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-red-900) 40%, transparent)}}.from-red-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-rose-900\/40{--tw-gradient-from:#8b083666}@supports (color:color-mix(in lab,red,red)){.from-rose-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-rose-900) 40%, transparent)}}.from-rose-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-stone-900\/40{--tw-gradient-from:#1c191766}@supports (color:color-mix(in lab,red,red)){.from-stone-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-stone-900) 40%, transparent)}}.from-stone-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-teal-900\/40{--tw-gradient-from:#0b4f4a66}@supports (color:color-mix(in lab,red,red)){.from-teal-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-teal-900) 40%, transparent)}}.from-teal-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-violet-900\/40{--tw-gradient-from:#4d179a66}@supports (color:color-mix(in lab,red,red)){.from-violet-900\/40{--tw-gradient-from:color-mix(in oklab, var(--color-violet-900) 40%, transparent)}}.from-violet-900\/40{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-amber-950\/60{--tw-gradient-to:#46190199}@supports (color:color-mix(in lab,red,red)){.to-amber-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-amber-950) 60%, transparent)}}.to-amber-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-blue-950\/60{--tw-gradient-to:#16245699}@supports (color:color-mix(in lab,red,red)){.to-blue-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-blue-950) 60%, transparent)}}.to-blue-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-950\/60{--tw-gradient-to:#05334599}@supports (color:color-mix(in lab,red,red)){.to-cyan-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-950) 60%, transparent)}}.to-cyan-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-emerald-950\/60{--tw-gradient-to:#002c2299}@supports (color:color-mix(in lab,red,red)){.to-emerald-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-emerald-950) 60%, transparent)}}.to-emerald-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-orange-950\/60{--tw-gradient-to:#44130699}@supports (color:color-mix(in lab,red,red)){.to-orange-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-orange-950) 60%, transparent)}}.to-orange-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary\/10{--tw-gradient-to:#6366f11a}@supports (color:color-mix(in lab,red,red)){.to-primary\/10{--tw-gradient-to:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.to-primary\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-red-950\/60{--tw-gradient-to:#46080999}@supports (color:color-mix(in lab,red,red)){.to-red-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-red-950) 60%, transparent)}}.to-red-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-rose-950\/60{--tw-gradient-to:#4d021899}@supports (color:color-mix(in lab,red,red)){.to-rose-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-rose-950) 60%, transparent)}}.to-rose-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-stone-950\/60{--tw-gradient-to:#0c0a0999}@supports (color:color-mix(in lab,red,red)){.to-stone-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-stone-950) 60%, transparent)}}.to-stone-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-teal-950\/60{--tw-gradient-to:#022f2e99}@supports (color:color-mix(in lab,red,red)){.to-teal-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-teal-950) 60%, transparent)}}.to-teal-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-violet-950\/60{--tw-gradient-to:#2f0d6899}@supports (color:color-mix(in lab,red,red)){.to-violet-950\/60{--tw-gradient-to:color-mix(in oklab, var(--color-violet-950) 60%, transparent)}}.to-violet-950\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-0{padding-inline:calc(var(--spacing) * 0)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-24{padding-top:calc(var(--spacing) * 24)}.pt-\[15vh\]{padding-top:15vh}.pr-2{padding-right:calc(var(--spacing) * 2)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pl-6{padding-left:calc(var(--spacing) * 6)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-display{font-family:var(--font-display)}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-400{color:var(--color-amber-400)}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-card-foreground{color:var(--color-card-foreground)}.text-cyan-500{color:var(--color-cyan-500)}.text-destructive{color:var(--color-destructive)}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-foreground{color:var(--color-foreground)}.text-foreground\/80{color:#1a1714cc}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,var(--color-foreground) 80%,transparent)}}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-health-good{color:var(--color-health-good)}.text-health-warn{color:var(--color-health-warn)}.text-indigo-500{color:var(--color-indigo-500)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-muted-foreground\/40{color:#78716c66}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,var(--color-muted-foreground) 40%,transparent)}}.text-muted-foreground\/70{color:#78716cb3}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,var(--color-muted-foreground) 70%,transparent)}}.text-orange-500{color:var(--color-orange-500)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-sidebar-foreground{color:var(--color-sidebar-foreground)}.text-sidebar-foreground\/50{color:#1a171480}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/50{color:color-mix(in oklab,var(--color-sidebar-foreground) 50%,transparent)}}.text-sidebar-foreground\/70{color:#1a1714b3}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/70{color:color-mix(in oklab,var(--color-sidebar-foreground) 70%,transparent)}}.text-sidebar-primary{color:var(--color-sidebar-primary)}.text-white\/40{color:#fff6}@supports (color:color-mix(in lab,red,red)){.text-white\/40{color:color-mix(in oklab,var(--color-white) 40%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white) 50%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white) 80%,transparent)}}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline-offset-4{text-underline-offset:4px}.accent-primary{accent-color:var(--color-primary)}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.\!shadow-sm{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000000d)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px var(--tw-shadow-color,#00000012);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-primary{--tw-ring-color:var(--color-primary)}.ring-primary\/30{--tw-ring-color:#6366f14d}@supports (color:color-mix(in lab,red,red)){.ring-primary\/30{--tw-ring-color:color-mix(in oklab, var(--color-primary) 30%, transparent)}}.ring-white\/5{--tw-ring-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.ring-white\/5{--tw-ring-color:color-mix(in oklab, var(--color-white) 5%, transparent)}}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-background{--tw-ring-offset-color:var(--color-background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-700{--tw-duration:.7s;transition-duration:.7s}.duration-\[var\(--transition-normal\)\]{--tw-duration:var(--transition-normal);transition-duration:var(--transition-normal)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}@media(hover:hover){.group-hover\:bg-primary:is(:where(.group):hover *){background-color:var(--color-primary)}.group-hover\:text-foreground:is(:where(.group):hover *){color:var(--color-foreground)}}.placeholder\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}.backdrop\:bg-black\/50::backdrop{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.backdrop\:bg-black\/50::backdrop{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.first\:pt-0:first-child{padding-top:calc(var(--spacing) * 0)}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}.last\:pb-0:last-child{padding-bottom:calc(var(--spacing) * 0)}@media(hover:hover){.hover\:border-primary\/40:hover{border-color:#6366f166}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab,var(--color-primary) 40%,transparent)}}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-accent\/30:hover{background-color:#e8e0d44d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/30:hover{background-color:color-mix(in oklab,var(--color-accent) 30%,transparent)}}.hover\:bg-accent\/50:hover{background-color:#e8e0d480}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.hover\:bg-destructive\/90:hover{background-color:#dc2626e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--color-destructive) 90%,transparent)}}.hover\:bg-primary:hover{background-color:var(--color-primary)}.hover\:bg-primary\/90:hover{background-color:#6366f1e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--color-primary) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:#ede5d8cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--color-secondary) 80%,transparent)}}.hover\:bg-sidebar-accent:hover{background-color:var(--color-sidebar-accent)}.hover\:text-accent-foreground:hover{color:var(--color-accent-foreground)}.hover\:text-destructive:hover{color:var(--color-destructive)}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:text-primary-foreground:hover{color:var(--color-primary-foreground)}.hover\:text-primary\/80:hover{color:#6366f1cc}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,var(--color-primary) 80%,transparent)}}.hover\:text-sidebar-foreground:hover{color:var(--color-sidebar-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px var(--tw-shadow-color,#00000012);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--color-ring)}.focus\:outline-2:focus{outline-style:var(--tw-outline-style);outline-width:2px}.focus\:outline-offset-2:focus{outline-offset:2px}.focus\:outline-ring:focus{outline-color:var(--color-ring)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--color-ring)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.aria-selected\:bg-accent[aria-selected=true]{background-color:var(--color-accent)}.aria-selected\:opacity-100[aria-selected=true]{opacity:1}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:inline-flex{display:inline-flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}:where(.sm\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.sm\:divide-y-0>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px * var(--tw-divide-y-reverse));border-bottom-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)))}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:pr-4{padding-right:calc(var(--spacing) * 4)}.sm\:pl-4{padding-left:calc(var(--spacing) * 4)}}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&\>button\]\:\!border-border>button{border-color:var(--color-border)!important}.\[\&\>button\]\:\!bg-card>button{background-color:var(--color-card)!important}.\[\&\>button\]\:\!fill-foreground>button{fill:var(--color-foreground)!important}}:root.dark{--color-background:#0c0b09;--color-foreground:#f5f0ea;--color-card:#16140f;--color-card-foreground:#f0ebe4;--color-popover:#1a1814;--color-popover-foreground:#f5f0ea;--color-primary:#818cf8;--color-primary-foreground:#0c0b09;--color-secondary:#1e1b16;--color-secondary-foreground:#f5f0ea;--color-muted:#1e1b16;--color-muted-foreground:#a8a29e;--color-accent:#292520;--color-accent-foreground:#f5f0ea;--color-destructive:#ef4444;--color-destructive-foreground:#fff;--color-border:#2e2a24;--color-input:#342f28;--color-ring:#818cf8;--color-health-good:#34d399;--color-health-warn:#fbbf24;--color-health-bad:#f87171;--shadow-sm:0 1px 3px #0006, 0 1px 2px #0000004d;--shadow-md:0 4px 12px #00000080, 0 2px 4px #00000059;--shadow-lg:0 12px 28px #0000008c, 0 4px 8px #0006;--color-sidebar:#0e0d0a;--color-sidebar-foreground:#f5f0ea;--color-sidebar-border:#2e2a24;--color-sidebar-accent:#1e1b16;--color-sidebar-accent-foreground:#f5f0ea;--color-sidebar-primary:#818cf8;--color-sidebar-primary-foreground:#0c0b09;--color-sidebar-ring:#818cf8}body{font-family:var(--font-sans);background-color:var(--color-background);color:var(--color-foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.font-display{font-family:var(--font-display)}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:9999px}::-webkit-scrollbar-thumb:hover{background:var(--color-muted-foreground)}.dark .border{border-color:#ffffff0f}.dark .rounded-xl{background-image:linear-gradient(#ffffff06,#0000 50%);box-shadow:0 0 0 1px #ffffff0a,0 2px 8px #0006}.dark aside{box-shadow:1px 0 12px #00000080}.dark header{box-shadow:0 1px 8px #0006}:focus-visible{outline:2px solid var(--color-ring);outline-offset:2px}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/src/surreal_memory/server/static/dist/assets/index-DXL5wCpD.js b/src/surreal_memory/server/static/dist/assets/index-DXL5wCpD.js new file mode 100644 index 00000000..73f761eb --- /dev/null +++ b/src/surreal_memory/server/static/dist/assets/index-DXL5wCpD.js @@ -0,0 +1,54 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OverviewPage-BixPEj84.js","assets/vendor-query-CqA1cBNl.js","assets/vendor-react-BfuodpLv.js","assets/card-Duzfr-hx.js","assets/skeleton-CBW-y0cP.js","assets/confirm-dialog-DE0Sgk6_.js","assets/vendor-icons-C6dhS1UE.js","assets/vendor-ui-Qm4_4bAc.js","assets/vendor-recharts-BkwZfCWA.js","assets/HealthPage-DoDlPq43.js","assets/UncertaintyPage-CdFbDPD5.js","assets/GraphPage-B5RqF55O.js","assets/TimelinePage-2mV1L6iZ.js","assets/EvolutionPage-C6VI1EZi.js","assets/ProGate-DjphnyL3.js","assets/DiagramsPage-ClJ9QIg8.js","assets/timer-DWAvo6M8.js","assets/DiagramsPage-BZV40eAE.css","assets/SettingsPage-CcFz-Brq.js","assets/SyncPage-BRERoUGJ.js","assets/OraclePage-BOi3rQAz.js","assets/ToolStatsPage-yrXaz2Sj.js","assets/VisualizePage-CayiR_fG.js","assets/StoragePage-BsRzooql.js","assets/ReasoningPage-BjC1wtHj.js"])))=>i.map(i=>d[i]); +import{j as E,u as it,a as fc,b as Hi,Q as Ay,c as Dy}from"./vendor-query-CqA1cBNl.js";import{a as wy,c as Ry,d as Y,e as ig,r as y,N as zy,R as dc,b as sg,u as My,O as _y,f as jy,h as ot,i as Ly,B as Uy}from"./vendor-react-BfuodpLv.js";import{c as rg,n as og,a as ug,b as By,s as cg,d as fg,e as dg,f as hg,g as mg,h as gg,i as pg,p as Hy,j as qy,k as Vy,l as vg,m as um,o as Yy,q as ky,r as cm,t as fm,u as Ky,v as Gy,w as Qy,x as Xy}from"./vendor-icons-C6dhS1UE.js";import{t as Zy,c as Fy,a as yg}from"./vendor-ui-Qm4_4bAc.js";import{r as Jy}from"./vendor-recharts-BkwZfCWA.js";(function(){const l=document.createElement("link").relList;if(l&&l.supports&&l.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))o(c);new MutationObserver(c=>{for(const f of c)if(f.type==="childList")for(const m of f.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&o(m)}).observe(document,{childList:!0,subtree:!0});function r(c){const f={};return c.integrity&&(f.integrity=c.integrity),c.referrerPolicy&&(f.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?f.credentials="include":c.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function o(c){if(c.ep)return;c.ep=!0;const f=r(c);fetch(c.href,f)}})();var qu={exports:{}},wi={},Vu={exports:{}},Yu={};var dm;function $y(){return dm||(dm=1,(function(i){function l(A,V){var $=A.length;A.push(V);e:for(;0<$;){var de=$-1>>>1,oe=A[de];if(0>>1;dec(q,$))Gc(k,q)?(A[de]=k,A[G]=$,de=G):(A[de]=q,A[_]=$,de=_);else if(Gc(k,$))A[de]=k,A[G]=$,de=G;else break e}}return V}function c(A,V){var $=A.sortIndex-V.sortIndex;return $!==0?$:A.id-V.id}if(i.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var f=performance;i.unstable_now=function(){return f.now()}}else{var m=Date,h=m.now();i.unstable_now=function(){return m.now()-h}}var b=[],v=[],x=1,g=null,D=3,z=!1,j=!1,B=!1,K=!1,U=typeof setTimeout=="function"?setTimeout:null,Q=typeof clearTimeout=="function"?clearTimeout:null,Z=typeof setImmediate<"u"?setImmediate:null;function I(A){for(var V=r(v);V!==null;){if(V.callback===null)o(v);else if(V.startTime<=A)o(v),V.sortIndex=V.expirationTime,l(b,V);else break;V=r(v)}}function ee(A){if(B=!1,I(A),!j)if(r(b)!==null)j=!0,J||(J=!0,re());else{var V=r(v);V!==null&&je(ee,V.startTime-A)}}var J=!1,X=-1,ve=5,ae=-1;function te(){return K?!0:!(i.unstable_now()-aeA&&te());){var de=g.callback;if(typeof de=="function"){g.callback=null,D=g.priorityLevel;var oe=de(g.expirationTime<=A);if(A=i.unstable_now(),typeof oe=="function"){g.callback=oe,I(A),V=!0;break t}g===r(b)&&o(b),I(A)}else o(b);g=r(b)}if(g!==null)V=!0;else{var me=r(v);me!==null&&je(ee,me.startTime-A),V=!1}}break e}finally{g=null,D=$,z=!1}V=void 0}}finally{V?re():J=!1}}}var re;if(typeof Z=="function")re=function(){Z(fe)};else if(typeof MessageChannel<"u"){var Ee=new MessageChannel,Te=Ee.port2;Ee.port1.onmessage=fe,re=function(){Te.postMessage(null)}}else re=function(){U(fe,0)};function je(A,V){X=U(function(){A(i.unstable_now())},V)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(A){A.callback=null},i.unstable_forceFrameRate=function(A){0>A||125de?(A.sortIndex=$,l(v,A),r(b)===null&&A===r(v)&&(B?(Q(X),X=-1):B=!0,je(ee,$-de))):(A.sortIndex=oe,l(b,A),j||z||(j=!0,J||(J=!0,re()))),A},i.unstable_shouldYield=te,i.unstable_wrapCallback=function(A){var V=D;return function(){var $=D;D=V;try{return A.apply(this,arguments)}finally{D=$}}}})(Yu)),Yu}var hm;function Wy(){return hm||(hm=1,Vu.exports=$y()),Vu.exports}var mm;function Iy(){if(mm)return wi;mm=1;var i=Wy(),l=wy(),r=Ry();function o(e){var t="https://react.dev/errors/"+e;if(1oe||(e.current=de[oe],de[oe]=null,oe--)}function q(e,t){oe++,de[oe]=e.current,e.current=t}var G=me(null),k=me(null),le=me(null),Se=me(null);function ue(e,t){switch(q(le,t),q(k,e),q(G,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Mh(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Mh(t),e=_h(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}_(G),q(G,e)}function Ae(){_(G),_(k),_(le)}function At(e){e.memoizedState!==null&&q(Se,e);var t=G.current,n=_h(t,e.type);t!==n&&(q(k,e),q(G,n))}function dn(e){k.current===e&&(_(G),_(k)),Se.current===e&&(_(Se),Ci._currentValue=$)}var tn,Yi;function Zt(e){if(tn===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);tn=t&&t[1]||"",Yi=-1)":-1s||S[a]!==N[s]){var M=` +`+S[a].replace(" at new "," at ");return e.displayName&&M.includes("")&&(M=M.replace("",e.displayName)),M}while(1<=a&&0<=s);break}}}finally{jl=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?Zt(n):""}function ca(e,t){switch(e.tag){case 26:case 27:case 5:return Zt(e.type);case 16:return Zt("Lazy");case 13:return e.child!==t&&t!==null?Zt("Suspense Fallback"):Zt("Suspense");case 19:return Zt("SuspenseList");case 0:case 15:return Ha(e.type,!1);case 11:return Ha(e.type.render,!1);case 1:return Ha(e.type,!0);case 31:return Zt("Activity");default:return""}}function Ll(e){try{var t="",n=null;do t+=ca(e,n),n=e,e=e.return;while(e);return t}catch(a){return` +Error generating stack: `+a.message+` +`+a.stack}}var Dt=Object.prototype.hasOwnProperty,Ul=i.unstable_scheduleCallback,Bl=i.unstable_cancelCallback,ut=i.unstable_shouldYield,_n=i.unstable_requestPaint,ct=i.unstable_now,Nr=i.unstable_getCurrentPriorityLevel,fa=i.unstable_ImmediatePriority,ki=i.unstable_UserBlockingPriority,da=i.unstable_NormalPriority,Hl=i.unstable_LowPriority,hn=i.unstable_IdlePriority,Ki=i.log,jn=i.unstable_setDisableYieldValue,ha=null,ft=null;function Ft(e){if(typeof Ki=="function"&&jn(e),ft&&typeof ft.setStrictMode=="function")try{ft.setStrictMode(ha,e)}catch{}}var st=Math.clz32?Math.clz32:nn,Ar=Math.log,ql=Math.LN2;function nn(e){return e>>>=0,e===0?32:31-(Ar(e)/ql|0)|0}var qa=256,Va=262144,ma=4194304;function an(e){var t=e&42;if(t!==0)return t;switch(e&-e){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:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ie(e,t,n){var a=e.pendingLanes;if(a===0)return 0;var s=0,u=e.suspendedLanes,d=e.pingedLanes;e=e.warmLanes;var p=a&134217727;return p!==0?(a=p&~u,a!==0?s=an(a):(d&=p,d!==0?s=an(d):n||(n=p&~e,n!==0&&(s=an(n))))):(p=a&~u,p!==0?s=an(p):d!==0?s=an(d):n||(n=a&~e,n!==0&&(s=an(n)))),s===0?0:t!==0&&t!==s&&(t&u)===0&&(u=s&-s,n=t&-t,u>=n||u===32&&(n&4194048)!==0)?t:s}function Be(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function We(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32: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+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function rt(){var e=ma;return ma<<=1,(ma&62914560)===0&&(ma=4194304),e}function Ln(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ve(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function mt(e,t,n,a,s,u){var d=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var p=e.entanglements,S=e.expirationTimes,N=e.hiddenUpdates;for(n=d&~n;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var xp=/[\n"\\]/g;function Ht(e){return e.replace(xp,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Mr(e,t,n,a,s,u,d,p){e.name="",d!=null&&typeof d!="function"&&typeof d!="symbol"&&typeof d!="boolean"?e.type=d:e.removeAttribute("type"),t!=null?d==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Bt(t)):e.value!==""+Bt(t)&&(e.value=""+Bt(t)):d!=="submit"&&d!=="reset"||e.removeAttribute("value"),t!=null?_r(e,d,Bt(t)):n!=null?_r(e,d,Bt(n)):a!=null&&e.removeAttribute("value"),s==null&&u!=null&&(e.defaultChecked=!!u),s!=null&&(e.checked=s&&typeof s!="function"&&typeof s!="symbol"),p!=null&&typeof p!="function"&&typeof p!="symbol"&&typeof p!="boolean"?e.name=""+Bt(p):e.removeAttribute("name")}function Cc(e,t,n,a,s,u,d,p){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(e.type=u),t!=null||n!=null){if(!(u!=="submit"&&u!=="reset"||t!=null)){zr(e);return}n=n!=null?""+Bt(n):"",t=t!=null?""+Bt(t):n,p||t===e.value||(e.value=t),e.defaultValue=t}a=a??s,a=typeof a!="function"&&typeof a!="symbol"&&!!a,e.checked=p?e.checked:!!a,e.defaultChecked=!!a,d!=null&&typeof d!="function"&&typeof d!="symbol"&&typeof d!="boolean"&&(e.name=d),zr(e)}function _r(e,t,n){t==="number"&&Xi(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function Za(e,t,n,a){if(e=e.options,t){t={};for(var s=0;s"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Hr=!1;if(pn)try{var Kl={};Object.defineProperty(Kl,"passive",{get:function(){Hr=!0}}),window.addEventListener("test",Kl,Kl),window.removeEventListener("test",Kl,Kl)}catch{Hr=!1}var Bn=null,qr=null,Fi=null;function Mc(){if(Fi)return Fi;var e,t=qr,n=t.length,a,s="value"in Bn?Bn.value:Bn.textContent,u=s.length;for(e=0;e=Xl),Hc=" ",qc=!1;function Vc(e,t){switch(e){case"keyup":return Jp.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Yc(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Wa=!1;function Wp(e,t){switch(e){case"compositionend":return Yc(t);case"keypress":return t.which!==32?null:(qc=!0,Hc);case"textInput":return e=t.data,e===Hc&&qc?null:e;default:return null}}function Ip(e,t){if(Wa)return e==="compositionend"||!Gr&&Vc(e,t)?(e=Mc(),Fi=qr=Bn=null,Wa=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=a}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Jc(n)}}function Wc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Wc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Ic(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Xi(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Xi(e.document)}return t}function Zr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var sv=pn&&"documentMode"in document&&11>=document.documentMode,Ia=null,Fr=null,$l=null,Jr=!1;function Pc(e,t,n){var a=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Jr||Ia==null||Ia!==Xi(a)||(a=Ia,"selectionStart"in a&&Zr(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}),$l&&Jl($l,a)||($l=a,a=Ys(Fr,"onSelect"),0>=d,s-=d,ln=1<<32-st(t)+s|n<he?(be=W,W=null):be=W.sibling;var Ce=w(O,W,C[he],L);if(Ce===null){W===null&&(W=be);break}e&&W&&Ce.alternate===null&&t(O,W),T=u(Ce,T,he),Oe===null?P=Ce:Oe.sibling=Ce,Oe=Ce,W=be}if(he===C.length)return n(O,W),xe&&yn(O,he),P;if(W===null){for(;hehe?(be=W,W=null):be=W.sibling;var ia=w(O,W,Ce.value,L);if(ia===null){W===null&&(W=be);break}e&&W&&ia.alternate===null&&t(O,W),T=u(ia,T,he),Oe===null?P=ia:Oe.sibling=ia,Oe=ia,W=be}if(Ce.done)return n(O,W),xe&&yn(O,he),P;if(W===null){for(;!Ce.done;he++,Ce=C.next())Ce=H(O,Ce.value,L),Ce!==null&&(T=u(Ce,T,he),Oe===null?P=Ce:Oe.sibling=Ce,Oe=Ce);return xe&&yn(O,he),P}for(W=a(W);!Ce.done;he++,Ce=C.next())Ce=R(W,O,he,Ce.value,L),Ce!==null&&(e&&Ce.alternate!==null&&W.delete(Ce.key===null?he:Ce.key),T=u(Ce,T,he),Oe===null?P=Ce:Oe.sibling=Ce,Oe=Ce);return e&&W.forEach(function(Ny){return t(O,Ny)}),xe&&yn(O,he),P}function Me(O,T,C,L){if(typeof C=="object"&&C!==null&&C.type===B&&C.key===null&&(C=C.props.children),typeof C=="object"&&C!==null){switch(C.$$typeof){case z:e:{for(var P=C.key;T!==null;){if(T.key===P){if(P=C.type,P===B){if(T.tag===7){n(O,T.sibling),L=s(T,C.props.children),L.return=O,O=L;break e}}else if(T.elementType===P||typeof P=="object"&&P!==null&&P.$$typeof===ve&&Na(P)===T.type){n(O,T.sibling),L=s(T,C.props),ni(L,C),L.return=O,O=L;break e}n(O,T);break}else t(O,T);T=T.sibling}C.type===B?(L=xa(C.props.children,O.mode,L,C.key),L.return=O,O=L):(L=ls(C.type,C.key,C.props,null,O.mode,L),ni(L,C),L.return=O,O=L)}return d(O);case j:e:{for(P=C.key;T!==null;){if(T.key===P)if(T.tag===4&&T.stateNode.containerInfo===C.containerInfo&&T.stateNode.implementation===C.implementation){n(O,T.sibling),L=s(T,C.children||[]),L.return=O,O=L;break e}else{n(O,T);break}else t(O,T);T=T.sibling}L=no(C,O.mode,L),L.return=O,O=L}return d(O);case ve:return C=Na(C),Me(O,T,C,L)}if(je(C))return F(O,T,C,L);if(re(C)){if(P=re(C),typeof P!="function")throw Error(o(150));return C=P.call(C),ne(O,T,C,L)}if(typeof C.then=="function")return Me(O,T,fs(C),L);if(C.$$typeof===Z)return Me(O,T,rs(O,C),L);ds(O,C)}return typeof C=="string"&&C!==""||typeof C=="number"||typeof C=="bigint"?(C=""+C,T!==null&&T.tag===6?(n(O,T.sibling),L=s(T,C),L.return=O,O=L):(n(O,T),L=to(C,O.mode,L),L.return=O,O=L),d(O)):n(O,T)}return function(O,T,C,L){try{ti=0;var P=Me(O,T,C,L);return ul=null,P}catch(W){if(W===ol||W===us)throw W;var Oe=Rt(29,W,null,O.mode);return Oe.lanes=L,Oe.return=O,Oe}}}var Da=Tf(!0),Of=Tf(!1),kn=!1;function go(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function po(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Kn(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Gn(e,t,n){var a=e.updateQueue;if(a===null)return null;if(a=a.shared,(Ne&2)!==0){var s=a.pending;return s===null?t.next=t:(t.next=s.next,s.next=t),a.pending=t,t=as(e),rf(e,null,n),t}return ns(e,a,t,n),as(e)}function ai(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194048)!==0)){var a=t.lanes;a&=e.pendingLanes,n|=a,t.lanes=n,gt(e,n)}}function vo(e,t){var n=e.updateQueue,a=e.alternate;if(a!==null&&(a=a.updateQueue,n===a)){var s=null,u=null;if(n=n.firstBaseUpdate,n!==null){do{var d={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};u===null?s=u=d:u=u.next=d,n=n.next}while(n!==null);u===null?s=u=t:u=u.next=t}else s=u=t;n={baseState:a.baseState,firstBaseUpdate:s,lastBaseUpdate:u,shared:a.shared,callbacks:a.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var yo=!1;function li(){if(yo){var e=rl;if(e!==null)throw e}}function ii(e,t,n,a){yo=!1;var s=e.updateQueue;kn=!1;var u=s.firstBaseUpdate,d=s.lastBaseUpdate,p=s.shared.pending;if(p!==null){s.shared.pending=null;var S=p,N=S.next;S.next=null,d===null?u=N:d.next=N,d=S;var M=e.alternate;M!==null&&(M=M.updateQueue,p=M.lastBaseUpdate,p!==d&&(p===null?M.firstBaseUpdate=N:p.next=N,M.lastBaseUpdate=S))}if(u!==null){var H=s.baseState;d=0,M=N=S=null,p=u;do{var w=p.lane&-536870913,R=w!==p.lane;if(R?(ye&w)===w:(a&w)===w){w!==0&&w===sl&&(yo=!0),M!==null&&(M=M.next={lane:0,tag:p.tag,payload:p.payload,callback:null,next:null});e:{var F=e,ne=p;w=t;var Me=n;switch(ne.tag){case 1:if(F=ne.payload,typeof F=="function"){H=F.call(Me,H,w);break e}H=F;break e;case 3:F.flags=F.flags&-65537|128;case 0:if(F=ne.payload,w=typeof F=="function"?F.call(Me,H,w):F,w==null)break e;H=g({},H,w);break e;case 2:kn=!0}}w=p.callback,w!==null&&(e.flags|=64,R&&(e.flags|=8192),R=s.callbacks,R===null?s.callbacks=[w]:R.push(w))}else R={lane:w,tag:p.tag,payload:p.payload,callback:p.callback,next:null},M===null?(N=M=R,S=H):M=M.next=R,d|=w;if(p=p.next,p===null){if(p=s.shared.pending,p===null)break;R=p,p=R.next,R.next=null,s.lastBaseUpdate=R,s.shared.pending=null}}while(!0);M===null&&(S=H),s.baseState=S,s.firstBaseUpdate=N,s.lastBaseUpdate=M,u===null&&(s.shared.lanes=0),Jn|=d,e.lanes=d,e.memoizedState=H}}function Cf(e,t){if(typeof e!="function")throw Error(o(191,e));e.call(t)}function Nf(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;eu?u:8;var d=A.T,p={};A.T=p,Bo(e,!1,t,n);try{var S=s(),N=A.S;if(N!==null&&N(p,S),S!==null&&typeof S=="object"&&typeof S.then=="function"){var M=gv(S,a);oi(e,t,M,Lt(e))}else oi(e,t,a,Lt(e))}catch(H){oi(e,t,{then:function(){},status:"rejected",reason:H},Lt())}finally{V.p=u,d!==null&&p.types!==null&&(d.types=p.types),A.T=d}}function xv(){}function Lo(e,t,n,a){if(e.tag!==5)throw Error(o(476));var s=ld(e).queue;ad(e,s,t,$,n===null?xv:function(){return id(e),n(a)})}function ld(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:$,baseState:$,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:En,lastRenderedState:$},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:En,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function id(e){var t=ld(e);t.next===null&&(t=e.alternate.memoizedState),oi(e,t.next.queue,{},Lt())}function Uo(){return nt(Ci)}function sd(){return Ge().memoizedState}function rd(){return Ge().memoizedState}function Ev(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=Lt();e=Kn(n);var a=Gn(t,e,n);a!==null&&(Tt(a,t,n),ai(a,t,n)),t={cache:co()},e.payload=t;return}t=t.return}}function Tv(e,t,n){var a=Lt();n={lane:a,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Es(e)?ud(t,n):(n=Pr(e,t,n,a),n!==null&&(Tt(n,e,a),cd(n,t,a)))}function od(e,t,n){var a=Lt();oi(e,t,n,a)}function oi(e,t,n,a){var s={lane:a,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Es(e))ud(t,s);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var d=t.lastRenderedState,p=u(d,n);if(s.hasEagerState=!0,s.eagerState=p,wt(p,d))return ns(e,t,s,0),_e===null&&ts(),!1}catch{}if(n=Pr(e,t,s,a),n!==null)return Tt(n,e,a),cd(n,t,a),!0}return!1}function Bo(e,t,n,a){if(a={lane:2,revertLane:gu(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},Es(e)){if(t)throw Error(o(479))}else t=Pr(e,n,a,2),t!==null&&Tt(t,e,2)}function Es(e){var t=e.alternate;return e===ce||t!==null&&t===ce}function ud(e,t){fl=gs=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function cd(e,t,n){if((n&4194048)!==0){var a=t.lanes;a&=e.pendingLanes,n|=a,t.lanes=n,gt(e,n)}}var ui={readContext:nt,use:ys,useCallback:Ye,useContext:Ye,useEffect:Ye,useImperativeHandle:Ye,useLayoutEffect:Ye,useInsertionEffect:Ye,useMemo:Ye,useReducer:Ye,useRef:Ye,useState:Ye,useDebugValue:Ye,useDeferredValue:Ye,useTransition:Ye,useSyncExternalStore:Ye,useId:Ye,useHostTransitionStatus:Ye,useFormState:Ye,useActionState:Ye,useOptimistic:Ye,useMemoCache:Ye,useCacheRefresh:Ye};ui.useEffectEvent=Ye;var fd={readContext:nt,use:ys,useCallback:function(e,t){return dt().memoizedState=[e,t===void 0?null:t],e},useContext:nt,useEffect:Ff,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,Ss(4194308,4,If.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ss(4194308,4,e,t)},useInsertionEffect:function(e,t){Ss(4,2,e,t)},useMemo:function(e,t){var n=dt();t=t===void 0?null:t;var a=e();if(wa){Ft(!0);try{e()}finally{Ft(!1)}}return n.memoizedState=[a,t],a},useReducer:function(e,t,n){var a=dt();if(n!==void 0){var s=n(t);if(wa){Ft(!0);try{n(t)}finally{Ft(!1)}}}else s=t;return a.memoizedState=a.baseState=s,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:s},a.queue=e,e=e.dispatch=Tv.bind(null,ce,e),[a.memoizedState,e]},useRef:function(e){var t=dt();return e={current:e},t.memoizedState=e},useState:function(e){e=Ro(e);var t=e.queue,n=od.bind(null,ce,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:_o,useDeferredValue:function(e,t){var n=dt();return jo(n,e,t)},useTransition:function(){var e=Ro(!1);return e=ad.bind(null,ce,e.queue,!0,!1),dt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var a=ce,s=dt();if(xe){if(n===void 0)throw Error(o(407));n=n()}else{if(n=t(),_e===null)throw Error(o(349));(ye&127)!==0||Mf(a,t,n)}s.memoizedState=n;var u={value:n,getSnapshot:t};return s.queue=u,Ff(jf.bind(null,a,u,e),[e]),a.flags|=2048,hl(9,{destroy:void 0},_f.bind(null,a,u,n,t),null),n},useId:function(){var e=dt(),t=_e.identifierPrefix;if(xe){var n=sn,a=ln;n=(a&~(1<<32-st(a)-1)).toString(32)+n,t="_"+t+"R_"+n,n=ps++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof a.is=="string"?d.createElement("select",{is:a.is}):d.createElement("select"),a.multiple?u.multiple=!0:a.size&&(u.size=a.size);break;default:u=typeof a.is=="string"?d.createElement(s,{is:a.is}):d.createElement(s)}}u[et]=t,u[vt]=a;e:for(d=t.child;d!==null;){if(d.tag===5||d.tag===6)u.appendChild(d.stateNode);else if(d.tag!==4&&d.tag!==27&&d.child!==null){d.child.return=d,d=d.child;continue}if(d===t)break e;for(;d.sibling===null;){if(d.return===null||d.return===t)break e;d=d.return}d.sibling.return=d.return,d=d.sibling}t.stateNode=u;e:switch(lt(u,s,a),s){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break e;case"img":a=!0;break e;default:a=!1}a&&On(t)}}return Ue(t),Wo(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==a&&On(t);else{if(typeof a!="string"&&t.stateNode===null)throw Error(o(166));if(e=le.current,ll(t)){if(e=t.stateNode,n=t.memoizedProps,a=null,s=tt,s!==null)switch(s.tag){case 27:case 5:a=s.memoizedProps}e[et]=t,e=!!(e.nodeValue===n||a!==null&&a.suppressHydrationWarning===!0||Rh(e.nodeValue,n)),e||Vn(t,!0)}else e=ks(e).createTextNode(a),e[et]=t,t.stateNode=e}return Ue(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(a=ll(t),n!==null){if(e===null){if(!a)throw Error(o(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(o(557));e[et]=t}else Ea(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ue(t),e=!1}else n=so(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(Mt(t),t):(Mt(t),null);if((t.flags&128)!==0)throw Error(o(558))}return Ue(t),null;case 13:if(a=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(s=ll(t),a!==null&&a.dehydrated!==null){if(e===null){if(!s)throw Error(o(318));if(s=t.memoizedState,s=s!==null?s.dehydrated:null,!s)throw Error(o(317));s[et]=t}else Ea(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ue(t),s=!1}else s=so(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=s),s=!0;if(!s)return t.flags&256?(Mt(t),t):(Mt(t),null)}return Mt(t),(t.flags&128)!==0?(t.lanes=n,t):(n=a!==null,e=e!==null&&e.memoizedState!==null,n&&(a=t.child,s=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(s=a.alternate.memoizedState.cachePool.pool),u=null,a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(u=a.memoizedState.cachePool.pool),u!==s&&(a.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),As(t,t.updateQueue),Ue(t),null);case 4:return Ae(),e===null&&bu(t.stateNode.containerInfo),Ue(t),null;case 10:return Sn(t.type),Ue(t),null;case 19:if(_(Ke),a=t.memoizedState,a===null)return Ue(t),null;if(s=(t.flags&128)!==0,u=a.rendering,u===null)if(s)fi(a,!1);else{if(ke!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(u=ms(e),u!==null){for(t.flags|=128,fi(a,!1),e=u.updateQueue,t.updateQueue=e,As(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)of(n,e),n=n.sibling;return q(Ke,Ke.current&1|2),xe&&yn(t,a.treeForkCount),t.child}e=e.sibling}a.tail!==null&&ct()>Ms&&(t.flags|=128,s=!0,fi(a,!1),t.lanes=4194304)}else{if(!s)if(e=ms(u),e!==null){if(t.flags|=128,s=!0,e=e.updateQueue,t.updateQueue=e,As(t,e),fi(a,!0),a.tail===null&&a.tailMode==="hidden"&&!u.alternate&&!xe)return Ue(t),null}else 2*ct()-a.renderingStartTime>Ms&&n!==536870912&&(t.flags|=128,s=!0,fi(a,!1),t.lanes=4194304);a.isBackwards?(u.sibling=t.child,t.child=u):(e=a.last,e!==null?e.sibling=u:t.child=u,a.last=u)}return a.tail!==null?(e=a.tail,a.rendering=e,a.tail=e.sibling,a.renderingStartTime=ct(),e.sibling=null,n=Ke.current,q(Ke,s?n&1|2:n&1),xe&&yn(t,a.treeForkCount),e):(Ue(t),null);case 22:case 23:return Mt(t),So(),a=t.memoizedState!==null,e!==null?e.memoizedState!==null!==a&&(t.flags|=8192):a&&(t.flags|=8192),a?(n&536870912)!==0&&(t.flags&128)===0&&(Ue(t),t.subtreeFlags&6&&(t.flags|=8192)):Ue(t),n=t.updateQueue,n!==null&&As(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),a=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(a=t.memoizedState.cachePool.pool),a!==n&&(t.flags|=2048),e!==null&&_(Ca),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Sn(Qe),Ue(t),null;case 25:return null;case 30:return null}throw Error(o(156,t.tag))}function Dv(e,t){switch(lo(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Sn(Qe),Ae(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return dn(t),null;case 31:if(t.memoizedState!==null){if(Mt(t),t.alternate===null)throw Error(o(340));Ea()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Mt(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(o(340));Ea()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return _(Ke),null;case 4:return Ae(),null;case 10:return Sn(t.type),null;case 22:case 23:return Mt(t),So(),e!==null&&_(Ca),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Sn(Qe),null;case 25:return null;default:return null}}function Ld(e,t){switch(lo(t),t.tag){case 3:Sn(Qe),Ae();break;case 26:case 27:case 5:dn(t);break;case 4:Ae();break;case 31:t.memoizedState!==null&&Mt(t);break;case 13:Mt(t);break;case 19:_(Ke);break;case 10:Sn(t.type);break;case 22:case 23:Mt(t),So(),e!==null&&_(Ca);break;case 24:Sn(Qe)}}function di(e,t){try{var n=t.updateQueue,a=n!==null?n.lastEffect:null;if(a!==null){var s=a.next;n=s;do{if((n.tag&e)===e){a=void 0;var u=n.create,d=n.inst;a=u(),d.destroy=a}n=n.next}while(n!==s)}}catch(p){we(t,t.return,p)}}function Zn(e,t,n){try{var a=t.updateQueue,s=a!==null?a.lastEffect:null;if(s!==null){var u=s.next;a=u;do{if((a.tag&e)===e){var d=a.inst,p=d.destroy;if(p!==void 0){d.destroy=void 0,s=t;var S=n,N=p;try{N()}catch(M){we(s,S,M)}}}a=a.next}while(a!==u)}}catch(M){we(t,t.return,M)}}function Ud(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Nf(t,n)}catch(a){we(e,e.return,a)}}}function Bd(e,t,n){n.props=Ra(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(a){we(e,t,a)}}function hi(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var a=e.stateNode;break;case 30:a=e.stateNode;break;default:a=e.stateNode}typeof n=="function"?e.refCleanup=n(a):n.current=a}}catch(s){we(e,t,s)}}function rn(e,t){var n=e.ref,a=e.refCleanup;if(n!==null)if(typeof a=="function")try{a()}catch(s){we(e,t,s)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n=="function")try{n(null)}catch(s){we(e,t,s)}else n.current=null}function Hd(e){var t=e.type,n=e.memoizedProps,a=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":n.autoFocus&&a.focus();break e;case"img":n.src?a.src=n.src:n.srcSet&&(a.srcset=n.srcSet)}}catch(s){we(e,e.return,s)}}function Io(e,t,n){try{var a=e.stateNode;$v(a,e.type,n,t),a[vt]=t}catch(s){we(e,e.return,s)}}function qd(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&ea(e.type)||e.tag===4}function Po(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||qd(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&ea(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function eu(e,t,n){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName==="HTML"?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName==="HTML"?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=gn));else if(a!==4&&(a===27&&ea(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(eu(e,t,n),e=e.sibling;e!==null;)eu(e,t,n),e=e.sibling}function Ds(e,t,n){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(a!==4&&(a===27&&ea(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(Ds(e,t,n),e=e.sibling;e!==null;)Ds(e,t,n),e=e.sibling}function Vd(e){var t=e.stateNode,n=e.memoizedProps;try{for(var a=e.type,s=t.attributes;s.length;)t.removeAttributeNode(s[0]);lt(t,a,n),t[et]=e,t[vt]=n}catch(u){we(e,e.return,u)}}var Cn=!1,Fe=!1,tu=!1,Yd=typeof WeakSet=="function"?WeakSet:Set,Pe=null;function wv(e,t){if(e=e.containerInfo,Eu=Js,e=Ic(e),Zr(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var a=n.getSelection&&n.getSelection();if(a&&a.rangeCount!==0){n=a.anchorNode;var s=a.anchorOffset,u=a.focusNode;a=a.focusOffset;try{n.nodeType,u.nodeType}catch{n=null;break e}var d=0,p=-1,S=-1,N=0,M=0,H=e,w=null;t:for(;;){for(var R;H!==n||s!==0&&H.nodeType!==3||(p=d+s),H!==u||a!==0&&H.nodeType!==3||(S=d+a),H.nodeType===3&&(d+=H.nodeValue.length),(R=H.firstChild)!==null;)w=H,H=R;for(;;){if(H===e)break t;if(w===n&&++N===s&&(p=d),w===u&&++M===a&&(S=d),(R=H.nextSibling)!==null)break;H=w,w=H.parentNode}H=R}n=p===-1||S===-1?null:{start:p,end:S}}else n=null}n=n||{start:0,end:0}}else n=null;for(Tu={focusedElem:e,selectionRange:n},Js=!1,Pe=t;Pe!==null;)if(t=Pe,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Pe=e;else for(;Pe!==null;){switch(t=Pe,u=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(n=0;n title"))),lt(u,a,n),u[et]=e,Ie(u),a=u;break e;case"link":var d=Zh("link","href",s).get(a+(n.href||""));if(d){for(var p=0;pMe&&(d=Me,Me=ne,ne=d);var O=$c(p,ne),T=$c(p,Me);if(O&&T&&(R.rangeCount!==1||R.anchorNode!==O.node||R.anchorOffset!==O.offset||R.focusNode!==T.node||R.focusOffset!==T.offset)){var C=H.createRange();C.setStart(O.node,O.offset),R.removeAllRanges(),ne>Me?(R.addRange(C),R.extend(T.node,T.offset)):(C.setEnd(T.node,T.offset),R.addRange(C))}}}}for(H=[],R=p;R=R.parentNode;)R.nodeType===1&&H.push({element:R,left:R.scrollLeft,top:R.scrollTop});for(typeof p.focus=="function"&&p.focus(),p=0;pn?32:n,A.T=null,n=ou,ou=null;var u=Wn,d=Rn;if(Je=0,yl=Wn=null,Rn=0,(Ne&6)!==0)throw Error(o(331));var p=Ne;if(Ne|=4,Id(u.current),Jd(u,u.current,d,n),Ne=p,bi(0,!1),ft&&typeof ft.onPostCommitFiberRoot=="function")try{ft.onPostCommitFiberRoot(ha,u)}catch{}return!0}finally{V.p=s,A.T=a,ph(e,t)}}function yh(e,t,n){t=Vt(n,t),t=Yo(e.stateNode,t,2),e=Gn(e,t,2),e!==null&&(Ve(e,2),on(e))}function we(e,t,n){if(e.tag===3)yh(e,e,n);else for(;t!==null;){if(t.tag===3){yh(t,e,n);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&($n===null||!$n.has(a))){e=Vt(n,e),n=bd(2),a=Gn(t,n,2),a!==null&&(Sd(n,a,t,e),Ve(a,2),on(a));break}}t=t.return}}function du(e,t,n){var a=e.pingCache;if(a===null){a=e.pingCache=new Mv;var s=new Set;a.set(t,s)}else s=a.get(t),s===void 0&&(s=new Set,a.set(t,s));s.has(n)||(lu=!0,s.add(n),e=Bv.bind(null,e,t,n),t.then(e,e))}function Bv(e,t,n){var a=e.pingCache;a!==null&&a.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,_e===e&&(ye&n)===n&&(ke===4||ke===3&&(ye&62914560)===ye&&300>ct()-zs?(Ne&2)===0&&bl(e,0):iu|=n,vl===ye&&(vl=0)),on(e)}function bh(e,t){t===0&&(t=rt()),e=Sa(e,t),e!==null&&(Ve(e,t),on(e))}function Hv(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),bh(e,n)}function qv(e,t){var n=0;switch(e.tag){case 31:case 13:var a=e.stateNode,s=e.memoizedState;s!==null&&(n=s.retryLane);break;case 19:a=e.stateNode;break;case 22:a=e.stateNode._retryCache;break;default:throw Error(o(314))}a!==null&&a.delete(t),bh(e,n)}function Vv(e,t){return Ul(e,t)}var Hs=null,xl=null,hu=!1,qs=!1,mu=!1,Pn=0;function on(e){e!==xl&&e.next===null&&(xl===null?Hs=xl=e:xl=xl.next=e),qs=!0,hu||(hu=!0,kv())}function bi(e,t){if(!mu&&qs){mu=!0;do for(var n=!1,a=Hs;a!==null;){if(e!==0){var s=a.pendingLanes;if(s===0)var u=0;else{var d=a.suspendedLanes,p=a.pingedLanes;u=(1<<31-st(42|e)+1)-1,u&=s&~(d&~p),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(n=!0,Th(a,u))}else u=ye,u=ie(a,a===_e?u:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(u&3)===0||Be(a,u)||(n=!0,Th(a,u));a=a.next}while(n);mu=!1}}function Yv(){Sh()}function Sh(){qs=hu=!1;var e=0;Pn!==0&&Iv()&&(e=Pn);for(var t=ct(),n=null,a=Hs;a!==null;){var s=a.next,u=xh(a,t);u===0?(a.next=null,n===null?Hs=s:n.next=s,s===null&&(xl=n)):(n=a,(e!==0||(u&3)!==0)&&(qs=!0)),a=s}Je!==0&&Je!==5||bi(e),Pn!==0&&(Pn=0)}function xh(e,t){for(var n=e.suspendedLanes,a=e.pingedLanes,s=e.expirationTimes,u=e.pendingLanes&-62914561;0p)break;var M=S.transferSize,H=S.initiatorType;M&&zh(H)&&(S=S.responseEnd,d+=M*(S"u"?null:document;function Kh(e,t,n){var a=El;if(a&&typeof t=="string"&&t){var s=Ht(t);s='link[rel="'+e+'"][href="'+s+'"]',typeof n=="string"&&(s+='[crossorigin="'+n+'"]'),kh.has(s)||(kh.add(s),e={rel:e,crossOrigin:n,href:t},a.querySelector(s)===null&&(t=a.createElement("link"),lt(t,"link",e),Ie(t),a.head.appendChild(t)))}}function ry(e){zn.D(e),Kh("dns-prefetch",e,null)}function oy(e,t){zn.C(e,t),Kh("preconnect",e,t)}function uy(e,t,n){zn.L(e,t,n);var a=El;if(a&&e&&t){var s='link[rel="preload"][as="'+Ht(t)+'"]';t==="image"&&n&&n.imageSrcSet?(s+='[imagesrcset="'+Ht(n.imageSrcSet)+'"]',typeof n.imageSizes=="string"&&(s+='[imagesizes="'+Ht(n.imageSizes)+'"]')):s+='[href="'+Ht(e)+'"]';var u=s;switch(t){case"style":u=Tl(e);break;case"script":u=Ol(e)}Xt.has(u)||(e=g({rel:"preload",href:t==="image"&&n&&n.imageSrcSet?void 0:e,as:t},n),Xt.set(u,e),a.querySelector(s)!==null||t==="style"&&a.querySelector(Ti(u))||t==="script"&&a.querySelector(Oi(u))||(t=a.createElement("link"),lt(t,"link",e),Ie(t),a.head.appendChild(t)))}}function cy(e,t){zn.m(e,t);var n=El;if(n&&e){var a=t&&typeof t.as=="string"?t.as:"script",s='link[rel="modulepreload"][as="'+Ht(a)+'"][href="'+Ht(e)+'"]',u=s;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=Ol(e)}if(!Xt.has(u)&&(e=g({rel:"modulepreload",href:e},t),Xt.set(u,e),n.querySelector(s)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(n.querySelector(Oi(u)))return}a=n.createElement("link"),lt(a,"link",e),Ie(a),n.head.appendChild(a)}}}function fy(e,t,n){zn.S(e,t,n);var a=El;if(a&&e){var s=Qa(a).hoistableStyles,u=Tl(e);t=t||"default";var d=s.get(u);if(!d){var p={loading:0,preload:null};if(d=a.querySelector(Ti(u)))p.loading=5;else{e=g({rel:"stylesheet",href:e,"data-precedence":t},n),(n=Xt.get(u))&&Ru(e,n);var S=d=a.createElement("link");Ie(S),lt(S,"link",e),S._p=new Promise(function(N,M){S.onload=N,S.onerror=M}),S.addEventListener("load",function(){p.loading|=1}),S.addEventListener("error",function(){p.loading|=2}),p.loading|=4,Gs(d,t,a)}d={type:"stylesheet",instance:d,count:1,state:p},s.set(u,d)}}}function dy(e,t){zn.X(e,t);var n=El;if(n&&e){var a=Qa(n).hoistableScripts,s=Ol(e),u=a.get(s);u||(u=n.querySelector(Oi(s)),u||(e=g({src:e,async:!0},t),(t=Xt.get(s))&&zu(e,t),u=n.createElement("script"),Ie(u),lt(u,"link",e),n.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(s,u))}}function hy(e,t){zn.M(e,t);var n=El;if(n&&e){var a=Qa(n).hoistableScripts,s=Ol(e),u=a.get(s);u||(u=n.querySelector(Oi(s)),u||(e=g({src:e,async:!0,type:"module"},t),(t=Xt.get(s))&&zu(e,t),u=n.createElement("script"),Ie(u),lt(u,"link",e),n.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(s,u))}}function Gh(e,t,n,a){var s=(s=le.current)?Ks(s):null;if(!s)throw Error(o(446));switch(e){case"meta":case"title":return null;case"style":return typeof n.precedence=="string"&&typeof n.href=="string"?(t=Tl(n.href),n=Qa(s).hoistableStyles,a=n.get(t),a||(a={type:"style",instance:null,count:0,state:null},n.set(t,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(n.rel==="stylesheet"&&typeof n.href=="string"&&typeof n.precedence=="string"){e=Tl(n.href);var u=Qa(s).hoistableStyles,d=u.get(e);if(d||(s=s.ownerDocument||s,d={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(e,d),(u=s.querySelector(Ti(e)))&&!u._p&&(d.instance=u,d.state.loading=5),Xt.has(e)||(n={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},Xt.set(e,n),u||my(s,e,n,d.state))),t&&a===null)throw Error(o(528,""));return d}if(t&&a!==null)throw Error(o(529,""));return null;case"script":return t=n.async,n=n.src,typeof n=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Ol(n),n=Qa(s).hoistableScripts,a=n.get(t),a||(a={type:"script",instance:null,count:0,state:null},n.set(t,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(o(444,e))}}function Tl(e){return'href="'+Ht(e)+'"'}function Ti(e){return'link[rel="stylesheet"]['+e+"]"}function Qh(e){return g({},e,{"data-precedence":e.precedence,precedence:null})}function my(e,t,n,a){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?a.loading=1:(t=e.createElement("link"),a.preload=t,t.addEventListener("load",function(){return a.loading|=1}),t.addEventListener("error",function(){return a.loading|=2}),lt(t,"link",n),Ie(t),e.head.appendChild(t))}function Ol(e){return'[src="'+Ht(e)+'"]'}function Oi(e){return"script[async]"+e}function Xh(e,t,n){if(t.count++,t.instance===null)switch(t.type){case"style":var a=e.querySelector('style[data-href~="'+Ht(n.href)+'"]');if(a)return t.instance=a,Ie(a),a;var s=g({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return a=(e.ownerDocument||e).createElement("style"),Ie(a),lt(a,"style",s),Gs(a,n.precedence,e),t.instance=a;case"stylesheet":s=Tl(n.href);var u=e.querySelector(Ti(s));if(u)return t.state.loading|=4,t.instance=u,Ie(u),u;a=Qh(n),(s=Xt.get(s))&&Ru(a,s),u=(e.ownerDocument||e).createElement("link"),Ie(u);var d=u;return d._p=new Promise(function(p,S){d.onload=p,d.onerror=S}),lt(u,"link",a),t.state.loading|=4,Gs(u,n.precedence,e),t.instance=u;case"script":return u=Ol(n.src),(s=e.querySelector(Oi(u)))?(t.instance=s,Ie(s),s):(a=n,(s=Xt.get(u))&&(a=g({},n),zu(a,s)),e=e.ownerDocument||e,s=e.createElement("script"),Ie(s),lt(s,"link",a),e.head.appendChild(s),t.instance=s);case"void":return null;default:throw Error(o(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(a=t.instance,t.state.loading|=4,Gs(a,n.precedence,e));return t.instance}function Gs(e,t,n){for(var a=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),s=a.length?a[a.length-1]:null,u=s,d=0;d title"):null)}function gy(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;return t.rel==="stylesheet"?(e=t.disabled,typeof t.precedence=="string"&&e==null):!0;case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function Jh(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function py(e,t,n,a){if(n.type==="stylesheet"&&(typeof a.media!="string"||matchMedia(a.media).matches!==!1)&&(n.state.loading&4)===0){if(n.instance===null){var s=Tl(a.href),u=t.querySelector(Ti(s));if(u){t=u._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=Xs.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=u,Ie(u);return}u=t.ownerDocument||t,a=Qh(a),(s=Xt.get(s))&&Ru(a,s),u=u.createElement("link"),Ie(u);var d=u;d._p=new Promise(function(p,S){d.onload=p,d.onerror=S}),lt(u,"link",a),n.instance=u}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&(n.state.loading&3)===0&&(e.count++,n=Xs.bind(e),t.addEventListener("load",n),t.addEventListener("error",n))}}var Mu=0;function vy(e,t){return e.stylesheets&&e.count===0&&Fs(e,e.stylesheets),0Mu?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(a),clearTimeout(s)}}:null}function Xs(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Fs(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Zs=null;function Fs(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Zs=new Map,t.forEach(yy,e),Zs=null,Xs.call(e))}function yy(e,t){if(!(t.state.loading&4)){var n=Zs.get(e);if(n)var a=n.get(null);else{n=new Map,Zs.set(e,n);for(var s=e.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(l){console.error(l)}}return i(),qu.exports=Iy(),qu.exports}var e0=Py();function t0(i){if(typeof document>"u")return;let l=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",l.appendChild(r),r.styleSheet?r.styleSheet.cssText=i:r.appendChild(document.createTextNode(i))}const n0=i=>{switch(i){case"success":return i0;case"info":return r0;case"warning":return s0;case"error":return o0;default:return null}},a0=Array(12).fill(0),l0=({visible:i,className:l})=>Y.createElement("div",{className:["sonner-loading-wrapper",l].filter(Boolean).join(" "),"data-visible":i},Y.createElement("div",{className:"sonner-spinner"},a0.map((r,o)=>Y.createElement("div",{className:"sonner-loading-bar",key:`spinner-bar-${o}`})))),i0=Y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},Y.createElement("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",clipRule:"evenodd"})),s0=Y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor",height:"20",width:"20"},Y.createElement("path",{fillRule:"evenodd",d:"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z",clipRule:"evenodd"})),r0=Y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},Y.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z",clipRule:"evenodd"})),o0=Y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",height:"20",width:"20"},Y.createElement("path",{fillRule:"evenodd",d:"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z",clipRule:"evenodd"})),u0=Y.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},Y.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),Y.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"})),c0=()=>{const[i,l]=Y.useState(document.hidden);return Y.useEffect(()=>{const r=()=>{l(document.hidden)};return document.addEventListener("visibilitychange",r),()=>window.removeEventListener("visibilitychange",r)},[]),i};let tc=1;class f0{constructor(){this.subscribe=l=>(this.subscribers.push(l),()=>{const r=this.subscribers.indexOf(l);this.subscribers.splice(r,1)}),this.publish=l=>{this.subscribers.forEach(r=>r(l))},this.addToast=l=>{this.publish(l),this.toasts=[...this.toasts,l]},this.create=l=>{var r;const{message:o,...c}=l,f=typeof l?.id=="number"||((r=l.id)==null?void 0:r.length)>0?l.id:tc++,m=this.toasts.find(b=>b.id===f),h=l.dismissible===void 0?!0:l.dismissible;return this.dismissedToasts.has(f)&&this.dismissedToasts.delete(f),m?this.toasts=this.toasts.map(b=>b.id===f?(this.publish({...b,...l,id:f,title:o}),{...b,...l,id:f,dismissible:h,title:o}):b):this.addToast({title:o,...c,dismissible:h,id:f}),f},this.dismiss=l=>(l?(this.dismissedToasts.add(l),requestAnimationFrame(()=>this.subscribers.forEach(r=>r({id:l,dismiss:!0})))):this.toasts.forEach(r=>{this.subscribers.forEach(o=>o({id:r.id,dismiss:!0}))}),l),this.message=(l,r)=>this.create({...r,message:l}),this.error=(l,r)=>this.create({...r,message:l,type:"error"}),this.success=(l,r)=>this.create({...r,type:"success",message:l}),this.info=(l,r)=>this.create({...r,type:"info",message:l}),this.warning=(l,r)=>this.create({...r,type:"warning",message:l}),this.loading=(l,r)=>this.create({...r,type:"loading",message:l}),this.promise=(l,r)=>{if(!r)return;let o;r.loading!==void 0&&(o=this.create({...r,promise:l,type:"loading",message:r.loading,description:typeof r.description!="function"?r.description:void 0}));const c=Promise.resolve(l instanceof Function?l():l);let f=o!==void 0,m;const h=c.then(async v=>{if(m=["resolve",v],Y.isValidElement(v))f=!1,this.create({id:o,type:"default",message:v});else if(h0(v)&&!v.ok){f=!1;const g=typeof r.error=="function"?await r.error(`HTTP error! status: ${v.status}`):r.error,D=typeof r.description=="function"?await r.description(`HTTP error! status: ${v.status}`):r.description,j=typeof g=="object"&&!Y.isValidElement(g)?g:{message:g};this.create({id:o,type:"error",description:D,...j})}else if(v instanceof Error){f=!1;const g=typeof r.error=="function"?await r.error(v):r.error,D=typeof r.description=="function"?await r.description(v):r.description,j=typeof g=="object"&&!Y.isValidElement(g)?g:{message:g};this.create({id:o,type:"error",description:D,...j})}else if(r.success!==void 0){f=!1;const g=typeof r.success=="function"?await r.success(v):r.success,D=typeof r.description=="function"?await r.description(v):r.description,j=typeof g=="object"&&!Y.isValidElement(g)?g:{message:g};this.create({id:o,type:"success",description:D,...j})}}).catch(async v=>{if(m=["reject",v],r.error!==void 0){f=!1;const x=typeof r.error=="function"?await r.error(v):r.error,g=typeof r.description=="function"?await r.description(v):r.description,z=typeof x=="object"&&!Y.isValidElement(x)?x:{message:x};this.create({id:o,type:"error",description:g,...z})}}).finally(()=>{f&&(this.dismiss(o),o=void 0),r.finally==null||r.finally.call(r)}),b=()=>new Promise((v,x)=>h.then(()=>m[0]==="reject"?x(m[1]):v(m[1])).catch(x));return typeof o!="string"&&typeof o!="number"?{unwrap:b}:Object.assign(o,{unwrap:b})},this.custom=(l,r)=>{const o=r?.id||tc++;return this.create({jsx:l(o),id:o,...r}),o},this.getActiveToasts=()=>this.toasts.filter(l=>!this.dismissedToasts.has(l.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}}const Ct=new f0,d0=(i,l)=>{const r=l?.id||tc++;return Ct.addToast({title:i,...l,id:r}),r},h0=i=>i&&typeof i=="object"&&"ok"in i&&typeof i.ok=="boolean"&&"status"in i&&typeof i.status=="number",m0=d0,g0=()=>Ct.toasts,p0=()=>Ct.getActiveToasts(),AE=Object.assign(m0,{success:Ct.success,info:Ct.info,warning:Ct.warning,error:Ct.error,custom:Ct.custom,message:Ct.message,promise:Ct.promise,dismiss:Ct.dismiss,loading:Ct.loading},{getHistory:g0,getToasts:p0});t0("[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}");function nr(i){return i.label!==void 0}const v0=3,y0="24px",b0="16px",pm=4e3,S0=356,x0=14,E0=45,T0=200;function un(...i){return i.filter(Boolean).join(" ")}function O0(i){const[l,r]=i.split("-"),o=[];return l&&o.push(l),r&&o.push(r),o}const C0=i=>{var l,r,o,c,f,m,h,b,v;const{invert:x,toast:g,unstyled:D,interacting:z,setHeights:j,visibleToasts:B,heights:K,index:U,toasts:Q,expanded:Z,removeToast:I,defaultRichColors:ee,closeButton:J,style:X,cancelButtonStyle:ve,actionButtonStyle:ae,className:te="",descriptionClassName:fe="",duration:re,position:Ee,gap:Te,expandByDefault:je,classNames:A,icons:V,closeButtonAriaLabel:$="Close toast"}=i,[de,oe]=Y.useState(null),[me,_]=Y.useState(null),[q,G]=Y.useState(!1),[k,le]=Y.useState(!1),[Se,ue]=Y.useState(!1),[Ae,At]=Y.useState(!1),[dn,tn]=Y.useState(!1),[Yi,Zt]=Y.useState(0),[jl,Ha]=Y.useState(0),ca=Y.useRef(g.duration||re||pm),Ll=Y.useRef(null),Dt=Y.useRef(null),Ul=U===0,Bl=U+1<=B,ut=g.type,_n=g.dismissible!==!1,ct=g.className||"",Nr=g.descriptionClassName||"",fa=Y.useMemo(()=>K.findIndex(ie=>ie.toastId===g.id)||0,[K,g.id]),ki=Y.useMemo(()=>{var ie;return(ie=g.closeButton)!=null?ie:J},[g.closeButton,J]),da=Y.useMemo(()=>g.duration||re||pm,[g.duration,re]),Hl=Y.useRef(0),hn=Y.useRef(0),Ki=Y.useRef(0),jn=Y.useRef(null),[ha,ft]=Ee.split("-"),Ft=Y.useMemo(()=>K.reduce((ie,Be,We)=>We>=fa?ie:ie+Be.height,0),[K,fa]),st=c0(),Ar=g.invert||x,ql=ut==="loading";hn.current=Y.useMemo(()=>fa*Te+Ft,[fa,Ft]),Y.useEffect(()=>{ca.current=da},[da]),Y.useEffect(()=>{G(!0)},[]),Y.useEffect(()=>{const ie=Dt.current;if(ie){const Be=ie.getBoundingClientRect().height;return Ha(Be),j(We=>[{toastId:g.id,height:Be,position:g.position},...We]),()=>j(We=>We.filter(rt=>rt.toastId!==g.id))}},[j,g.id]),Y.useLayoutEffect(()=>{if(!q)return;const ie=Dt.current,Be=ie.style.height;ie.style.height="auto";const We=ie.getBoundingClientRect().height;ie.style.height=Be,Ha(We),j(rt=>rt.find(Ve=>Ve.toastId===g.id)?rt.map(Ve=>Ve.toastId===g.id?{...Ve,height:We}:Ve):[{toastId:g.id,height:We,position:g.position},...rt])},[q,g.title,g.description,j,g.id,g.jsx,g.action,g.cancel]);const nn=Y.useCallback(()=>{le(!0),Zt(hn.current),j(ie=>ie.filter(Be=>Be.toastId!==g.id)),setTimeout(()=>{I(g)},T0)},[g,I,j,hn]);Y.useEffect(()=>{if(g.promise&&ut==="loading"||g.duration===1/0||g.type==="loading")return;let ie;return Z||z||st?(()=>{if(Ki.current{g.onAutoClose==null||g.onAutoClose.call(g,g),nn()},ca.current)),()=>clearTimeout(ie)},[Z,z,g,ut,st,nn]),Y.useEffect(()=>{g.delete&&(nn(),g.onDismiss==null||g.onDismiss.call(g,g))},[nn,g.delete]);function qa(){var ie;if(V?.loading){var Be;return Y.createElement("div",{className:un(A?.loader,g==null||(Be=g.classNames)==null?void 0:Be.loader,"sonner-loader"),"data-visible":ut==="loading"},V.loading)}return Y.createElement(l0,{className:un(A?.loader,g==null||(ie=g.classNames)==null?void 0:ie.loader),visible:ut==="loading"})}const Va=g.icon||V?.[ut]||n0(ut);var ma,an;return Y.createElement("li",{tabIndex:0,ref:Dt,className:un(te,ct,A?.toast,g==null||(l=g.classNames)==null?void 0:l.toast,A?.default,A?.[ut],g==null||(r=g.classNames)==null?void 0:r[ut]),"data-sonner-toast":"","data-rich-colors":(ma=g.richColors)!=null?ma:ee,"data-styled":!(g.jsx||g.unstyled||D),"data-mounted":q,"data-promise":!!g.promise,"data-swiped":dn,"data-removed":k,"data-visible":Bl,"data-y-position":ha,"data-x-position":ft,"data-index":U,"data-front":Ul,"data-swiping":Se,"data-dismissible":_n,"data-type":ut,"data-invert":Ar,"data-swipe-out":Ae,"data-swipe-direction":me,"data-expanded":!!(Z||je&&q),"data-testid":g.testId,style:{"--index":U,"--toasts-before":U,"--z-index":Q.length-U,"--offset":`${k?Yi:hn.current}px`,"--initial-height":je?"auto":`${jl}px`,...X,...g.style},onDragEnd:()=>{ue(!1),oe(null),jn.current=null},onPointerDown:ie=>{ie.button!==2&&(ql||!_n||(Ll.current=new Date,Zt(hn.current),ie.target.setPointerCapture(ie.pointerId),ie.target.tagName!=="BUTTON"&&(ue(!0),jn.current={x:ie.clientX,y:ie.clientY})))},onPointerUp:()=>{var ie,Be,We;if(Ae||!_n)return;jn.current=null;const rt=Number(((ie=Dt.current)==null?void 0:ie.style.getPropertyValue("--swipe-amount-x").replace("px",""))||0),Ln=Number(((Be=Dt.current)==null?void 0:Be.style.getPropertyValue("--swipe-amount-y").replace("px",""))||0),Ve=new Date().getTime()-((We=Ll.current)==null?void 0:We.getTime()),mt=de==="x"?rt:Ln,ga=Math.abs(mt)/Ve;if(Math.abs(mt)>=E0||ga>.11){Zt(hn.current),g.onDismiss==null||g.onDismiss.call(g,g),_(de==="x"?rt>0?"right":"left":Ln>0?"down":"up"),nn(),At(!0);return}else{var gt,pt;(gt=Dt.current)==null||gt.style.setProperty("--swipe-amount-x","0px"),(pt=Dt.current)==null||pt.style.setProperty("--swipe-amount-y","0px")}tn(!1),ue(!1),oe(null)},onPointerMove:ie=>{var Be,We,rt;if(!jn.current||!_n||((Be=window.getSelection())==null?void 0:Be.toString().length)>0)return;const Ve=ie.clientY-jn.current.y,mt=ie.clientX-jn.current.x;var ga;const gt=(ga=i.swipeDirections)!=null?ga:O0(Ee);!de&&(Math.abs(mt)>1||Math.abs(Ve)>1)&&oe(Math.abs(mt)>Math.abs(Ve)?"x":"y");let pt={x:0,y:0};const Ya=Jt=>1/(1.5+Math.abs(Jt)/20);if(de==="y"){if(gt.includes("top")||gt.includes("bottom"))if(gt.includes("top")&&Ve<0||gt.includes("bottom")&&Ve>0)pt.y=Ve;else{const Jt=Ve*Ya(Ve);pt.y=Math.abs(Jt)0)pt.x=mt;else{const Jt=mt*Ya(mt);pt.x=Math.abs(Jt)0||Math.abs(pt.y)>0)&&tn(!0),(We=Dt.current)==null||We.style.setProperty("--swipe-amount-x",`${pt.x}px`),(rt=Dt.current)==null||rt.style.setProperty("--swipe-amount-y",`${pt.y}px`)}},ki&&!g.jsx&&ut!=="loading"?Y.createElement("button",{"aria-label":$,"data-disabled":ql,"data-close-button":!0,onClick:ql||!_n?()=>{}:()=>{nn(),g.onDismiss==null||g.onDismiss.call(g,g)},className:un(A?.closeButton,g==null||(o=g.classNames)==null?void 0:o.closeButton)},(an=V?.close)!=null?an:u0):null,(ut||g.icon||g.promise)&&g.icon!==null&&(V?.[ut]!==null||g.icon)?Y.createElement("div",{"data-icon":"",className:un(A?.icon,g==null||(c=g.classNames)==null?void 0:c.icon)},g.promise||g.type==="loading"&&!g.icon?g.icon||qa():null,g.type!=="loading"?Va:null):null,Y.createElement("div",{"data-content":"",className:un(A?.content,g==null||(f=g.classNames)==null?void 0:f.content)},Y.createElement("div",{"data-title":"",className:un(A?.title,g==null||(m=g.classNames)==null?void 0:m.title)},g.jsx?g.jsx:typeof g.title=="function"?g.title():g.title),g.description?Y.createElement("div",{"data-description":"",className:un(fe,Nr,A?.description,g==null||(h=g.classNames)==null?void 0:h.description)},typeof g.description=="function"?g.description():g.description):null),Y.isValidElement(g.cancel)?g.cancel:g.cancel&&nr(g.cancel)?Y.createElement("button",{"data-button":!0,"data-cancel":!0,style:g.cancelButtonStyle||ve,onClick:ie=>{nr(g.cancel)&&_n&&(g.cancel.onClick==null||g.cancel.onClick.call(g.cancel,ie),nn())},className:un(A?.cancelButton,g==null||(b=g.classNames)==null?void 0:b.cancelButton)},g.cancel.label):null,Y.isValidElement(g.action)?g.action:g.action&&nr(g.action)?Y.createElement("button",{"data-button":!0,"data-action":!0,style:g.actionButtonStyle||ae,onClick:ie=>{nr(g.action)&&(g.action.onClick==null||g.action.onClick.call(g.action,ie),!ie.defaultPrevented&&nn())},className:un(A?.actionButton,g==null||(v=g.classNames)==null?void 0:v.actionButton)},g.action.label):null)};function vm(){if(typeof window>"u"||typeof document>"u")return"ltr";const i=document.documentElement.getAttribute("dir");return i==="auto"||!i?window.getComputedStyle(document.documentElement).direction:i}function N0(i,l){const r={};return[i,l].forEach((o,c)=>{const f=c===1,m=f?"--mobile-offset":"--offset",h=f?b0:y0;function b(v){["top","right","bottom","left"].forEach(x=>{r[`${m}-${x}`]=typeof v=="number"?`${v}px`:v})}typeof o=="number"||typeof o=="string"?b(o):typeof o=="object"?["top","right","bottom","left"].forEach(v=>{o[v]===void 0?r[`${m}-${v}`]=h:r[`${m}-${v}`]=typeof o[v]=="number"?`${o[v]}px`:o[v]}):b(h)}),r}const A0=Y.forwardRef(function(l,r){const{id:o,invert:c,position:f="bottom-right",hotkey:m=["altKey","KeyT"],expand:h,closeButton:b,className:v,offset:x,mobileOffset:g,theme:D="light",richColors:z,duration:j,style:B,visibleToasts:K=v0,toastOptions:U,dir:Q=vm(),gap:Z=x0,icons:I,containerAriaLabel:ee="Notifications"}=l,[J,X]=Y.useState([]),ve=Y.useMemo(()=>o?J.filter(q=>q.toasterId===o):J.filter(q=>!q.toasterId),[J,o]),ae=Y.useMemo(()=>Array.from(new Set([f].concat(ve.filter(q=>q.position).map(q=>q.position)))),[ve,f]),[te,fe]=Y.useState([]),[re,Ee]=Y.useState(!1),[Te,je]=Y.useState(!1),[A,V]=Y.useState(D!=="system"?D:typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),$=Y.useRef(null),de=m.join("+").replace(/Key/g,"").replace(/Digit/g,""),oe=Y.useRef(null),me=Y.useRef(!1),_=Y.useCallback(q=>{X(G=>{var k;return(k=G.find(le=>le.id===q.id))!=null&&k.delete||Ct.dismiss(q.id),G.filter(({id:le})=>le!==q.id)})},[]);return Y.useEffect(()=>Ct.subscribe(q=>{if(q.dismiss){requestAnimationFrame(()=>{X(G=>G.map(k=>k.id===q.id?{...k,delete:!0}:k))});return}setTimeout(()=>{ig.flushSync(()=>{X(G=>{const k=G.findIndex(le=>le.id===q.id);return k!==-1?[...G.slice(0,k),{...G[k],...q},...G.slice(k+1)]:[q,...G]})})})}),[J]),Y.useEffect(()=>{if(D!=="system"){V(D);return}if(D==="system"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?V("dark"):V("light")),typeof window>"u")return;const q=window.matchMedia("(prefers-color-scheme: dark)");try{q.addEventListener("change",({matches:G})=>{V(G?"dark":"light")})}catch{q.addListener(({matches:k})=>{try{V(k?"dark":"light")}catch(le){console.error(le)}})}},[D]),Y.useEffect(()=>{J.length<=1&&Ee(!1)},[J]),Y.useEffect(()=>{const q=G=>{var k;if(m.every(ue=>G[ue]||G.code===ue)){var Se;Ee(!0),(Se=$.current)==null||Se.focus()}G.code==="Escape"&&(document.activeElement===$.current||(k=$.current)!=null&&k.contains(document.activeElement))&&Ee(!1)};return document.addEventListener("keydown",q),()=>document.removeEventListener("keydown",q)},[m]),Y.useEffect(()=>{if($.current)return()=>{oe.current&&(oe.current.focus({preventScroll:!0}),oe.current=null,me.current=!1)}},[$.current]),Y.createElement("section",{ref:r,"aria-label":`${ee} ${de}`,tabIndex:-1,"aria-live":"polite","aria-relevant":"additions text","aria-atomic":"false",suppressHydrationWarning:!0},ae.map((q,G)=>{var k;const[le,Se]=q.split("-");return ve.length?Y.createElement("ol",{key:q,dir:Q==="auto"?vm():Q,tabIndex:-1,ref:$,className:v,"data-sonner-toaster":!0,"data-sonner-theme":A,"data-y-position":le,"data-x-position":Se,style:{"--front-toast-height":`${((k=te[0])==null?void 0:k.height)||0}px`,"--width":`${S0}px`,"--gap":`${Z}px`,...B,...N0(x,g)},onBlur:ue=>{me.current&&!ue.currentTarget.contains(ue.relatedTarget)&&(me.current=!1,oe.current&&(oe.current.focus({preventScroll:!0}),oe.current=null))},onFocus:ue=>{ue.target instanceof HTMLElement&&ue.target.dataset.dismissible==="false"||me.current||(me.current=!0,oe.current=ue.relatedTarget)},onMouseEnter:()=>Ee(!0),onMouseMove:()=>Ee(!0),onMouseLeave:()=>{Te||Ee(!1)},onDragEnd:()=>Ee(!1),onPointerDown:ue=>{ue.target instanceof HTMLElement&&ue.target.dataset.dismissible==="false"||je(!0)},onPointerUp:()=>je(!1)},ve.filter(ue=>!ue.position&&G===0||ue.position===q).map((ue,Ae)=>{var At,dn;return Y.createElement(C0,{key:ue.id,icons:I,index:Ae,toast:ue,defaultRichColors:z,duration:(At=U?.duration)!=null?At:j,className:U?.className,descriptionClassName:U?.descriptionClassName,invert:c,visibleToasts:K,closeButton:(dn=U?.closeButton)!=null?dn:b,interacting:Te,position:q,style:U?.style,unstyled:U?.unstyled,classNames:U?.classNames,cancelButtonStyle:U?.cancelButtonStyle,actionButtonStyle:U?.actionButtonStyle,closeButtonAriaLabel:U?.closeButtonAriaLabel,removeToast:_,toasts:ve.filter(tn=>tn.position==ue.position),heights:te.filter(tn=>tn.position==ue.position),setHeights:fe,expandByDefault:h,gap:Z,expanded:re,swipeDirections:l.swipeDirections})})):null}))}),D0="modulepreload",w0=function(i){return"/"+i},ym={},Nt=function(l,r,o){let c=Promise.resolve();if(r&&r.length>0){let b=function(v){return Promise.all(v.map(x=>Promise.resolve(x).then(g=>({status:"fulfilled",value:g}),g=>({status:"rejected",reason:g}))))};document.getElementsByTagName("link");const m=document.querySelector("meta[property=csp-nonce]"),h=m?.nonce||m?.getAttribute("nonce");c=b(r.map(v=>{if(v=w0(v),v in ym)return;ym[v]=!0;const x=v.endsWith(".css"),g=x?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${v}"]${g}`))return;const D=document.createElement("link");if(D.rel=x?"stylesheet":D0,x||(D.as="script"),D.crossOrigin="",D.href=v,h&&D.setAttribute("nonce",h),document.head.appendChild(D),x)return new Promise((z,j)=>{D.addEventListener("load",z),D.addEventListener("error",()=>j(new Error(`Unable to preload CSS for ${v}`)))})}))}function f(m){const h=new Event("vite:preloadError",{cancelable:!0});if(h.payload=m,window.dispatchEvent(h),!h.defaultPrevented)throw m}return c.then(m=>{for(const h of m||[])h.status==="rejected"&&f(h.reason);return l().catch(f)})};function ji(...i){return Zy(Fy(i))}const bm=i=>{let l;const r=new Set,o=(v,x)=>{const g=typeof v=="function"?v(l):v;if(!Object.is(g,l)){const D=l;l=x??(typeof g!="object"||g===null)?g:Object.assign({},l,g),r.forEach(z=>z(l,D))}},c=()=>l,h={setState:o,getState:c,getInitialState:()=>b,subscribe:v=>(r.add(v),()=>r.delete(v))},b=l=i(o,c,h);return h},R0=(i=>i?bm(i):bm),z0=i=>i;function M0(i,l=z0){const r=Y.useSyncExternalStore(i.subscribe,Y.useCallback(()=>l(i.getState()),[i,l]),Y.useCallback(()=>l(i.getInitialState()),[i,l]));return Y.useDebugValue(r),r}const Sm=i=>{const l=R0(i),r=o=>M0(l,o);return Object.assign(r,l),r},_0=(i=>i?Sm(i):Sm);function bg(){if(typeof window>"u")return"system";const i=localStorage.getItem("nm-theme");return i==="light"||i==="dark"||i==="system"?i:"system"}function hr(i){const l=document.documentElement,r=i==="dark"||i==="system"&&window.matchMedia("(prefers-color-scheme: dark)").matches;l.classList.toggle("dark",r),localStorage.setItem("nm-theme",i)}hr(bg());const br=_0((i,l)=>({sidebarOpen:!0,theme:bg(),toggleSidebar:()=>i(r=>({sidebarOpen:!r.sidebarOpen})),setSidebarOpen:r=>i({sidebarOpen:r}),setTheme:r=>{hr(r),i({theme:r})},cycleTheme:()=>{const r=["light","dark","system"],o=l().theme,c=r[(r.indexOf(o)+1)%r.length];hr(c),i({theme:c})}}));typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{const{theme:i}=br.getState();i==="system"&&hr("system")});const se=i=>typeof i=="string",Ri=()=>{let i,l;const r=new Promise((o,c)=>{i=o,l=c});return r.resolve=i,r.reject=l,r},xm=i=>i==null?"":""+i,j0=(i,l,r)=>{i.forEach(o=>{l[o]&&(r[o]=l[o])})},L0=/###/g,Em=i=>i&&i.indexOf("###")>-1?i.replace(L0,"."):i,Tm=i=>!i||se(i),Mi=(i,l,r)=>{const o=se(l)?l.split("."):l;let c=0;for(;c{const{obj:o,k:c}=Mi(i,l,Object);if(o!==void 0||l.length===1){o[c]=r;return}let f=l[l.length-1],m=l.slice(0,l.length-1),h=Mi(i,m,Object);for(;h.obj===void 0&&m.length;)f=`${m[m.length-1]}.${f}`,m=m.slice(0,m.length-1),h=Mi(i,m,Object),h?.obj&&typeof h.obj[`${h.k}.${f}`]<"u"&&(h.obj=void 0);h.obj[`${h.k}.${f}`]=r},U0=(i,l,r,o)=>{const{obj:c,k:f}=Mi(i,l,Object);c[f]=c[f]||[],c[f].push(r)},mr=(i,l)=>{const{obj:r,k:o}=Mi(i,l);if(r&&Object.prototype.hasOwnProperty.call(r,o))return r[o]},B0=(i,l,r)=>{const o=mr(i,r);return o!==void 0?o:mr(l,r)},Sg=(i,l,r)=>{for(const o in l)o!=="__proto__"&&o!=="constructor"&&(o in i?se(i[o])||i[o]instanceof String||se(l[o])||l[o]instanceof String?r&&(i[o]=l[o]):Sg(i[o],l[o],r):i[o]=l[o]);return i},_a=i=>i.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var H0={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};const q0=i=>se(i)?i.replace(/[&<>"'\/]/g,l=>H0[l]):i;class V0{constructor(l){this.capacity=l,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(l){const r=this.regExpMap.get(l);if(r!==void 0)return r;const o=new RegExp(l);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(l,o),this.regExpQueue.push(l),o}}const Y0=[" ",",","?","!",";"],k0=new V0(20),K0=(i,l,r)=>{l=l||"",r=r||"";const o=Y0.filter(m=>l.indexOf(m)<0&&r.indexOf(m)<0);if(o.length===0)return!0;const c=k0.getRegExp(`(${o.map(m=>m==="?"?"\\?":m).join("|")})`);let f=!c.test(i);if(!f){const m=i.indexOf(r);m>0&&!c.test(i.substring(0,m))&&(f=!0)}return f},nc=(i,l,r=".")=>{if(!i)return;if(i[l])return Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;const o=l.split(r);let c=i;for(let f=0;f-1&&bi?.replace("_","-"),G0={type:"logger",log(i){this.output("log",i)},warn(i){this.output("warn",i)},error(i){this.output("error",i)},output(i,l){console?.[i]?.apply?.(console,l)}};class gr{constructor(l,r={}){this.init(l,r)}init(l,r={}){this.prefix=r.prefix||"i18next:",this.logger=l||G0,this.options=r,this.debug=r.debug}log(...l){return this.forward(l,"log","",!0)}warn(...l){return this.forward(l,"warn","",!0)}error(...l){return this.forward(l,"error","")}deprecate(...l){return this.forward(l,"warn","WARNING DEPRECATED: ",!0)}forward(l,r,o,c){return c&&!this.debug?null:(se(l[0])&&(l[0]=`${o}${this.prefix} ${l[0]}`),this.logger[r](l))}create(l){return new gr(this.logger,{prefix:`${this.prefix}:${l}:`,...this.options})}clone(l){return l=l||this.options,l.prefix=l.prefix||this.prefix,new gr(this.logger,l)}}var fn=new gr;class Sr{constructor(){this.observers={}}on(l,r){return l.split(" ").forEach(o=>{this.observers[o]||(this.observers[o]=new Map);const c=this.observers[o].get(r)||0;this.observers[o].set(r,c+1)}),this}off(l,r){if(this.observers[l]){if(!r){delete this.observers[l];return}this.observers[l].delete(r)}}emit(l,...r){this.observers[l]&&Array.from(this.observers[l].entries()).forEach(([c,f])=>{for(let m=0;m{for(let m=0;m-1&&this.options.ns.splice(r,1)}getResource(l,r,o,c={}){const f=c.keySeparator!==void 0?c.keySeparator:this.options.keySeparator,m=c.ignoreJSONStructure!==void 0?c.ignoreJSONStructure:this.options.ignoreJSONStructure;let h;l.indexOf(".")>-1?h=l.split("."):(h=[l,r],o&&(Array.isArray(o)?h.push(...o):se(o)&&f?h.push(...o.split(f)):h.push(o)));const b=mr(this.data,h);return!b&&!r&&!o&&l.indexOf(".")>-1&&(l=h[0],r=h[1],o=h.slice(2).join(".")),b||!m||!se(o)?b:nc(this.data?.[l]?.[r],o,f)}addResource(l,r,o,c,f={silent:!1}){const m=f.keySeparator!==void 0?f.keySeparator:this.options.keySeparator;let h=[l,r];o&&(h=h.concat(m?o.split(m):o)),l.indexOf(".")>-1&&(h=l.split("."),c=r,r=h[1]),this.addNamespaces(r),Om(this.data,h,c),f.silent||this.emit("added",l,r,o,c)}addResources(l,r,o,c={silent:!1}){for(const f in o)(se(o[f])||Array.isArray(o[f]))&&this.addResource(l,r,f,o[f],{silent:!0});c.silent||this.emit("added",l,r,o)}addResourceBundle(l,r,o,c,f,m={silent:!1,skipCopy:!1}){let h=[l,r];l.indexOf(".")>-1&&(h=l.split("."),c=o,o=r,r=h[1]),this.addNamespaces(r);let b=mr(this.data,h)||{};m.skipCopy||(o=JSON.parse(JSON.stringify(o))),c?Sg(b,o,f):b={...b,...o},Om(this.data,h,b),m.silent||this.emit("added",l,r,o)}removeResourceBundle(l,r){this.hasResourceBundle(l,r)&&delete this.data[l][r],this.removeNamespaces(r),this.emit("removed",l,r)}hasResourceBundle(l,r){return this.getResource(l,r)!==void 0}getResourceBundle(l,r){return r||(r=this.options.defaultNS),this.getResource(l,r)}getDataByLanguage(l){return this.data[l]}hasLanguageSomeTranslations(l){const r=this.getDataByLanguage(l);return!!(r&&Object.keys(r)||[]).find(c=>r[c]&&Object.keys(r[c]).length>0)}toJSON(){return this.data}}var xg={processors:{},addPostProcessor(i){this.processors[i.name]=i},handle(i,l,r,o,c){return i.forEach(f=>{l=this.processors[f]?.process(l,r,o,c)??l}),l}};const Eg=Symbol("i18next/PATH_KEY");function Q0(){const i=[],l=Object.create(null);let r;return l.get=(o,c)=>(r?.revoke?.(),c===Eg?i:(i.push(c),r=Proxy.revocable(o,l),r.proxy)),Proxy.revocable(Object.create(null),l).proxy}function ac(i,l){const{[Eg]:r}=i(Q0());return r.join(l?.keySeparator??".")}const Nm={},ku=i=>!se(i)&&typeof i!="boolean"&&typeof i!="number";class pr extends Sr{constructor(l,r={}){super(),j0(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],l,this),this.options=r,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=fn.create("translator")}changeLanguage(l){l&&(this.language=l)}exists(l,r={interpolation:{}}){const o={...r};if(l==null)return!1;const c=this.resolve(l,o);if(c?.res===void 0)return!1;const f=ku(c.res);return!(o.returnObjects===!1&&f)}extractFromKey(l,r){let o=r.nsSeparator!==void 0?r.nsSeparator:this.options.nsSeparator;o===void 0&&(o=":");const c=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator;let f=r.ns||this.options.defaultNS||[];const m=o&&l.indexOf(o)>-1,h=!this.options.userDefinedKeySeparator&&!r.keySeparator&&!this.options.userDefinedNsSeparator&&!r.nsSeparator&&!K0(l,o,c);if(m&&!h){const b=l.match(this.interpolator.nestingRegexp);if(b&&b.length>0)return{key:l,namespaces:se(f)?[f]:f};const v=l.split(o);(o!==c||o===c&&this.options.ns.indexOf(v[0])>-1)&&(f=v.shift()),l=v.join(c)}return{key:l,namespaces:se(f)?[f]:f}}translate(l,r,o){let c=typeof r=="object"?{...r}:r;if(typeof c!="object"&&this.options.overloadTranslationOptionHandler&&(c=this.options.overloadTranslationOptionHandler(arguments)),typeof c=="object"&&(c={...c}),c||(c={}),l==null)return"";typeof l=="function"&&(l=ac(l,{...this.options,...c})),Array.isArray(l)||(l=[String(l)]);const f=c.returnDetails!==void 0?c.returnDetails:this.options.returnDetails,m=c.keySeparator!==void 0?c.keySeparator:this.options.keySeparator,{key:h,namespaces:b}=this.extractFromKey(l[l.length-1],c),v=b[b.length-1];let x=c.nsSeparator!==void 0?c.nsSeparator:this.options.nsSeparator;x===void 0&&(x=":");const g=c.lng||this.language,D=c.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(g?.toLowerCase()==="cimode")return D?f?{res:`${v}${x}${h}`,usedKey:h,exactUsedKey:h,usedLng:g,usedNS:v,usedParams:this.getUsedParamsDetails(c)}:`${v}${x}${h}`:f?{res:h,usedKey:h,exactUsedKey:h,usedLng:g,usedNS:v,usedParams:this.getUsedParamsDetails(c)}:h;const z=this.resolve(l,c);let j=z?.res;const B=z?.usedKey||h,K=z?.exactUsedKey||h,U=["[object Number]","[object Function]","[object RegExp]"],Q=c.joinArrays!==void 0?c.joinArrays:this.options.joinArrays,Z=!this.i18nFormat||this.i18nFormat.handleAsObject,I=c.count!==void 0&&!se(c.count),ee=pr.hasDefaultValue(c),J=I?this.pluralResolver.getSuffix(g,c.count,c):"",X=c.ordinal&&I?this.pluralResolver.getSuffix(g,c.count,{ordinal:!1}):"",ve=I&&!c.ordinal&&c.count===0,ae=ve&&c[`defaultValue${this.options.pluralSeparator}zero`]||c[`defaultValue${J}`]||c[`defaultValue${X}`]||c.defaultValue;let te=j;Z&&!j&&ee&&(te=ae);const fe=ku(te),re=Object.prototype.toString.apply(te);if(Z&&te&&fe&&U.indexOf(re)<0&&!(se(Q)&&Array.isArray(te))){if(!c.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const Ee=this.options.returnedObjectHandler?this.options.returnedObjectHandler(B,te,{...c,ns:b}):`key '${h} (${this.language})' returned an object instead of string.`;return f?(z.res=Ee,z.usedParams=this.getUsedParamsDetails(c),z):Ee}if(m){const Ee=Array.isArray(te),Te=Ee?[]:{},je=Ee?K:B;for(const A in te)if(Object.prototype.hasOwnProperty.call(te,A)){const V=`${je}${m}${A}`;ee&&!j?Te[A]=this.translate(V,{...c,defaultValue:ku(ae)?ae[A]:void 0,joinArrays:!1,ns:b}):Te[A]=this.translate(V,{...c,joinArrays:!1,ns:b}),Te[A]===V&&(Te[A]=te[A])}j=Te}}else if(Z&&se(Q)&&Array.isArray(j))j=j.join(Q),j&&(j=this.extendTranslation(j,l,c,o));else{let Ee=!1,Te=!1;!this.isValidLookup(j)&&ee&&(Ee=!0,j=ae),this.isValidLookup(j)||(Te=!0,j=h);const A=(c.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&Te?void 0:j,V=ee&&ae!==j&&this.options.updateMissing;if(Te||Ee||V){if(this.logger.log(V?"updateKey":"missingKey",g,v,h,V?ae:j),m){const me=this.resolve(h,{...c,keySeparator:!1});me&&me.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let $=[];const de=this.languageUtils.getFallbackCodes(this.options.fallbackLng,c.lng||this.language);if(this.options.saveMissingTo==="fallback"&&de&&de[0])for(let me=0;me{const G=ee&&q!==j?q:A;this.options.missingKeyHandler?this.options.missingKeyHandler(me,v,_,G,V,c):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(me,v,_,G,V,c),this.emit("missingKey",me,v,_,j)};this.options.saveMissing&&(this.options.saveMissingPlurals&&I?$.forEach(me=>{const _=this.pluralResolver.getSuffixes(me,c);ve&&c[`defaultValue${this.options.pluralSeparator}zero`]&&_.indexOf(`${this.options.pluralSeparator}zero`)<0&&_.push(`${this.options.pluralSeparator}zero`),_.forEach(q=>{oe([me],h+q,c[`defaultValue${q}`]||ae)})}):oe($,h,ae))}j=this.extendTranslation(j,l,c,z,o),Te&&j===h&&this.options.appendNamespaceToMissingKey&&(j=`${v}${x}${h}`),(Te||Ee)&&this.options.parseMissingKeyHandler&&(j=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${v}${x}${h}`:h,Ee?j:void 0,c))}return f?(z.res=j,z.usedParams=this.getUsedParamsDetails(c),z):j}extendTranslation(l,r,o,c,f){if(this.i18nFormat?.parse)l=this.i18nFormat.parse(l,{...this.options.interpolation.defaultVariables,...o},o.lng||this.language||c.usedLng,c.usedNS,c.usedKey,{resolved:c});else if(!o.skipInterpolation){o.interpolation&&this.interpolator.init({...o,interpolation:{...this.options.interpolation,...o.interpolation}});const b=se(l)&&(o?.interpolation?.skipOnVariables!==void 0?o.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let v;if(b){const g=l.match(this.interpolator.nestingRegexp);v=g&&g.length}let x=o.replace&&!se(o.replace)?o.replace:o;if(this.options.interpolation.defaultVariables&&(x={...this.options.interpolation.defaultVariables,...x}),l=this.interpolator.interpolate(l,x,o.lng||this.language||c.usedLng,o),b){const g=l.match(this.interpolator.nestingRegexp),D=g&&g.length;vf?.[0]===g[0]&&!o.context?(this.logger.warn(`It seems you are nesting recursively key: ${g[0]} in key: ${r[0]}`),null):this.translate(...g,r),o)),o.interpolation&&this.interpolator.reset()}const m=o.postProcess||this.options.postProcess,h=se(m)?[m]:m;return l!=null&&h?.length&&o.applyPostProcessor!==!1&&(l=xg.handle(h,l,r,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...c,usedParams:this.getUsedParamsDetails(o)},...o}:o,this)),l}resolve(l,r={}){let o,c,f,m,h;return se(l)&&(l=[l]),l.forEach(b=>{if(this.isValidLookup(o))return;const v=this.extractFromKey(b,r),x=v.key;c=x;let g=v.namespaces;this.options.fallbackNS&&(g=g.concat(this.options.fallbackNS));const D=r.count!==void 0&&!se(r.count),z=D&&!r.ordinal&&r.count===0,j=r.context!==void 0&&(se(r.context)||typeof r.context=="number")&&r.context!=="",B=r.lngs?r.lngs:this.languageUtils.toResolveHierarchy(r.lng||this.language,r.fallbackLng);g.forEach(K=>{this.isValidLookup(o)||(h=K,!Nm[`${B[0]}-${K}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(h)&&(Nm[`${B[0]}-${K}`]=!0,this.logger.warn(`key "${c}" for languages "${B.join(", ")}" won't get resolved as namespace "${h}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),B.forEach(U=>{if(this.isValidLookup(o))return;m=U;const Q=[x];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(Q,x,U,K,r);else{let I;D&&(I=this.pluralResolver.getSuffix(U,r.count,r));const ee=`${this.options.pluralSeparator}zero`,J=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(D&&(r.ordinal&&I.indexOf(J)===0&&Q.push(x+I.replace(J,this.options.pluralSeparator)),Q.push(x+I),z&&Q.push(x+ee)),j){const X=`${x}${this.options.contextSeparator||"_"}${r.context}`;Q.push(X),D&&(r.ordinal&&I.indexOf(J)===0&&Q.push(X+I.replace(J,this.options.pluralSeparator)),Q.push(X+I),z&&Q.push(X+ee))}}let Z;for(;Z=Q.pop();)this.isValidLookup(o)||(f=Z,o=this.getResource(U,K,Z,r))}))})}),{res:o,usedKey:c,exactUsedKey:f,usedLng:m,usedNS:h}}isValidLookup(l){return l!==void 0&&!(!this.options.returnNull&&l===null)&&!(!this.options.returnEmptyString&&l==="")}getResource(l,r,o,c={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(l,r,o,c):this.resourceStore.getResource(l,r,o,c)}getUsedParamsDetails(l={}){const r=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],o=l.replace&&!se(l.replace);let c=o?l.replace:l;if(o&&typeof l.count<"u"&&(c.count=l.count),this.options.interpolation.defaultVariables&&(c={...this.options.interpolation.defaultVariables,...c}),!o){c={...c};for(const f of r)delete c[f]}return c}static hasDefaultValue(l){const r="defaultValue";for(const o in l)if(Object.prototype.hasOwnProperty.call(l,o)&&r===o.substring(0,r.length)&&l[o]!==void 0)return!0;return!1}}class Am{constructor(l){this.options=l,this.supportedLngs=this.options.supportedLngs||!1,this.logger=fn.create("languageUtils")}getScriptPartFromCode(l){if(l=Li(l),!l||l.indexOf("-")<0)return null;const r=l.split("-");return r.length===2||(r.pop(),r[r.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(r.join("-"))}getLanguagePartFromCode(l){if(l=Li(l),!l||l.indexOf("-")<0)return l;const r=l.split("-");return this.formatLanguageCode(r[0])}formatLanguageCode(l){if(se(l)&&l.indexOf("-")>-1){let r;try{r=Intl.getCanonicalLocales(l)[0]}catch{}return r&&this.options.lowerCaseLng&&(r=r.toLowerCase()),r||(this.options.lowerCaseLng?l.toLowerCase():l)}return this.options.cleanCode||this.options.lowerCaseLng?l.toLowerCase():l}isSupportedCode(l){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(l=this.getLanguagePartFromCode(l)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(l)>-1}getBestMatchFromCodes(l){if(!l)return null;let r;return l.forEach(o=>{if(r)return;const c=this.formatLanguageCode(o);(!this.options.supportedLngs||this.isSupportedCode(c))&&(r=c)}),!r&&this.options.supportedLngs&&l.forEach(o=>{if(r)return;const c=this.getScriptPartFromCode(o);if(this.isSupportedCode(c))return r=c;const f=this.getLanguagePartFromCode(o);if(this.isSupportedCode(f))return r=f;r=this.options.supportedLngs.find(m=>{if(m===f)return m;if(!(m.indexOf("-")<0&&f.indexOf("-")<0)&&(m.indexOf("-")>0&&f.indexOf("-")<0&&m.substring(0,m.indexOf("-"))===f||m.indexOf(f)===0&&f.length>1))return m})}),r||(r=this.getFallbackCodes(this.options.fallbackLng)[0]),r}getFallbackCodes(l,r){if(!l)return[];if(typeof l=="function"&&(l=l(r)),se(l)&&(l=[l]),Array.isArray(l))return l;if(!r)return l.default||[];let o=l[r];return o||(o=l[this.getScriptPartFromCode(r)]),o||(o=l[this.formatLanguageCode(r)]),o||(o=l[this.getLanguagePartFromCode(r)]),o||(o=l.default),o||[]}toResolveHierarchy(l,r){const o=this.getFallbackCodes((r===!1?[]:r)||this.options.fallbackLng||[],l),c=[],f=m=>{m&&(this.isSupportedCode(m)?c.push(m):this.logger.warn(`rejecting language code not found in supportedLngs: ${m}`))};return se(l)&&(l.indexOf("-")>-1||l.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&f(this.formatLanguageCode(l)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&f(this.getScriptPartFromCode(l)),this.options.load!=="currentOnly"&&f(this.getLanguagePartFromCode(l))):se(l)&&f(this.formatLanguageCode(l)),o.forEach(m=>{c.indexOf(m)<0&&f(this.formatLanguageCode(m))}),c}}const Dm={zero:0,one:1,two:2,few:3,many:4,other:5},wm={select:i=>i===1?"one":"other",resolvedOptions:()=>({pluralCategories:["one","other"]})};class X0{constructor(l,r={}){this.languageUtils=l,this.options=r,this.logger=fn.create("pluralResolver"),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(l,r={}){const o=Li(l==="dev"?"en":l),c=r.ordinal?"ordinal":"cardinal",f=JSON.stringify({cleanedCode:o,type:c});if(f in this.pluralRulesCache)return this.pluralRulesCache[f];let m;try{m=new Intl.PluralRules(o,{type:c})}catch{if(typeof Intl>"u")return this.logger.error("No Intl support, please use an Intl polyfill!"),wm;if(!l.match(/-|_/))return wm;const b=this.languageUtils.getLanguagePartFromCode(l);m=this.getRule(b,r)}return this.pluralRulesCache[f]=m,m}needsPlural(l,r={}){let o=this.getRule(l,r);return o||(o=this.getRule("dev",r)),o?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(l,r,o={}){return this.getSuffixes(l,o).map(c=>`${r}${c}`)}getSuffixes(l,r={}){let o=this.getRule(l,r);return o||(o=this.getRule("dev",r)),o?o.resolvedOptions().pluralCategories.sort((c,f)=>Dm[c]-Dm[f]).map(c=>`${this.options.prepend}${r.ordinal?`ordinal${this.options.prepend}`:""}${c}`):[]}getSuffix(l,r,o={}){const c=this.getRule(l,o);return c?`${this.options.prepend}${o.ordinal?`ordinal${this.options.prepend}`:""}${c.select(r)}`:(this.logger.warn(`no plural rule found for: ${l}`),this.getSuffix("dev",r,o))}}const Rm=(i,l,r,o=".",c=!0)=>{let f=B0(i,l,r);return!f&&c&&se(r)&&(f=nc(i,r,o),f===void 0&&(f=nc(l,r,o))),f},Ku=i=>i.replace(/\$/g,"$$$$");class zm{constructor(l={}){this.logger=fn.create("interpolator"),this.options=l,this.format=l?.interpolation?.format||(r=>r),this.init(l)}init(l={}){l.interpolation||(l.interpolation={escapeValue:!0});const{escape:r,escapeValue:o,useRawValueToEscape:c,prefix:f,prefixEscaped:m,suffix:h,suffixEscaped:b,formatSeparator:v,unescapeSuffix:x,unescapePrefix:g,nestingPrefix:D,nestingPrefixEscaped:z,nestingSuffix:j,nestingSuffixEscaped:B,nestingOptionsSeparator:K,maxReplaces:U,alwaysFormat:Q}=l.interpolation;this.escape=r!==void 0?r:q0,this.escapeValue=o!==void 0?o:!0,this.useRawValueToEscape=c!==void 0?c:!1,this.prefix=f?_a(f):m||"{{",this.suffix=h?_a(h):b||"}}",this.formatSeparator=v||",",this.unescapePrefix=x?"":g||"-",this.unescapeSuffix=this.unescapePrefix?"":x||"",this.nestingPrefix=D?_a(D):z||_a("$t("),this.nestingSuffix=j?_a(j):B||_a(")"),this.nestingOptionsSeparator=K||",",this.maxReplaces=U||1e3,this.alwaysFormat=Q!==void 0?Q:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const l=(r,o)=>r?.source===o?(r.lastIndex=0,r):new RegExp(o,"g");this.regexp=l(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=l(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=l(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(l,r,o,c){let f,m,h;const b=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},v=z=>{if(z.indexOf(this.formatSeparator)<0){const U=Rm(r,b,z,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(U,void 0,o,{...c,...r,interpolationkey:z}):U}const j=z.split(this.formatSeparator),B=j.shift().trim(),K=j.join(this.formatSeparator).trim();return this.format(Rm(r,b,B,this.options.keySeparator,this.options.ignoreJSONStructure),K,o,{...c,...r,interpolationkey:B})};this.resetRegExp();const x=c?.missingInterpolationHandler||this.options.missingInterpolationHandler,g=c?.interpolation?.skipOnVariables!==void 0?c.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:z=>Ku(z)},{regex:this.regexp,safeValue:z=>this.escapeValue?Ku(this.escape(z)):Ku(z)}].forEach(z=>{for(h=0;f=z.regex.exec(l);){const j=f[1].trim();if(m=v(j),m===void 0)if(typeof x=="function"){const K=x(l,f,c);m=se(K)?K:""}else if(c&&Object.prototype.hasOwnProperty.call(c,j))m="";else if(g){m=f[0];continue}else this.logger.warn(`missed to pass in variable ${j} for interpolating ${l}`),m="";else!se(m)&&!this.useRawValueToEscape&&(m=xm(m));const B=z.safeValue(m);if(l=l.replace(f[0],B),g?(z.regex.lastIndex+=m.length,z.regex.lastIndex-=f[0].length):z.regex.lastIndex=0,h++,h>=this.maxReplaces)break}}),l}nest(l,r,o={}){let c,f,m;const h=(b,v)=>{const x=this.nestingOptionsSeparator;if(b.indexOf(x)<0)return b;const g=b.split(new RegExp(`${_a(x)}[ ]*{`));let D=`{${g[1]}`;b=g[0],D=this.interpolate(D,m);const z=D.match(/'/g),j=D.match(/"/g);((z?.length??0)%2===0&&!j||(j?.length??0)%2!==0)&&(D=D.replace(/'/g,'"'));try{m=JSON.parse(D),v&&(m={...v,...m})}catch(B){return this.logger.warn(`failed parsing options string in nesting for key ${b}`,B),`${b}${x}${D}`}return m.defaultValue&&m.defaultValue.indexOf(this.prefix)>-1&&delete m.defaultValue,b};for(;c=this.nestingRegexp.exec(l);){let b=[];m={...o},m=m.replace&&!se(m.replace)?m.replace:m,m.applyPostProcessor=!1,delete m.defaultValue;const v=/{.*}/.test(c[1])?c[1].lastIndexOf("}")+1:c[1].indexOf(this.formatSeparator);if(v!==-1&&(b=c[1].slice(v).split(this.formatSeparator).map(x=>x.trim()).filter(Boolean),c[1]=c[1].slice(0,v)),f=r(h.call(this,c[1].trim(),m),m),f&&c[0]===l&&!se(f))return f;se(f)||(f=xm(f)),f||(this.logger.warn(`missed to resolve ${c[1]} for nesting ${l}`),f=""),b.length&&(f=b.reduce((x,g)=>this.format(x,g,o.lng,{...o,interpolationkey:c[1].trim()}),f.trim())),l=l.replace(c[0],f),this.regexp.lastIndex=0}return l}}const Z0=i=>{let l=i.toLowerCase().trim();const r={};if(i.indexOf("(")>-1){const o=i.split("(");l=o[0].toLowerCase().trim();const c=o[1].substring(0,o[1].length-1);l==="currency"&&c.indexOf(":")<0?r.currency||(r.currency=c.trim()):l==="relativetime"&&c.indexOf(":")<0?r.range||(r.range=c.trim()):c.split(";").forEach(m=>{if(m){const[h,...b]=m.split(":"),v=b.join(":").trim().replace(/^'+|'+$/g,""),x=h.trim();r[x]||(r[x]=v),v==="false"&&(r[x]=!1),v==="true"&&(r[x]=!0),isNaN(v)||(r[x]=parseInt(v,10))}})}return{formatName:l,formatOptions:r}},Mm=i=>{const l={};return(r,o,c)=>{let f=c;c&&c.interpolationkey&&c.formatParams&&c.formatParams[c.interpolationkey]&&c[c.interpolationkey]&&(f={...f,[c.interpolationkey]:void 0});const m=o+JSON.stringify(f);let h=l[m];return h||(h=i(Li(o),c),l[m]=h),h(r)}},F0=i=>(l,r,o)=>i(Li(r),o)(l);class J0{constructor(l={}){this.logger=fn.create("formatter"),this.options=l,this.init(l)}init(l,r={interpolation:{}}){this.formatSeparator=r.interpolation.formatSeparator||",";const o=r.cacheInBuiltFormats?Mm:F0;this.formats={number:o((c,f)=>{const m=new Intl.NumberFormat(c,{...f});return h=>m.format(h)}),currency:o((c,f)=>{const m=new Intl.NumberFormat(c,{...f,style:"currency"});return h=>m.format(h)}),datetime:o((c,f)=>{const m=new Intl.DateTimeFormat(c,{...f});return h=>m.format(h)}),relativetime:o((c,f)=>{const m=new Intl.RelativeTimeFormat(c,{...f});return h=>m.format(h,f.range||"day")}),list:o((c,f)=>{const m=new Intl.ListFormat(c,{...f});return h=>m.format(h)})}}add(l,r){this.formats[l.toLowerCase().trim()]=r}addCached(l,r){this.formats[l.toLowerCase().trim()]=Mm(r)}format(l,r,o,c={}){const f=r.split(this.formatSeparator);if(f.length>1&&f[0].indexOf("(")>1&&f[0].indexOf(")")<0&&f.find(h=>h.indexOf(")")>-1)){const h=f.findIndex(b=>b.indexOf(")")>-1);f[0]=[f[0],...f.splice(1,h)].join(this.formatSeparator)}return f.reduce((h,b)=>{const{formatName:v,formatOptions:x}=Z0(b);if(this.formats[v]){let g=h;try{const D=c?.formatParams?.[c.interpolationkey]||{},z=D.locale||D.lng||c.locale||c.lng||o;g=this.formats[v](h,z,{...x,...c,...D})}catch(D){this.logger.warn(D)}return g}else this.logger.warn(`there was no format function for ${v}`);return h},l)}}const $0=(i,l)=>{i.pending[l]!==void 0&&(delete i.pending[l],i.pendingCount--)};class W0 extends Sr{constructor(l,r,o,c={}){super(),this.backend=l,this.store=r,this.services=o,this.languageUtils=o.languageUtils,this.options=c,this.logger=fn.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=c.maxParallelReads||10,this.readingCalls=0,this.maxRetries=c.maxRetries>=0?c.maxRetries:5,this.retryTimeout=c.retryTimeout>=1?c.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(o,c.backend,c)}queueLoad(l,r,o,c){const f={},m={},h={},b={};return l.forEach(v=>{let x=!0;r.forEach(g=>{const D=`${v}|${g}`;!o.reload&&this.store.hasResourceBundle(v,g)?this.state[D]=2:this.state[D]<0||(this.state[D]===1?m[D]===void 0&&(m[D]=!0):(this.state[D]=1,x=!1,m[D]===void 0&&(m[D]=!0),f[D]===void 0&&(f[D]=!0),b[g]===void 0&&(b[g]=!0)))}),x||(h[v]=!0)}),(Object.keys(f).length||Object.keys(m).length)&&this.queue.push({pending:m,pendingCount:Object.keys(m).length,loaded:{},errors:[],callback:c}),{toLoad:Object.keys(f),pending:Object.keys(m),toLoadLanguages:Object.keys(h),toLoadNamespaces:Object.keys(b)}}loaded(l,r,o){const c=l.split("|"),f=c[0],m=c[1];r&&this.emit("failedLoading",f,m,r),!r&&o&&this.store.addResourceBundle(f,m,o,void 0,void 0,{skipCopy:!0}),this.state[l]=r?-1:2,r&&o&&(this.state[l]=0);const h={};this.queue.forEach(b=>{U0(b.loaded,[f],m),$0(b,l),r&&b.errors.push(r),b.pendingCount===0&&!b.done&&(Object.keys(b.loaded).forEach(v=>{h[v]||(h[v]={});const x=b.loaded[v];x.length&&x.forEach(g=>{h[v][g]===void 0&&(h[v][g]=!0)})}),b.done=!0,b.errors.length?b.callback(b.errors):b.callback())}),this.emit("loaded",h),this.queue=this.queue.filter(b=>!b.done)}read(l,r,o,c=0,f=this.retryTimeout,m){if(!l.length)return m(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:l,ns:r,fcName:o,tried:c,wait:f,callback:m});return}this.readingCalls++;const h=(v,x)=>{if(this.readingCalls--,this.waitingReads.length>0){const g=this.waitingReads.shift();this.read(g.lng,g.ns,g.fcName,g.tried,g.wait,g.callback)}if(v&&x&&c{this.read.call(this,l,r,o,c+1,f*2,m)},f);return}m(v,x)},b=this.backend[o].bind(this.backend);if(b.length===2){try{const v=b(l,r);v&&typeof v.then=="function"?v.then(x=>h(null,x)).catch(h):h(null,v)}catch(v){h(v)}return}return b(l,r,h)}prepareLoading(l,r,o={},c){if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),c&&c();se(l)&&(l=this.languageUtils.toResolveHierarchy(l)),se(r)&&(r=[r]);const f=this.queueLoad(l,r,o,c);if(!f.toLoad.length)return f.pending.length||c(),null;f.toLoad.forEach(m=>{this.loadOne(m)})}load(l,r,o){this.prepareLoading(l,r,{},o)}reload(l,r,o){this.prepareLoading(l,r,{reload:!0},o)}loadOne(l,r=""){const o=l.split("|"),c=o[0],f=o[1];this.read(c,f,"read",void 0,void 0,(m,h)=>{m&&this.logger.warn(`${r}loading namespace ${f} for language ${c} failed`,m),!m&&h&&this.logger.log(`${r}loaded namespace ${f} for language ${c}`,h),this.loaded(l,m,h)})}saveMissing(l,r,o,c,f,m={},h=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(r)){this.logger.warn(`did not save key "${o}" as the namespace "${r}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(o==null||o==="")){if(this.backend?.create){const b={...m,isUpdate:f},v=this.backend.create.bind(this.backend);if(v.length<6)try{let x;v.length===5?x=v(l,r,o,c,b):x=v(l,r,o,c),x&&typeof x.then=="function"?x.then(g=>h(null,g)).catch(h):h(null,x)}catch(x){h(x)}else v(l,r,o,c,h,b)}!l||!l[0]||this.store.addResource(l[0],r,o,c)}}}const Gu=()=>({debug:!1,initAsync:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:i=>{let l={};if(typeof i[1]=="object"&&(l=i[1]),se(i[1])&&(l.defaultValue=i[1]),se(i[2])&&(l.tDescription=i[2]),typeof i[2]=="object"||typeof i[3]=="object"){const r=i[3]||i[2];Object.keys(r).forEach(o=>{l[o]=r[o]})}return l},interpolation:{escapeValue:!0,format:i=>i,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),_m=i=>(se(i.ns)&&(i.ns=[i.ns]),se(i.fallbackLng)&&(i.fallbackLng=[i.fallbackLng]),se(i.fallbackNS)&&(i.fallbackNS=[i.fallbackNS]),i.supportedLngs?.indexOf?.("cimode")<0&&(i.supportedLngs=i.supportedLngs.concat(["cimode"])),typeof i.initImmediate=="boolean"&&(i.initAsync=i.initImmediate),i),ar=()=>{},I0=i=>{Object.getOwnPropertyNames(Object.getPrototypeOf(i)).forEach(r=>{typeof i[r]=="function"&&(i[r]=i[r].bind(i))})},Tg="__i18next_supportNoticeShown",P0=()=>typeof globalThis<"u"&&!!globalThis[Tg],eb=()=>{typeof globalThis<"u"&&(globalThis[Tg]=!0)},tb=i=>!!(i?.modules?.backend?.name?.indexOf("Locize")>0||i?.modules?.backend?.constructor?.name?.indexOf("Locize")>0||i?.options?.backend?.backends&&i.options.backend.backends.some(l=>l?.name?.indexOf("Locize")>0||l?.constructor?.name?.indexOf("Locize")>0)||i?.options?.backend?.projectId||i?.options?.backend?.backendOptions&&i.options.backend.backendOptions.some(l=>l?.projectId));class _i extends Sr{constructor(l={},r){if(super(),this.options=_m(l),this.services={},this.logger=fn,this.modules={external:[]},I0(this),r&&!this.isInitialized&&!l.isClone){if(!this.options.initAsync)return this.init(l,r),this;setTimeout(()=>{this.init(l,r)},0)}}init(l={},r){this.isInitializing=!0,typeof l=="function"&&(r=l,l={}),l.defaultNS==null&&l.ns&&(se(l.ns)?l.defaultNS=l.ns:l.ns.indexOf("translation")<0&&(l.defaultNS=l.ns[0]));const o=Gu();this.options={...o,...this.options,..._m(l)},this.options.interpolation={...o.interpolation,...this.options.interpolation},l.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=l.keySeparator),l.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=l.nsSeparator),typeof this.options.overloadTranslationOptionHandler!="function"&&(this.options.overloadTranslationOptionHandler=o.overloadTranslationOptionHandler),this.options.showSupportNotice!==!1&&!tb(this)&&!P0()&&(typeof console<"u"&&typeof console.info<"u"&&console.info("🌐 i18next is maintained with support from Locize — consider powering your project with managed localization (AI, CDN, integrations): https://locize.com 💙"),eb());const c=v=>v?typeof v=="function"?new v:v:null;if(!this.options.isClone){this.modules.logger?fn.init(c(this.modules.logger),this.options):fn.init(null,this.options);let v;this.modules.formatter?v=this.modules.formatter:v=J0;const x=new Am(this.options);this.store=new Cm(this.options.resources,this.options);const g=this.services;g.logger=fn,g.resourceStore=this.store,g.languageUtils=x,g.pluralResolver=new X0(x,{prepend:this.options.pluralSeparator,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),this.options.interpolation.format&&this.options.interpolation.format!==o.interpolation.format&&this.logger.deprecate("init: you are still using the legacy format function, please use the new approach: https://www.i18next.com/translation-function/formatting"),v&&(!this.options.interpolation.format||this.options.interpolation.format===o.interpolation.format)&&(g.formatter=c(v),g.formatter.init&&g.formatter.init(g,this.options),this.options.interpolation.format=g.formatter.format.bind(g.formatter)),g.interpolator=new zm(this.options),g.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},g.backendConnector=new W0(c(this.modules.backend),g.resourceStore,g,this.options),g.backendConnector.on("*",(z,...j)=>{this.emit(z,...j)}),this.modules.languageDetector&&(g.languageDetector=c(this.modules.languageDetector),g.languageDetector.init&&g.languageDetector.init(g,this.options.detection,this.options)),this.modules.i18nFormat&&(g.i18nFormat=c(this.modules.i18nFormat),g.i18nFormat.init&&g.i18nFormat.init(this)),this.translator=new pr(this.services,this.options),this.translator.on("*",(z,...j)=>{this.emit(z,...j)}),this.modules.external.forEach(z=>{z.init&&z.init(this)})}if(this.format=this.options.interpolation.format,r||(r=ar),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const v=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);v.length>0&&v[0]!=="dev"&&(this.options.lng=v[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(v=>{this[v]=(...x)=>this.store[v](...x)}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(v=>{this[v]=(...x)=>(this.store[v](...x),this)});const h=Ri(),b=()=>{const v=(x,g)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),h.resolve(g),r(x,g)};if(this.languages&&!this.isInitialized)return v(null,this.t.bind(this));this.changeLanguage(this.options.lng,v)};return this.options.resources||!this.options.initAsync?b():setTimeout(b,0),h}loadResources(l,r=ar){let o=r;const c=se(l)?l:this.language;if(typeof l=="function"&&(o=l),!this.options.resources||this.options.partialBundledLanguages){if(c?.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return o();const f=[],m=h=>{if(!h||h==="cimode")return;this.services.languageUtils.toResolveHierarchy(h).forEach(v=>{v!=="cimode"&&f.indexOf(v)<0&&f.push(v)})};c?m(c):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(b=>m(b)),this.options.preload?.forEach?.(h=>m(h)),this.services.backendConnector.load(f,this.options.ns,h=>{!h&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),o(h)})}else o(null)}reloadResources(l,r,o){const c=Ri();return typeof l=="function"&&(o=l,l=void 0),typeof r=="function"&&(o=r,r=void 0),l||(l=this.languages),r||(r=this.options.ns),o||(o=ar),this.services.backendConnector.reload(l,r,f=>{c.resolve(),o(f)}),c}use(l){if(!l)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!l.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return l.type==="backend"&&(this.modules.backend=l),(l.type==="logger"||l.log&&l.warn&&l.error)&&(this.modules.logger=l),l.type==="languageDetector"&&(this.modules.languageDetector=l),l.type==="i18nFormat"&&(this.modules.i18nFormat=l),l.type==="postProcessor"&&xg.addPostProcessor(l),l.type==="formatter"&&(this.modules.formatter=l),l.type==="3rdParty"&&this.modules.external.push(l),this}setResolvedLanguage(l){if(!(!l||!this.languages)&&!(["cimode","dev"].indexOf(l)>-1)){for(let r=0;r-1)&&this.store.hasLanguageSomeTranslations(o)){this.resolvedLanguage=o;break}}!this.resolvedLanguage&&this.languages.indexOf(l)<0&&this.store.hasLanguageSomeTranslations(l)&&(this.resolvedLanguage=l,this.languages.unshift(l))}}changeLanguage(l,r){this.isLanguageChangingTo=l;const o=Ri();this.emit("languageChanging",l);const c=h=>{this.language=h,this.languages=this.services.languageUtils.toResolveHierarchy(h),this.resolvedLanguage=void 0,this.setResolvedLanguage(h)},f=(h,b)=>{b?this.isLanguageChangingTo===l&&(c(b),this.translator.changeLanguage(b),this.isLanguageChangingTo=void 0,this.emit("languageChanged",b),this.logger.log("languageChanged",b)):this.isLanguageChangingTo=void 0,o.resolve((...v)=>this.t(...v)),r&&r(h,(...v)=>this.t(...v))},m=h=>{!l&&!h&&this.services.languageDetector&&(h=[]);const b=se(h)?h:h&&h[0],v=this.store.hasLanguageSomeTranslations(b)?b:this.services.languageUtils.getBestMatchFromCodes(se(h)?[h]:h);v&&(this.language||c(v),this.translator.language||this.translator.changeLanguage(v),this.services.languageDetector?.cacheUserLanguage?.(v)),this.loadResources(v,x=>{f(x,v)})};return!l&&this.services.languageDetector&&!this.services.languageDetector.async?m(this.services.languageDetector.detect()):!l&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(m):this.services.languageDetector.detect(m):m(l),o}getFixedT(l,r,o){const c=(f,m,...h)=>{let b;typeof m!="object"?b=this.options.overloadTranslationOptionHandler([f,m].concat(h)):b={...m},b.lng=b.lng||c.lng,b.lngs=b.lngs||c.lngs,b.ns=b.ns||c.ns,b.keyPrefix!==""&&(b.keyPrefix=b.keyPrefix||o||c.keyPrefix);const v=this.options.keySeparator||".";let x;return b.keyPrefix&&Array.isArray(f)?x=f.map(g=>(typeof g=="function"&&(g=ac(g,{...this.options,...m})),`${b.keyPrefix}${v}${g}`)):(typeof f=="function"&&(f=ac(f,{...this.options,...m})),x=b.keyPrefix?`${b.keyPrefix}${v}${f}`:f),this.t(x,b)};return se(l)?c.lng=l:c.lngs=l,c.ns=r,c.keyPrefix=o,c}t(...l){return this.translator?.translate(...l)}exists(...l){return this.translator?.exists(...l)}setDefaultNamespace(l){this.options.defaultNS=l}hasLoadedNamespace(l,r={}){if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const o=r.lng||this.resolvedLanguage||this.languages[0],c=this.options?this.options.fallbackLng:!1,f=this.languages[this.languages.length-1];if(o.toLowerCase()==="cimode")return!0;const m=(h,b)=>{const v=this.services.backendConnector.state[`${h}|${b}`];return v===-1||v===0||v===2};if(r.precheck){const h=r.precheck(this,m);if(h!==void 0)return h}return!!(this.hasResourceBundle(o,l)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||m(o,l)&&(!c||m(f,l)))}loadNamespaces(l,r){const o=Ri();return this.options.ns?(se(l)&&(l=[l]),l.forEach(c=>{this.options.ns.indexOf(c)<0&&this.options.ns.push(c)}),this.loadResources(c=>{o.resolve(),r&&r(c)}),o):(r&&r(),Promise.resolve())}loadLanguages(l,r){const o=Ri();se(l)&&(l=[l]);const c=this.options.preload||[],f=l.filter(m=>c.indexOf(m)<0&&this.services.languageUtils.isSupportedCode(m));return f.length?(this.options.preload=c.concat(f),this.loadResources(m=>{o.resolve(),r&&r(m)}),o):(r&&r(),Promise.resolve())}dir(l){if(l||(l=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language)),!l)return"rtl";try{const c=new Intl.Locale(l);if(c&&c.getTextInfo){const f=c.getTextInfo();if(f&&f.direction)return f.direction}}catch{}const r=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],o=this.services?.languageUtils||new Am(Gu());return l.toLowerCase().indexOf("-latn")>1?"ltr":r.indexOf(o.getLanguagePartFromCode(l))>-1||l.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(l={},r){const o=new _i(l,r);return o.createInstance=_i.createInstance,o}cloneInstance(l={},r=ar){const o=l.forkResourceStore;o&&delete l.forkResourceStore;const c={...this.options,...l,isClone:!0},f=new _i(c);if((l.debug!==void 0||l.prefix!==void 0)&&(f.logger=f.logger.clone(l)),["store","services","language"].forEach(h=>{f[h]=this[h]}),f.services={...this.services},f.services.utils={hasLoadedNamespace:f.hasLoadedNamespace.bind(f)},o){const h=Object.keys(this.store.data).reduce((b,v)=>(b[v]={...this.store.data[v]},b[v]=Object.keys(b[v]).reduce((x,g)=>(x[g]={...b[v][g]},x),b[v]),b),{});f.store=new Cm(h,c),f.services.resourceStore=f.store}if(l.interpolation){const b={...Gu().interpolation,...this.options.interpolation,...l.interpolation},v={...c,interpolation:b};f.services.interpolator=new zm(v)}return f.translator=new pr(f.services,c),f.translator.on("*",(h,...b)=>{f.emit(h,...b)}),f.init(c,r),f.translator.options=c,f.translator.backendConnector.services.utils={hasLoadedNamespace:f.hasLoadedNamespace.bind(f)},f}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const ht=_i.createInstance();ht.createInstance;ht.dir;ht.init;ht.loadResources;ht.reloadResources;ht.use;ht.changeLanguage;ht.getFixedT;ht.t;ht.exists;ht.setDefaultNamespace;ht.hasLoadedNamespace;ht.loadNamespaces;ht.loadLanguages;const nb=(i,l,r,o)=>{const c=[r,{code:l,...o||{}}];if(i?.services?.logger?.forward)return i.services.logger.forward(c,"warn","react-i18next::",!0);ja(c[0])&&(c[0]=`react-i18next:: ${c[0]}`),i?.services?.logger?.warn?i.services.logger.warn(...c):console?.warn&&console.warn(...c)},jm={},Og=(i,l,r,o)=>{ja(r)&&jm[r]||(ja(r)&&(jm[r]=new Date),nb(i,l,r,o))},Cg=(i,l)=>()=>{if(i.isInitialized)l();else{const r=()=>{setTimeout(()=>{i.off("initialized",r)},0),l()};i.on("initialized",r)}},lc=(i,l,r)=>{i.loadNamespaces(l,Cg(i,r))},Lm=(i,l,r,o)=>{if(ja(r)&&(r=[r]),i.options.preload&&i.options.preload.indexOf(l)>-1)return lc(i,r,o);r.forEach(c=>{i.options.ns.indexOf(c)<0&&i.options.ns.push(c)}),i.loadLanguages(l,Cg(i,o))},ab=(i,l,r={})=>!l.languages||!l.languages.length?(Og(l,"NO_LANGUAGES","i18n.languages were undefined or empty",{languages:l.languages}),!0):l.hasLoadedNamespace(i,{lng:r.lng,precheck:(o,c)=>{if(r.bindI18n&&r.bindI18n.indexOf("languageChanging")>-1&&o.services.backendConnector.backend&&o.isLanguageChangingTo&&!c(o.isLanguageChangingTo,i))return!1}}),ja=i=>typeof i=="string",lb=i=>typeof i=="object"&&i!==null,ib=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,sb={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},rb=i=>sb[i],ob=i=>i.replace(ib,rb);let ic={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:ob,transDefaultProps:void 0};const ub=(i={})=>{ic={...ic,...i}},cb=()=>ic;let Ng;const fb=i=>{Ng=i},db=()=>Ng,hb={type:"3rdParty",init(i){ub(i.options.react),fb(i)}},mb=y.createContext();class gb{constructor(){this.usedNamespaces={}}addUsedNamespaces(l){l.forEach(r=>{this.usedNamespaces[r]||(this.usedNamespaces[r]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}var pb=Jy();const vb=(i,l)=>ja(l)?l:lb(l)&&ja(l.defaultValue)?l.defaultValue:Array.isArray(i)?i[i.length-1]:i,yb={t:vb,ready:!1},bb=()=>()=>{},xr=(i,l={})=>{const{i18n:r}=l,{i18n:o,defaultNS:c}=y.useContext(mb)||{},f=r||o||db();f&&!f.reportNamespaces&&(f.reportNamespaces=new gb),f||Og(f,"NO_I18NEXT_INSTANCE","useTranslation: You will need to pass in an i18next instance by using initReactI18next");const m=y.useMemo(()=>({...cb(),...f?.options?.react,...l}),[f,l]),{useSuspense:h,keyPrefix:b}=m,v=c||f?.options?.defaultNS,x=ja(v)?[v]:v||["translation"],g=y.useMemo(()=>x,x);f?.reportNamespaces?.addUsedNamespaces?.(g);const D=y.useRef(0),z=y.useCallback(ae=>{if(!f)return bb;const{bindI18n:te,bindI18nStore:fe}=m,re=()=>{D.current+=1,ae()};return te&&f.on(te,re),fe&&f.store.on(fe,re),()=>{te&&te.split(" ").forEach(Ee=>f.off(Ee,re)),fe&&fe.split(" ").forEach(Ee=>f.store.off(Ee,re))}},[f,m]),j=y.useRef(),B=y.useCallback(()=>{if(!f)return yb;const ae=!!(f.isInitialized||f.initializedStoreOnce)&&g.every(je=>ab(je,f,m)),te=l.lng||f.language,fe=D.current,re=j.current;if(re&&re.ready===ae&&re.lng===te&&re.keyPrefix===b&&re.revision===fe)return re;const Te={t:f.getFixedT(te,m.nsMode==="fallback"?g:g[0],b),ready:ae,lng:te,keyPrefix:b,revision:fe};return j.current=Te,Te},[f,g,b,m,l.lng]),[K,U]=y.useState(0),{t:Q,ready:Z}=pb.useSyncExternalStore(z,B,B);y.useEffect(()=>{if(f&&!Z&&!h){const ae=()=>U(te=>te+1);l.lng?Lm(f,l.lng,g,ae):lc(f,g,ae)}},[f,l.lng,g,Z,h,K]);const I=f||{},ee=y.useRef(null),J=y.useRef(),X=ae=>{const te=Object.getOwnPropertyDescriptors(ae);te.__original&&delete te.__original;const fe=Object.create(Object.getPrototypeOf(ae),te);if(!Object.prototype.hasOwnProperty.call(fe,"__original"))try{Object.defineProperty(fe,"__original",{value:ae,writable:!1,enumerable:!1,configurable:!1})}catch{}return fe},ve=y.useMemo(()=>{const ae=I,te=ae?.language;let fe=ae;ae&&(ee.current&&ee.current.__original===ae?J.current!==te?(fe=X(ae),ee.current=fe,J.current=te):fe=ee.current:(fe=X(ae),ee.current=fe,J.current=te));const re=[Q,fe,Z];return re.t=Q,re.i18n=fe,re.ready=Z,re},[Q,I,Z,I.resolvedLanguage,I.language,I.languages]);if(f&&h&&!Z)throw new Promise(ae=>{const te=()=>ae();l.lng?Lm(f,l.lng,g,te):lc(f,g,te)});return ve},Sb=[{to:"/",icon:og,labelKey:"nav.overview"},{to:"/health",icon:ug,labelKey:"nav.health"},{to:"/uncertainty",icon:By,labelKey:"nav.uncertainty"},{to:"/graph",icon:cg,labelKey:"nav.graph"},{to:"/timeline",icon:fg,labelKey:"nav.timeline"},{to:"/evolution",icon:dg,labelKey:"nav.evolution"},{to:"/diagrams",icon:hg,labelKey:"nav.mindmap"},{to:"/sync",icon:mg,labelKey:"nav.sync"},{to:"/oracle",icon:gg,labelKey:"nav.oracle"},{to:"/tool-stats",icon:pg,labelKey:"nav.toolStats"},{to:"/reasoning",icon:Hy,labelKey:"nav.reasoningTraining"},{to:"/visualize",icon:qy,labelKey:"nav.visualize"},{to:"/storage",icon:Vy,labelKey:"nav.storage"},{to:"/settings",icon:vg,labelKey:"nav.settings"}];function xb(){const i=br(r=>r.sidebarOpen),{t:l}=xr();return E.jsxs("aside",{className:ji("fixed inset-y-0 left-0 z-30 flex flex-col border-r border-sidebar-border bg-sidebar transition-all duration-[var(--transition-normal)]",i?"w-56":"w-16"),children:[E.jsxs("div",{className:"flex h-14 items-center gap-3 border-b border-sidebar-border px-4",children:[E.jsx(rg,{className:"size-6 shrink-0 text-sidebar-primary"}),i&&E.jsx("span",{className:"font-display text-base font-bold text-sidebar-foreground truncate",children:"Surreal-Memory"})]}),E.jsx("nav",{className:"flex-1 space-y-1 p-2","aria-label":l("common.mainNavigation"),children:Sb.map(({to:r,icon:o,labelKey:c})=>{const f=l(c);return E.jsxs(zy,{to:r,end:r==="/",className:({isActive:m})=>ji("flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-colors cursor-pointer",m?"bg-sidebar-accent text-sidebar-primary":"text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-foreground",!i&&"justify-center px-0"),title:f,children:[E.jsx(o,{className:"size-5 shrink-0","aria-hidden":"true"}),i&&E.jsx("span",{children:f})]},r)})}),E.jsx("div",{className:"border-t border-sidebar-border p-3",children:i&&E.jsx("p",{className:"text-xs text-sidebar-foreground/50 text-center",children:"Surreal-Memory"})})]})}function Um(i,l){if(typeof i=="function")return i(l);i!=null&&(i.current=l)}function Pt(...i){return l=>{let r=!1;const o=i.map(c=>{const f=Um(c,l);return!r&&typeof f=="function"&&(r=!0),f});if(r)return()=>{for(let c=0;c{let{children:f,...m}=o;Ag(f)&&typeof vr=="function"&&(f=vr(f._payload));const h=y.Children.toArray(f),b=h.find(Ab);if(b){const v=b.props.children,x=h.map(g=>g===b?y.Children.count(v)>1?y.Children.only(null):y.isValidElement(v)?v.props.children:null:g);return E.jsx(l,{...m,ref:c,children:y.isValidElement(v)?y.cloneElement(v,void 0,x):null})}return E.jsx(l,{...m,ref:c,children:f})});return r.displayName=`${i}.Slot`,r}var Ob=Dg("Slot");function Cb(i){const l=y.forwardRef((r,o)=>{let{children:c,...f}=r;if(Ag(c)&&typeof vr=="function"&&(c=vr(c._payload)),y.isValidElement(c)){const m=wb(c),h=Db(f,c.props);return c.type!==y.Fragment&&(h.ref=o?Pt(o,m):m),y.cloneElement(c,h)}return y.Children.count(c)>1?y.Children.only(null):null});return l.displayName=`${i}.SlotClone`,l}var Nb=Symbol("radix.slottable");function Ab(i){return y.isValidElement(i)&&typeof i.type=="function"&&"__radixId"in i.type&&i.type.__radixId===Nb}function Db(i,l){const r={...l};for(const o in l){const c=i[o],f=l[o];/^on[A-Z]/.test(o)?c&&f?r[o]=(...h)=>{const b=f(...h);return c(...h),b}:c&&(r[o]=c):o==="style"?r[o]={...c,...f}:o==="className"&&(r[o]=[c,f].filter(Boolean).join(" "))}return{...i,...r}}function wb(i){let l=Object.getOwnPropertyDescriptor(i.props,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning;return r?i.ref:(l=Object.getOwnPropertyDescriptor(i,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}const Rb=yg("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 cursor-pointer [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-border bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-lg px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),cr=y.forwardRef(({className:i,variant:l,size:r,asChild:o=!1,...c},f)=>{const m=o?Ob:"button";return E.jsx(m,{className:ji(Rb({variant:l,size:r,className:i})),ref:f,...c})});cr.displayName="Button";const zb="";class wg extends Error{status;constructor(l,r){super(r),this.name="ApiError",this.status=l}}async function lr(i,l={}){const{brain:r,...o}=l,c=new Headers(o.headers);r&&c.set("X-Brain-ID",r),o.body&&!c.has("Content-Type")&&c.set("Content-Type","application/json");const f=await fetch(`${zb}${i}`,{...o,headers:c});if(!f.ok){const m=await f.text().catch(()=>"Unknown error");throw new wg(f.status,m)}return f.json()}const qe={get:(i,l)=>lr(i,{...l,method:"GET"}),post:(i,l,r)=>lr(i,{...r,method:"POST",body:l?JSON.stringify(l):void 0}),put:(i,l,r)=>lr(i,{...r,method:"PUT",body:l?JSON.stringify(l):void 0}),delete:(i,l)=>lr(i,{...l,method:"DELETE"})};function DE(i,l){if(i instanceof wg){try{const r=JSON.parse(i.message);if(r&&typeof r.detail=="string")return r.detail}catch{}return i.message||l}return l}const $e={stats:["dashboard","stats"],brains:["dashboard","brains"],health:["dashboard","health"],healthCheck:["health"],toolStats:i=>["dashboard","tool-stats",i],timeline:(i,l)=>["dashboard","timeline",i,l],dailyStats:i=>["dashboard","timeline","daily-stats",i],evolution:["dashboard","evolution"],fibers:["dashboard","fibers"],fiberDiagram:i=>["dashboard","fiber",i,"diagram"],graph:i=>["graph",i],brainFiles:["dashboard","brain-files"],configStatus:["dashboard","config-status"],embeddingConfig:["config","embedding"],watcherStatus:["dashboard","watcher-status"],license:["dashboard","license"],uncertainty:i=>["dashboard","uncertainty",i]};function Mb(){return it({queryKey:$e.stats,queryFn:()=>qe.get("/api/dashboard/stats")})}function _b(){return it({queryKey:$e.healthCheck,queryFn:()=>qe.get("/health"),staleTime:3e5})}function wE(){return it({queryKey:$e.brains,queryFn:()=>qe.get("/api/dashboard/brains")})}function RE(){const i=fc();return Hi({mutationFn:l=>qe.post("/api/dashboard/brains/switch",{brain_name:l}),onSuccess:()=>{i.invalidateQueries()}})}function zE(){return it({queryKey:$e.health,queryFn:()=>qe.get("/api/dashboard/health")})}function ME(i=14){return it({queryKey:$e.uncertainty(i),queryFn:()=>qe.get(`/api/dashboard/uncertainty?within_days=${i}`)})}function _E(i=100,l=0){return it({queryKey:$e.timeline(i,l),queryFn:()=>qe.get(`/api/dashboard/timeline?limit=${i}&offset=${l}`)})}function jE(i=30){return it({queryKey:$e.dailyStats(i),queryFn:()=>qe.get(`/api/dashboard/timeline/daily-stats?days=${i}`)})}function LE(){return it({queryKey:$e.evolution,queryFn:()=>qe.get("/api/dashboard/evolution")})}function jb(){return it({queryKey:$e.fibers,queryFn:()=>qe.get("/api/dashboard/fibers")})}function UE(i){return it({queryKey:$e.fiberDiagram(i),queryFn:()=>qe.get(`/api/dashboard/fiber/${i}/diagram`),enabled:!!i})}function BE(i=500){return it({queryKey:$e.graph(i),queryFn:()=>qe.get(`/api/graph?limit=${i}`)})}function HE(){const i=fc();return Hi({mutationFn:l=>qe.delete(`/brain/${l}`),onSuccess:()=>{i.invalidateQueries()}})}function qE(i=30){return it({queryKey:$e.toolStats(i),queryFn:()=>qe.get(`/api/dashboard/tool-stats?days=${i}`)})}function VE(){return it({queryKey:$e.brainFiles,queryFn:()=>qe.get("/api/dashboard/brain-files")})}function YE(){return it({queryKey:$e.configStatus,queryFn:()=>qe.get("/api/dashboard/config-status"),staleTime:6e4})}function kE(){return it({queryKey:$e.embeddingConfig,queryFn:()=>qe.get("/api/dashboard/config/embedding"),staleTime:6e4})}function KE(){const i=fc();return Hi({mutationFn:l=>qe.put("/api/dashboard/config",l),onSuccess:()=>{i.invalidateQueries({queryKey:$e.configStatus}),i.invalidateQueries({queryKey:$e.embeddingConfig})}})}function GE(){return it({queryKey:$e.watcherStatus,queryFn:()=>qe.get("/api/dashboard/watcher/status"),staleTime:3e4})}function QE(){return Hi({mutationFn:()=>qe.post("/api/dashboard/config/embedding/test",{})})}function XE(){return Hi({mutationFn:i=>qe.post("/api/dashboard/visualize",i)})}function ZE(){return it({queryKey:$e.license,queryFn:()=>qe.get("/api/dashboard/license"),staleTime:6e4})}const Lb=yg("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-2 focus:outline-offset-2 focus:outline-ring",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow",secondary:"border-transparent bg-secondary text-secondary-foreground",destructive:"border-transparent bg-destructive text-destructive-foreground shadow",outline:"text-foreground",success:"border-transparent bg-health-good/10 text-health-good",warning:"border-transparent bg-health-warn/10 text-health-warn"}},defaultVariants:{variant:"default"}});function Ub({className:i,variant:l,...r}){return E.jsx("div",{className:ji(Lb({variant:l}),i),...r})}var Bm=1,Bb=.9,Hb=.8,qb=.17,Qu=.1,Xu=.999,Vb=.9999,Yb=.99,kb=/[\\\/_+.#"@\[\(\{&]/,Kb=/[\\\/_+.#"@\[\(\{&]/g,Gb=/[\s-]/,Rg=/[\s-]/g;function sc(i,l,r,o,c,f,m){if(f===l.length)return c===i.length?Bm:Yb;var h=`${c},${f}`;if(m[h]!==void 0)return m[h];for(var b=o.charAt(f),v=r.indexOf(b,c),x=0,g,D,z,j;v>=0;)g=sc(i,l,r,o,v+1,f+1,m),g>x&&(v===c?g*=Bm:kb.test(i.charAt(v-1))?(g*=Hb,z=i.slice(c,v-1).match(Kb),z&&c>0&&(g*=Math.pow(Xu,z.length))):Gb.test(i.charAt(v-1))?(g*=Bb,j=i.slice(c,v-1).match(Rg),j&&c>0&&(g*=Math.pow(Xu,j.length))):(g*=qb,c>0&&(g*=Math.pow(Xu,v-c))),i.charAt(v)!==l.charAt(f)&&(g*=Vb)),(gg&&(g=D*Qu)),g>x&&(x=g),v=r.indexOf(b,v+1);return m[h]=x,x}function Hm(i){return i.toLowerCase().replace(Rg," ")}function Qb(i,l,r){return i=r&&r.length>0?`${i+" "+r.join(" ")}`:i,sc(i,l,Hm(i),Hm(l),0,0,{})}function ra(i,l,{checkForDefaultPrevented:r=!0}={}){return function(c){if(i?.(c),r===!1||!c.defaultPrevented)return l?.(c)}}function Xb(i,l){const r=y.createContext(l),o=f=>{const{children:m,...h}=f,b=y.useMemo(()=>h,Object.values(h));return E.jsx(r.Provider,{value:b,children:m})};o.displayName=i+"Provider";function c(f){const m=y.useContext(r);if(m)return m;if(l!==void 0)return l;throw new Error(`\`${f}\` must be used within \`${i}\``)}return[o,c]}function Zb(i,l=[]){let r=[];function o(f,m){const h=y.createContext(m),b=r.length;r=[...r,m];const v=g=>{const{scope:D,children:z,...j}=g,B=D?.[i]?.[b]||h,K=y.useMemo(()=>j,Object.values(j));return E.jsx(B.Provider,{value:K,children:z})};v.displayName=f+"Provider";function x(g,D){const z=D?.[i]?.[b]||h,j=y.useContext(z);if(j)return j;if(m!==void 0)return m;throw new Error(`\`${g}\` must be used within \`${f}\``)}return[v,x]}const c=()=>{const f=r.map(m=>y.createContext(m));return function(h){const b=h?.[i]||f;return y.useMemo(()=>({[`__scope${i}`]:{...h,[i]:b}}),[h,b])}};return c.scopeName=i,[o,Fb(c,...l)]}function Fb(...i){const l=i[0];if(i.length===1)return l;const r=()=>{const o=i.map(c=>({useScope:c(),scopeName:c.scopeName}));return function(f){const m=o.reduce((h,{useScope:b,scopeName:v})=>{const g=b(f)[`__scope${v}`];return{...h,...g}},{});return y.useMemo(()=>({[`__scope${l.scopeName}`]:m}),[m])}};return r.scopeName=l.scopeName,r}var Ui=globalThis?.document?y.useLayoutEffect:()=>{},Jb=dc[" useId ".trim().toString()]||(()=>{}),$b=0;function Mn(i){const[l,r]=y.useState(Jb());return Ui(()=>{r(o=>o??String($b++))},[i]),l?`radix-${l}`:""}var Wb=dc[" useInsertionEffect ".trim().toString()]||Ui;function Ib({prop:i,defaultProp:l,onChange:r=()=>{},caller:o}){const[c,f,m]=Pb({defaultProp:l,onChange:r}),h=i!==void 0,b=h?i:c;{const x=y.useRef(i!==void 0);y.useEffect(()=>{const g=x.current;g!==h&&console.warn(`${o} is changing from ${g?"controlled":"uncontrolled"} to ${h?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),x.current=h},[h,o])}const v=y.useCallback(x=>{if(h){const g=eS(x)?x(i):x;g!==i&&m.current?.(g)}else f(x)},[h,i,f,m]);return[b,v]}function Pb({defaultProp:i,onChange:l}){const[r,o]=y.useState(i),c=y.useRef(r),f=y.useRef(l);return Wb(()=>{f.current=l},[l]),y.useEffect(()=>{c.current!==r&&(f.current?.(r),c.current=r)},[r,c]),[r,o,f]}function eS(i){return typeof i=="function"}function tS(i){const l=nS(i),r=y.forwardRef((o,c)=>{const{children:f,...m}=o,h=y.Children.toArray(f),b=h.find(lS);if(b){const v=b.props.children,x=h.map(g=>g===b?y.Children.count(v)>1?y.Children.only(null):y.isValidElement(v)?v.props.children:null:g);return E.jsx(l,{...m,ref:c,children:y.isValidElement(v)?y.cloneElement(v,void 0,x):null})}return E.jsx(l,{...m,ref:c,children:f})});return r.displayName=`${i}.Slot`,r}function nS(i){const l=y.forwardRef((r,o)=>{const{children:c,...f}=r;if(y.isValidElement(c)){const m=sS(c),h=iS(f,c.props);return c.type!==y.Fragment&&(h.ref=o?Pt(o,m):m),y.cloneElement(c,h)}return y.Children.count(c)>1?y.Children.only(null):null});return l.displayName=`${i}.SlotClone`,l}var aS=Symbol("radix.slottable");function lS(i){return y.isValidElement(i)&&typeof i.type=="function"&&"__radixId"in i.type&&i.type.__radixId===aS}function iS(i,l){const r={...l};for(const o in l){const c=i[o],f=l[o];/^on[A-Z]/.test(o)?c&&f?r[o]=(...h)=>{const b=f(...h);return c(...h),b}:c&&(r[o]=c):o==="style"?r[o]={...c,...f}:o==="className"&&(r[o]=[c,f].filter(Boolean).join(" "))}return{...i,...r}}function sS(i){let l=Object.getOwnPropertyDescriptor(i.props,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning;return r?i.ref:(l=Object.getOwnPropertyDescriptor(i,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}var rS=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],zg=rS.reduce((i,l)=>{const r=tS(`Primitive.${l}`),o=y.forwardRef((c,f)=>{const{asChild:m,...h}=c,b=m?r:l;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),E.jsx(b,{...h,ref:f})});return o.displayName=`Primitive.${l}`,{...i,[l]:o}},{});function oS(i,l){i&&sg.flushSync(()=>i.dispatchEvent(l))}function Bi(i){const l=y.useRef(i);return y.useEffect(()=>{l.current=i}),y.useMemo(()=>(...r)=>l.current?.(...r),[])}function uS(i,l=globalThis?.document){const r=Bi(i);y.useEffect(()=>{const o=c=>{c.key==="Escape"&&r(c)};return l.addEventListener("keydown",o,{capture:!0}),()=>l.removeEventListener("keydown",o,{capture:!0})},[r,l])}var cS="DismissableLayer",rc="dismissableLayer.update",fS="dismissableLayer.pointerDownOutside",dS="dismissableLayer.focusOutside",qm,Mg=y.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),_g=y.forwardRef((i,l)=>{const{disableOutsidePointerEvents:r=!1,onEscapeKeyDown:o,onPointerDownOutside:c,onFocusOutside:f,onInteractOutside:m,onDismiss:h,...b}=i,v=y.useContext(Mg),[x,g]=y.useState(null),D=x?.ownerDocument??globalThis?.document,[,z]=y.useState({}),j=Ba(l,X=>g(X)),B=Array.from(v.layers),[K]=[...v.layersWithOutsidePointerEventsDisabled].slice(-1),U=B.indexOf(K),Q=x?B.indexOf(x):-1,Z=v.layersWithOutsidePointerEventsDisabled.size>0,I=Q>=U,ee=gS(X=>{const ve=X.target,ae=[...v.branches].some(te=>te.contains(ve));!I||ae||(c?.(X),m?.(X),X.defaultPrevented||h?.())},D),J=pS(X=>{const ve=X.target;[...v.branches].some(te=>te.contains(ve))||(f?.(X),m?.(X),X.defaultPrevented||h?.())},D);return uS(X=>{Q===v.layers.size-1&&(o?.(X),!X.defaultPrevented&&h&&(X.preventDefault(),h()))},D),y.useEffect(()=>{if(x)return r&&(v.layersWithOutsidePointerEventsDisabled.size===0&&(qm=D.body.style.pointerEvents,D.body.style.pointerEvents="none"),v.layersWithOutsidePointerEventsDisabled.add(x)),v.layers.add(x),Vm(),()=>{r&&v.layersWithOutsidePointerEventsDisabled.size===1&&(D.body.style.pointerEvents=qm)}},[x,D,r,v]),y.useEffect(()=>()=>{x&&(v.layers.delete(x),v.layersWithOutsidePointerEventsDisabled.delete(x),Vm())},[x,v]),y.useEffect(()=>{const X=()=>z({});return document.addEventListener(rc,X),()=>document.removeEventListener(rc,X)},[]),E.jsx(zg.div,{...b,ref:j,style:{pointerEvents:Z?I?"auto":"none":void 0,...i.style},onFocusCapture:ra(i.onFocusCapture,J.onFocusCapture),onBlurCapture:ra(i.onBlurCapture,J.onBlurCapture),onPointerDownCapture:ra(i.onPointerDownCapture,ee.onPointerDownCapture)})});_g.displayName=cS;var hS="DismissableLayerBranch",mS=y.forwardRef((i,l)=>{const r=y.useContext(Mg),o=y.useRef(null),c=Ba(l,o);return y.useEffect(()=>{const f=o.current;if(f)return r.branches.add(f),()=>{r.branches.delete(f)}},[r.branches]),E.jsx(zg.div,{...i,ref:c})});mS.displayName=hS;function gS(i,l=globalThis?.document){const r=Bi(i),o=y.useRef(!1),c=y.useRef(()=>{});return y.useEffect(()=>{const f=h=>{if(h.target&&!o.current){let b=function(){jg(fS,r,v,{discrete:!0})};const v={originalEvent:h};h.pointerType==="touch"?(l.removeEventListener("click",c.current),c.current=b,l.addEventListener("click",c.current,{once:!0})):b()}else l.removeEventListener("click",c.current);o.current=!1},m=window.setTimeout(()=>{l.addEventListener("pointerdown",f)},0);return()=>{window.clearTimeout(m),l.removeEventListener("pointerdown",f),l.removeEventListener("click",c.current)}},[l,r]),{onPointerDownCapture:()=>o.current=!0}}function pS(i,l=globalThis?.document){const r=Bi(i),o=y.useRef(!1);return y.useEffect(()=>{const c=f=>{f.target&&!o.current&&jg(dS,r,{originalEvent:f},{discrete:!1})};return l.addEventListener("focusin",c),()=>l.removeEventListener("focusin",c)},[l,r]),{onFocusCapture:()=>o.current=!0,onBlurCapture:()=>o.current=!1}}function Vm(){const i=new CustomEvent(rc);document.dispatchEvent(i)}function jg(i,l,r,{discrete:o}){const c=r.originalEvent.target,f=new CustomEvent(i,{bubbles:!1,cancelable:!0,detail:r});l&&c.addEventListener(i,l,{once:!0}),o?oS(c,f):c.dispatchEvent(f)}function vS(i){const l=yS(i),r=y.forwardRef((o,c)=>{const{children:f,...m}=o,h=y.Children.toArray(f),b=h.find(SS);if(b){const v=b.props.children,x=h.map(g=>g===b?y.Children.count(v)>1?y.Children.only(null):y.isValidElement(v)?v.props.children:null:g);return E.jsx(l,{...m,ref:c,children:y.isValidElement(v)?y.cloneElement(v,void 0,x):null})}return E.jsx(l,{...m,ref:c,children:f})});return r.displayName=`${i}.Slot`,r}function yS(i){const l=y.forwardRef((r,o)=>{const{children:c,...f}=r;if(y.isValidElement(c)){const m=ES(c),h=xS(f,c.props);return c.type!==y.Fragment&&(h.ref=o?Pt(o,m):m),y.cloneElement(c,h)}return y.Children.count(c)>1?y.Children.only(null):null});return l.displayName=`${i}.SlotClone`,l}var bS=Symbol("radix.slottable");function SS(i){return y.isValidElement(i)&&typeof i.type=="function"&&"__radixId"in i.type&&i.type.__radixId===bS}function xS(i,l){const r={...l};for(const o in l){const c=i[o],f=l[o];/^on[A-Z]/.test(o)?c&&f?r[o]=(...h)=>{const b=f(...h);return c(...h),b}:c&&(r[o]=c):o==="style"?r[o]={...c,...f}:o==="className"&&(r[o]=[c,f].filter(Boolean).join(" "))}return{...i,...r}}function ES(i){let l=Object.getOwnPropertyDescriptor(i.props,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning;return r?i.ref:(l=Object.getOwnPropertyDescriptor(i,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}var TS=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],OS=TS.reduce((i,l)=>{const r=vS(`Primitive.${l}`),o=y.forwardRef((c,f)=>{const{asChild:m,...h}=c,b=m?r:l;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),E.jsx(b,{...h,ref:f})});return o.displayName=`Primitive.${l}`,{...i,[l]:o}},{}),Zu="focusScope.autoFocusOnMount",Fu="focusScope.autoFocusOnUnmount",Ym={bubbles:!1,cancelable:!0},CS="FocusScope",Lg=y.forwardRef((i,l)=>{const{loop:r=!1,trapped:o=!1,onMountAutoFocus:c,onUnmountAutoFocus:f,...m}=i,[h,b]=y.useState(null),v=Bi(c),x=Bi(f),g=y.useRef(null),D=Ba(l,B=>b(B)),z=y.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;y.useEffect(()=>{if(o){let B=function(Z){if(z.paused||!h)return;const I=Z.target;h.contains(I)?g.current=I:sa(g.current,{select:!0})},K=function(Z){if(z.paused||!h)return;const I=Z.relatedTarget;I!==null&&(h.contains(I)||sa(g.current,{select:!0}))},U=function(Z){if(document.activeElement===document.body)for(const ee of Z)ee.removedNodes.length>0&&sa(h)};document.addEventListener("focusin",B),document.addEventListener("focusout",K);const Q=new MutationObserver(U);return h&&Q.observe(h,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",B),document.removeEventListener("focusout",K),Q.disconnect()}}},[o,h,z.paused]),y.useEffect(()=>{if(h){Km.add(z);const B=document.activeElement;if(!h.contains(B)){const U=new CustomEvent(Zu,Ym);h.addEventListener(Zu,v),h.dispatchEvent(U),U.defaultPrevented||(NS(zS(Ug(h)),{select:!0}),document.activeElement===B&&sa(h))}return()=>{h.removeEventListener(Zu,v),setTimeout(()=>{const U=new CustomEvent(Fu,Ym);h.addEventListener(Fu,x),h.dispatchEvent(U),U.defaultPrevented||sa(B??document.body,{select:!0}),h.removeEventListener(Fu,x),Km.remove(z)},0)}}},[h,v,x,z]);const j=y.useCallback(B=>{if(!r&&!o||z.paused)return;const K=B.key==="Tab"&&!B.altKey&&!B.ctrlKey&&!B.metaKey,U=document.activeElement;if(K&&U){const Q=B.currentTarget,[Z,I]=AS(Q);Z&&I?!B.shiftKey&&U===I?(B.preventDefault(),r&&sa(Z,{select:!0})):B.shiftKey&&U===Z&&(B.preventDefault(),r&&sa(I,{select:!0})):U===Q&&B.preventDefault()}},[r,o,z.paused]);return E.jsx(OS.div,{tabIndex:-1,...m,ref:D,onKeyDown:j})});Lg.displayName=CS;function NS(i,{select:l=!1}={}){const r=document.activeElement;for(const o of i)if(sa(o,{select:l}),document.activeElement!==r)return}function AS(i){const l=Ug(i),r=km(l,i),o=km(l.reverse(),i);return[r,o]}function Ug(i){const l=[],r=document.createTreeWalker(i,NodeFilter.SHOW_ELEMENT,{acceptNode:o=>{const c=o.tagName==="INPUT"&&o.type==="hidden";return o.disabled||o.hidden||c?NodeFilter.FILTER_SKIP:o.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;r.nextNode();)l.push(r.currentNode);return l}function km(i,l){for(const r of i)if(!DS(r,{upTo:l}))return r}function DS(i,{upTo:l}){if(getComputedStyle(i).visibility==="hidden")return!0;for(;i;){if(l!==void 0&&i===l)return!1;if(getComputedStyle(i).display==="none")return!0;i=i.parentElement}return!1}function wS(i){return i instanceof HTMLInputElement&&"select"in i}function sa(i,{select:l=!1}={}){if(i&&i.focus){const r=document.activeElement;i.focus({preventScroll:!0}),i!==r&&wS(i)&&l&&i.select()}}var Km=RS();function RS(){let i=[];return{add(l){const r=i[0];l!==r&&r?.pause(),i=Gm(i,l),i.unshift(l)},remove(l){i=Gm(i,l),i[0]?.resume()}}}function Gm(i,l){const r=[...i],o=r.indexOf(l);return o!==-1&&r.splice(o,1),r}function zS(i){return i.filter(l=>l.tagName!=="A")}function MS(i){const l=_S(i),r=y.forwardRef((o,c)=>{const{children:f,...m}=o,h=y.Children.toArray(f),b=h.find(LS);if(b){const v=b.props.children,x=h.map(g=>g===b?y.Children.count(v)>1?y.Children.only(null):y.isValidElement(v)?v.props.children:null:g);return E.jsx(l,{...m,ref:c,children:y.isValidElement(v)?y.cloneElement(v,void 0,x):null})}return E.jsx(l,{...m,ref:c,children:f})});return r.displayName=`${i}.Slot`,r}function _S(i){const l=y.forwardRef((r,o)=>{const{children:c,...f}=r;if(y.isValidElement(c)){const m=BS(c),h=US(f,c.props);return c.type!==y.Fragment&&(h.ref=o?Pt(o,m):m),y.cloneElement(c,h)}return y.Children.count(c)>1?y.Children.only(null):null});return l.displayName=`${i}.SlotClone`,l}var jS=Symbol("radix.slottable");function LS(i){return y.isValidElement(i)&&typeof i.type=="function"&&"__radixId"in i.type&&i.type.__radixId===jS}function US(i,l){const r={...l};for(const o in l){const c=i[o],f=l[o];/^on[A-Z]/.test(o)?c&&f?r[o]=(...h)=>{const b=f(...h);return c(...h),b}:c&&(r[o]=c):o==="style"?r[o]={...c,...f}:o==="className"&&(r[o]=[c,f].filter(Boolean).join(" "))}return{...i,...r}}function BS(i){let l=Object.getOwnPropertyDescriptor(i.props,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning;return r?i.ref:(l=Object.getOwnPropertyDescriptor(i,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}var HS=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],qS=HS.reduce((i,l)=>{const r=MS(`Primitive.${l}`),o=y.forwardRef((c,f)=>{const{asChild:m,...h}=c,b=m?r:l;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),E.jsx(b,{...h,ref:f})});return o.displayName=`Primitive.${l}`,{...i,[l]:o}},{}),VS="Portal",Bg=y.forwardRef((i,l)=>{const{container:r,...o}=i,[c,f]=y.useState(!1);Ui(()=>f(!0),[]);const m=r||c&&globalThis?.document?.body;return m?ig.createPortal(E.jsx(qS.div,{...o,ref:l}),m):null});Bg.displayName=VS;function YS(i,l){return y.useReducer((r,o)=>l[r][o]??r,i)}var Er=i=>{const{present:l,children:r}=i,o=kS(l),c=typeof r=="function"?r({present:o.isPresent}):y.Children.only(r),f=Ba(o.ref,KS(c));return typeof r=="function"||o.isPresent?y.cloneElement(c,{ref:f}):null};Er.displayName="Presence";function kS(i){const[l,r]=y.useState(),o=y.useRef(null),c=y.useRef(i),f=y.useRef("none"),m=i?"mounted":"unmounted",[h,b]=YS(m,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return y.useEffect(()=>{const v=ir(o.current);f.current=h==="mounted"?v:"none"},[h]),Ui(()=>{const v=o.current,x=c.current;if(x!==i){const D=f.current,z=ir(v);i?b("MOUNT"):z==="none"||v?.display==="none"?b("UNMOUNT"):b(x&&D!==z?"ANIMATION_OUT":"UNMOUNT"),c.current=i}},[i,b]),Ui(()=>{if(l){let v;const x=l.ownerDocument.defaultView??window,g=z=>{const B=ir(o.current).includes(CSS.escape(z.animationName));if(z.target===l&&B&&(b("ANIMATION_END"),!c.current)){const K=l.style.animationFillMode;l.style.animationFillMode="forwards",v=x.setTimeout(()=>{l.style.animationFillMode==="forwards"&&(l.style.animationFillMode=K)})}},D=z=>{z.target===l&&(f.current=ir(o.current))};return l.addEventListener("animationstart",D),l.addEventListener("animationcancel",g),l.addEventListener("animationend",g),()=>{x.clearTimeout(v),l.removeEventListener("animationstart",D),l.removeEventListener("animationcancel",g),l.removeEventListener("animationend",g)}}else b("ANIMATION_END")},[l,b]),{isPresent:["mounted","unmountSuspended"].includes(h),ref:y.useCallback(v=>{o.current=v?getComputedStyle(v):null,r(v)},[])}}function ir(i){return i?.animationName||"none"}function KS(i){let l=Object.getOwnPropertyDescriptor(i.props,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning;return r?i.ref:(l=Object.getOwnPropertyDescriptor(i,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}function Hg(i){const l=GS(i),r=y.forwardRef((o,c)=>{const{children:f,...m}=o,h=y.Children.toArray(f),b=h.find(XS);if(b){const v=b.props.children,x=h.map(g=>g===b?y.Children.count(v)>1?y.Children.only(null):y.isValidElement(v)?v.props.children:null:g);return E.jsx(l,{...m,ref:c,children:y.isValidElement(v)?y.cloneElement(v,void 0,x):null})}return E.jsx(l,{...m,ref:c,children:f})});return r.displayName=`${i}.Slot`,r}function GS(i){const l=y.forwardRef((r,o)=>{const{children:c,...f}=r;if(y.isValidElement(c)){const m=FS(c),h=ZS(f,c.props);return c.type!==y.Fragment&&(h.ref=o?Pt(o,m):m),y.cloneElement(c,h)}return y.Children.count(c)>1?y.Children.only(null):null});return l.displayName=`${i}.SlotClone`,l}var QS=Symbol("radix.slottable");function XS(i){return y.isValidElement(i)&&typeof i.type=="function"&&"__radixId"in i.type&&i.type.__radixId===QS}function ZS(i,l){const r={...l};for(const o in l){const c=i[o],f=l[o];/^on[A-Z]/.test(o)?c&&f?r[o]=(...h)=>{const b=f(...h);return c(...h),b}:c&&(r[o]=c):o==="style"?r[o]={...c,...f}:o==="className"&&(r[o]=[c,f].filter(Boolean).join(" "))}return{...i,...r}}function FS(i){let l=Object.getOwnPropertyDescriptor(i.props,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning;return r?i.ref:(l=Object.getOwnPropertyDescriptor(i,"ref")?.get,r=l&&"isReactWarning"in l&&l.isReactWarning,r?i.props.ref:i.props.ref||i.ref)}var JS=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],qi=JS.reduce((i,l)=>{const r=Hg(`Primitive.${l}`),o=y.forwardRef((c,f)=>{const{asChild:m,...h}=c,b=m?r:l;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),E.jsx(b,{...h,ref:f})});return o.displayName=`Primitive.${l}`,{...i,[l]:o}},{}),Ju=0;function $S(){y.useEffect(()=>{const i=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",i[0]??Qm()),document.body.insertAdjacentElement("beforeend",i[1]??Qm()),Ju++,()=>{Ju===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(l=>l.remove()),Ju--}},[])}function Qm(){const i=document.createElement("span");return i.setAttribute("data-radix-focus-guard",""),i.tabIndex=0,i.style.outline="none",i.style.opacity="0",i.style.position="fixed",i.style.pointerEvents="none",i}var cn=function(){return cn=Object.assign||function(l){for(var r,o=1,c=arguments.length;o"u")return h1;var l=m1(i),r=document.documentElement.clientWidth,o=window.innerWidth;return{left:l[0],top:l[1],right:l[2],gap:Math.max(0,o-r+l[2]-l[0])}},p1=kg(),_l="data-scroll-locked",v1=function(i,l,r,o){var c=i.left,f=i.top,m=i.right,h=i.gap;return r===void 0&&(r="margin"),` + .`.concat(IS,` { + overflow: hidden `).concat(o,`; + padding-right: `).concat(h,"px ").concat(o,`; + } + body[`).concat(_l,`] { + overflow: hidden `).concat(o,`; + overscroll-behavior: contain; + `).concat([l&&"position: relative ".concat(o,";"),r==="margin"&&` + padding-left: `.concat(c,`px; + padding-top: `).concat(f,`px; + padding-right: `).concat(m,`px; + margin-left:0; + margin-top:0; + margin-right: `).concat(h,"px ").concat(o,`; + `),r==="padding"&&"padding-right: ".concat(h,"px ").concat(o,";")].filter(Boolean).join(""),` + } + + .`).concat(fr,` { + right: `).concat(h,"px ").concat(o,`; + } + + .`).concat(dr,` { + margin-right: `).concat(h,"px ").concat(o,`; + } + + .`).concat(fr," .").concat(fr,` { + right: 0 `).concat(o,`; + } + + .`).concat(dr," .").concat(dr,` { + margin-right: 0 `).concat(o,`; + } + + body[`).concat(_l,`] { + `).concat(PS,": ").concat(h,`px; + } +`)},Zm=function(){var i=parseInt(document.body.getAttribute(_l)||"0",10);return isFinite(i)?i:0},y1=function(){y.useEffect(function(){return document.body.setAttribute(_l,(Zm()+1).toString()),function(){var i=Zm()-1;i<=0?document.body.removeAttribute(_l):document.body.setAttribute(_l,i.toString())}},[])},b1=function(i){var l=i.noRelative,r=i.noImportant,o=i.gapMode,c=o===void 0?"margin":o;y1();var f=y.useMemo(function(){return g1(c)},[c]);return y.createElement(p1,{styles:v1(f,!l,c,r?"":"!important")})},oc=!1;if(typeof window<"u")try{var sr=Object.defineProperty({},"passive",{get:function(){return oc=!0,!0}});window.addEventListener("test",sr,sr),window.removeEventListener("test",sr,sr)}catch{oc=!1}var Nl=oc?{passive:!1}:!1,S1=function(i){return i.tagName==="TEXTAREA"},Kg=function(i,l){if(!(i instanceof Element))return!1;var r=window.getComputedStyle(i);return r[l]!=="hidden"&&!(r.overflowY===r.overflowX&&!S1(i)&&r[l]==="visible")},x1=function(i){return Kg(i,"overflowY")},E1=function(i){return Kg(i,"overflowX")},Fm=function(i,l){var r=l.ownerDocument,o=l;do{typeof ShadowRoot<"u"&&o instanceof ShadowRoot&&(o=o.host);var c=Gg(i,o);if(c){var f=Qg(i,o),m=f[1],h=f[2];if(m>h)return!0}o=o.parentNode}while(o&&o!==r.body);return!1},T1=function(i){var l=i.scrollTop,r=i.scrollHeight,o=i.clientHeight;return[l,r,o]},O1=function(i){var l=i.scrollLeft,r=i.scrollWidth,o=i.clientWidth;return[l,r,o]},Gg=function(i,l){return i==="v"?x1(l):E1(l)},Qg=function(i,l){return i==="v"?T1(l):O1(l)},C1=function(i,l){return i==="h"&&l==="rtl"?-1:1},N1=function(i,l,r,o,c){var f=C1(i,window.getComputedStyle(l).direction),m=f*o,h=r.target,b=l.contains(h),v=!1,x=m>0,g=0,D=0;do{if(!h)break;var z=Qg(i,h),j=z[0],B=z[1],K=z[2],U=B-K-f*j;(j||U)&&Gg(i,h)&&(g+=U,D+=j);var Q=h.parentNode;h=Q&&Q.nodeType===Node.DOCUMENT_FRAGMENT_NODE?Q.host:Q}while(!b&&h!==document.body||b&&(l.contains(h)||l===h));return(x&&Math.abs(g)<1||!x&&Math.abs(D)<1)&&(v=!0),v},rr=function(i){return"changedTouches"in i?[i.changedTouches[0].clientX,i.changedTouches[0].clientY]:[0,0]},Jm=function(i){return[i.deltaX,i.deltaY]},$m=function(i){return i&&"current"in i?i.current:i},A1=function(i,l){return i[0]===l[0]&&i[1]===l[1]},D1=function(i){return` + .block-interactivity-`.concat(i,` {pointer-events: none;} + .allow-interactivity-`).concat(i,` {pointer-events: all;} +`)},w1=0,Al=[];function R1(i){var l=y.useRef([]),r=y.useRef([0,0]),o=y.useRef(),c=y.useState(w1++)[0],f=y.useState(kg)[0],m=y.useRef(i);y.useEffect(function(){m.current=i},[i]),y.useEffect(function(){if(i.inert){document.body.classList.add("block-interactivity-".concat(c));var B=WS([i.lockRef.current],(i.shards||[]).map($m),!0).filter(Boolean);return B.forEach(function(K){return K.classList.add("allow-interactivity-".concat(c))}),function(){document.body.classList.remove("block-interactivity-".concat(c)),B.forEach(function(K){return K.classList.remove("allow-interactivity-".concat(c))})}}},[i.inert,i.lockRef.current,i.shards]);var h=y.useCallback(function(B,K){if("touches"in B&&B.touches.length===2||B.type==="wheel"&&B.ctrlKey)return!m.current.allowPinchZoom;var U=rr(B),Q=r.current,Z="deltaX"in B?B.deltaX:Q[0]-U[0],I="deltaY"in B?B.deltaY:Q[1]-U[1],ee,J=B.target,X=Math.abs(Z)>Math.abs(I)?"h":"v";if("touches"in B&&X==="h"&&J.type==="range")return!1;var ve=window.getSelection(),ae=ve&&ve.anchorNode,te=ae?ae===J||ae.contains(J):!1;if(te)return!1;var fe=Fm(X,J);if(!fe)return!0;if(fe?ee=X:(ee=X==="v"?"h":"v",fe=Fm(X,J)),!fe)return!1;if(!o.current&&"changedTouches"in B&&(Z||I)&&(o.current=ee),!ee)return!0;var re=o.current||ee;return N1(re,K,B,re==="h"?Z:I)},[]),b=y.useCallback(function(B){var K=B;if(!(!Al.length||Al[Al.length-1]!==f)){var U="deltaY"in K?Jm(K):rr(K),Q=l.current.filter(function(ee){return ee.name===K.type&&(ee.target===K.target||K.target===ee.shadowParent)&&A1(ee.delta,U)})[0];if(Q&&Q.should){K.cancelable&&K.preventDefault();return}if(!Q){var Z=(m.current.shards||[]).map($m).filter(Boolean).filter(function(ee){return ee.contains(K.target)}),I=Z.length>0?h(K,Z[0]):!m.current.noIsolation;I&&K.cancelable&&K.preventDefault()}}},[]),v=y.useCallback(function(B,K,U,Q){var Z={name:B,delta:K,target:U,should:Q,shadowParent:z1(U)};l.current.push(Z),setTimeout(function(){l.current=l.current.filter(function(I){return I!==Z})},1)},[]),x=y.useCallback(function(B){r.current=rr(B),o.current=void 0},[]),g=y.useCallback(function(B){v(B.type,Jm(B),B.target,h(B,i.lockRef.current))},[]),D=y.useCallback(function(B){v(B.type,rr(B),B.target,h(B,i.lockRef.current))},[]);y.useEffect(function(){return Al.push(f),i.setCallbacks({onScrollCapture:g,onWheelCapture:g,onTouchMoveCapture:D}),document.addEventListener("wheel",b,Nl),document.addEventListener("touchmove",b,Nl),document.addEventListener("touchstart",x,Nl),function(){Al=Al.filter(function(B){return B!==f}),document.removeEventListener("wheel",b,Nl),document.removeEventListener("touchmove",b,Nl),document.removeEventListener("touchstart",x,Nl)}},[]);var z=i.removeScrollBar,j=i.inert;return y.createElement(y.Fragment,null,j?y.createElement(f,{styles:D1(c)}):null,z?y.createElement(b1,{noRelative:i.noRelative,gapMode:i.gapMode}):null)}function z1(i){for(var l=null;i!==null;)i instanceof ShadowRoot&&(l=i.host,i=i.host),i=i.parentNode;return l}const M1=s1(Yg,R1);var Xg=y.forwardRef(function(i,l){return y.createElement(Tr,cn({},i,{ref:l,sideCar:M1}))});Xg.classNames=Tr.classNames;var _1=function(i){if(typeof document>"u")return null;var l=Array.isArray(i)?i[0]:i;return l.ownerDocument.body},Dl=new WeakMap,or=new WeakMap,ur={},Pu=0,Zg=function(i){return i&&(i.host||Zg(i.parentNode))},j1=function(i,l){return l.map(function(r){if(i.contains(r))return r;var o=Zg(r);return o&&i.contains(o)?o:(console.error("aria-hidden",r,"in not contained inside",i,". Doing nothing"),null)}).filter(function(r){return!!r})},L1=function(i,l,r,o){var c=j1(l,Array.isArray(i)?i:[i]);ur[r]||(ur[r]=new WeakMap);var f=ur[r],m=[],h=new Set,b=new Set(c),v=function(g){!g||h.has(g)||(h.add(g),v(g.parentNode))};c.forEach(v);var x=function(g){!g||b.has(g)||Array.prototype.forEach.call(g.children,function(D){if(h.has(D))x(D);else try{var z=D.getAttribute(o),j=z!==null&&z!=="false",B=(Dl.get(D)||0)+1,K=(f.get(D)||0)+1;Dl.set(D,B),f.set(D,K),m.push(D),B===1&&j&&or.set(D,!0),K===1&&D.setAttribute(r,"true"),j||D.setAttribute(o,"true")}catch(U){console.error("aria-hidden: cannot operate on ",D,U)}})};return x(l),h.clear(),Pu++,function(){m.forEach(function(g){var D=Dl.get(g)-1,z=f.get(g)-1;Dl.set(g,D),f.set(g,z),D||(or.has(g)||g.removeAttribute(o),or.delete(g)),z||g.removeAttribute(r)}),Pu--,Pu||(Dl=new WeakMap,Dl=new WeakMap,or=new WeakMap,ur={})}},U1=function(i,l,r){r===void 0&&(r="data-aria-hidden");var o=Array.from(Array.isArray(i)?i:[i]),c=_1(i);return c?(o.push.apply(o,Array.from(c.querySelectorAll("[aria-live], script"))),L1(o,c,r,"aria-hidden")):function(){return null}},Or="Dialog",[Fg]=Zb(Or),[B1,en]=Fg(Or),Jg=i=>{const{__scopeDialog:l,children:r,open:o,defaultOpen:c,onOpenChange:f,modal:m=!0}=i,h=y.useRef(null),b=y.useRef(null),[v,x]=Ib({prop:o,defaultProp:c??!1,onChange:f,caller:Or});return E.jsx(B1,{scope:l,triggerRef:h,contentRef:b,contentId:Mn(),titleId:Mn(),descriptionId:Mn(),open:v,onOpenChange:x,onOpenToggle:y.useCallback(()=>x(g=>!g),[x]),modal:m,children:r})};Jg.displayName=Or;var $g="DialogTrigger",H1=y.forwardRef((i,l)=>{const{__scopeDialog:r,...o}=i,c=en($g,r),f=Ba(l,c.triggerRef);return E.jsx(qi.button,{type:"button","aria-haspopup":"dialog","aria-expanded":c.open,"aria-controls":c.contentId,"data-state":gc(c.open),...o,ref:f,onClick:ra(i.onClick,c.onOpenToggle)})});H1.displayName=$g;var hc="DialogPortal",[q1,Wg]=Fg(hc,{forceMount:void 0}),Ig=i=>{const{__scopeDialog:l,forceMount:r,children:o,container:c}=i,f=en(hc,l);return E.jsx(q1,{scope:l,forceMount:r,children:y.Children.map(o,m=>E.jsx(Er,{present:r||f.open,children:E.jsx(Bg,{asChild:!0,container:c,children:m})}))})};Ig.displayName=hc;var yr="DialogOverlay",Pg=y.forwardRef((i,l)=>{const r=Wg(yr,i.__scopeDialog),{forceMount:o=r.forceMount,...c}=i,f=en(yr,i.__scopeDialog);return f.modal?E.jsx(Er,{present:o||f.open,children:E.jsx(Y1,{...c,ref:l})}):null});Pg.displayName=yr;var V1=Hg("DialogOverlay.RemoveScroll"),Y1=y.forwardRef((i,l)=>{const{__scopeDialog:r,...o}=i,c=en(yr,r);return E.jsx(Xg,{as:V1,allowPinchZoom:!0,shards:[c.contentRef],children:E.jsx(qi.div,{"data-state":gc(c.open),...o,ref:l,style:{pointerEvents:"auto",...o.style}})})}),La="DialogContent",ep=y.forwardRef((i,l)=>{const r=Wg(La,i.__scopeDialog),{forceMount:o=r.forceMount,...c}=i,f=en(La,i.__scopeDialog);return E.jsx(Er,{present:o||f.open,children:f.modal?E.jsx(k1,{...c,ref:l}):E.jsx(K1,{...c,ref:l})})});ep.displayName=La;var k1=y.forwardRef((i,l)=>{const r=en(La,i.__scopeDialog),o=y.useRef(null),c=Ba(l,r.contentRef,o);return y.useEffect(()=>{const f=o.current;if(f)return U1(f)},[]),E.jsx(tp,{...i,ref:c,trapFocus:r.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:ra(i.onCloseAutoFocus,f=>{f.preventDefault(),r.triggerRef.current?.focus()}),onPointerDownOutside:ra(i.onPointerDownOutside,f=>{const m=f.detail.originalEvent,h=m.button===0&&m.ctrlKey===!0;(m.button===2||h)&&f.preventDefault()}),onFocusOutside:ra(i.onFocusOutside,f=>f.preventDefault())})}),K1=y.forwardRef((i,l)=>{const r=en(La,i.__scopeDialog),o=y.useRef(!1),c=y.useRef(!1);return E.jsx(tp,{...i,ref:l,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:f=>{i.onCloseAutoFocus?.(f),f.defaultPrevented||(o.current||r.triggerRef.current?.focus(),f.preventDefault()),o.current=!1,c.current=!1},onInteractOutside:f=>{i.onInteractOutside?.(f),f.defaultPrevented||(o.current=!0,f.detail.originalEvent.type==="pointerdown"&&(c.current=!0));const m=f.target;r.triggerRef.current?.contains(m)&&f.preventDefault(),f.detail.originalEvent.type==="focusin"&&c.current&&f.preventDefault()}})}),tp=y.forwardRef((i,l)=>{const{__scopeDialog:r,trapFocus:o,onOpenAutoFocus:c,onCloseAutoFocus:f,...m}=i,h=en(La,r),b=y.useRef(null),v=Ba(l,b);return $S(),E.jsxs(E.Fragment,{children:[E.jsx(Lg,{asChild:!0,loop:!0,trapped:o,onMountAutoFocus:c,onUnmountAutoFocus:f,children:E.jsx(_g,{role:"dialog",id:h.contentId,"aria-describedby":h.descriptionId,"aria-labelledby":h.titleId,"data-state":gc(h.open),...m,ref:v,onDismiss:()=>h.onOpenChange(!1)})}),E.jsxs(E.Fragment,{children:[E.jsx(Z1,{titleId:h.titleId}),E.jsx(J1,{contentRef:b,descriptionId:h.descriptionId})]})]})}),mc="DialogTitle",G1=y.forwardRef((i,l)=>{const{__scopeDialog:r,...o}=i,c=en(mc,r);return E.jsx(qi.h2,{id:c.titleId,...o,ref:l})});G1.displayName=mc;var np="DialogDescription",Q1=y.forwardRef((i,l)=>{const{__scopeDialog:r,...o}=i,c=en(np,r);return E.jsx(qi.p,{id:c.descriptionId,...o,ref:l})});Q1.displayName=np;var ap="DialogClose",X1=y.forwardRef((i,l)=>{const{__scopeDialog:r,...o}=i,c=en(ap,r);return E.jsx(qi.button,{type:"button",...o,ref:l,onClick:ra(i.onClick,()=>c.onOpenChange(!1))})});X1.displayName=ap;function gc(i){return i?"open":"closed"}var lp="DialogTitleWarning",[FE,ip]=Xb(lp,{contentName:La,titleName:mc,docsSlug:"dialog"}),Z1=({titleId:i})=>{const l=ip(lp),r=`\`${l.contentName}\` requires a \`${l.titleName}\` for the component to be accessible for screen reader users. + +If you want to hide the \`${l.titleName}\`, you can wrap it with our VisuallyHidden component. + +For more information, see https://radix-ui.com/primitives/docs/components/${l.docsSlug}`;return y.useEffect(()=>{i&&(document.getElementById(i)||console.error(r))},[r,i]),null},F1="DialogDescriptionWarning",J1=({contentRef:i,descriptionId:l})=>{const o=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${ip(F1).contentName}}.`;return y.useEffect(()=>{const c=i.current?.getAttribute("aria-describedby");l&&c&&(document.getElementById(l)||console.warn(o))},[o,i,l]),null},$1=Jg,W1=Ig,I1=Pg,P1=ep,ex=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],ua=ex.reduce((i,l)=>{const r=Dg(`Primitive.${l}`),o=y.forwardRef((c,f)=>{const{asChild:m,...h}=c,b=m?r:l;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),E.jsx(b,{...h,ref:f})});return o.displayName=`Primitive.${l}`,{...i,[l]:o}},{}),zi='[cmdk-group=""]',ec='[cmdk-group-items=""]',tx='[cmdk-group-heading=""]',sp='[cmdk-item=""]',Wm=`${sp}:not([aria-disabled="true"])`,uc="cmdk-item-select",zl="data-value",nx=(i,l,r)=>Qb(i,l,r),rp=y.createContext(void 0),Vi=()=>y.useContext(rp),op=y.createContext(void 0),pc=()=>y.useContext(op),up=y.createContext(void 0),cp=y.forwardRef((i,l)=>{let r=Ml(()=>{var _,q;return{search:"",value:(q=(_=i.value)!=null?_:i.defaultValue)!=null?q:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),o=Ml(()=>new Set),c=Ml(()=>new Map),f=Ml(()=>new Map),m=Ml(()=>new Set),h=fp(i),{label:b,children:v,value:x,onValueChange:g,filter:D,shouldFilter:z,loop:j,disablePointerSelection:B=!1,vimBindings:K=!0,...U}=i,Q=Mn(),Z=Mn(),I=Mn(),ee=y.useRef(null),J=hx();Ua(()=>{if(x!==void 0){let _=x.trim();r.current.value=_,X.emit()}},[x]),Ua(()=>{J(6,Ee)},[]);let X=y.useMemo(()=>({subscribe:_=>(m.current.add(_),()=>m.current.delete(_)),snapshot:()=>r.current,setState:(_,q,G)=>{var k,le,Se,ue;if(!Object.is(r.current[_],q)){if(r.current[_]=q,_==="search")re(),te(),J(1,fe);else if(_==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let Ae=document.getElementById(I);Ae?Ae.focus():(k=document.getElementById(Q))==null||k.focus()}if(J(7,()=>{var Ae;r.current.selectedItemId=(Ae=Te())==null?void 0:Ae.id,X.emit()}),G||J(5,Ee),((le=h.current)==null?void 0:le.value)!==void 0){let Ae=q??"";(ue=(Se=h.current).onValueChange)==null||ue.call(Se,Ae);return}}X.emit()}},emit:()=>{m.current.forEach(_=>_())}}),[]),ve=y.useMemo(()=>({value:(_,q,G)=>{var k;q!==((k=f.current.get(_))==null?void 0:k.value)&&(f.current.set(_,{value:q,keywords:G}),r.current.filtered.items.set(_,ae(q,G)),J(2,()=>{te(),X.emit()}))},item:(_,q)=>(o.current.add(_),q&&(c.current.has(q)?c.current.get(q).add(_):c.current.set(q,new Set([_]))),J(3,()=>{re(),te(),r.current.value||fe(),X.emit()}),()=>{f.current.delete(_),o.current.delete(_),r.current.filtered.items.delete(_);let G=Te();J(4,()=>{re(),G?.getAttribute("id")===_&&fe(),X.emit()})}),group:_=>(c.current.has(_)||c.current.set(_,new Set),()=>{f.current.delete(_),c.current.delete(_)}),filter:()=>h.current.shouldFilter,label:b||i["aria-label"],getDisablePointerSelection:()=>h.current.disablePointerSelection,listId:Q,inputId:I,labelId:Z,listInnerRef:ee}),[]);function ae(_,q){var G,k;let le=(k=(G=h.current)==null?void 0:G.filter)!=null?k:nx;return _?le(_,r.current.search,q):0}function te(){if(!r.current.search||h.current.shouldFilter===!1)return;let _=r.current.filtered.items,q=[];r.current.filtered.groups.forEach(k=>{let le=c.current.get(k),Se=0;le.forEach(ue=>{let Ae=_.get(ue);Se=Math.max(Ae,Se)}),q.push([k,Se])});let G=ee.current;je().sort((k,le)=>{var Se,ue;let Ae=k.getAttribute("id"),At=le.getAttribute("id");return((Se=_.get(At))!=null?Se:0)-((ue=_.get(Ae))!=null?ue:0)}).forEach(k=>{let le=k.closest(ec);le?le.appendChild(k.parentElement===le?k:k.closest(`${ec} > *`)):G.appendChild(k.parentElement===G?k:k.closest(`${ec} > *`))}),q.sort((k,le)=>le[1]-k[1]).forEach(k=>{var le;let Se=(le=ee.current)==null?void 0:le.querySelector(`${zi}[${zl}="${encodeURIComponent(k[0])}"]`);Se?.parentElement.appendChild(Se)})}function fe(){let _=je().find(G=>G.getAttribute("aria-disabled")!=="true"),q=_?.getAttribute(zl);X.setState("value",q||void 0)}function re(){var _,q,G,k;if(!r.current.search||h.current.shouldFilter===!1){r.current.filtered.count=o.current.size;return}r.current.filtered.groups=new Set;let le=0;for(let Se of o.current){let ue=(q=(_=f.current.get(Se))==null?void 0:_.value)!=null?q:"",Ae=(k=(G=f.current.get(Se))==null?void 0:G.keywords)!=null?k:[],At=ae(ue,Ae);r.current.filtered.items.set(Se,At),At>0&&le++}for(let[Se,ue]of c.current)for(let Ae of ue)if(r.current.filtered.items.get(Ae)>0){r.current.filtered.groups.add(Se);break}r.current.filtered.count=le}function Ee(){var _,q,G;let k=Te();k&&(((_=k.parentElement)==null?void 0:_.firstChild)===k&&((G=(q=k.closest(zi))==null?void 0:q.querySelector(tx))==null||G.scrollIntoView({block:"nearest"})),k.scrollIntoView({block:"nearest"}))}function Te(){var _;return(_=ee.current)==null?void 0:_.querySelector(`${sp}[aria-selected="true"]`)}function je(){var _;return Array.from(((_=ee.current)==null?void 0:_.querySelectorAll(Wm))||[])}function A(_){let q=je()[_];q&&X.setState("value",q.getAttribute(zl))}function V(_){var q;let G=Te(),k=je(),le=k.findIndex(ue=>ue===G),Se=k[le+_];(q=h.current)!=null&&q.loop&&(Se=le+_<0?k[k.length-1]:le+_===k.length?k[0]:k[le+_]),Se&&X.setState("value",Se.getAttribute(zl))}function $(_){let q=Te(),G=q?.closest(zi),k;for(;G&&!k;)G=_>0?fx(G,zi):dx(G,zi),k=G?.querySelector(Wm);k?X.setState("value",k.getAttribute(zl)):V(_)}let de=()=>A(je().length-1),oe=_=>{_.preventDefault(),_.metaKey?de():_.altKey?$(1):V(1)},me=_=>{_.preventDefault(),_.metaKey?A(0):_.altKey?$(-1):V(-1)};return y.createElement(ua.div,{ref:l,tabIndex:-1,...U,"cmdk-root":"",onKeyDown:_=>{var q;(q=U.onKeyDown)==null||q.call(U,_);let G=_.nativeEvent.isComposing||_.keyCode===229;if(!(_.defaultPrevented||G))switch(_.key){case"n":case"j":{K&&_.ctrlKey&&oe(_);break}case"ArrowDown":{oe(_);break}case"p":case"k":{K&&_.ctrlKey&&me(_);break}case"ArrowUp":{me(_);break}case"Home":{_.preventDefault(),A(0);break}case"End":{_.preventDefault(),de();break}case"Enter":{_.preventDefault();let k=Te();if(k){let le=new Event(uc);k.dispatchEvent(le)}}}}},y.createElement("label",{"cmdk-label":"",htmlFor:ve.inputId,id:ve.labelId,style:gx},b),Cr(i,_=>y.createElement(op.Provider,{value:X},y.createElement(rp.Provider,{value:ve},_))))}),ax=y.forwardRef((i,l)=>{var r,o;let c=Mn(),f=y.useRef(null),m=y.useContext(up),h=Vi(),b=fp(i),v=(o=(r=b.current)==null?void 0:r.forceMount)!=null?o:m?.forceMount;Ua(()=>{if(!v)return h.item(c,m?.id)},[v]);let x=dp(c,f,[i.value,i.children,f],i.keywords),g=pc(),D=oa(J=>J.value&&J.value===x.current),z=oa(J=>v||h.filter()===!1?!0:J.search?J.filtered.items.get(c)>0:!0);y.useEffect(()=>{let J=f.current;if(!(!J||i.disabled))return J.addEventListener(uc,j),()=>J.removeEventListener(uc,j)},[z,i.onSelect,i.disabled]);function j(){var J,X;B(),(X=(J=b.current).onSelect)==null||X.call(J,x.current)}function B(){g.setState("value",x.current,!0)}if(!z)return null;let{disabled:K,value:U,onSelect:Q,forceMount:Z,keywords:I,...ee}=i;return y.createElement(ua.div,{ref:Pt(f,l),...ee,id:c,"cmdk-item":"",role:"option","aria-disabled":!!K,"aria-selected":!!D,"data-disabled":!!K,"data-selected":!!D,onPointerMove:K||h.getDisablePointerSelection()?void 0:B,onClick:K?void 0:j},i.children)}),lx=y.forwardRef((i,l)=>{let{heading:r,children:o,forceMount:c,...f}=i,m=Mn(),h=y.useRef(null),b=y.useRef(null),v=Mn(),x=Vi(),g=oa(z=>c||x.filter()===!1?!0:z.search?z.filtered.groups.has(m):!0);Ua(()=>x.group(m),[]),dp(m,h,[i.value,i.heading,b]);let D=y.useMemo(()=>({id:m,forceMount:c}),[c]);return y.createElement(ua.div,{ref:Pt(h,l),...f,"cmdk-group":"",role:"presentation",hidden:g?void 0:!0},r&&y.createElement("div",{ref:b,"cmdk-group-heading":"","aria-hidden":!0,id:v},r),Cr(i,z=>y.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":r?v:void 0},y.createElement(up.Provider,{value:D},z))))}),ix=y.forwardRef((i,l)=>{let{alwaysRender:r,...o}=i,c=y.useRef(null),f=oa(m=>!m.search);return!r&&!f?null:y.createElement(ua.div,{ref:Pt(c,l),...o,"cmdk-separator":"",role:"separator"})}),sx=y.forwardRef((i,l)=>{let{onValueChange:r,...o}=i,c=i.value!=null,f=pc(),m=oa(v=>v.search),h=oa(v=>v.selectedItemId),b=Vi();return y.useEffect(()=>{i.value!=null&&f.setState("search",i.value)},[i.value]),y.createElement(ua.input,{ref:l,...o,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":b.listId,"aria-labelledby":b.labelId,"aria-activedescendant":h,id:b.inputId,type:"text",value:c?i.value:m,onChange:v=>{c||f.setState("search",v.target.value),r?.(v.target.value)}})}),rx=y.forwardRef((i,l)=>{let{children:r,label:o="Suggestions",...c}=i,f=y.useRef(null),m=y.useRef(null),h=oa(v=>v.selectedItemId),b=Vi();return y.useEffect(()=>{if(m.current&&f.current){let v=m.current,x=f.current,g,D=new ResizeObserver(()=>{g=requestAnimationFrame(()=>{let z=v.offsetHeight;x.style.setProperty("--cmdk-list-height",z.toFixed(1)+"px")})});return D.observe(v),()=>{cancelAnimationFrame(g),D.unobserve(v)}}},[]),y.createElement(ua.div,{ref:Pt(f,l),...c,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":h,"aria-label":o,id:b.listId},Cr(i,v=>y.createElement("div",{ref:Pt(m,b.listInnerRef),"cmdk-list-sizer":""},v)))}),ox=y.forwardRef((i,l)=>{let{open:r,onOpenChange:o,overlayClassName:c,contentClassName:f,container:m,...h}=i;return y.createElement($1,{open:r,onOpenChange:o},y.createElement(W1,{container:m},y.createElement(I1,{"cmdk-overlay":"",className:c}),y.createElement(P1,{"aria-label":i.label,"cmdk-dialog":"",className:f},y.createElement(cp,{ref:l,...h}))))}),ux=y.forwardRef((i,l)=>oa(r=>r.filtered.count===0)?y.createElement(ua.div,{ref:l,...i,"cmdk-empty":"",role:"presentation"}):null),cx=y.forwardRef((i,l)=>{let{progress:r,children:o,label:c="Loading...",...f}=i;return y.createElement(ua.div,{ref:l,...f,"cmdk-loading":"",role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,"aria-label":c},Cr(i,m=>y.createElement("div",{"aria-hidden":!0},m)))}),Ut=Object.assign(cp,{List:rx,Item:ax,Input:sx,Group:lx,Separator:ix,Dialog:ox,Empty:ux,Loading:cx});function fx(i,l){let r=i.nextElementSibling;for(;r;){if(r.matches(l))return r;r=r.nextElementSibling}}function dx(i,l){let r=i.previousElementSibling;for(;r;){if(r.matches(l))return r;r=r.previousElementSibling}}function fp(i){let l=y.useRef(i);return Ua(()=>{l.current=i}),l}var Ua=typeof window>"u"?y.useEffect:y.useLayoutEffect;function Ml(i){let l=y.useRef();return l.current===void 0&&(l.current=i()),l}function oa(i){let l=pc(),r=()=>i(l.snapshot());return y.useSyncExternalStore(l.subscribe,r,r)}function dp(i,l,r,o=[]){let c=y.useRef(),f=Vi();return Ua(()=>{var m;let h=(()=>{var v;for(let x of r){if(typeof x=="string")return x.trim();if(typeof x=="object"&&"current"in x)return x.current?(v=x.current.textContent)==null?void 0:v.trim():c.current}})(),b=o.map(v=>v.trim());f.value(i,h,b),(m=l.current)==null||m.setAttribute(zl,h),c.current=h}),c}var hx=()=>{let[i,l]=y.useState(),r=Ml(()=>new Map);return Ua(()=>{r.current.forEach(o=>o()),r.current=new Map},[i]),(o,c)=>{r.current.set(o,c),l({})}};function mx(i){let l=i.type;return typeof l=="function"?l(i.props):"render"in l?l.render(i.props):i}function Cr({asChild:i,children:l},r){return i&&y.isValidElement(l)?y.cloneElement(mx(l),{ref:l.ref},r(l.props.children)):r(l)}var gx={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};const px="https://pay.theio.vn",vx={vn:{product:"NM-PRO-YEARLY",original:"1.190.000 VND",price:"595.000 VND",method:"Bank Transfer (VietQR)",flag:"🇻🇳"},intl:{product:"NM-PRO-YEARLY",original:"$89 USD",price:"$49 USD",method:"Card / PayPal (Polar)",flag:"🌐"}};let cc=null;function Im(){cc?.()}function yx(){const[i,l]=y.useState(!1),[r,o]=y.useState("choose"),[c,f]=y.useState(""),[m,h]=y.useState(!1),[b,v]=y.useState(!1),[x,g]=y.useState(""),{t:D}=xr();return y.useEffect(()=>(cc=()=>l(!0),()=>{cc=null}),[]),y.useEffect(()=>{i||(o("choose"),f(""),g(""),v(!1))},[i]),y.useEffect(()=>{if(!i)return;const z=j=>{j.key==="Escape"&&l(!1)};return document.addEventListener("keydown",z),()=>document.removeEventListener("keydown",z)},[i]),y.useCallback(async z=>{const j=vx[z],B=prompt(D("upgrade.enterEmail","Enter your email for the license:"));if(B){try{const Q=await(await fetch(`${px}${z==="intl"?"/checkout/polar":"/order/sepay"}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({product:j.product,email:B})})).json();Q.url?window.open(Q.url,"_blank"):Q.qr_url&&window.open(Q.qr_url,"_blank")}catch{z==="intl"&&window.open("https://polar.sh/nhadaututtheky","_blank")}l(!1)}},[D]),y.useCallback(async()=>{const z=c.trim();if(z){h(!0),g("");try{const j=await qe.post("/api/dashboard/license/activate",{license_key:z});j.success?(v(!0),setTimeout(()=>{l(!1),window.location.reload()},1500)):g(j.error||D("upgrade.activationFailed","Activation failed"))}catch{g(D("upgrade.activationFailed","Activation failed. Check key format."))}finally{h(!1)}}},[c,D]),null}const bx=[{path:"/",icon:og,labelKey:"nav.overview"},{path:"/health",icon:ug,labelKey:"nav.health"},{path:"/graph",icon:cg,labelKey:"nav.graph"},{path:"/timeline",icon:fg,labelKey:"nav.timeline"},{path:"/evolution",icon:dg,labelKey:"nav.evolution"},{path:"/diagrams",icon:hg,labelKey:"nav.mindmap"},{path:"/sync",icon:mg,labelKey:"nav.sync"},{path:"/oracle",icon:gg,labelKey:"nav.oracle"},{path:"/tool-stats",icon:pg,labelKey:"nav.toolStats"},{path:"/settings",icon:vg,labelKey:"nav.settings"}],Pm={fact:"#06b6d4",decision:"#f59e0b",error:"#ef4444",insight:"#8b5cf6",preference:"#ec4899",workflow:"#059669",instruction:"#6366f1",pattern:"#14b8a6",concept:"#6366f1",entity:"#06b6d4"};function Sx(){const[i,l]=y.useState(!1),[r,o]=y.useState(""),[c,f]=y.useState([]),[m,h]=y.useState(!1),b=y.useRef(null),v=My(),{data:x}=jb(),{t:g}=xr();y.useEffect(()=>{const U=Q=>{(Q.metaKey||Q.ctrlKey)&&Q.key==="k"&&(Q.preventDefault(),l(Z=>!Z))};return document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)},[]),y.useEffect(()=>{i||(o(""),f([]))},[i]);const D=y.useCallback(U=>{if(b.current&&clearTimeout(b.current),U.length<2){f([]),h(!1);return}h(!0),b.current=setTimeout(async()=>{try{const Q=await qe.get(`/neurons?content_contains=${encodeURIComponent(U)}&limit=8`);f(Q.neurons??[])}catch{f([])}finally{h(!1)}},300)},[]),z=U=>{o(U),D(U)},j=U=>{v(U),l(!1)},B=x?.fibers??[],K=r.length>0?B.filter(U=>U.summary.toLowerCase().includes(r.toLowerCase())):B.slice(0,5);return E.jsxs(E.Fragment,{children:[E.jsxs("button",{onClick:()=>l(!0),className:"flex items-center gap-2 rounded-lg border border-border bg-card px-3 py-1.5 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground cursor-pointer","aria-label":g("commandPalette.placeholder"),children:[E.jsx(um,{className:"size-3.5","aria-hidden":"true"}),E.jsx("span",{className:"hidden sm:inline",children:g("commandPalette.search")}),E.jsxs("kbd",{className:"pointer-events-none hidden select-none rounded border border-border bg-muted px-1.5 py-0.5 font-mono text-[10px] font-medium sm:inline-flex",children:[E.jsx(Yy,{className:"mr-0.5 inline size-2.5","aria-hidden":"true"}),"K"]})]}),i&&sg.createPortal(E.jsx("div",{className:"fixed inset-0 z-[100] flex items-start justify-center pt-[15vh] bg-black/50 backdrop-blur-sm",onClick:U=>{U.target===U.currentTarget&&l(!1)},children:E.jsxs(Ut,{className:"w-full max-w-lg rounded-xl border border-border bg-card shadow-lg overflow-hidden",shouldFilter:!1,children:[E.jsxs("div",{className:"flex items-center border-b border-border px-3",children:[E.jsx(um,{className:"mr-2 size-4 shrink-0 text-muted-foreground","aria-hidden":"true"}),E.jsx(Ut.Input,{value:r,onValueChange:z,placeholder:g("commandPalette.placeholder"),className:"flex h-11 w-full bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground"}),m&&E.jsx("div",{className:"size-4 shrink-0 animate-spin rounded-full border-2 border-muted-foreground border-t-transparent"})]}),E.jsxs(Ut.List,{className:"max-h-80 overflow-y-auto px-2 py-2",children:[E.jsx(Ut.Empty,{className:"py-6 text-center text-sm text-muted-foreground",children:g("commandPalette.noResults")}),E.jsx(Ut.Group,{heading:E.jsx("span",{className:"px-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground",children:g("commandPalette.pages")}),children:bx.map(({path:U,icon:Q,labelKey:Z})=>E.jsxs(Ut.Item,{value:`page-${g(Z)}`,onSelect:()=>j(U),className:"flex items-center gap-3 rounded-lg px-3 py-2 text-sm cursor-pointer aria-selected:bg-accent",children:[E.jsx(Q,{className:"size-4 text-muted-foreground","aria-hidden":"true"}),E.jsx("span",{children:g(Z)})]},U))}),K.length>0&&E.jsx(Ut.Group,{heading:E.jsx("span",{className:"px-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground",children:g("commandPalette.fibers")}),children:K.slice(0,6).map(U=>E.jsxs(Ut.Item,{value:`fiber-${U.summary}`,onSelect:()=>{v("/diagrams"),l(!1)},className:"flex items-center gap-3 rounded-lg px-3 py-2 text-sm cursor-pointer aria-selected:bg-accent",children:[E.jsx(ky,{className:"size-4 text-muted-foreground","aria-hidden":"true"}),E.jsx("span",{className:"flex-1 truncate",children:U.summary}),E.jsx("span",{className:"text-[10px] text-muted-foreground font-mono",children:U.neuron_count})]},U.id))}),c.length>0&&E.jsx(Ut.Group,{heading:E.jsx("span",{className:"px-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground",children:g("commandPalette.neurons")}),children:c.map(U=>E.jsxs(Ut.Item,{value:`neuron-${U.id}`,onSelect:()=>{v("/graph"),l(!1)},className:"flex items-center gap-3 rounded-lg px-3 py-2 text-sm cursor-pointer aria-selected:bg-accent",children:[E.jsx(rg,{className:"size-4 text-muted-foreground","aria-hidden":"true"}),E.jsx("span",{className:"flex-1 truncate text-xs",children:U.content}),E.jsx("span",{className:"shrink-0 rounded-full px-1.5 py-0.5 text-[9px] font-semibold",style:{backgroundColor:`${Pm[U.type]??"#94a3b8"}20`,color:Pm[U.type]??"#94a3b8"},children:U.type})]},U.id))}),E.jsxs(Ut.Group,{heading:E.jsx("span",{className:"px-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground",children:"Pro"}),children:[E.jsxs(Ut.Item,{value:"pro-semantic-search",onSelect:()=>{l(!1),Im()},className:"flex items-center gap-3 rounded-lg px-3 py-2 text-sm opacity-60 cursor-pointer aria-selected:bg-accent aria-selected:opacity-100",children:[E.jsx(cm,{className:"size-4 text-muted-foreground","aria-hidden":"true"}),E.jsx("span",{className:"flex-1",children:g("commandPalette.semanticSearch")}),E.jsx("span",{className:"rounded-md bg-primary/10 px-1.5 py-0.5 text-[10px] font-semibold text-primary",children:"PRO"})]}),E.jsxs(Ut.Item,{value:"pro-cross-brain-search",onSelect:()=>{l(!1),Im()},className:"flex items-center gap-3 rounded-lg px-3 py-2 text-sm opacity-60 cursor-pointer aria-selected:bg-accent aria-selected:opacity-100",children:[E.jsx(cm,{className:"size-4 text-muted-foreground","aria-hidden":"true"}),E.jsx("span",{className:"flex-1",children:g("commandPalette.crossBrainSearch")}),E.jsx("span",{className:"rounded-md bg-primary/10 px-1.5 py-0.5 text-[10px] font-semibold text-primary",children:"PRO"})]})]})]}),E.jsx("div",{className:"flex items-center justify-between border-t border-border px-4 py-2",children:E.jsxs("div",{className:"flex items-center gap-3 text-[10px] text-muted-foreground",children:[E.jsxs("span",{children:[E.jsx("kbd",{className:"rounded border border-border bg-muted px-1 py-0.5 font-mono",children:"↑↓"})," ",g("commandPalette.navigate")]}),E.jsxs("span",{children:[E.jsx("kbd",{className:"rounded border border-border bg-muted px-1 py-0.5 font-mono",children:"↵"})," ",g("commandPalette.select")]}),E.jsxs("span",{children:[E.jsx("kbd",{className:"rounded border border-border bg-muted px-1 py-0.5 font-mono",children:"esc"})," ",g("commandPalette.close")]})]})})]})}),document.body)]})}const xx={light:Xy,dark:Qy,system:Gy},eg={light:"common.lightMode",dark:"common.darkMode",system:"common.systemTheme"};function Ex(){const{sidebarOpen:i,toggleSidebar:l,theme:r,cycleTheme:o}=br(),{data:c}=Mb(),{data:f}=_b(),{t:m}=xr(),h=xx[r];return E.jsxs("header",{className:"sticky top-0 z-20 flex h-14 items-center gap-4 border-b border-border bg-background/80 px-4 backdrop-blur-sm",children:[E.jsx(cr,{variant:"ghost",size:"icon",onClick:l,"aria-label":m(i?"common.collapseSidebar":"common.expandSidebar"),children:i?E.jsx(fm,{className:"size-5",weight:"bold"}):E.jsx(fm,{className:"size-5"})}),c?.active_brain&&E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsxs("span",{className:"text-sm text-muted-foreground",children:[m("common.brain"),":"]}),E.jsx(Ub,{variant:"secondary",className:"font-mono text-xs",children:c.active_brain})]}),E.jsx(Sx,{}),E.jsx("div",{className:"flex-1"}),E.jsx(cr,{variant:"ghost",size:"icon",asChild:!0,"aria-label":"Quickstart Guide",title:"Quickstart Guide",children:E.jsx("a",{href:"https://github.com/acidkill/surreal-memory/blob/main/docs/guides/quickstart-guide.md",target:"_blank",rel:"noopener noreferrer",children:E.jsx(Ky,{className:"size-4"})})}),E.jsx(cr,{variant:"ghost",size:"icon",onClick:o,"aria-label":m(eg[r]),title:m(eg[r]),"data-testid":"theme-toggle",children:E.jsx(h,{className:"size-4"})}),f?.version&&E.jsxs("span",{className:"text-xs text-muted-foreground font-mono",children:["v",f.version]})]})}function Tx(){const i=br(l=>l.sidebarOpen);return E.jsxs("div",{className:"h-screen bg-background overflow-hidden",children:[E.jsx(xb,{}),E.jsxs("div",{className:ji("flex flex-col h-full transition-all duration-[var(--transition-normal)]",i?"ml-56":"ml-16"),children:[E.jsx(Ex,{}),E.jsx("main",{className:"flex-1 overflow-auto",children:E.jsx(_y,{})})]}),E.jsx(yx,{})]})}function Ot(){return E.jsxs("div",{className:"space-y-6 p-6 animate-pulse",children:[E.jsx("div",{className:"h-8 w-48 rounded-lg bg-muted"}),E.jsx("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",children:Array.from({length:4}).map((i,l)=>E.jsx("div",{className:"h-28 rounded-xl bg-muted"},l))}),E.jsxs("div",{className:"grid grid-cols-1 gap-6 lg:grid-cols-2",children:[E.jsx("div",{className:"h-64 rounded-xl bg-muted"}),E.jsx("div",{className:"h-64 rounded-xl bg-muted"})]})]})}const Ox=y.lazy(()=>Nt(()=>import("./OverviewPage-BixPEj84.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8]))),Cx=y.lazy(()=>Nt(()=>import("./HealthPage-DoDlPq43.js"),__vite__mapDeps([9,1,2,3,4,6,8,7]))),Nx=y.lazy(()=>Nt(()=>import("./UncertaintyPage-CdFbDPD5.js"),__vite__mapDeps([10,1,2,3,4,6,7,8]))),Ax=y.lazy(()=>Nt(()=>import("./GraphPage-B5RqF55O.js"),__vite__mapDeps([11,1,2,3,4,6,7,8]))),Dx=y.lazy(()=>Nt(()=>import("./TimelinePage-2mV1L6iZ.js"),__vite__mapDeps([12,1,2,3,4,6,8,7]))),wx=y.lazy(()=>Nt(()=>import("./EvolutionPage-C6VI1EZi.js"),__vite__mapDeps([13,1,2,14,3,4,8,7,6]))),Rx=y.lazy(()=>Nt(()=>import("./DiagramsPage-ClJ9QIg8.js"),__vite__mapDeps([15,1,2,3,4,16,8,7,6,17]))),zx=y.lazy(()=>Nt(()=>import("./SettingsPage-CcFz-Brq.js"),__vite__mapDeps([18,1,2,3,6,4,14,7,8]))),Mx=y.lazy(()=>Nt(()=>import("./SyncPage-BRERoUGJ.js"),__vite__mapDeps([19,1,2,3,6,7,8]))),_x=y.lazy(()=>Nt(()=>import("./OraclePage-BOi3rQAz.js"),__vite__mapDeps([20,1,2,6,7,8]))),jx=y.lazy(()=>Nt(()=>import("./ToolStatsPage-yrXaz2Sj.js"),__vite__mapDeps([21,1,2,3,4,8,7,6]))),Lx=y.lazy(()=>Nt(()=>import("./VisualizePage-CayiR_fG.js"),__vite__mapDeps([22,1,2,14,3,6,7,8]))),Ux=y.lazy(()=>Nt(()=>import("./StoragePage-BsRzooql.js"),__vite__mapDeps([23,1,2,3,6,4,7,8]))),Bx=y.lazy(()=>Nt(()=>import("./ReasoningPage-BjC1wtHj.js"),__vite__mapDeps([24,1,2,3,4,6,5,7,8])));function Hx(){return E.jsx(jy,{children:E.jsxs(ot,{element:E.jsx(Tx,{}),children:[E.jsx(ot,{index:!0,element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(Ox,{})})}),E.jsx(ot,{path:"health",element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(Cx,{})})}),E.jsx(ot,{path:"uncertainty",element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(Nx,{})})}),E.jsx(ot,{path:"graph",element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(Ax,{})})}),E.jsx(ot,{path:"timeline",element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(Dx,{})})}),E.jsx(ot,{path:"evolution",element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(wx,{})})}),E.jsx(ot,{path:"diagrams",element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(Rx,{})})}),E.jsx(ot,{path:"settings",element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(zx,{})})}),E.jsx(ot,{path:"sync",element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(Mx,{})})}),E.jsx(ot,{path:"oracle",element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(_x,{})})}),E.jsx(ot,{path:"tool-stats",element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(jx,{})})}),E.jsx(ot,{path:"visualize",element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(Lx,{})})}),E.jsx(ot,{path:"storage",element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(Ux,{})})}),E.jsx(ot,{path:"reasoning",element:E.jsx(y.Suspense,{fallback:E.jsx(Ot,{}),children:E.jsx(Bx,{})})}),E.jsx(ot,{path:"*",element:E.jsx(Ly,{to:"/",replace:!0})})]})})}const{slice:qx,forEach:Vx}=[];function Yx(i){return Vx.call(qx.call(arguments,1),l=>{if(l)for(const r in l)i[r]===void 0&&(i[r]=l[r])}),i}function kx(i){return typeof i!="string"?!1:[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(r=>r.test(i))}const tg=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,Kx=function(i,l){const o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{path:"/"},c=encodeURIComponent(l);let f=`${i}=${c}`;if(o.maxAge>0){const m=o.maxAge-0;if(Number.isNaN(m))throw new Error("maxAge should be a Number");f+=`; Max-Age=${Math.floor(m)}`}if(o.domain){if(!tg.test(o.domain))throw new TypeError("option domain is invalid");f+=`; Domain=${o.domain}`}if(o.path){if(!tg.test(o.path))throw new TypeError("option path is invalid");f+=`; Path=${o.path}`}if(o.expires){if(typeof o.expires.toUTCString!="function")throw new TypeError("option expires is invalid");f+=`; Expires=${o.expires.toUTCString()}`}if(o.httpOnly&&(f+="; HttpOnly"),o.secure&&(f+="; Secure"),o.sameSite)switch(typeof o.sameSite=="string"?o.sameSite.toLowerCase():o.sameSite){case!0:f+="; SameSite=Strict";break;case"lax":f+="; SameSite=Lax";break;case"strict":f+="; SameSite=Strict";break;case"none":f+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return o.partitioned&&(f+="; Partitioned"),f},ng={create(i,l,r,o){let c=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:"/",sameSite:"strict"};r&&(c.expires=new Date,c.expires.setTime(c.expires.getTime()+r*60*1e3)),o&&(c.domain=o),document.cookie=Kx(i,l,c)},read(i){const l=`${i}=`,r=document.cookie.split(";");for(let o=0;o-1&&(o=window.location.hash.substring(window.location.hash.indexOf("?")));const f=o.substring(1).split("&");for(let m=0;m0&&f[m].substring(0,h)===l&&(r=f[m].substring(h+1))}}return r}},Xx={name:"hash",lookup(i){let{lookupHash:l,lookupFromHashIndex:r}=i,o;if(typeof window<"u"){const{hash:c}=window.location;if(c&&c.length>2){const f=c.substring(1);if(l){const m=f.split("&");for(let h=0;h0&&m[h].substring(0,b)===l&&(o=m[h].substring(b+1))}}if(o)return o;if(!o&&r>-1){const m=c.match(/\/([a-zA-Z-]*)/g);return Array.isArray(m)?m[typeof r=="number"?r:0]?.replace("/",""):void 0}}}return o}};let wl=null;const ag=()=>{if(wl!==null)return wl;try{if(wl=typeof window<"u"&&window.localStorage!==null,!wl)return!1;const i="i18next.translate.boo";window.localStorage.setItem(i,"foo"),window.localStorage.removeItem(i)}catch{wl=!1}return wl};var Zx={name:"localStorage",lookup(i){let{lookupLocalStorage:l}=i;if(l&&ag())return window.localStorage.getItem(l)||void 0},cacheUserLanguage(i,l){let{lookupLocalStorage:r}=l;r&&ag()&&window.localStorage.setItem(r,i)}};let Rl=null;const lg=()=>{if(Rl!==null)return Rl;try{if(Rl=typeof window<"u"&&window.sessionStorage!==null,!Rl)return!1;const i="i18next.translate.boo";window.sessionStorage.setItem(i,"foo"),window.sessionStorage.removeItem(i)}catch{Rl=!1}return Rl};var Fx={name:"sessionStorage",lookup(i){let{lookupSessionStorage:l}=i;if(l&&lg())return window.sessionStorage.getItem(l)||void 0},cacheUserLanguage(i,l){let{lookupSessionStorage:r}=l;r&&lg()&&window.sessionStorage.setItem(r,i)}},Jx={name:"navigator",lookup(i){const l=[];if(typeof navigator<"u"){const{languages:r,userLanguage:o,language:c}=navigator;if(r)for(let f=0;f0?l:void 0}},$x={name:"htmlTag",lookup(i){let{htmlTag:l}=i,r;const o=l||(typeof document<"u"?document.documentElement:null);return o&&typeof o.getAttribute=="function"&&(r=o.getAttribute("lang")),r}},Wx={name:"path",lookup(i){let{lookupFromPathIndex:l}=i;if(typeof window>"u")return;const r=window.location.pathname.match(/\/([a-zA-Z-]*)/g);return Array.isArray(r)?r[typeof l=="number"?l:0]?.replace("/",""):void 0}},Ix={name:"subdomain",lookup(i){let{lookupFromSubdomainIndex:l}=i;const r=typeof l=="number"?l+1:1,o=typeof window<"u"&&window.location?.hostname?.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i);if(o)return o[r]}};let hp=!1;try{document.cookie,hp=!0}catch{}const mp=["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"];hp||mp.splice(1,1);const Px=()=>({order:mp,lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:i=>i});class gp{constructor(l){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(l,r)}init(){let l=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{languageUtils:{}},r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=l,this.options=Yx(r,this.options||{},Px()),typeof this.options.convertDetectedLanguage=="string"&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=c=>c.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=o,this.addDetector(Gx),this.addDetector(Qx),this.addDetector(Zx),this.addDetector(Fx),this.addDetector(Jx),this.addDetector($x),this.addDetector(Wx),this.addDetector(Ix),this.addDetector(Xx)}addDetector(l){return this.detectors[l.name]=l,this}detect(){let l=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.order,r=[];return l.forEach(o=>{if(this.detectors[o]){let c=this.detectors[o].lookup(this.options);c&&typeof c=="string"&&(c=[c]),c&&(r=r.concat(c))}}),r=r.filter(o=>o!=null&&!kx(o)).map(o=>this.options.convertDetectedLanguage(o)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes?r:r.length>0?r[0]:null}cacheUserLanguage(l){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.caches;r&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(l)>-1||r.forEach(o=>{this.detectors[o]&&this.detectors[o].cacheUserLanguage(l,this.options)}))}}gp.type="languageDetector";const eE={overview:"Overview",health:"Health",uncertainty:"Uncertainty",graph:"Graph",timeline:"Timeline",evolution:"Evolution",mindmap:"Mindmap",sync:"Cloud Sync",oracle:"Oracle",toolStats:"Tool Stats",reasoningTraining:"Reasoning Training",visualize:"Visualize",storage:"Storage",settings:"Settings"},tE={confirm:"Confirm",cancel:"Cancel",delete:"Delete",loading:"Loading...",active:"Active",yes:"Yes",no:"No",none:"(none)",neurons:"neurons",brain:"Brain",collapseSidebar:"Collapse sidebar",expandSidebar:"Expand sidebar",mainNavigation:"Main navigation",lightMode:"Light mode",darkMode:"Dark mode",systemTheme:"System theme",retry:"Retry",prev:"Previous",next:"Next"},nE={pageTitle:"Reasoning Training",pageSubtitle:"Mine model thinking into reasoning strategies and inject them into other models.",statusError:"Failed to load reasoning status.",emptyState:"No reasoning traces yet. Enable mining below, then run a backfill to scan past sessions.",kpiTraces:"Total traces",kpiUnprocessed:"Unprocessed",kpiPatterns:"Learned patterns",kpiModels:"Detected models",coverageTitle:"Category coverage",miningTitle:"Mining",miningEnabled:"Enable mining (reads model thinking from ~/.claude transcripts)",miningModels:"Source models",miningModelsHint:"None selected = mine all models with thinking text.",noModels:"No models detected yet.",noThinkingText:"This model produces no thinking text and cannot be mined.",noThinkingShort:"no thinking",backfill:"Backfill (full history)",runMining:"Run mining",miningRunning:"Mining…",miningStarted:"Mining started.",miningInProgress:"A mining run is already in progress.",miningDisabled:"Enable mining first.",miningFailed:"Failed to start mining.",injectionTitle:"Injection",injectionEnabled:"Enable injection (add learned strategies to other models' sessions)",injectionMap:"Source → target mappings",injectionMapHint:"Inject a source model's learned strategies into the target model's sessions.",noMappings:"No mappings configured.",source:"Source model",target:"Target model",targetPlaceholder:"target model / glob",addMapping:"Add mapping",save:"Save",configSaved:"Configuration saved.",configSaveFailed:"Failed to save configuration.",patternsTitle:"Pattern library",filterModel:"Filter by model",filterCategory:"Filter by category",allModels:"All models",allCategories:"All categories",patternsError:"Failed to load patterns.",noPatterns:"No learned patterns yet.",colTitle:"Pattern",colModel:"Model",colCategory:"Category",colConfidence:"Confidence",colFrequency:"Frequency",patternDeleted:"Pattern deleted.",patternDeleteFailed:"Failed to delete pattern.",deletePatternTitle:"Delete pattern?",deletePatternDesc:'Delete the learned pattern "{{title}}"? This cannot be undone.',deleteAllForModel:"Delete all for model",deleteAllTitle:"Delete all patterns?",deleteAllDesc:'Delete every learned pattern for "{{model}}"? This cannot be undone.',patternsDeletedCount:"Deleted {{count}} pattern(s).",wipeTraces:"Wipe traces",wipeTracesTitle:"Wipe traces?",wipeTracesDesc:'Permanently delete all staged reasoning traces for "{{model}}"? This cannot be undone.',tracesWiped:"Wiped {{count}} trace(s).",duplicateTarget:'Duplicate target "{{target}}" — each target maps to only one source.'},aE={title:"Overview",neurons:"Neurons",synapses:"Synapses",fibers:"Fibers",brains:"Brains",brainList:"Brains",name:"Name",grade:"Grade",status:"Status",actions:"Actions",currentBrain:"Current active brain",switchTo:"Click to switch to {{name}}",deleteBrain:"Delete brain {{name}}",noBrains:"No brains found.",deleteBrainTitle:"Delete Brain",deleteBrainDesc:'Delete brain "{{name}}"? This will remove all neurons, synapses, and fibers permanently. This cannot be undone.',switchedTo:"Switched to brain: {{name}}",switchFailed:"Failed to switch brain",deleted:"Deleted brain: {{name}}",deleteFailed:"Failed to delete brain"},lE={title:"Health",brainMetrics:"Brain Metrics",purity:"Purity",freshness:"Freshness",connectivity:"Connectivity",diversity:"Diversity",consolidation:"Consolidation",activation:"Activation",recall:"Recall",orphanRate:"Orphan Rate",radarName:"Health",warnings:"Warnings & Recommendations",noWarnings:"No warnings. Brain is healthy!",recommendations:"Recommendations",enrichTitle:"How to Enrich Your Brain",enrichDesc:"A richer brain means better recall. Here's how to build detailed neurons and strong synapses.",collapseTips:"Collapse tips",expandTips:"Expand tips",less:"Less",more:"More",topPenalties:"Top Issues Hurting Your Score",noPenalties:"No significant penalties. Keep it up!",penaltyPoints:"{{points}} pts lost",estimatedGain:"+{{gain}} pts if fixed",currentScore:"Current: {{score}}%",weight:"Weight: {{weight}}%",fixAction:"Fix",conflictRate:"Conflict Rate",contradictionCount:"Contradictions"},iE={title:"Uncertainty",window:"Last {{days}} days",level:{low:"Low",medium:"Medium",high:"High"},contradictionRate:"Contradiction Rate",totalMemories:"Total Memories",contradictions:"Contradictions",lowTrust:"Low-trust",superseded:"Superseded",expiring:"Expiring",drift:"Drift Clusters",driftSqliteOnly:"Drift detection is SQLite-only.",truncatedNote:"Low-trust and superseded reflect only the most-recent {{count}} scanned memories.",fiberId:"Fiber",trustScore:"Trust",supersededBy:"Superseded by",canonical:"Canonical",confidence:"Confidence",noSamples:"Nothing to show."},sE={rememberTitle:"Ask your agent to remember frequently",rememberTips:['After every decision: "Remember that we chose PostgreSQL over MongoDB for the user service"','After debugging: "Remember the root cause was a race condition in the WebSocket handler"','After meetings: "Remember Alice suggested rate limiting at the API gateway level"','After learning: "Remember that Vite HMR requires export default for React components"'],causalTitle:"Use rich, causal language",causalTips:['BAD: "PostgreSQL" → creates a single flat neuron','GOOD: "We chose PostgreSQL over MongoDB because we need ACID transactions for payment processing" → creates concept + entity + decision neurons with CAUSED_BY synapses',"Include WHY, not just WHAT — causal chains create richer neural connections","Mention people, dates, and context — they become separate neurons linked by synapses"],diverseTitle:"Diverse memory types = stronger recall",diverseTips:['Facts: "The API rate limit is 1000 req/min per user"','Decisions: "We decided to use JWT over sessions because of microservice architecture"',`Errors: "Import failed because the column 'email' was renamed to 'user_email' in v3"`,'Insights: "Pattern: always validate webhook signatures before processing payloads"','Workflows: "Deploy process: lint → test → build → push → verify health check"'],trainTitle:"Train from documents for permanent knowledge",trainTips:["Use smem_train to import docs (PDF, DOCX, MD) — trained memories never decay","Use smem_index to index your codebase — enables code-aware recall","Pin critical memories with smem_pin — they skip decay and consolidation","Use smem_eternal for project-level context that should persist across all sessions"]},rE={title:"Neural Graph",nodes:"Nodes:",networkVisualization:"Network Visualization",nodesCount:"{{nodes}} nodes, {{edges}} edges",noNeurons:"No neurons found in this brain.",concept:"concept",entity:"entity",time:"time",action:"action",state:"state",other:"other"},oE={title:"Timeline",memoryTimeline:"Memory Timeline",entries:"{{total}} entries",noEntries:"No timeline entries.",range7d:"7 Days",range30d:"30 Days",range90d:"90 Days",rangeAll:"All",todayMemories:"Today",totalPeriod:"Total",avgPerDay:"Avg/Day",activeDays:"Active Days",activityTrend:"Activity Trend",neuronDistribution:"Neuron Distribution",recentActivity:"Recent Activity",neurons:"Neurons",fibers:"Fibers",synapses:"Synapses"},uE={title:"Evolution",brainMetrics:"Brain Metrics",maturity:"Maturity",plasticity:"Plasticity",semanticRatio:"Semantic Ratio",totalFibers:"Total Fibers",totalNeurons:"Total Neurons",stageDistribution:"Stage Distribution",shortTerm:"Short Term",working:"Working",episodic:"Episodic",semantic:"Semantic"},cE={title:"Mindmap",fibers:"Fibers",noFibers:"No fibers found.",selectFiber:"Select a Fiber",fiberLabel:"Fiber: {{id}}...",neuronsCount:"Neurons:",connectionsCount:"Connections:",selectFiberPrompt:"Select a fiber to view its mindmap"},fE={title:"Settings",general:"General",version:"Version",activeBrain:"Active Brain",totalBrains:"Total Brains",brainFiles:"Brain Files",brainsDirectory:"Brains Directory",totalDiskUsage:"Total Disk Usage",telegramBackup:"Telegram Backup",connected:"Connected",chatIds:"Chat IDs",autoBackup:"Auto-backup on consolidation",sendTest:"Send Test",sending:"Sending...",backupNow:"Backup Now",backingUp:"Backing up...",notConfigured:"Not Configured",telegramSetup:"Set NMEM_TELEGRAM_BOT_TOKEN env var and add [telegram] chat_ids to config.toml.",feedbackTitle:"Feedback & Bug Report",reportBug:"Report a Bug",reportBugDesc:"Found something broken? Open an issue with steps to reproduce.",featureRequest:"Feature Request",featureRequestDesc:"Have an idea to improve Surreal-Memory? We'd love to hear it.",discussions:"GitHub Discussions",discussionsDesc:"Questions, tips, and community support.",testSuccess:"Test message sent successfully",testPartial:"Some messages failed to send",testFailed:"Failed to send test message",backupSuccess:"Backup sent! {{brain}} ({{size}}MB) to {{count}} chat(s)",backupSendFailed:"Backup failed to send",backupFailed:"Backup failed",configStatus:"Configuration Status",embeddingConfig:"Embedding Provider",embeddingProvider:"Provider",embeddingModel:"Model",embeddingEnabled:"Enabled",embeddingThreshold:"Similarity Threshold",embeddingTest:"Test Connection",embeddingTesting:"Testing...",embeddingTestOk:"Connection OK — {{provider}} ({{dimension}}D)",embeddingTestFail:"Test failed: {{error}}",embeddingSave:"Save",embeddingSaving:"Saving...",embeddingSaved:"Embedding settings saved",embeddingSaveFailed:"Failed to save embedding settings",proFeature:"Pro",watcher:"File Watcher",watcherPaths:"Watched Paths",watcherRecent:"Recent Activity",watcherRunning:"Running",watcherStopped:"Stopped",watcherDisabled:"Disabled",watcherNoActivity:"No recent activity"},dE={title:"Cloud Sync",refresh:"Refresh",connectionStatus:"Connection",status:"Status",cloudConnected:"Connected",notConnected:"Not Connected",hubUrl:"Hub URL",apiKey:"API Key",deviceId:"Device ID",disconnect:"Disconnect",setupCloud:"Connect to Cloud",setupTitle:"Connect to Cloud Hub",setupDesc:"Enter your hub URL and API key to sync memories across devices. Register at the hub to get your key.",keyRequired:"API key is required",keyInvalid:"API key must start with nmk_",keyHint:"Get your key by registering at the hub. It starts with nmk_.",connect:"Connect",connecting:"Connecting...",connected:"Cloud sync connected!",connectFailed:"Failed to connect",disconnected:"Cloud sync disconnected",disconnectFailed:"Failed to disconnect",devices:"Devices",lastSync:"Last sync",never:"Never",noDevices:"No devices registered yet. Sync from a device to register it.",changeLog:"Change Log",totalChanges:"Total Changes",synced:"Synced",pending:"Pending",latestSequence:"Latest Sequence",conflictStrategy:"Conflict Resolution",conflictDesc:"How to resolve when the same memory is changed on multiple devices.",strategyUpdated:"Conflict strategy updated",updateFailed:"Failed to update config",syncMode:"Sync Mode",merkleDelta:"Merkle Delta",fullSync:"Full Sync"},hE={title:"Brain Oracle",loading:"Channeling your memories...",needMore:"Your brain needs more memories",needMoreDesc:"The Oracle requires at least 3 memories to unlock. Ask your AI agent to remember decisions, insights, and learnings — then return for your reading.",dailyHint:"Tap each card to reveal your reading",past:"Past",present:"Present",future:"Future",readingDate:"Reading for {{brain}} on {{date}}",whatifHint:"What if these memories collided?",reshuffle:"Reshuffle",memory:"Memory",wildcard:"Wildcard",matchupComplete:"Matchup Complete!",matchupScoreDesc:"Based on activation strength and connections of your chosen memories",playAgain:"Play Again",round:"Round {{current}} / {{total}}",choose:"Choose",chosen:"Chosen!",score:"Score",dailyReading:"Daily Reading",whatif:"What If",matchup:"Matchup",copyCard:"Copy Card",copied:"Copied!",downloadCard:"Download"},mE={search:"Search...",placeholder:"Search pages, fibers, memories...",noResults:"No results found.",pages:"Pages",fibers:"Fibers",neurons:"Memories",semanticSearch:"Semantic Search — find by meaning",crossBrainSearch:"Cross-Brain Search — search all brains",navigate:"navigate",select:"open",close:"close"},gE={title:"Tool Stats",totalEvents:"Total Events",successRate:"Success Rate",uniqueTools:"Unique Tools",topTools:"Top Tools",usageOverTime:"Usage Over Time",detailTable:"Tool Details",tool:"Tool",calls:"Calls",avgDuration:"Avg Duration",server:"Server",noData:"No tool events recorded yet. Use Surreal-Memory tools to start tracking."},pE={title:"Memory Visualizer",description:"Query your memories and generate charts from stored data."},vE={title:"Storage",currentBackend:"Current Backend",brain:"Brain",neurons:"Neurons",synapses:"Synapses",fibers:"Fibers",tierDistribution:"Memory Tiers",tierHot:"HOT — Always in context",tierWarm:"WARM — Semantic match",tierCold:"COLD — Explicit recall only",totalMemories:"Total typed memories"},yE={tier:"License",pro_badge:"PRO",pro_feature:"Pro Feature",free:"Free",pro:"Pro",team:"Team"},bE={title:"Get Surreal-Memory Pro",subtitle:"Choose your payment method",enterKey:"Enter your license key",enterEmail:"Enter your email for the license:",orActivate:"or activate a key",haveKey:"I already have a license key",licenseKey:"License Key",activate:"Activate",activated:"Pro activated!",activationFailed:"Activation failed. Check your key.",back:"Back"},SE={nav:eE,common:tE,reasoning:nE,overview:aE,health:lE,uncertainty:iE,enrichment:sE,graph:rE,timeline:oE,evolution:uE,diagrams:cE,settings:fE,sync:dE,oracle:hE,commandPalette:mE,toolStats:gE,visualize:pE,storage:vE,license:yE,upgrade:bE};ht.use(gp).use(hb).init({resources:{en:{translation:SE}},fallbackLng:"en",detection:{order:["localStorage","navigator"],lookupLocalStorage:"smem-lang",caches:["localStorage"]},interpolation:{escapeValue:!1}});const xE=new Ay({defaultOptions:{queries:{staleTime:3e4,retry:1,refetchOnWindowFocus:!1}}});e0.createRoot(document.getElementById("root")).render(E.jsx(y.StrictMode,{children:E.jsx(Dy,{client:xE,children:E.jsxs(Uy,{basename:window.location.pathname.startsWith("/dashboard")?"/dashboard":"/ui",children:[E.jsx(Hx,{}),E.jsx(A0,{position:"bottom-right",toastOptions:{className:"bg-card text-card-foreground border-border"}})]})})}));export{XE as A,Ub as B,DE as C,wg as D,ji as E,Nt as _,cr as a,Mb as b,wE as c,RE as d,HE as e,xr as f,zE as g,ME as h,BE as i,jE as j,_E as k,LE as l,jb as m,UE as n,qe as o,kE as p,KE as q,QE as r,GE as s,AE as t,YE as u,_b as v,VE as w,ZE as x,Im as y,qE as z}; diff --git a/src/surreal_memory/server/static/dist/assets/skeleton-CAu64_35.js b/src/surreal_memory/server/static/dist/assets/skeleton-CAu64_35.js deleted file mode 100644 index d8b2bbbb..00000000 --- a/src/surreal_memory/server/static/dist/assets/skeleton-CAu64_35.js +++ /dev/null @@ -1 +0,0 @@ -import{j as m}from"./vendor-query-CqA1cBNl.js";import{C as o}from"./index-CSMoVcy_.js";function n({className:e,...t}){return m.jsx("div",{className:o("animate-pulse rounded-md bg-muted",e),...t})}export{n as S}; diff --git a/src/surreal_memory/server/static/dist/assets/skeleton-CBW-y0cP.js b/src/surreal_memory/server/static/dist/assets/skeleton-CBW-y0cP.js new file mode 100644 index 00000000..86c11f0d --- /dev/null +++ b/src/surreal_memory/server/static/dist/assets/skeleton-CBW-y0cP.js @@ -0,0 +1 @@ +import{j as m}from"./vendor-query-CqA1cBNl.js";import{E as o}from"./index-DXL5wCpD.js";function n({className:e,...t}){return m.jsx("div",{className:o("animate-pulse rounded-md bg-muted",e),...t})}export{n as S}; diff --git a/src/surreal_memory/server/static/dist/assets/vendor-icons-C6dhS1UE.js b/src/surreal_memory/server/static/dist/assets/vendor-icons-C6dhS1UE.js new file mode 100644 index 00000000..30cc321e --- /dev/null +++ b/src/surreal_memory/server/static/dist/assets/vendor-icons-C6dhS1UE.js @@ -0,0 +1 @@ +import{r as a}from"./vendor-react-BfuodpLv.js";const u0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224.49,136.49l-72,72a12,12,0,0,1-17-17L187,140H40a12,12,0,0,1,0-24H187L135.51,64.48a12,12,0,0,1,17-17l72,72A12,12,0,0,1,224.49,136.49Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,128l-72,72V56Z",opacity:"0.2"}),a.createElement("path",{d:"M221.66,122.34l-72-72A8,8,0,0,0,136,56v64H40a8,8,0,0,0,0,16h96v64a8,8,0,0,0,13.66,5.66l72-72A8,8,0,0,0,221.66,122.34ZM152,180.69V75.31L204.69,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M221.66,133.66l-72,72A8,8,0,0,1,136,200V136H40a8,8,0,0,1,0-16h96V56a8,8,0,0,1,13.66-5.66l72,72A8,8,0,0,1,221.66,133.66Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M220.24,132.24l-72,72a6,6,0,0,1-8.48-8.48L201.51,134H40a6,6,0,0,1,0-12H201.51L139.76,60.24a6,6,0,0,1,8.48-8.48l72,72A6,6,0,0,1,220.24,132.24Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M218.83,130.83l-72,72a4,4,0,0,1-5.66-5.66L206.34,132H40a4,4,0,0,1,0-8H206.34L141.17,58.83a4,4,0,0,1,5.66-5.66l72,72A4,4,0,0,1,218.83,130.83Z"}))]]),v0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M184,80V208a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V80a8,8,0,0,1,8-8H176A8,8,0,0,1,184,80Z",opacity:"0.2"}),a.createElement("path",{d:"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M192,136v72a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V80A16,16,0,0,1,48,64h72a8,8,0,0,1,0,16H48V208H176V136a8,8,0,0,1,16,0Zm32-96a8,8,0,0,0-8-8H152a8,8,0,0,0-5.66,13.66L172.69,72l-42.35,42.34a8,8,0,0,0,11.32,11.32L184,83.31l26.34,26.35A8,8,0,0,0,224,104Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M222,104a6,6,0,0,1-12,0V54.49l-69.75,69.75a6,6,0,0,1-8.48-8.48L201.51,46H152a6,6,0,0,1,0-12h64a6,6,0,0,1,6,6Zm-38,26a6,6,0,0,0-6,6v72a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V80a2,2,0,0,1,2-2h72a6,6,0,0,0,0-12H48A14,14,0,0,0,34,80V208a14,14,0,0,0,14,14H176a14,14,0,0,0,14-14V136A6,6,0,0,0,184,130Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M220,104a4,4,0,0,1-8,0V49.66l-73.16,73.17a4,4,0,0,1-5.66-5.66L206.34,44H152a4,4,0,0,1,0-8h64a4,4,0,0,1,4,4Zm-36,28a4,4,0,0,0-4,4v72a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V80a4,4,0,0,1,4-4h72a4,4,0,0,0,0-8H48A12,12,0,0,0,36,80V208a12,12,0,0,0,12,12H176a12,12,0,0,0,12-12V136A4,4,0,0,0,184,132Z"}))]]),s0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,48V96a12,12,0,0,1-12,12H168a12,12,0,0,1,0-24h19l-7.8-7.8a75.55,75.55,0,0,0-53.32-22.26h-.43A75.49,75.49,0,0,0,72.39,75.57,12,12,0,1,1,55.61,58.41a99.38,99.38,0,0,1,69.87-28.47H126A99.42,99.42,0,0,1,196.2,59.23L204,67V48a12,12,0,0,1,24,0ZM183.61,180.43a75.49,75.49,0,0,1-53.09,21.63h-.43A75.55,75.55,0,0,1,76.77,179.8L69,172H88a12,12,0,0,0,0-24H40a12,12,0,0,0-12,12v48a12,12,0,0,0,24,0V189l7.8,7.8A99.42,99.42,0,0,0,130,226.06h.56a99.38,99.38,0,0,0,69.87-28.47,12,12,0,0,0-16.78-17.16Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,128a88,88,0,1,1-88-88A88,88,0,0,1,216,128Z",opacity:"0.2"}),a.createElement("path",{d:"M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h28.69L182.06,73.37a79.56,79.56,0,0,0-56.13-23.43h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27a96,96,0,0,1,135,.79L208,76.69V48a8,8,0,0,1,16,0ZM186.41,183.29a80,80,0,0,1-112.47-.66L59.31,168H88a8,8,0,0,0,0-16H40a8,8,0,0,0-8,8v48a8,8,0,0,0,16,0V179.31l14.63,14.63A95.43,95.43,0,0,0,130,222.06h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1-5.66-13.66L180.65,72a79.48,79.48,0,0,0-54.72-22.09h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27,96,96,0,0,1,192,60.7l18.36-18.36A8,8,0,0,1,224,48ZM186.41,183.29A80,80,0,0,1,75.35,184l18.31-18.31A8,8,0,0,0,88,152H40a8,8,0,0,0-8,8v48a8,8,0,0,0,13.66,5.66L64,195.3a95.42,95.42,0,0,0,66,26.76h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M222,48V96a6,6,0,0,1-6,6H168a6,6,0,0,1,0-12h33.52L183.47,72a81.51,81.51,0,0,0-57.53-24h-.46A81.5,81.5,0,0,0,68.19,71.28a6,6,0,1,1-8.38-8.58,93.38,93.38,0,0,1,65.67-26.76H126a93.45,93.45,0,0,1,66,27.53l18,18V48a6,6,0,0,1,12,0ZM187.81,184.72a81.5,81.5,0,0,1-57.29,23.34h-.46a81.51,81.51,0,0,1-57.53-24L54.48,166H88a6,6,0,0,0,0-12H40a6,6,0,0,0-6,6v48a6,6,0,0,0,12,0V174.48l18,18.05a93.45,93.45,0,0,0,66,27.53h.52a93.38,93.38,0,0,0,65.67-26.76,6,6,0,1,0-8.38-8.58Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h28.69L182.06,73.37a79.56,79.56,0,0,0-56.13-23.43h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27a96,96,0,0,1,135,.79L208,76.69V48a8,8,0,0,1,16,0ZM186.41,183.29a80,80,0,0,1-112.47-.66L59.31,168H88a8,8,0,0,0,0-16H40a8,8,0,0,0-8,8v48a8,8,0,0,0,16,0V179.31l14.63,14.63A95.43,95.43,0,0,0,130,222.06h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M220,48V96a4,4,0,0,1-4,4H168a4,4,0,0,1,0-8h38.34L184.89,70.54A84,84,0,0,0,66.8,69.85a4,4,0,1,1-5.6-5.72,92,92,0,0,1,129.34.76L212,86.34V48a4,4,0,0,1,8,0ZM189.2,186.15a83.44,83.44,0,0,1-58.68,23.91h-.47a83.52,83.52,0,0,1-58.94-24.6L49.66,164H88a4,4,0,0,0,0-8H40a4,4,0,0,0-4,4v48a4,4,0,0,0,8,0V169.66l21.46,21.45A91.43,91.43,0,0,0,130,218.06h.51a91.45,91.45,0,0,0,64.28-26.19,4,4,0,1,0-5.6-5.72Z"}))]]),i0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,44H160a43.86,43.86,0,0,0-32,13.85A43.86,43.86,0,0,0,96,44H24A12,12,0,0,0,12,56V200a12,12,0,0,0,12,12H96a20,20,0,0,1,20,20,12,12,0,0,0,24,0,20,20,0,0,1,20-20h72a12,12,0,0,0,12-12V56A12,12,0,0,0,232,44ZM96,188H36V68H96a20,20,0,0,1,20,20V192.81A43.79,43.79,0,0,0,96,188Zm124,0H160a43.71,43.71,0,0,0-20,4.83V88a20,20,0,0,1,20-20h60Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,56V200H160a32,32,0,0,0-32,32,32,32,0,0,0-32-32H24V56H96a32,32,0,0,1,32,32,32,32,0,0,1,32-32Z",opacity:"0.2"}),a.createElement("path",{d:"M232,48H160a40,40,0,0,0-32,16A40,40,0,0,0,96,48H24a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8H96a24,24,0,0,1,24,24,8,8,0,0,0,16,0,24,24,0,0,1,24-24h72a8,8,0,0,0,8-8V56A8,8,0,0,0,232,48ZM96,192H32V64H96a24,24,0,0,1,24,24V200A39.81,39.81,0,0,0,96,192Zm128,0H160a39.81,39.81,0,0,0-24,8V88a24,24,0,0,1,24-24h64Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,56V200a8,8,0,0,1-8,8H160a24,24,0,0,0-24,23.94,7.9,7.9,0,0,1-5.12,7.55A8,8,0,0,1,120,232a24,24,0,0,0-24-24H24a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8H88a32,32,0,0,1,32,32v87.73a8.17,8.17,0,0,0,7.47,8.25,8,8,0,0,0,8.53-8V80a32,32,0,0,1,32-32h64A8,8,0,0,1,240,56Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,50H160a38,38,0,0,0-32,17.55A38,38,0,0,0,96,50H24a6,6,0,0,0-6,6V200a6,6,0,0,0,6,6H96a26,26,0,0,1,26,26,6,6,0,0,0,12,0,26,26,0,0,1,26-26h72a6,6,0,0,0,6-6V56A6,6,0,0,0,232,50ZM96,194H30V62H96a26,26,0,0,1,26,26V204.31A37.86,37.86,0,0,0,96,194Zm130,0H160a37.87,37.87,0,0,0-26,10.32V88a26,26,0,0,1,26-26h66Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,48H160a40,40,0,0,0-32,16A40,40,0,0,0,96,48H24a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8H96a24,24,0,0,1,24,24,8,8,0,0,0,16,0,24,24,0,0,1,24-24h72a8,8,0,0,0,8-8V56A8,8,0,0,0,232,48ZM96,192H32V64H96a24,24,0,0,1,24,24V200A39.81,39.81,0,0,0,96,192Zm128,0H160a39.81,39.81,0,0,0-24,8V88a24,24,0,0,1,24-24h64Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,52H160a36,36,0,0,0-32,19.54A36,36,0,0,0,96,52H24a4,4,0,0,0-4,4V200a4,4,0,0,0,4,4H96a28,28,0,0,1,28,28,4,4,0,0,0,8,0,28,28,0,0,1,28-28h72a4,4,0,0,0,4-4V56A4,4,0,0,0,232,52ZM96,196H28V60H96a28,28,0,0,1,28,28V209.4A35.93,35.93,0,0,0,96,196Zm132,0H160a35.94,35.94,0,0,0-28,13.41V88a28,28,0,0,1,28-28h68Z"}))]]),F0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M252,124a60.14,60.14,0,0,0-32-53.08,52,52,0,0,0-92-32.11A52,52,0,0,0,36,70.92a60,60,0,0,0,0,106.14,52,52,0,0,0,92,32.13,52,52,0,0,0,92-32.13A60.05,60.05,0,0,0,252,124ZM88,204a28,28,0,0,1-26.85-20.07c1,0,1.89.07,2.85.07h8a12,12,0,0,0,0-24H64A36,36,0,0,1,52,90.05a12,12,0,0,0,8-11.32V72a28,28,0,0,1,56,0v60.18a51.61,51.61,0,0,0-7.2-3.85,12,12,0,1,0-9.6,22A28,28,0,0,1,88,204Zm104-44h-8a12,12,0,0,0,0,24h8c1,0,1.9,0,2.85-.07a28,28,0,1,1-38-33.61,12,12,0,1,0-9.6-22,51.61,51.61,0,0,0-7.2,3.85V72a28,28,0,0,1,56,0v6.73a12,12,0,0,0,8,11.32,36,36,0,0,1-12,70Zm16-44a12,12,0,0,1-12,12,40,40,0,0,1-40-40V84a12,12,0,0,1,24,0v4a16,16,0,0,0,16,16A12,12,0,0,1,208,116ZM100,88a40,40,0,0,1-40,40,12,12,0,0,1,0-24A16,16,0,0,0,76,88V84a12,12,0,0,1,24,0Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,124a48,48,0,0,1-32,45.27h0V176a40,40,0,0,1-80,0,40,40,0,0,1-80,0v-6.73h0a48,48,0,0,1,0-90.54V72a40,40,0,0,1,80,0,40,40,0,0,1,80,0v6.73A48,48,0,0,1,240,124Z",opacity:"0.2"}),a.createElement("path",{d:"M248,124a56.11,56.11,0,0,0-32-50.61V72a48,48,0,0,0-88-26.49A48,48,0,0,0,40,72v1.39a56,56,0,0,0,0,101.2V176a48,48,0,0,0,88,26.49A48,48,0,0,0,216,176v-1.41A56.09,56.09,0,0,0,248,124ZM88,208a32,32,0,0,1-31.81-28.56A55.87,55.87,0,0,0,64,180h8a8,8,0,0,0,0-16H64A40,40,0,0,1,50.67,86.27,8,8,0,0,0,56,78.73V72a32,32,0,0,1,64,0v68.26A47.8,47.8,0,0,0,88,128a8,8,0,0,0,0,16,32,32,0,0,1,0,64Zm104-44h-8a8,8,0,0,0,0,16h8a55.87,55.87,0,0,0,7.81-.56A32,32,0,1,1,168,144a8,8,0,0,0,0-16,47.8,47.8,0,0,0-32,12.26V72a32,32,0,0,1,64,0v6.73a8,8,0,0,0,5.33,7.54A40,40,0,0,1,192,164Zm16-52a8,8,0,0,1-8,8h-4a36,36,0,0,1-36-36V80a8,8,0,0,1,16,0v4a20,20,0,0,0,20,20h4A8,8,0,0,1,208,112ZM60,120H56a8,8,0,0,1,0-16h4A20,20,0,0,0,80,84V80a8,8,0,0,1,16,0v4A36,36,0,0,1,60,120Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M212,76V72a44,44,0,0,0-74.86-31.31,3.93,3.93,0,0,0-1.14,2.8v88.72a4,4,0,0,0,6.2,3.33A47.67,47.67,0,0,1,167.68,128a8.18,8.18,0,0,1,8.31,7.58,8,8,0,0,1-8,8.42,32,32,0,0,0-32,32v33.88a4,4,0,0,0,1.49,3.12,47.92,47.92,0,0,0,74.21-17.16,4,4,0,0,0-4.49-5.56A68.06,68.06,0,0,1,192,192h-7.73a8.18,8.18,0,0,1-8.25-7.47,8,8,0,0,1,8-8.53h8a51.6,51.6,0,0,0,24-5.88v0A52,52,0,0,0,212,76Zm-12,36h-4a36,36,0,0,1-36-36V72a8,8,0,0,1,16,0v4a20,20,0,0,0,20,20h4a8,8,0,0,1,0,16ZM88,28A44.05,44.05,0,0,0,44,72v4a52,52,0,0,0-4,94.12h0A51.6,51.6,0,0,0,64,176h7.73A8.18,8.18,0,0,1,80,183.47,8,8,0,0,1,72,192H64a67.48,67.48,0,0,1-15.21-1.73,4,4,0,0,0-4.5,5.55A47.93,47.93,0,0,0,118.51,213a4,4,0,0,0,1.49-3.12V176a32,32,0,0,0-32-32,8,8,0,0,1-8-8.42A8.18,8.18,0,0,1,88.32,128a47.67,47.67,0,0,1,25.48,7.54,4,4,0,0,0,6.2-3.33V43.49a4,4,0,0,0-1.14-2.81A43.85,43.85,0,0,0,88,28Zm8,48a36,36,0,0,1-36,36H56a8,8,0,0,1,0-16h4A20,20,0,0,0,80,76V72a8,8,0,0,1,16,0Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M246,124a54.13,54.13,0,0,0-32-49.33V72a46,46,0,0,0-86-22.67A46,46,0,0,0,42,72v2.67a54,54,0,0,0,0,98.63V176a46,46,0,0,0,86,22.67A46,46,0,0,0,214,176v-2.7A54.07,54.07,0,0,0,246,124ZM88,210a34,34,0,0,1-34-32.94A53.67,53.67,0,0,0,64,178h8a6,6,0,0,0,0-12H64A42,42,0,0,1,50,84.39a6,6,0,0,0,4-5.66V72a34,34,0,0,1,68,0v73.05A45.89,45.89,0,0,0,88,130a6,6,0,0,0,0,12,34,34,0,0,1,0,68Zm104-44h-8a6,6,0,0,0,0,12h8a53.67,53.67,0,0,0,10-.94A34,34,0,1,1,168,142a6,6,0,0,0,0-12,45.89,45.89,0,0,0-34,15.05V72a34,34,0,0,1,68,0v6.73a6,6,0,0,0,4,5.66A42,42,0,0,1,192,166Zm14-54a6,6,0,0,1-6,6h-4a34,34,0,0,1-34-34V80a6,6,0,0,1,12,0v4a22,22,0,0,0,22,22h4A6,6,0,0,1,206,112ZM60,118H56a6,6,0,0,1,0-12h4A22,22,0,0,0,82,84V80a6,6,0,0,1,12,0v4A34,34,0,0,1,60,118Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M248,124a56.11,56.11,0,0,0-32-50.61V72a48,48,0,0,0-88-26.49A48,48,0,0,0,40,72v1.39a56,56,0,0,0,0,101.2V176a48,48,0,0,0,88,26.49A48,48,0,0,0,216,176v-1.41A56.09,56.09,0,0,0,248,124ZM88,208a32,32,0,0,1-31.81-28.56A55.87,55.87,0,0,0,64,180h8a8,8,0,0,0,0-16H64A40,40,0,0,1,50.67,86.27,8,8,0,0,0,56,78.73V72a32,32,0,0,1,64,0v68.26A47.8,47.8,0,0,0,88,128a8,8,0,0,0,0,16,32,32,0,0,1,0,64Zm104-44h-8a8,8,0,0,0,0,16h8a55.87,55.87,0,0,0,7.81-.56A32,32,0,1,1,168,144a8,8,0,0,0,0-16,47.8,47.8,0,0,0-32,12.26V72a32,32,0,0,1,64,0v6.73a8,8,0,0,0,5.33,7.54A40,40,0,0,1,192,164Zm16-52a8,8,0,0,1-8,8h-4a36,36,0,0,1-36-36V80a8,8,0,0,1,16,0v4a20,20,0,0,0,20,20h4A8,8,0,0,1,208,112ZM60,120H56a8,8,0,0,1,0-16h4A20,20,0,0,0,80,84V80a8,8,0,0,1,16,0v4A36,36,0,0,1,60,120Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M244,124a52.1,52.1,0,0,0-32-48V72a44,44,0,0,0-84-18.3A44,44,0,0,0,44,72v4a52,52,0,0,0,0,96v4a44,44,0,0,0,84,18.3A44,44,0,0,0,212,176v-4A52.07,52.07,0,0,0,244,124ZM88,212a36,36,0,0,1-36-36v-1.41A52.13,52.13,0,0,0,64,176h8a4,4,0,0,0,0-8H64A44,44,0,0,1,49.33,82.5,4,4,0,0,0,52,78.73V72a36,36,0,0,1,72,0v78.75A44,44,0,0,0,88,132a4,4,0,0,0,0,8,36,36,0,0,1,0,72Zm104-44h-8a4,4,0,0,0,0,8h8a52.13,52.13,0,0,0,12-1.41V176a36,36,0,1,1-36-36,4,4,0,0,0,0-8,44,44,0,0,0-36,18.75V72a36,36,0,0,1,72,0v6.73a4,4,0,0,0,2.67,3.77A44,44,0,0,1,192,168Zm12-56a4,4,0,0,1-4,4h-4a32,32,0,0,1-32-32V80a4,4,0,0,1,8,0v4a24,24,0,0,0,24,24h4A4,4,0,0,1,204,112ZM92,84a32,32,0,0,1-32,32H56a4,4,0,0,1,0-8h4A24,24,0,0,0,84,84V80a4,4,0,0,1,8,0Z"}))]]),f0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M140,88a16,16,0,1,1,16,16A16,16,0,0,1,140,88ZM100,72a16,16,0,1,0,16,16A16,16,0,0,0,100,72Zm120,72a91.84,91.84,0,0,1-2.34,20.64L236.81,173a12,12,0,0,1-9.62,22l-18-7.85a92,92,0,0,1-162.46,0l-18,7.85a12,12,0,1,1-9.62-22l19.15-8.36A91.84,91.84,0,0,1,36,144v-4H16a12,12,0,0,1,0-24H36v-4a91.84,91.84,0,0,1,2.34-20.64L19.19,83a12,12,0,0,1,9.62-22l18,7.85a92,92,0,0,1,162.46,0l18-7.85a12,12,0,1,1,9.62,22l-19.15,8.36A91.84,91.84,0,0,1,220,112v4h20a12,12,0,0,1,0,24H220ZM60,116H196v-4a68,68,0,0,0-136,0Zm56,94.92V140H60v4A68.1,68.1,0,0,0,116,210.92ZM196,144v-4H140v70.92A68.1,68.1,0,0,0,196,144Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,128v16a80,80,0,0,1-160,0V128Z",opacity:"0.2"}),a.createElement("path",{d:"M144,92a12,12,0,1,1,12,12A12,12,0,0,1,144,92ZM100,80a12,12,0,1,0,12,12A12,12,0,0,0,100,80Zm116,64A87.76,87.76,0,0,1,213,167l22.24,9.72A8,8,0,0,1,232,192a7.89,7.89,0,0,1-3.2-.67L207.38,182a88,88,0,0,1-158.76,0L27.2,191.33A7.89,7.89,0,0,1,24,192a8,8,0,0,1-3.2-15.33L43,167A87.76,87.76,0,0,1,40,144v-8H16a8,8,0,0,1,0-16H40v-8a87.76,87.76,0,0,1,3-23L20.8,79.33a8,8,0,1,1,6.4-14.66L48.62,74a88,88,0,0,1,158.76,0l21.42-9.36a8,8,0,0,1,6.4,14.66L213,89.05a87.76,87.76,0,0,1,3,23v8h24a8,8,0,0,1,0,16H216ZM56,120H200v-8a72,72,0,0,0-144,0Zm64,95.54V136H56v8A72.08,72.08,0,0,0,120,215.54ZM200,144v-8H136v79.54A72.08,72.08,0,0,0,200,144Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M168,92a12,12,0,1,1-12-12A12,12,0,0,1,168,92ZM100,80a12,12,0,1,0,12,12A12,12,0,0,0,100,80Zm116,64A87.76,87.76,0,0,1,213,167l22.24,9.72A8,8,0,0,1,232,192a7.89,7.89,0,0,1-3.2-.67L207.38,182a88,88,0,0,1-158.76,0L27.2,191.33A7.89,7.89,0,0,1,24,192a8,8,0,0,1-3.2-15.33L43,167A87.76,87.76,0,0,1,40,144v-8H16a8,8,0,0,1,0-16H40v-8a87.76,87.76,0,0,1,3-23L20.8,79.33a8,8,0,1,1,6.4-14.66L48.62,74a88,88,0,0,1,158.76,0l21.42-9.36a8,8,0,0,1,6.4,14.66L213,89.05a87.76,87.76,0,0,1,3,23v8h24a8,8,0,0,1,0,16H216Zm-80,0a8,8,0,0,0-16,0v64a8,8,0,0,0,16,0Zm64-32a72,72,0,0,0-144,0v8H200Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M146,92a10,10,0,1,1,10,10A10,10,0,0,1,146,92ZM100,82a10,10,0,1,0,10,10A10,10,0,0,0,100,82Zm146,46a6,6,0,0,1-6,6H214v10a85.88,85.88,0,0,1-3.45,24.08L234.4,178.5a6,6,0,0,1-4.8,11l-23.23-10.15a86,86,0,0,1-156.74,0L26.4,189.5a6,6,0,1,1-4.8-11l23.85-10.42A85.88,85.88,0,0,1,42,144V134H16a6,6,0,0,1,0-12H42V112a85.88,85.88,0,0,1,3.45-24.08L21.6,77.5a6,6,0,0,1,4.8-11L49.63,76.65a86,86,0,0,1,156.74,0L229.6,66.5a6,6,0,1,1,4.8,11L210.55,87.92A85.88,85.88,0,0,1,214,112v10h26A6,6,0,0,1,246,128ZM54,122H202V112a74,74,0,0,0-148,0Zm68,95.74V134H54v10A74.09,74.09,0,0,0,122,217.74ZM202,134H134v83.74A74.09,74.09,0,0,0,202,144Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M144,92a12,12,0,1,1,12,12A12,12,0,0,1,144,92ZM100,80a12,12,0,1,0,12,12A12,12,0,0,0,100,80Zm116,64A87.76,87.76,0,0,1,213,167l22.24,9.72A8,8,0,0,1,232,192a7.89,7.89,0,0,1-3.2-.67L207.38,182a88,88,0,0,1-158.76,0L27.2,191.33A7.89,7.89,0,0,1,24,192a8,8,0,0,1-3.2-15.33L43,167A87.76,87.76,0,0,1,40,144v-8H16a8,8,0,0,1,0-16H40v-8a87.76,87.76,0,0,1,3-23L20.8,79.33a8,8,0,1,1,6.4-14.66L48.62,74a88,88,0,0,1,158.76,0l21.42-9.36a8,8,0,0,1,6.4,14.66L213,89.05a87.76,87.76,0,0,1,3,23v8h24a8,8,0,0,1,0,16H216ZM56,120H200v-8a72,72,0,0,0-144,0Zm64,95.54V136H56v8A72.08,72.08,0,0,0,120,215.54ZM200,144v-8H136v79.54A72.08,72.08,0,0,0,200,144Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M148,92a8,8,0,1,1,8,8A8,8,0,0,1,148,92Zm-48-8a8,8,0,1,0,8,8A8,8,0,0,0,100,84Zm144,44a4,4,0,0,1-4,4H212v12a83.64,83.64,0,0,1-3.87,25.2l25.47,11.13A4,4,0,0,1,232,188a4.09,4.09,0,0,1-1.6-.33l-25-10.95a84,84,0,0,1-154.72,0l-25,10.95A4.09,4.09,0,0,1,24,188a4,4,0,0,1-1.6-7.67L47.87,169.2A83.64,83.64,0,0,1,44,144V132H16a4,4,0,0,1,0-8H44V112a83.64,83.64,0,0,1,3.87-25.2L22.4,75.67a4,4,0,0,1,3.2-7.34l25,11a84,84,0,0,1,154.72,0l25-11a4,4,0,1,1,3.2,7.34L208.13,86.8A83.64,83.64,0,0,1,212,112v12h28A4,4,0,0,1,244,128ZM52,124H204V112a76,76,0,0,0-152,0Zm72,95.89V132H52v12A76.09,76.09,0,0,0,124,219.89ZM204,132H132v87.89A76.09,76.09,0,0,0,204,144Z"}))]]),w0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,28H188V24a12,12,0,0,0-24,0v4H92V24a12,12,0,0,0-24,0v4H48A20,20,0,0,0,28,48V208a20,20,0,0,0,20,20H208a20,20,0,0,0,20-20V48A20,20,0,0,0,208,28ZM68,52a12,12,0,0,0,24,0h72a12,12,0,0,0,24,0h16V76H52V52ZM52,204V100H204V204Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48V88H40V48a8,8,0,0,1,8-8H208A8,8,0,0,1,216,48Z",opacity:"0.2"}),a.createElement("path",{d:"M208,32H184V24a8,8,0,0,0-16,0v8H88V24a8,8,0,0,0-16,0v8H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM72,48v8a8,8,0,0,0,16,0V48h80v8a8,8,0,0,0,16,0V48h24V80H48V48ZM208,208H48V96H208V208Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,32H184V24a8,8,0,0,0-16,0v8H88V24a8,8,0,0,0-16,0v8H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32Zm0,48H48V48H72v8a8,8,0,0,0,16,0V48h80v8a8,8,0,0,0,16,0V48h24Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,34H182V24a6,6,0,0,0-12,0V34H86V24a6,6,0,0,0-12,0V34H48A14,14,0,0,0,34,48V208a14,14,0,0,0,14,14H208a14,14,0,0,0,14-14V48A14,14,0,0,0,208,34ZM48,46H74V56a6,6,0,0,0,12,0V46h84V56a6,6,0,0,0,12,0V46h26a2,2,0,0,1,2,2V82H46V48A2,2,0,0,1,48,46ZM208,210H48a2,2,0,0,1-2-2V94H210V208A2,2,0,0,1,208,210Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,32H184V24a8,8,0,0,0-16,0v8H88V24a8,8,0,0,0-16,0v8H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM72,48v8a8,8,0,0,0,16,0V48h80v8a8,8,0,0,0,16,0V48h24V80H48V48ZM208,208H48V96H208V208Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,36H180V24a4,4,0,0,0-8,0V36H84V24a4,4,0,0,0-8,0V36H48A12,12,0,0,0,36,48V208a12,12,0,0,0,12,12H208a12,12,0,0,0,12-12V48A12,12,0,0,0,208,36ZM48,44H76V56a4,4,0,0,0,8,0V44h88V56a4,4,0,0,0,8,0V44h28a4,4,0,0,1,4,4V84H44V48A4,4,0,0,1,48,44ZM208,212H48a4,4,0,0,1-4-4V92H212V208A4,4,0,0,1,208,212Z"}))]]),$0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216.49,104.49l-80,80a12,12,0,0,1-17,0l-80-80a12,12,0,0,1,17-17L128,159l71.51-71.52a12,12,0,0,1,17,17Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,96l-80,80L48,96Z",opacity:"0.2"}),a.createElement("path",{d:"M215.39,92.94A8,8,0,0,0,208,88H48a8,8,0,0,0-5.66,13.66l80,80a8,8,0,0,0,11.32,0l80-80A8,8,0,0,0,215.39,92.94ZM128,164.69,67.31,104H188.69Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M213.66,101.66l-80,80a8,8,0,0,1-11.32,0l-80-80A8,8,0,0,1,48,88H208a8,8,0,0,1,5.66,13.66Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M212.24,100.24l-80,80a6,6,0,0,1-8.48,0l-80-80a6,6,0,0,1,8.48-8.48L128,167.51l75.76-75.75a6,6,0,0,1,8.48,8.48Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M213.66,101.66l-80,80a8,8,0,0,1-11.32,0l-80-80A8,8,0,0,1,53.66,90.34L128,164.69l74.34-74.35a8,8,0,0,1,11.32,11.32Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M210.83,98.83l-80,80a4,4,0,0,1-5.66,0l-80-80a4,4,0,0,1,5.66-5.66L128,170.34l77.17-77.17a4,4,0,1,1,5.66,5.66Z"}))]]),C0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216.49,168.49a12,12,0,0,1-17,0L128,97,56.49,168.49a12,12,0,0,1-17-17l80-80a12,12,0,0,1,17,0l80,80A12,12,0,0,1,216.49,168.49Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,160H48l80-80Z",opacity:"0.2"}),a.createElement("path",{d:"M213.66,154.34l-80-80a8,8,0,0,0-11.32,0l-80,80A8,8,0,0,0,48,168H208a8,8,0,0,0,5.66-13.66ZM67.31,152,128,91.31,188.69,152Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M215.39,163.06A8,8,0,0,1,208,168H48a8,8,0,0,1-5.66-13.66l80-80a8,8,0,0,1,11.32,0l80,80A8,8,0,0,1,215.39,163.06Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M212.24,164.24a6,6,0,0,1-8.48,0L128,88.49,52.24,164.24a6,6,0,0,1-8.48-8.48l80-80a6,6,0,0,1,8.48,0l80,80A6,6,0,0,1,212.24,164.24Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M213.66,165.66a8,8,0,0,1-11.32,0L128,91.31,53.66,165.66a8,8,0,0,1-11.32-11.32l80-80a8,8,0,0,1,11.32,0l80,80A8,8,0,0,1,213.66,165.66Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M210.83,162.83a4,4,0,0,1-5.66,0L128,85.66,50.83,162.83a4,4,0,0,1-5.66-5.66l80-80a4,4,0,0,1,5.66,0l80,80A4,4,0,0,1,210.83,162.83Z"}))]]),y0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,196h-4V40a12,12,0,0,0-12-12H152a12,12,0,0,0-12,12V76H96A12,12,0,0,0,84,88v36H48a12,12,0,0,0-12,12v60H32a12,12,0,0,0,0,24H224a12,12,0,0,0,0-24ZM164,52h32V196H164Zm-56,48h32v96H108ZM60,148H84v48H60Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,40V208H152V40Z",opacity:"0.2"}),a.createElement("path",{d:"M224,200h-8V40a8,8,0,0,0-8-8H152a8,8,0,0,0-8,8V80H96a8,8,0,0,0-8,8v40H48a8,8,0,0,0-8,8v64H32a8,8,0,0,0,0,16H224a8,8,0,0,0,0-16ZM160,48h40V200H160ZM104,96h40V200H104ZM56,144H88v56H56Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,208a8,8,0,0,1-8,8H32a8,8,0,0,1,0-16h8V136a8,8,0,0,1,8-8H72a8,8,0,0,1,8,8v64H96V88a8,8,0,0,1,8-8h32a8,8,0,0,1,8,8V200h16V40a8,8,0,0,1,8-8h40a8,8,0,0,1,8,8V200h8A8,8,0,0,1,232,208Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,202H214V40a6,6,0,0,0-6-6H152a6,6,0,0,0-6,6V82H96a6,6,0,0,0-6,6v42H48a6,6,0,0,0-6,6v66H32a6,6,0,0,0,0,12H224a6,6,0,0,0,0-12ZM158,46h44V202H158ZM102,94h44V202H102ZM54,142H90v60H54Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,200h-8V40a8,8,0,0,0-8-8H152a8,8,0,0,0-8,8V80H96a8,8,0,0,0-8,8v40H48a8,8,0,0,0-8,8v64H32a8,8,0,0,0,0,16H224a8,8,0,0,0,0-16ZM160,48h40V200H160ZM104,96h40V200H104ZM56,144H88v56H56Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,204H212V40a4,4,0,0,0-4-4H152a4,4,0,0,0-4,4V84H96a4,4,0,0,0-4,4v44H48a4,4,0,0,0-4,4v68H32a4,4,0,0,0,0,8H224a4,4,0,0,0,0-8ZM156,44h48V204H156ZM100,92h48V204H100ZM52,140H92v64H52Z"}))]]),b0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236,208a12,12,0,0,1-12,12H32a12,12,0,0,1-12-12V48a12,12,0,0,1,24,0v85.55L88.1,95a12,12,0,0,1,15.1-.57l56.22,42.16L216.1,87A12,12,0,1,1,231.9,105l-64,56a12,12,0,0,1-15.1.57L96.58,119.44,44,165.45V196H224A12,12,0,0,1,236,208Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,64V208H32V48H208A16,16,0,0,1,224,64Z",opacity:"0.2"}),a.createElement("path",{d:"M232,208a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V48a8,8,0,0,1,16,0v94.37L90.73,98a8,8,0,0,1,10.07-.38l58.81,44.11L218.73,90a8,8,0,1,1,10.54,12l-64,56a8,8,0,0,1-10.07.38L96.39,114.29,40,163.63V200H224A8,8,0,0,1,232,208Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM200,176a8,8,0,0,1,0,16H56a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v62.92l34.88-29.07a8,8,0,0,1,9.56-.51l43,28.69,43.41-36.18a8,8,0,0,1,10.24,12.3l-48,40a8,8,0,0,1-9.56.51l-43-28.69L64,155.75V176Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M230,208a6,6,0,0,1-6,6H32a6,6,0,0,1-6-6V48a6,6,0,0,1,12,0v98.78l54.05-47.3a6,6,0,0,1,7.55-.28l60.11,45.08,60.34-52.8a6,6,0,0,1,7.9,9l-64,56a6,6,0,0,1-7.55.28L96.29,111.72,38,162.72V202H224A6,6,0,0,1,230,208Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,208a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V48a8,8,0,0,1,16,0v94.37L90.73,98a8,8,0,0,1,10.07-.38l58.81,44.11L218.73,90a8,8,0,1,1,10.54,12l-64,56a8,8,0,0,1-10.07.38L96.39,114.29,40,163.63V200H224A8,8,0,0,1,232,208Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,208a4,4,0,0,1-4,4H32a4,4,0,0,1-4-4V48a4,4,0,0,1,8,0V151.19L93.37,101a4,4,0,0,1,5-.19l61.41,46.05L221.37,93a4,4,0,0,1,5.26,6l-64,56a4,4,0,0,1-5,.19l-61.41-46L36,161.81V204H224A4,4,0,0,1,228,208Z"}))]]),I0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,44H40A20,20,0,0,0,20,64V224A19.82,19.82,0,0,0,31.56,242.1a20.14,20.14,0,0,0,8.49,1.9,19.91,19.91,0,0,0,12.82-4.72l.12-.11L84.47,212H216a20,20,0,0,0,20-20V64A20,20,0,0,0,216,44Zm-4,144H80a11.93,11.93,0,0,0-7.84,2.92L44,215.23V68H212ZM84,108A12,12,0,0,1,96,96h64a12,12,0,1,1,0,24H96A12,12,0,0,1,84,108Zm0,40a12,12,0,0,1,12-12h64a12,12,0,0,1,0,24H96A12,12,0,0,1,84,148Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,64V192a8,8,0,0,1-8,8H80L45.15,230.11A8,8,0,0,1,32,224V64a8,8,0,0,1,8-8H216A8,8,0,0,1,224,64Z",opacity:"0.2"}),a.createElement("path",{d:"M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78l.09-.07L83,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H80a8,8,0,0,0-5.23,1.95L40,224V64H216ZM88,112a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H96A8,8,0,0,1,88,112Zm0,32a8,8,0,0,1,8-8h64a8,8,0,1,1,0,16H96A8,8,0,0,1,88,144Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48H40A16,16,0,0,0,24,64V224a15.84,15.84,0,0,0,9.25,14.5A16.05,16.05,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78l.09-.07L83,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM160,152H96a8,8,0,0,1,0-16h64a8,8,0,0,1,0,16Zm0-32H96a8,8,0,0,1,0-16h64a8,8,0,0,1,0,16Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,50H40A14,14,0,0,0,26,64V224a13.88,13.88,0,0,0,8.09,12.69A14.11,14.11,0,0,0,40,238a13.87,13.87,0,0,0,9-3.31l.06-.05L82.23,206H216a14,14,0,0,0,14-14V64A14,14,0,0,0,216,50Zm2,142a2,2,0,0,1-2,2H80a6,6,0,0,0-3.92,1.46L41.26,225.53A2,2,0,0,1,38,224V64a2,2,0,0,1,2-2H216a2,2,0,0,1,2,2Zm-52-80a6,6,0,0,1-6,6H96a6,6,0,0,1,0-12h64A6,6,0,0,1,166,112Zm0,32a6,6,0,0,1-6,6H96a6,6,0,0,1,0-12h64A6,6,0,0,1,166,144Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78l.09-.07L83,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H80a8,8,0,0,0-5.23,1.95L40,224V64H216ZM88,112a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H96A8,8,0,0,1,88,112Zm0,32a8,8,0,0,1,8-8h64a8,8,0,1,1,0,16H96A8,8,0,0,1,88,144Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,52H40A12,12,0,0,0,28,64V224a11.89,11.89,0,0,0,6.93,10.88A12.17,12.17,0,0,0,40,236a11.89,11.89,0,0,0,7.69-2.83l0,0L81.49,204H216a12,12,0,0,0,12-12V64A12,12,0,0,0,216,52Zm4,140a4,4,0,0,1-4,4H80a4,4,0,0,0-2.62,1L42.56,227.06A4,4,0,0,1,36,224V64a4,4,0,0,1,4-4H216a4,4,0,0,1,4,4Zm-56-80a4,4,0,0,1-4,4H96a4,4,0,0,1,0-8h64A4,4,0,0,1,164,112Zm0,32a4,4,0,0,1-4,4H96a4,4,0,0,1,0-8h64A4,4,0,0,1,164,144Z"}))]]),N0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56Z",opacity:"0.2"}),a.createElement("path",{d:"M205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228.24,76.24l-128,128a6,6,0,0,1-8.48,0l-56-56a6,6,0,0,1,8.48-8.48L96,191.51,219.76,67.76a6,6,0,0,1,8.48,8.48Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M226.83,74.83l-128,128a4,4,0,0,1-5.66,0l-56-56a4,4,0,0,1,5.66-5.66L96,194.34,221.17,69.17a4,4,0,1,1,5.66,5.66Z"}))]]),R0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176.49,95.51a12,12,0,0,1,0,17l-56,56a12,12,0,0,1-17,0l-24-24a12,12,0,1,1,17-17L112,143l47.51-47.52A12,12,0,0,1,176.49,95.51ZM236,128A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-24,0a84,84,0,1,0-84,84A84.09,84.09,0,0,0,212,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),a.createElement("path",{d:"M173.66,98.34a8,8,0,0,1,0,11.32l-56,56a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35A8,8,0,0,1,173.66,98.34ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm45.66,85.66-56,56a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35a8,8,0,0,1,11.32,11.32Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M172.24,99.76a6,6,0,0,1,0,8.48l-56,56a6,6,0,0,1-8.48,0l-24-24a6,6,0,0,1,8.48-8.48L112,151.51l51.76-51.75A6,6,0,0,1,172.24,99.76ZM230,128A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M173.66,98.34a8,8,0,0,1,0,11.32l-56,56a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35A8,8,0,0,1,173.66,98.34ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M170.83,101.17a4,4,0,0,1,0,5.66l-56,56a4,4,0,0,1-5.66,0l-24-24a4,4,0,0,1,5.66-5.66L112,154.34l53.17-53.17A4,4,0,0,1,170.83,101.17ZM228,128A100,100,0,1,1,128,28,100.11,100.11,0,0,1,228,128Zm-8,0a92,92,0,1,0-92,92A92.1,92.1,0,0,0,220,128Z"}))]]),q0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm0,192a84,84,0,1,1,84-84A84.09,84.09,0,0,1,128,212Zm68-84a12,12,0,0,1-12,12H128a12,12,0,0,1-12-12V72a12,12,0,0,1,24,0v44h44A12,12,0,0,1,196,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm64-88a8,8,0,0,1-8,8H128a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v48h48A8,8,0,0,1,192,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm56,112H128a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v48h48a8,8,0,0,1,0,16Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26Zm0,192a90,90,0,1,1,90-90A90.1,90.1,0,0,1,128,218Zm62-90a6,6,0,0,1-6,6H128a6,6,0,0,1-6-6V72a6,6,0,0,1,12,0v50h50A6,6,0,0,1,190,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm64-88a8,8,0,0,1-8,8H128a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v48h48A8,8,0,0,1,192,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28Zm0,192a92,92,0,1,1,92-92A92.1,92.1,0,0,1,128,220Zm60-92a4,4,0,0,1-4,4H128a4,4,0,0,1-4-4V72a4,4,0,0,1,8,0v52h52A4,4,0,0,1,188,128Z"}))]]),S0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236,137A108.13,108.13,0,1,1,119,20,12,12,0,0,1,121,44,84.12,84.12,0,1,0,212,135,12,12,0,1,1,236,137ZM116,76v52a12,12,0,0,0,12,12h52a12,12,0,0,0,0-24H140V76a12,12,0,0,0-24,0Zm92,20a16,16,0,1,0-16-16A16,16,0,0,0,208,96ZM176,64a16,16,0,1,0-16-16A16,16,0,0,0,176,64Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),a.createElement("path",{d:"M232,136.66A104.12,104.12,0,1,1,119.34,24,8,8,0,0,1,120.66,40,88.12,88.12,0,1,0,216,135.34,8,8,0,0,1,232,136.66ZM120,72v56a8,8,0,0,0,8,8h56a8,8,0,0,0,0-16H136V72a8,8,0,0,0-16,0Zm40-24a12,12,0,1,0-12-12A12,12,0,0,0,160,48Zm36,24a12,12,0,1,0-12-12A12,12,0,0,0,196,72Zm24,36a12,12,0,1,0-12-12A12,12,0,0,0,220,108Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,96a12,12,0,1,1,12,12A12,12,0,0,1,208,96ZM196,72a12,12,0,1,0-12-12A12,12,0,0,0,196,72Zm28.66,56a8,8,0,0,0-8.63,7.31A88.12,88.12,0,1,1,120.66,40,8,8,0,0,0,119.34,24,104.12,104.12,0,1,0,232,136.66,8,8,0,0,0,224.66,128ZM128,56a72,72,0,1,1-72,72A72.08,72.08,0,0,1,128,56Zm-8,72a8,8,0,0,0,8,8h48a8,8,0,0,0,0-16H136V80a8,8,0,0,0-16,0Zm40-80a12,12,0,1,0-12-12A12,12,0,0,0,160,48Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M230,136.49A102.12,102.12,0,1,1,119.51,26a6,6,0,0,1,1,12A90.13,90.13,0,1,0,218,135.51a6,6,0,1,1,12,1ZM122,72v56a6,6,0,0,0,6,6h56a6,6,0,0,0,0-12H134V72a6,6,0,0,0-12,0Zm38-26a10,10,0,1,0-10-10A10,10,0,0,0,160,46Zm36,24a10,10,0,1,0-10-10A10,10,0,0,0,196,70Zm24,36a10,10,0,1,0-10-10A10,10,0,0,0,220,106Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,136.66A104.12,104.12,0,1,1,119.34,24,8,8,0,0,1,120.66,40,88.12,88.12,0,1,0,216,135.34,8,8,0,0,1,232,136.66ZM120,72v56a8,8,0,0,0,8,8h56a8,8,0,0,0,0-16H136V72a8,8,0,0,0-16,0Zm40-24a12,12,0,1,0-12-12A12,12,0,0,0,160,48Zm36,24a12,12,0,1,0-12-12A12,12,0,0,0,196,72Zm24,36a12,12,0,1,0-12-12A12,12,0,0,0,220,108Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,136.33A100.13,100.13,0,1,1,119.67,28a4,4,0,1,1,.66,8A92.13,92.13,0,1,0,220,135.67a4,4,0,1,1,8,.66ZM128,132h56a4,4,0,0,0,0-8H132V72a4,4,0,0,0-8,0v56A4,4,0,0,0,128,132Zm32-88a8,8,0,1,0-8-8A8,8,0,0,0,160,44Zm36,24a8,8,0,1,0-8-8A8,8,0,0,0,196,68Zm24,36a8,8,0,1,0-8-8A8,8,0,0,0,220,104Z"}))]]),k0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M160,36A92.09,92.09,0,0,0,79,84.36,68,68,0,1,0,72,220h88a92,92,0,0,0,0-184Zm0,160H72a44,44,0,0,1-1.82-88A91.86,91.86,0,0,0,68,128a12,12,0,0,0,24,0,68,68,0,1,1,68,68Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,128a80,80,0,0,1-80,80H72A56,56,0,1,1,85.92,97.74l0,.1A80,80,0,0,1,240,128Z",opacity:"0.2"}),a.createElement("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M160.06,40A88.1,88.1,0,0,0,81.29,88.67h0A87.48,87.48,0,0,0,72,127.73,8.18,8.18,0,0,1,64.57,136,8,8,0,0,1,56,128a103.66,103.66,0,0,1,5.34-32.92,4,4,0,0,0-4.75-5.18A64.09,64.09,0,0,0,8,152c0,35.19,29.75,64,65,64H160a88.09,88.09,0,0,0,87.93-91.48C246.11,77.54,207.07,40,160.06,40Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M160,42A86.11,86.11,0,0,0,82.43,90.88,62,62,0,1,0,72,214h88a86,86,0,0,0,0-172Zm0,160H72a50,50,0,0,1,0-100,50.67,50.67,0,0,1,5.91.35A85.61,85.61,0,0,0,74,128a6,6,0,0,0,12,0,74,74,0,1,1,74,74Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M160,44A84.11,84.11,0,0,0,83.59,93.12,60.71,60.71,0,0,0,72,92a60,60,0,0,0,0,120h88a84,84,0,0,0,0-168Zm0,160H72a52,52,0,1,1,8.55-103.3A83.66,83.66,0,0,0,76,128a4,4,0,0,0,8,0,76,76,0,1,1,76,76Z"}))]]),x0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M56.88,31.93A12,12,0,1,0,39.12,48.07L71.79,84A68,68,0,0,0,72,220h88a91.26,91.26,0,0,0,30.66-5.24l8.46,9.31a12,12,0,0,0,17.76-16.14ZM160,196H72a44,44,0,0,1-1.8-87.95A91.91,91.91,0,0,0,68,128a12,12,0,0,0,24,0,68.22,68.22,0,0,1,2.66-18.84l77.88,85.67A68.67,68.67,0,0,1,160,196Zm92-68a91.32,91.32,0,0,1-17.53,54,12,12,0,1,1-19.41-14.11,68,68,0,0,0-89.57-98.53,12,12,0,0,1-12.2-20.66A92,92,0,0,1,252,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,128a80,80,0,0,1-80,80H72A56,56,0,1,1,85.92,97.74l0,.1A80,80,0,0,1,240,128Z",opacity:"0.2"}),a.createElement("path",{d:"M53.92,34.62A8,8,0,1,0,42.08,45.38L81.32,88.55l-.06.12A65,65,0,0,0,72,88a64,64,0,0,0,0,128h88a87.34,87.34,0,0,0,31.8-5.93l10.28,11.31a8,8,0,1,0,11.84-10.76ZM160,200H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.3.12A88.4,88.4,0,0,0,72,128a8,8,0,0,0,16,0,72.25,72.25,0,0,1,5.06-26.54l87,95.7A71.66,71.66,0,0,1,160,200Zm88-72a87.89,87.89,0,0,1-22.35,58.61A8,8,0,0,1,213.71,176,72,72,0,0,0,117.37,70a8,8,0,0,1-9.48-12.89A88,88,0,0,1,248,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M248,128.72A87.74,87.74,0,0,1,222.41,190a4,4,0,0,1-5.77-.16L103.78,65.67a4,4,0,0,1,.39-5.76A87.82,87.82,0,0,1,160.87,40C209.15,40.47,248.38,80.43,248,128.72ZM53.92,34.62A8,8,0,1,0,42.08,45.38L81.33,88.56l-.06.11A64,64,0,0,0,8,153c.53,35.12,29.84,63,65,63h87a87.65,87.65,0,0,0,31.78-5.95l10.3,11.33a8,8,0,0,0,11.33.52,8.32,8.32,0,0,0,.29-11.52Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M52.44,36A6,6,0,0,0,43.56,44l40.18,44.2c-.45.87-.9,1.75-1.32,2.64A62,62,0,1,0,72,214h88a85.23,85.23,0,0,0,32.35-6.3L203.56,220a6,6,0,0,0,8.88-8.08ZM160,202H72a50,50,0,1,1,5.9-99.64A86.25,86.25,0,0,0,74,128a6,6,0,0,0,12,0,73.92,73.92,0,0,1,6.44-30.2l91.22,100.34A73.65,73.65,0,0,1,160,202Zm86-74a85.85,85.85,0,0,1-21.85,57.27,6,6,0,0,1-4.47,2,6,6,0,0,1-4.47-10,74,74,0,0,0-99-108.92,6,6,0,1,1-7.11-9.67A86,86,0,0,1,246,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M53.92,34.62A8,8,0,1,0,42.08,45.38L81.32,88.55l-.06.12A65,65,0,0,0,72,88a64,64,0,0,0,0,128h88a87.34,87.34,0,0,0,31.8-5.93l10.28,11.31a8,8,0,1,0,11.84-10.76ZM160,200H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.3.12A88.4,88.4,0,0,0,72,128a8,8,0,0,0,16,0,72.25,72.25,0,0,1,5.06-26.54l87,95.7A71.66,71.66,0,0,1,160,200Zm88-72a87.89,87.89,0,0,1-22.35,58.61A8,8,0,0,1,213.71,176,72,72,0,0,0,117.37,70a8,8,0,0,1-9.48-12.89A88,88,0,0,1,248,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M51,37.31A4,4,0,0,0,45,42.69L86.16,87.93q-1.38,2.55-2.59,5.19A60,60,0,1,0,72,212h88a83.19,83.19,0,0,0,32.88-6.69L205,218.69a4,4,0,1,0,5.92-5.38ZM160,204H72a52,52,0,0,1,0-104,52.92,52.92,0,0,1,8.54.72A84.21,84.21,0,0,0,76,128a4,4,0,0,0,8,0,76,76,0,0,1,7.9-33.76L187.13,199A75.37,75.37,0,0,1,160,204Zm84-76a83.86,83.86,0,0,1-21.34,55.94,4,4,0,1,1-6-5.33A76,76,0,0,0,115,66.75a4,4,0,0,1-4.74-6.45A84,84,0,0,1,244,128Z"}))]]),B0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M180,140H164V116h16a40,40,0,1,0-40-40V92H116V76a40,40,0,1,0-40,40H92v24H76a40,40,0,1,0,40,40V164h24v16a40,40,0,1,0,40-40ZM164,76a16,16,0,1,1,16,16H164ZM60,76a16,16,0,0,1,32,0V92H76A16,16,0,0,1,60,76ZM92,180a16,16,0,1,1-16-16H92Zm24-64h24v24H116Zm64,80a16,16,0,0,1-16-16V164h16a16,16,0,0,1,0,32Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,76h0a28,28,0,0,1-28,28H152V76a28,28,0,0,1,28-28h0A28,28,0,0,1,208,76ZM76,48h0A28,28,0,0,0,48,76h0a28,28,0,0,0,28,28h28V76A28,28,0,0,0,76,48ZM180,152H152v28a28,28,0,0,0,28,28h0a28,28,0,0,0,28-28h0A28,28,0,0,0,180,152ZM48,180h0a28,28,0,0,0,28,28h0a28,28,0,0,0,28-28V152H76A28,28,0,0,0,48,180Z",opacity:"0.2"}),a.createElement("path",{d:"M180,144H160V112h20a36,36,0,1,0-36-36V96H112V76a36,36,0,1,0-36,36H96v32H76a36,36,0,1,0,36,36V160h32v20a36,36,0,1,0,36-36ZM160,76a20,20,0,1,1,20,20H160ZM56,76a20,20,0,0,1,40,0V96H76A20,20,0,0,1,56,76ZM96,180a20,20,0,1,1-20-20H96Zm16-68h32v32H112Zm68,88a20,20,0,0,1-20-20V160h20a20,20,0,0,1,0,40Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M116,116h24v24H116ZM86,72a14,14,0,0,0,0,28h14V86A14,14,0,0,0,86,72Zm98,14a14,14,0,0,0-28,0v14h14A14,14,0,0,0,184,86ZM72,170a14,14,0,0,0,28,0V156H86A14,14,0,0,0,72,170ZM224,48V208a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V48A16,16,0,0,1,48,32H208A16,16,0,0,1,224,48Zm-68,92V116h14a30,30,0,1,0-30-30v14H116V86a30,30,0,1,0-30,30h14v24H86a30,30,0,1,0,30,30V156h24v14a30,30,0,1,0,30-30Zm0,30a14,14,0,1,0,14-14H156Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M180,146H158V110h22a34,34,0,1,0-34-34V98H110V76a34,34,0,1,0-34,34H98v36H76a34,34,0,1,0,34,34V158h36v22a34,34,0,1,0,34-34ZM158,76a22,22,0,1,1,22,22H158ZM54,76a22,22,0,0,1,44,0V98H76A22,22,0,0,1,54,76ZM98,180a22,22,0,1,1-22-22H98Zm12-70h36v36H110Zm70,92a22,22,0,0,1-22-22V158h22a22,22,0,0,1,0,44Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M180,144H160V112h20a36,36,0,1,0-36-36V96H112V76a36,36,0,1,0-36,36H96v32H76a36,36,0,1,0,36,36V160h32v20a36,36,0,1,0,36-36ZM160,76a20,20,0,1,1,20,20H160ZM56,76a20,20,0,0,1,40,0V96H76A20,20,0,0,1,56,76ZM96,180a20,20,0,1,1-20-20H96Zm16-68h32v32H112Zm68,88a20,20,0,0,1-20-20V160h20a20,20,0,0,1,0,40Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M180,148H156V108h24a32,32,0,1,0-32-32v24H108V76a32,32,0,1,0-32,32h24v40H76a32,32,0,1,0,32,32V156h40v24a32,32,0,1,0,32-32ZM156,76a24,24,0,1,1,24,24H156ZM52,76a24,24,0,0,1,48,0v24H76A24,24,0,0,1,52,76Zm48,104a24,24,0,1,1-24-24h24Zm8-72h40v40H108Zm72,96a24,24,0,0,1-24-24V156h24a24,24,0,0,1,0,48Z"}))]]),Q0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,40V168H168V88H88V40Z",opacity:"0.2"}),a.createElement("path",{d:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32Zm-8,128H176V88a8,8,0,0,0-8-8H96V48H208Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,34H88a6,6,0,0,0-6,6V82H40a6,6,0,0,0-6,6V216a6,6,0,0,0,6,6H168a6,6,0,0,0,6-6V174h42a6,6,0,0,0,6-6V40A6,6,0,0,0,216,34ZM162,210H46V94H162Zm48-48H174V88a6,6,0,0,0-6-6H94V46H210Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,36H88a4,4,0,0,0-4,4V84H40a4,4,0,0,0-4,4V216a4,4,0,0,0,4,4H168a4,4,0,0,0,4-4V172h44a4,4,0,0,0,4-4V40A4,4,0,0,0,216,36ZM164,212H44V92H164Zm48-48H172V88a4,4,0,0,0-4-4H92V44H212Z"}))]]),G0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M196,35.52C177.62,25.51,153.48,20,128,20S78.38,25.51,60,35.52C39.37,46.79,28,62.58,28,80v96c0,17.42,11.37,33.21,32,44.48,18.35,10,42.49,15.52,68,15.52s49.62-5.51,68-15.52c20.66-11.27,32-27.06,32-44.48V80C228,62.58,216.63,46.79,196,35.52ZM204,128c0,17-31.21,36-76,36s-76-19-76-36v-8.46a88.9,88.9,0,0,0,8,4.94c18.35,10,42.49,15.52,68,15.52s49.62-5.51,68-15.52a88.9,88.9,0,0,0,8-4.94ZM128,44c44.79,0,76,19,76,36s-31.21,36-76,36S52,97,52,80,83.21,44,128,44Zm0,168c-44.79,0-76-19-76-36v-8.46a88.9,88.9,0,0,0,8,4.94c18.35,10,42.49,15.52,68,15.52s49.62-5.51,68-15.52a88.9,88.9,0,0,0,8-4.94V176C204,193,172.79,212,128,212Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,80c0,26.51-39.4,48-88,48S40,106.51,40,80s39.4-48,88-48S216,53.49,216,80Z",opacity:"0.2"}),a.createElement("path",{d:"M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64ZM69.61,53.08C85.07,44.65,105.81,40,128,40s42.93,4.65,58.39,13.08C200.12,60.57,208,70.38,208,80s-7.88,19.43-21.61,26.92C170.93,115.35,150.19,120,128,120s-42.93-4.65-58.39-13.08C55.88,99.43,48,89.62,48,80S55.88,60.57,69.61,53.08ZM186.39,202.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64Zm-21.61,74.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,26C75.29,26,34,49.72,34,80v96c0,30.28,41.29,54,94,54s94-23.72,94-54V80C222,49.72,180.71,26,128,26Zm0,12c44.45,0,82,19.23,82,42s-37.55,42-82,42S46,102.77,46,80,83.55,38,128,38Zm82,138c0,22.77-37.55,42-82,42s-82-19.23-82-42V154.79C62,171.16,92.37,182,128,182s66-10.84,82-27.21Zm0-48c0,22.77-37.55,42-82,42s-82-19.23-82-42V106.79C62,123.16,92.37,134,128,134s66-10.84,82-27.21Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64ZM69.61,53.08C85.07,44.65,105.81,40,128,40s42.93,4.65,58.39,13.08C200.12,60.57,208,70.38,208,80s-7.88,19.43-21.61,26.92C170.93,115.35,150.19,120,128,120s-42.93-4.65-58.39-13.08C55.88,99.43,48,89.62,48,80S55.88,60.57,69.61,53.08ZM186.39,202.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M192.14,42.55C174.94,33.17,152.16,28,128,28S81.06,33.17,63.86,42.55C45.89,52.35,36,65.65,36,80v96c0,14.35,9.89,27.65,27.86,37.45,17.2,9.38,40,14.55,64.14,14.55s46.94-5.17,64.14-14.55c18-9.8,27.86-23.1,27.86-37.45V80C220,65.65,210.11,52.35,192.14,42.55ZM212,176c0,11.29-8.41,22.1-23.69,30.43C172.27,215.18,150.85,220,128,220s-44.27-4.82-60.31-13.57C52.41,198.1,44,187.29,44,176V149.48c4.69,5.93,11.37,11.34,19.86,16,17.2,9.38,40,14.55,64.14,14.55s46.94-5.17,64.14-14.55c8.49-4.63,15.17-10,19.86-16Zm0-48c0,11.29-8.41,22.1-23.69,30.43C172.27,167.18,150.85,172,128,172s-44.27-4.82-60.31-13.57C52.41,150.1,44,139.29,44,128V101.48c4.69,5.93,11.37,11.34,19.86,16,17.2,9.38,40,14.55,64.14,14.55s46.94-5.17,64.14-14.55c8.49-4.63,15.17-10,19.86-16Zm-23.69-17.57C172.27,119.18,150.85,124,128,124s-44.27-4.82-60.31-13.57C52.41,102.1,44,91.29,44,80s8.41-22.1,23.69-30.43C83.73,40.82,105.15,36,128,36s44.27,4.82,60.31,13.57C203.59,57.9,212,68.71,212,80S203.59,102.1,188.31,110.43Z"}))]]),D0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,144v64a12,12,0,0,1-12,12H40a12,12,0,0,1-12-12V144a12,12,0,0,1,24,0v52H204V144a12,12,0,0,1,24,0Zm-108.49,8.49a12,12,0,0,0,17,0l40-40a12,12,0,0,0-17-17L140,115V32a12,12,0,0,0-24,0v83L96.49,95.51a12,12,0,0,0-17,17Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48V208H40V48A16,16,0,0,1,56,32H200A16,16,0,0,1,216,48Z",opacity:"0.2"}),a.createElement("path",{d:"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40A8,8,0,0,0,168,96H136V32a8,8,0,0,0-16,0V96H88a8,8,0,0,0-5.66,13.66Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M222,144v64a6,6,0,0,1-6,6H40a6,6,0,0,1-6-6V144a6,6,0,0,1,12,0v58H210V144a6,6,0,0,1,12,0Zm-98.24,4.24a6,6,0,0,0,8.48,0l40-40a6,6,0,0,0-8.48-8.48L134,129.51V32a6,6,0,0,0-12,0v97.51L92.24,99.76a6,6,0,0,0-8.48,8.48Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M220,144v64a4,4,0,0,1-4,4H40a4,4,0,0,1-4-4V144a4,4,0,0,1,8,0v60H212V144a4,4,0,0,1,8,0Zm-94.83,2.83a4,4,0,0,0,5.66,0l40-40a4,4,0,1,0-5.66-5.66L132,134.34V32a4,4,0,0,0-8,0V134.34L90.83,101.17a4,4,0,0,0-5.66,5.66Z"}))]]),z0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,76a52,52,0,1,0,52,52A52.06,52.06,0,0,0,128,76Zm0,80a28,28,0,1,1,28-28A28,28,0,0,1,128,156Zm92-27.21v-1.58l14-17.51a12,12,0,0,0,2.23-10.59A111.75,111.75,0,0,0,225,71.89,12,12,0,0,0,215.89,66L193.61,63.5l-1.11-1.11L190,40.1A12,12,0,0,0,184.11,31a111.67,111.67,0,0,0-27.23-11.27A12,12,0,0,0,146.3,22L128.79,36h-1.58L109.7,22a12,12,0,0,0-10.59-2.23A111.75,111.75,0,0,0,71.89,31.05,12,12,0,0,0,66,40.11L63.5,62.39,62.39,63.5,40.1,66A12,12,0,0,0,31,71.89,111.67,111.67,0,0,0,19.77,99.12,12,12,0,0,0,22,109.7l14,17.51v1.58L22,146.3a12,12,0,0,0-2.23,10.59,111.75,111.75,0,0,0,11.29,27.22A12,12,0,0,0,40.11,190l22.28,2.48,1.11,1.11L66,215.9A12,12,0,0,0,71.89,225a111.67,111.67,0,0,0,27.23,11.27A12,12,0,0,0,109.7,234l17.51-14h1.58l17.51,14a12,12,0,0,0,10.59,2.23A111.75,111.75,0,0,0,184.11,225a12,12,0,0,0,5.91-9.06l2.48-22.28,1.11-1.11L215.9,190a12,12,0,0,0,9.06-5.91,111.67,111.67,0,0,0,11.27-27.23A12,12,0,0,0,234,146.3Zm-24.12-4.89a70.1,70.1,0,0,1,0,8.2,12,12,0,0,0,2.61,8.22l12.84,16.05A86.47,86.47,0,0,1,207,166.86l-20.43,2.27a12,12,0,0,0-7.65,4,69,69,0,0,1-5.8,5.8,12,12,0,0,0-4,7.65L166.86,207a86.47,86.47,0,0,1-10.49,4.35l-16.05-12.85a12,12,0,0,0-7.5-2.62c-.24,0-.48,0-.72,0a70.1,70.1,0,0,1-8.2,0,12.06,12.06,0,0,0-8.22,2.6L99.63,211.33A86.47,86.47,0,0,1,89.14,207l-2.27-20.43a12,12,0,0,0-4-7.65,69,69,0,0,1-5.8-5.8,12,12,0,0,0-7.65-4L49,166.86a86.47,86.47,0,0,1-4.35-10.49l12.84-16.05a12,12,0,0,0,2.61-8.22,70.1,70.1,0,0,1,0-8.2,12,12,0,0,0-2.61-8.22L44.67,99.63A86.47,86.47,0,0,1,49,89.14l20.43-2.27a12,12,0,0,0,7.65-4,69,69,0,0,1,5.8-5.8,12,12,0,0,0,4-7.65L89.14,49a86.47,86.47,0,0,1,10.49-4.35l16.05,12.85a12.06,12.06,0,0,0,8.22,2.6,70.1,70.1,0,0,1,8.2,0,12,12,0,0,0,8.22-2.6l16.05-12.85A86.47,86.47,0,0,1,166.86,49l2.27,20.43a12,12,0,0,0,4,7.65,69,69,0,0,1,5.8,5.8,12,12,0,0,0,7.65,4L207,89.14a86.47,86.47,0,0,1,4.35,10.49l-12.84,16.05A12,12,0,0,0,195.88,123.9Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M207.86,123.18l16.78-21a99.14,99.14,0,0,0-10.07-24.29l-26.7-3a81,81,0,0,0-6.81-6.81l-3-26.71a99.43,99.43,0,0,0-24.3-10l-21,16.77a81.59,81.59,0,0,0-9.64,0l-21-16.78A99.14,99.14,0,0,0,77.91,41.43l-3,26.7a81,81,0,0,0-6.81,6.81l-26.71,3a99.43,99.43,0,0,0-10,24.3l16.77,21a81.59,81.59,0,0,0,0,9.64l-16.78,21a99.14,99.14,0,0,0,10.07,24.29l26.7,3a81,81,0,0,0,6.81,6.81l3,26.71a99.43,99.43,0,0,0,24.3,10l21-16.77a81.59,81.59,0,0,0,9.64,0l21,16.78a99.14,99.14,0,0,0,24.29-10.07l3-26.7a81,81,0,0,0,6.81-6.81l26.71-3a99.43,99.43,0,0,0,10-24.3l-16.77-21A81.59,81.59,0,0,0,207.86,123.18ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z",opacity:"0.2"}),a.createElement("path",{d:"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.6,107.6,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.29,107.29,0,0,0-26.25-10.86,8,8,0,0,0-7.06,1.48L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.6,107.6,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8.06,8.06,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8.06,8.06,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,130.16q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.6,107.6,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.29,107.29,0,0,0-26.25-10.86,8,8,0,0,0-7.06,1.48L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.6,107.6,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,82a46,46,0,1,0,46,46A46.06,46.06,0,0,0,128,82Zm0,80a34,34,0,1,1,34-34A34,34,0,0,1,128,162ZM214,130.84c.06-1.89.06-3.79,0-5.68L229.33,106a6,6,0,0,0,1.11-5.29A105.34,105.34,0,0,0,219.76,74.9a6,6,0,0,0-4.53-3l-24.45-2.71q-1.93-2.07-4-4l-2.72-24.46a6,6,0,0,0-3-4.53,105.65,105.65,0,0,0-25.77-10.66A6,6,0,0,0,150,26.68l-19.2,15.37c-1.89-.06-3.79-.06-5.68,0L106,26.67a6,6,0,0,0-5.29-1.11A105.34,105.34,0,0,0,74.9,36.24a6,6,0,0,0-3,4.53L69.23,65.22q-2.07,1.94-4,4L40.76,72a6,6,0,0,0-4.53,3,105.65,105.65,0,0,0-10.66,25.77A6,6,0,0,0,26.68,106l15.37,19.2c-.06,1.89-.06,3.79,0,5.68L26.67,150.05a6,6,0,0,0-1.11,5.29A105.34,105.34,0,0,0,36.24,181.1a6,6,0,0,0,4.53,3l24.45,2.71q1.94,2.07,4,4L72,215.24a6,6,0,0,0,3,4.53,105.65,105.65,0,0,0,25.77,10.66,6,6,0,0,0,5.29-1.11L125.16,214c1.89.06,3.79.06,5.68,0l19.21,15.38a6,6,0,0,0,3.75,1.31,6.2,6.2,0,0,0,1.54-.2,105.34,105.34,0,0,0,25.76-10.68,6,6,0,0,0,3-4.53l2.71-24.45q2.07-1.93,4-4l24.46-2.72a6,6,0,0,0,4.53-3,105.49,105.49,0,0,0,10.66-25.77,6,6,0,0,0-1.11-5.29Zm-3.1,41.63-23.64,2.63a6,6,0,0,0-3.82,2,75.14,75.14,0,0,1-6.31,6.31,6,6,0,0,0-2,3.82l-2.63,23.63A94.28,94.28,0,0,1,155.14,218l-18.57-14.86a6,6,0,0,0-3.75-1.31h-.36a78.07,78.07,0,0,1-8.92,0,6,6,0,0,0-4.11,1.3L100.87,218a94.13,94.13,0,0,1-17.34-7.17L80.9,187.21a6,6,0,0,0-2-3.82,75.14,75.14,0,0,1-6.31-6.31,6,6,0,0,0-3.82-2l-23.63-2.63A94.28,94.28,0,0,1,38,155.14l14.86-18.57a6,6,0,0,0,1.3-4.11,78.07,78.07,0,0,1,0-8.92,6,6,0,0,0-1.3-4.11L38,100.87a94.13,94.13,0,0,1,7.17-17.34L68.79,80.9a6,6,0,0,0,3.82-2,75.14,75.14,0,0,1,6.31-6.31,6,6,0,0,0,2-3.82l2.63-23.63A94.28,94.28,0,0,1,100.86,38l18.57,14.86a6,6,0,0,0,4.11,1.3,78.07,78.07,0,0,1,8.92,0,6,6,0,0,0,4.11-1.3L155.13,38a94.13,94.13,0,0,1,17.34,7.17l2.63,23.64a6,6,0,0,0,2,3.82,75.14,75.14,0,0,1,6.31,6.31,6,6,0,0,0,3.82,2l23.63,2.63A94.28,94.28,0,0,1,218,100.86l-14.86,18.57a6,6,0,0,0-1.3,4.11,78.07,78.07,0,0,1,0,8.92,6,6,0,0,0,1.3,4.11L218,155.13A94.13,94.13,0,0,1,210.85,172.47Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.21,107.21,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.71,107.71,0,0,0-26.25-10.87,8,8,0,0,0-7.06,1.49L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.21,107.21,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8,8,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8,8,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,84a44,44,0,1,0,44,44A44.05,44.05,0,0,0,128,84Zm0,80a36,36,0,1,1,36-36A36,36,0,0,1,128,164Zm83.93-32.49q.13-3.51,0-7l15.83-19.79a4,4,0,0,0,.75-3.53A103.64,103.64,0,0,0,218,75.9a4,4,0,0,0-3-2l-25.19-2.8c-1.58-1.71-3.24-3.37-4.95-4.95L182.07,41a4,4,0,0,0-2-3A104,104,0,0,0,154.82,27.5a4,4,0,0,0-3.53.74L131.51,44.07q-3.51-.14-7,0L104.7,28.24a4,4,0,0,0-3.53-.75A103.64,103.64,0,0,0,75.9,38a4,4,0,0,0-2,3l-2.8,25.19c-1.71,1.58-3.37,3.24-4.95,4.95L41,73.93a4,4,0,0,0-3,2A104,104,0,0,0,27.5,101.18a4,4,0,0,0,.74,3.53l15.83,19.78q-.14,3.51,0,7L28.24,151.3a4,4,0,0,0-.75,3.53A103.64,103.64,0,0,0,38,180.1a4,4,0,0,0,3,2l25.19,2.8c1.58,1.71,3.24,3.37,4.95,4.95l2.8,25.2a4,4,0,0,0,2,3,104,104,0,0,0,25.28,10.46,4,4,0,0,0,3.53-.74l19.78-15.83q3.51.13,7,0l19.79,15.83a4,4,0,0,0,2.5.88,4,4,0,0,0,1-.13A103.64,103.64,0,0,0,180.1,218a4,4,0,0,0,2-3l2.8-25.19c1.71-1.58,3.37-3.24,4.95-4.95l25.2-2.8a4,4,0,0,0,3-2,104,104,0,0,0,10.46-25.28,4,4,0,0,0-.74-3.53Zm.17,42.83-24.67,2.74a4,4,0,0,0-2.55,1.32,76.2,76.2,0,0,1-6.48,6.48,4,4,0,0,0-1.32,2.55l-2.74,24.66a95.45,95.45,0,0,1-19.64,8.15l-19.38-15.51a4,4,0,0,0-2.5-.87h-.24a73.67,73.67,0,0,1-9.16,0,4,4,0,0,0-2.74.87l-19.37,15.5a95.33,95.33,0,0,1-19.65-8.13l-2.74-24.67a4,4,0,0,0-1.32-2.55,76.2,76.2,0,0,1-6.48-6.48,4,4,0,0,0-2.55-1.32l-24.66-2.74a95.45,95.45,0,0,1-8.15-19.64l15.51-19.38a4,4,0,0,0,.87-2.74,77.76,77.76,0,0,1,0-9.16,4,4,0,0,0-.87-2.74l-15.5-19.37A95.33,95.33,0,0,1,43.9,81.66l24.67-2.74a4,4,0,0,0,2.55-1.32,76.2,76.2,0,0,1,6.48-6.48,4,4,0,0,0,1.32-2.55l2.74-24.66a95.45,95.45,0,0,1,19.64-8.15l19.38,15.51a4,4,0,0,0,2.74.87,73.67,73.67,0,0,1,9.16,0,4,4,0,0,0,2.74-.87l19.37-15.5a95.33,95.33,0,0,1,19.65,8.13l2.74,24.67a4,4,0,0,0,1.32,2.55,76.2,76.2,0,0,1,6.48,6.48,4,4,0,0,0,2.55,1.32l24.66,2.74a95.45,95.45,0,0,1,8.15,19.64l-15.51,19.38a4,4,0,0,0-.87,2.74,77.76,77.76,0,0,1,0,9.16,4,4,0,0,0,.87,2.74l15.5,19.37A95.33,95.33,0,0,1,212.1,174.34Z"}))]]),T0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236,64a36,36,0,1,0-48,33.94V112a4,4,0,0,1-4,4H96a27.8,27.8,0,0,0-4,.29V97.94a36,36,0,1,0-24,0v60.12a36,36,0,1,0,24,0V144a4,4,0,0,1,4-4h88a28,28,0,0,0,28-28V97.94A36.07,36.07,0,0,0,236,64ZM80,52A12,12,0,1,1,68,64,12,12,0,0,1,80,52Zm0,152a12,12,0,1,1,12-12A12,12,0,0,1,80,204ZM200,76a12,12,0,1,1,12-12A12,12,0,0,1,200,76Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,64a24,24,0,1,1-24-24A24,24,0,0,1,224,64Z",opacity:"0.2"}),a.createElement("path",{d:"M232,64a32,32,0,1,0-40,31v17a8,8,0,0,1-8,8H96a23.84,23.84,0,0,0-8,1.38V95a32,32,0,1,0-16,0v66a32,32,0,1,0,16,0V144a8,8,0,0,1,8-8h88a24,24,0,0,0,24-24V95A32.06,32.06,0,0,0,232,64ZM64,64A16,16,0,1,1,80,80,16,16,0,0,1,64,64ZM96,192a16,16,0,1,1-16-16A16,16,0,0,1,96,192ZM200,80a16,16,0,1,1,16-16A16,16,0,0,1,200,80Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,64a32,32,0,1,0-40,31v17a8,8,0,0,1-8,8H96a23.84,23.84,0,0,0-8,1.38V95a32,32,0,1,0-16,0v66a32,32,0,1,0,16,0V144a8,8,0,0,1,8-8h88a24,24,0,0,0,24-24V95A32.06,32.06,0,0,0,232,64ZM64,64A16,16,0,1,1,80,80,16,16,0,0,1,64,64ZM96,192a16,16,0,1,1-16-16A16,16,0,0,1,96,192Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M230,64a30,30,0,1,0-36,29.4V112a10,10,0,0,1-10,10H96a21.84,21.84,0,0,0-10,2.42v-31a30,30,0,1,0-12,0v69.2a30,30,0,1,0,12,0V144a10,10,0,0,1,10-10h88a22,22,0,0,0,22-22V93.4A30.05,30.05,0,0,0,230,64ZM62,64A18,18,0,1,1,80,82,18,18,0,0,1,62,64ZM98,192a18,18,0,1,1-18-18A18,18,0,0,1,98,192ZM200,82a18,18,0,1,1,18-18A18,18,0,0,1,200,82Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,64a32,32,0,1,0-40,31v17a8,8,0,0,1-8,8H96a23.84,23.84,0,0,0-8,1.38V95a32,32,0,1,0-16,0v66a32,32,0,1,0,16,0V144a8,8,0,0,1,8-8h88a24,24,0,0,0,24-24V95A32.06,32.06,0,0,0,232,64ZM64,64A16,16,0,1,1,80,80,16,16,0,0,1,64,64ZM96,192a16,16,0,1,1-16-16A16,16,0,0,1,96,192ZM200,80a16,16,0,1,1,16-16A16,16,0,0,1,200,80Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,64a28,28,0,1,0-32,27.71V112a12,12,0,0,1-12,12H96a19.91,19.91,0,0,0-12,4V91.71a28,28,0,1,0-8,0v72.58a28,28,0,1,0,8,0V144a12,12,0,0,1,12-12h88a20,20,0,0,0,20-20V91.71A28,28,0,0,0,228,64ZM60,64A20,20,0,1,1,80,84,20,20,0,0,1,60,64Zm40,128a20,20,0,1,1-20-20A20,20,0,0,1,100,192ZM200,84a20,20,0,1,1,20-20A20,20,0,0,1,200,84Z"}))]]),W0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M212.62,75.17A63.7,63.7,0,0,0,206.39,26,12,12,0,0,0,196,20a63.71,63.71,0,0,0-50,24H126A63.71,63.71,0,0,0,76,20a12,12,0,0,0-10.39,6,63.7,63.7,0,0,0-6.23,49.17A61.5,61.5,0,0,0,52,104v8a60.1,60.1,0,0,0,45.76,58.28A43.66,43.66,0,0,0,92,192v4H76a20,20,0,0,1-20-20,44.05,44.05,0,0,0-44-44,12,12,0,0,0,0,24,20,20,0,0,1,20,20,44.05,44.05,0,0,0,44,44H92v12a12,12,0,0,0,24,0V192a20,20,0,0,1,40,0v40a12,12,0,0,0,24,0V192a43.66,43.66,0,0,0-5.76-21.72A60.1,60.1,0,0,0,220,112v-8A61.5,61.5,0,0,0,212.62,75.17ZM196,112a36,36,0,0,1-36,36H112a36,36,0,0,1-36-36v-8a37.87,37.87,0,0,1,6.13-20.12,11.65,11.65,0,0,0,1.58-11.49,39.9,39.9,0,0,1-.4-27.72,39.87,39.87,0,0,1,26.41,17.8A12,12,0,0,0,119.82,68h32.35a12,12,0,0,0,10.11-5.53,39.84,39.84,0,0,1,26.41-17.8,39.9,39.9,0,0,1-.4,27.72,12,12,0,0,0,1.61,11.53A37.85,37.85,0,0,1,196,104Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,104v8a48,48,0,0,1-48,48H136a32,32,0,0,1,32,32v40H104V192a32,32,0,0,1,32-32H112a48,48,0,0,1-48-48v-8a49.28,49.28,0,0,1,8.51-27.3A51.92,51.92,0,0,1,76,32a52,52,0,0,1,43.83,24h32.34A52,52,0,0,1,196,32a51.92,51.92,0,0,1,3.49,44.7A49.28,49.28,0,0,1,208,104Z",opacity:"0.2"}),a.createElement("path",{d:"M208.3,75.68A59.74,59.74,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58,58,0,0,0,208.3,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.76,41.76,0,0,1,200,104Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,104v8a56.06,56.06,0,0,1-48.44,55.47A39.8,39.8,0,0,1,176,192v40a8,8,0,0,1-8,8H104a8,8,0,0,1-8-8V216H72a40,40,0,0,1-40-40A24,24,0,0,0,8,152a8,8,0,0,1,0-16,40,40,0,0,1,40,40,24,24,0,0,0,24,24H96v-8a39.8,39.8,0,0,1,8.44-24.53A56.06,56.06,0,0,1,56,112v-8a58.14,58.14,0,0,1,7.69-28.32A59.78,59.78,0,0,1,69.07,28,8,8,0,0,1,76,24a59.75,59.75,0,0,1,48,24h24a59.75,59.75,0,0,1,48-24,8,8,0,0,1,6.93,4,59.74,59.74,0,0,1,5.37,47.68A58,58,0,0,1,216,104Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M206.13,75.92A57.79,57.79,0,0,0,201.2,29a6,6,0,0,0-5.2-3,57.77,57.77,0,0,0-47,24H123A57.77,57.77,0,0,0,76,26a6,6,0,0,0-5.2,3,57.79,57.79,0,0,0-4.93,46.92A55.88,55.88,0,0,0,58,104v8a54.06,54.06,0,0,0,50.45,53.87A37.85,37.85,0,0,0,98,192v10H72a26,26,0,0,1-26-26A38,38,0,0,0,8,138a6,6,0,0,0,0,12,26,26,0,0,1,26,26,38,38,0,0,0,38,38H98v18a6,6,0,0,0,12,0V192a26,26,0,0,1,52,0v40a6,6,0,0,0,12,0V192a37.85,37.85,0,0,0-10.45-26.13A54.06,54.06,0,0,0,214,112v-8A55.88,55.88,0,0,0,206.13,75.92ZM202,112a42,42,0,0,1-42,42H112a42,42,0,0,1-42-42v-8a43.86,43.86,0,0,1,7.3-23.69,6,6,0,0,0,.81-5.76,45.85,45.85,0,0,1,1.43-36.42,45.85,45.85,0,0,1,35.23,21.1A6,6,0,0,0,119.83,62h32.34a6,6,0,0,0,5.06-2.76,45.83,45.83,0,0,1,35.23-21.11,45.85,45.85,0,0,1,1.43,36.42,6,6,0,0,0,.79,5.74A43.78,43.78,0,0,1,202,104Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208.31,75.68A59.78,59.78,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58.14,58.14,0,0,0,208.31,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.72,41.72,0,0,1,200,104Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M203.94,76.16A55.73,55.73,0,0,0,199.46,30,4,4,0,0,0,196,28a55.78,55.78,0,0,0-46,24H122A55.78,55.78,0,0,0,76,28a4,4,0,0,0-3.46,2,55.73,55.73,0,0,0-4.48,46.16A53.78,53.78,0,0,0,60,104v8a52.06,52.06,0,0,0,52,52h1.41A36,36,0,0,0,100,192v12H72a28,28,0,0,1-28-28A36,36,0,0,0,8,140a4,4,0,0,0,0,8,28,28,0,0,1,28,28,36,36,0,0,0,36,36h28v20a4,4,0,0,0,8,0V192a28,28,0,0,1,56,0v40a4,4,0,0,0,8,0V192a36,36,0,0,0-13.41-28H160a52.06,52.06,0,0,0,52-52v-8A53.78,53.78,0,0,0,203.94,76.16ZM204,112a44.05,44.05,0,0,1-44,44H112a44.05,44.05,0,0,1-44-44v-8a45.76,45.76,0,0,1,7.71-24.89,4,4,0,0,0,.53-3.84,47.82,47.82,0,0,1,2.1-39.21,47.8,47.8,0,0,1,38.12,22.1A4,4,0,0,0,119.83,60h32.34a4,4,0,0,0,3.37-1.84,47.8,47.8,0,0,1,38.12-22.1,47.82,47.82,0,0,1,2.1,39.21,4,4,0,0,0,.53,3.83A45.85,45.85,0,0,1,204,104Z"}))]]),j0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M249.8,85.49l-116-64a12,12,0,0,0-11.6,0l-116,64a12,12,0,0,0,0,21l21.8,12v47.76a19.89,19.89,0,0,0,5.09,13.32C46.63,194.7,77,220,128,220a136.88,136.88,0,0,0,40-5.75V240a12,12,0,0,0,24,0V204.12a119.53,119.53,0,0,0,30.91-24.51A19.89,19.89,0,0,0,228,166.29V118.53l21.8-12a12,12,0,0,0,0-21ZM128,45.71,219.16,96,186,114.3a1.88,1.88,0,0,1-.18-.12l-52-28.69a12,12,0,0,0-11.6,21l39,21.49L128,146.3,36.84,96ZM128,196c-40.42,0-64.65-19.07-76-31.27v-33l70.2,38.74a12,12,0,0,0,11.6,0L168,151.64v37.23A110.46,110.46,0,0,1,128,196Zm76-31.27a93.21,93.21,0,0,1-12,10.81V138.39l12-6.62Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,113.07v53.22a8,8,0,0,1-2,5.31c-11.3,12.59-38.9,36.4-86,36.4s-74.68-23.81-86-36.4a8,8,0,0,1-2-5.31V113.07L128,160Z",opacity:"0.2"}),a.createElement("path",{d:"M251.76,88.94l-120-64a8,8,0,0,0-7.52,0l-120,64a8,8,0,0,0,0,14.12L32,117.87v48.42a15.91,15.91,0,0,0,4.06,10.65C49.16,191.53,78.51,216,128,216a130,130,0,0,0,48-8.76V240a8,8,0,0,0,16,0V199.51a115.63,115.63,0,0,0,27.94-22.57A15.91,15.91,0,0,0,224,166.29V117.87l27.76-14.81a8,8,0,0,0,0-14.12ZM128,200c-43.27,0-68.72-21.14-80-33.71V126.4l76.24,40.66a8,8,0,0,0,7.52,0L176,143.47v46.34C163.4,195.69,147.52,200,128,200Zm80-33.75a97.83,97.83,0,0,1-16,14.25V134.93l16-8.53ZM188,118.94l-.22-.13-56-29.87a8,8,0,0,0-7.52,14.12L171,128l-43,22.93L25,96,128,41.07,231,96Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176,207.24a119,119,0,0,0,16-7.73V240a8,8,0,0,1-16,0Zm11.76-88.43-56-29.87a8,8,0,0,0-7.52,14.12L171,128l17-9.06Zm64-29.87-120-64a8,8,0,0,0-7.52,0l-120,64a8,8,0,0,0,0,14.12L32,117.87v48.42a15.91,15.91,0,0,0,4.06,10.65C49.16,191.53,78.51,216,128,216a130,130,0,0,0,48-8.76V130.67L171,128l-43,22.93L43.83,106l0,0L25,96,128,41.07,231,96l-18.78,10-.06,0L188,118.94a8,8,0,0,1,4,6.93v73.64a115.63,115.63,0,0,0,27.94-22.57A15.91,15.91,0,0,0,224,166.29V117.87l27.76-14.81a8,8,0,0,0,0-14.12Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M250.82,90.71l-120-64a5.94,5.94,0,0,0-5.64,0l-120,64a6,6,0,0,0,0,10.58L34,116.67v49.62a14,14,0,0,0,3.55,9.32C50.42,189.94,79.29,214,128,214a127.21,127.21,0,0,0,50-9.73V240a6,6,0,0,0,12,0V198.35a113.18,113.18,0,0,0,28.45-22.75,13.91,13.91,0,0,0,3.55-9.31V116.67l28.82-15.38a6,6,0,0,0,0-10.58ZM128,202c-44,0-70-21.56-81.52-34.41a2,2,0,0,1-.48-1.3V123.07l79.18,42.22a6,6,0,0,0,5.64,0L178,140.13v51C165,197.35,148.45,202,128,202Zm82-35.71a2,2,0,0,1-.48,1.3A100.25,100.25,0,0,1,190,184.3V133.73l20-10.66Zm-22.15-45a6.27,6.27,0,0,0-1-.71l-56-29.86a6,6,0,0,0-5.64,10.58L175.25,128,128,153.2,20.75,96,128,38.8,235.25,96Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M251.76,88.94l-120-64a8,8,0,0,0-7.52,0l-120,64a8,8,0,0,0,0,14.12L32,117.87v48.42a15.91,15.91,0,0,0,4.06,10.65C49.16,191.53,78.51,216,128,216a130,130,0,0,0,48-8.76V240a8,8,0,0,0,16,0V199.51a115.63,115.63,0,0,0,27.94-22.57A15.91,15.91,0,0,0,224,166.29V117.87l27.76-14.81a8,8,0,0,0,0-14.12ZM128,200c-43.27,0-68.72-21.14-80-33.71V126.4l76.24,40.66a8,8,0,0,0,7.52,0L176,143.47v46.34C163.4,195.69,147.52,200,128,200Zm80-33.75a97.83,97.83,0,0,1-16,14.25V134.93l16-8.53ZM188,118.94l-.22-.13-56-29.87a8,8,0,0,0-7.52,14.12L171,128l-43,22.93L25,96,128,41.07,231,96Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M249.88,92.47l-120-64a4,4,0,0,0-3.76,0l-120,64a4,4,0,0,0,0,7.06L36,115.47v50.82a11.92,11.92,0,0,0,3,8c12.65,14.09,41,37.73,89,37.73,21,0,38.2-4.52,52-10.79V240a4,4,0,0,0,8,0V197.18a111.64,111.64,0,0,0,29-22.91,11.94,11.94,0,0,0,3-8V115.47l29.88-15.94a4,4,0,0,0,0-7.06ZM128,204c-44.83,0-71.25-22-83-35.08a3.92,3.92,0,0,1-1-2.63V119.73l82.12,43.8a4,4,0,0,0,3.76,0L180,136.8v55.53C166.58,199,149.39,204,128,204Zm84-37.71a4,4,0,0,1-1,2.64,103.32,103.32,0,0,1-23,19v-55.4l24-12.8Zm-24.59-42.51a4,4,0,0,0-1.53-1.44l-56-29.87a4,4,0,0,0-3.76,7.06L179.5,128,128,155.47,16.5,96,128,36.53,239.5,96Z"}))]]),O0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,152a35.77,35.77,0,0,0-16.46,4l-21.39-16.64A35.49,35.49,0,0,0,164,128.65l10.35-3.44A36,36,0,1,0,164,100c0,1.11.06,2.21.16,3.3l-7.78,2.59A36,36,0,0,0,128,92c-1,0-1.88,0-2.81.12l-4.45-10A36,36,0,1,0,96,92c1,0,1.88,0,2.81-.12l4.45,10a35.91,35.91,0,0,0-8.59,39.7L73.39,160.49a36,36,0,1,0,15.94,17.93l21.28-18.91a35.91,35.91,0,0,0,36.8-1.21L167,173.56A36,36,0,1,0,200,152Zm0-64a12,12,0,1,1-12,12A12,12,0,0,1,200,88ZM84,56A12,12,0,1,1,96,68,12,12,0,0,1,84,56ZM56,204a12,12,0,1,1,12-12A12,12,0,0,1,56,204Zm60-76a12,12,0,1,1,12,12A12,12,0,0,1,116,128Zm84,72a12,12,0,1,1,12-12A12,12,0,0,1,200,200Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M152,128a24,24,0,1,1-24-24A24,24,0,0,1,152,128Z",opacity:"0.2"}),a.createElement("path",{d:"M200,152a31.84,31.84,0,0,0-19.53,6.68l-23.11-18A31.65,31.65,0,0,0,160,128c0-.74,0-1.48-.08-2.21l13.23-4.41A32,32,0,1,0,168,104c0,.74,0,1.48.08,2.21l-13.23,4.41A32,32,0,0,0,128,96a32.59,32.59,0,0,0-5.27.44L115.89,81A32,32,0,1,0,96,88a32.59,32.59,0,0,0,5.27-.44l6.84,15.4a31.92,31.92,0,0,0-8.57,39.64L73.83,165.44a32.06,32.06,0,1,0,10.63,12l25.71-22.84a31.91,31.91,0,0,0,37.36-1.24l23.11,18A31.65,31.65,0,0,0,168,184a32,32,0,1,0,32-32Zm0-64a16,16,0,1,1-16,16A16,16,0,0,1,200,88ZM80,56A16,16,0,1,1,96,72,16,16,0,0,1,80,56ZM56,208a16,16,0,1,1,16-16A16,16,0,0,1,56,208Zm56-80a16,16,0,1,1,16,16A16,16,0,0,1,112,128Zm88,72a16,16,0,1,1,16-16A16,16,0,0,1,200,200Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,152a31.84,31.84,0,0,0-19.53,6.68l-23.11-18A31.65,31.65,0,0,0,160,128c0-.74,0-1.48-.08-2.21l13.23-4.41A32,32,0,1,0,168,104c0,.74,0,1.48.08,2.21l-13.23,4.41A32,32,0,0,0,128,96a32.59,32.59,0,0,0-5.27.44L115.89,81A32,32,0,1,0,96,88a32.59,32.59,0,0,0,5.27-.44l6.84,15.4a31.92,31.92,0,0,0-8.57,39.64L73.83,165.44a32.06,32.06,0,1,0,10.63,12l25.71-22.84a31.91,31.91,0,0,0,37.36-1.24l23.11,18A31.65,31.65,0,0,0,168,184a32,32,0,1,0,32-32Zm0-64a16,16,0,1,1-16,16A16,16,0,0,1,200,88ZM80,56A16,16,0,1,1,96,72,16,16,0,0,1,80,56ZM56,208a16,16,0,1,1,16-16A16,16,0,0,1,56,208Zm144-8a16,16,0,1,1,16-16A16,16,0,0,1,200,200Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,154a29.87,29.87,0,0,0-19.5,7.23L154.88,141.3A29.83,29.83,0,0,0,158,128a30.52,30.52,0,0,0-.22-3.6L174,119a30,30,0,1,0-4-15,30.52,30.52,0,0,0,.22,3.6L154,113a29.91,29.91,0,0,0-32.42-14.31l-8.14-18.3a30,30,0,1,0-11,4.88l8.14,18.3A29.92,29.92,0,0,0,102.06,143L74,168a30.08,30.08,0,1,0,8,9L110,152a29.91,29.91,0,0,0,37.47-1.23l25.62,19.93A30,30,0,1,0,200,154Zm0-68a18,18,0,1,1-18,18A18,18,0,0,1,200,86ZM78,56A18,18,0,1,1,96,74,18,18,0,0,1,78,56ZM56,210a18,18,0,1,1,18-18A18,18,0,0,1,56,210Zm72-64a18,18,0,1,1,18-18A18,18,0,0,1,128,146Zm72,56a18,18,0,1,1,18-18A18,18,0,0,1,200,202Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,152a31.84,31.84,0,0,0-19.53,6.68l-23.11-18A31.65,31.65,0,0,0,160,128c0-.74,0-1.48-.08-2.21l13.23-4.41A32,32,0,1,0,168,104c0,.74,0,1.48.08,2.21l-13.23,4.41A32,32,0,0,0,128,96a32.59,32.59,0,0,0-5.27.44L115.89,81A32,32,0,1,0,96,88a32.59,32.59,0,0,0,5.27-.44l6.84,15.4a31.92,31.92,0,0,0-8.57,39.64L73.83,165.44a32.06,32.06,0,1,0,10.63,12l25.71-22.84a31.91,31.91,0,0,0,37.36-1.24l23.11,18A31.65,31.65,0,0,0,168,184a32,32,0,1,0,32-32Zm0-64a16,16,0,1,1-16,16A16,16,0,0,1,200,88ZM80,56A16,16,0,1,1,96,72,16,16,0,0,1,80,56ZM56,208a16,16,0,1,1,16-16A16,16,0,0,1,56,208Zm56-80a16,16,0,1,1,16,16A16,16,0,0,1,112,128Zm88,72a16,16,0,1,1,16-16A16,16,0,0,1,200,200Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,156a27.87,27.87,0,0,0-19.4,7.84l-28.28-22A27.78,27.78,0,0,0,156,128a28.09,28.09,0,0,0-.45-5L175,116.55a28.07,28.07,0,1,0-2.53-7.58L153,115.45A28,28,0,0,0,128,100a27.68,27.68,0,0,0-7.6,1.06l-9.5-21.37A28,28,0,1,0,96,84a27.68,27.68,0,0,0,7.6-1.06l9.5,21.37a27.95,27.95,0,0,0-8.46,39.1L74,170.61a28,28,0,1,0,5.32,6l30.6-27.2a27.92,27.92,0,0,0,37.44-1.23l28.28,22A28,28,0,1,0,200,156Zm0-72a20,20,0,1,1-20,20A20,20,0,0,1,200,84ZM76,56A20,20,0,1,1,96,76,20,20,0,0,1,76,56ZM56,212a20,20,0,1,1,20-20A20,20,0,0,1,56,212Zm72-64a20,20,0,1,1,20-20A20,20,0,0,1,128,148Zm72,56a20,20,0,1,1,20-20A20,20,0,0,1,200,204Z"}))]]),U0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,60H32A20,20,0,0,0,12,80v96a20,20,0,0,0,20,20H224a20,20,0,0,0,20-20V80A20,20,0,0,0,224,60Zm-4,112H36V84H220Zm-56-44a16,16,0,1,1,16,16A16,16,0,0,1,164,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,80v96a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V80a8,8,0,0,1,8-8H224A8,8,0,0,1,232,80Z",opacity:"0.2"}),a.createElement("path",{d:"M224,64H32A16,16,0,0,0,16,80v96a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V80A16,16,0,0,0,224,64Zm0,112H32V80H224v96Zm-24-48a12,12,0,1,1-12-12A12,12,0,0,1,200,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,64H32A16,16,0,0,0,16,80v96a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V80A16,16,0,0,0,224,64Zm-36,76a12,12,0,1,1,12-12A12,12,0,0,1,188,140Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,66H32A14,14,0,0,0,18,80v96a14,14,0,0,0,14,14H224a14,14,0,0,0,14-14V80A14,14,0,0,0,224,66Zm2,110a2,2,0,0,1-2,2H32a2,2,0,0,1-2-2V80a2,2,0,0,1,2-2H224a2,2,0,0,1,2,2Zm-28-48a10,10,0,1,1-10-10A10,10,0,0,1,198,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,64H32A16,16,0,0,0,16,80v96a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V80A16,16,0,0,0,224,64Zm0,112H32V80H224v96Zm-24-48a12,12,0,1,1-12-12A12,12,0,0,1,200,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,68H32A12,12,0,0,0,20,80v96a12,12,0,0,0,12,12H224a12,12,0,0,0,12-12V80A12,12,0,0,0,224,68Zm4,108a4,4,0,0,1-4,4H32a4,4,0,0,1-4-4V80a4,4,0,0,1,4-4H224a4,4,0,0,1,4,4Zm-32-48a8,8,0,1,1-8-8A8,8,0,0,1,196,128Z"}))]]),X0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M71.76,148H31.7a12,12,0,1,1,0-24H65.33l12.45-18.66a12,12,0,0,1,20,0l22,33,6-9a12,12,0,0,1,10-5.34h24a12,12,0,1,1,0,24h-17.6l-12.46,18.66a12,12,0,0,1-20,0l-22-33-6,9A12,12,0,0,1,71.76,148ZM177.91,36c-20.12,0-38,7.93-50.07,21.56C115.74,43.93,97.89,36,77.76,36A66,66,0,0,0,12.07,94.68,12,12,0,0,0,36,97.32,42,42,0,0,1,77.76,60c17.83,0,32.75,9.4,38.95,24.54a12,12,0,0,0,22.25,0C145.16,69.4,160.08,60,177.91,60A42.08,42.08,0,0,1,220,102c0,29.42-25.86,57.77-47.56,76.36a329,329,0,0,1-44.58,31.81c-10.87-6.45-35.37-22-56.51-42.73a12,12,0,1,0-16.84,17.12c30.39,29.81,66.15,49.2,67.66,50a12.06,12.06,0,0,0,11.39,0C138,232.14,244,174.34,244,102A66.12,66.12,0,0,0,177.91,36Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,102c0,66-104,122-104,122S24,168,24,102A54,54,0,0,1,78,48c22.59,0,41.94,12.31,50,32,8.06-19.69,27.41-32,50-32A54,54,0,0,1,232,102Z",opacity:"0.2"}),a.createElement("path",{d:"M72,144H32a8,8,0,0,1,0-16H67.72l13.62-20.44a8,8,0,0,1,13.32,0l25.34,38,9.34-14A8,8,0,0,1,136,128h24a8,8,0,0,1,0,16H140.28l-13.62,20.44a8,8,0,0,1-13.32,0L88,126.42l-9.34,14A8,8,0,0,1,72,144ZM178,40c-20.65,0-38.73,8.88-50,23.89C116.73,48.88,98.65,40,78,40a62.07,62.07,0,0,0-62,62c0,.75,0,1.5,0,2.25a8,8,0,1,0,16-.5c0-.58,0-1.17,0-1.75A46.06,46.06,0,0,1,78,56c19.45,0,35.78,10.36,42.6,27a8,8,0,0,0,14.8,0c6.82-16.67,23.15-27,42.6-27a46.06,46.06,0,0,1,46,46c0,53.61-77.76,102.15-96,112.8-10.83-6.31-42.63-26-66.68-52.21a8,8,0,1,0-11.8,10.82c31.17,34,72.93,56.68,74.69,57.63a8,8,0,0,0,7.58,0C136.21,228.66,240,172,240,102A62.07,62.07,0,0,0,178,40Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,102c0,70-103.79,126.66-108.21,129a8,8,0,0,1-7.58,0c-3.35-1.8-63.55-34.69-92.68-80.89A4,4,0,0,1,34.92,144H72a8,8,0,0,0,6.66-3.56l9.34-14,25.34,38a8,8,0,0,0,9.16,3.16,8.23,8.23,0,0,0,4.28-3.34L140.28,144H160a8,8,0,0,0,8-8.53,8.18,8.18,0,0,0-8.25-7.47H136a8,8,0,0,0-6.66,3.56l-9.34,14-25.34-38a8,8,0,0,0-9.17-3.16,8.25,8.25,0,0,0-4.27,3.34L67.72,128H23.53a4,4,0,0,1-3.83-2.81A76.93,76.93,0,0,1,16,102,62.07,62.07,0,0,1,78,40c20.65,0,38.73,8.88,50,23.89C139.27,48.88,157.35,40,178,40A62.07,62.07,0,0,1,240,102Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M72,142H32a6,6,0,0,1,0-12H68.79L83,108.67a6,6,0,0,1,10,0l27,40.51,11-16.51a6,6,0,0,1,5-2.67h24a6,6,0,0,1,0,12H139.21L125,163.33a6,6,0,0,1-10,0L88,122.82,77,139.33A6,6,0,0,1,72,142ZM178,42c-21,0-39.26,9.47-50,25.34C117.26,51.47,99,42,78,42a60.07,60.07,0,0,0-60,60q0,1.09,0,2.19a6,6,0,0,0,12-.38c0-.6,0-1.21,0-1.81A48.05,48.05,0,0,1,78,54c20.28,0,37.31,10.83,44.45,28.27a6,6,0,0,0,11.1,0C140.69,64.83,157.72,54,178,54a48.05,48.05,0,0,1,48,48c0,55.73-81.61,105.65-98,115.11-9.84-5.66-43.09-25.82-68.16-53.16a6,6,0,1,0-8.84,8.1c30.94,33.77,72.41,56.29,74.16,57.23a6,6,0,0,0,5.68,0,334.68,334.68,0,0,0,53.06-37C219.8,161.59,238,131.2,238,102A60.07,60.07,0,0,0,178,42Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M72,144H32a8,8,0,0,1,0-16H67.72l13.62-20.44a8,8,0,0,1,13.32,0l25.34,38,9.34-14A8,8,0,0,1,136,128h24a8,8,0,0,1,0,16H140.28l-13.62,20.44a8,8,0,0,1-13.32,0L88,126.42l-9.34,14A8,8,0,0,1,72,144ZM178,40c-20.65,0-38.73,8.88-50,23.89C116.73,48.88,98.65,40,78,40a62.07,62.07,0,0,0-62,62c0,.75,0,1.5,0,2.25a8,8,0,1,0,16-.5c0-.58,0-1.17,0-1.75A46.06,46.06,0,0,1,78,56c19.45,0,35.78,10.36,42.6,27a8,8,0,0,0,14.8,0c6.82-16.67,23.15-27,42.6-27a46.06,46.06,0,0,1,46,46c0,53.61-77.76,102.15-96,112.8-10.83-6.31-42.63-26-66.68-52.21a8,8,0,1,0-11.8,10.82c31.17,34,72.93,56.68,74.69,57.63a8,8,0,0,0,7.58,0C136.21,228.66,240,172,240,102A62.07,62.07,0,0,0,178,40Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M72,140H32a4,4,0,0,1,0-8H69.86l14.81-22.22a4,4,0,0,1,6.66,0l28.67,43,12.67-19A4,4,0,0,1,136,132h24a4,4,0,0,1,0,8H138.14l-14.81,22.22a4,4,0,0,1-6.66,0L88,119.21l-12.67,19A4,4,0,0,1,72,140ZM178,44c-21.44,0-39.92,10.19-50,27.07C117.92,54.19,99.44,44,78,44a58.07,58.07,0,0,0-58,58q0,1.06,0,2.13a4,4,0,1,0,8-.26c0-.62,0-1.24,0-1.87A50.06,50.06,0,0,1,78,52c21.11,0,38.85,11.31,46.3,29.51a4,4,0,0,0,7.4,0C139.15,63.31,156.89,52,178,52a50.06,50.06,0,0,1,50,50c0,58-86,109.46-100,117.42-8.47-4.82-43.5-25.61-69.63-54.12a4,4,0,0,0-5.9,5.4c30.72,33.52,71.9,55.89,73.63,56.82a4,4,0,0,0,3.8,0,333.81,333.81,0,0,0,52.7-36.73C218,160.47,236,130.59,236,102A58.07,58.07,0,0,0,178,44Z"}))]]),J0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M108,84a16,16,0,1,1,16,16A16,16,0,0,1,108,84Zm128,44A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-24,0a84,84,0,1,0-84,84A84.09,84.09,0,0,0,212,128Zm-72,36.68V132a20,20,0,0,0-20-20,12,12,0,0,0-4,23.32V168a20,20,0,0,0,20,20,12,12,0,0,0,4-23.32Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),a.createElement("path",{d:"M144,176a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176Zm88-48A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128ZM124,96a12,12,0,1,0-12-12A12,12,0,0,0,124,96Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-4,48a12,12,0,1,1-12,12A12,12,0,0,1,124,72Zm12,112a16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40a8,8,0,0,1,0,16Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M142,176a6,6,0,0,1-6,6,14,14,0,0,1-14-14V128a2,2,0,0,0-2-2,6,6,0,0,1,0-12,14,14,0,0,1,14,14v40a2,2,0,0,0,2,2A6,6,0,0,1,142,176ZM124,94a10,10,0,1,0-10-10A10,10,0,0,0,124,94Zm106,34A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M140,176a4,4,0,0,1-4,4,12,12,0,0,1-12-12V128a4,4,0,0,0-4-4,4,4,0,0,1,0-8,12,12,0,0,1,12,12v40a4,4,0,0,0,4,4A4,4,0,0,1,140,176ZM124,92a8,8,0,1,0-8-8A8,8,0,0,0,124,92Zm104,36A100,100,0,1,1,128,28,100.11,100.11,0,0,1,228,128Zm-8,0a92,92,0,1,0-92,92A92.1,92.1,0,0,0,220,128Z"}))]]),K0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M180,232a12,12,0,0,1-12,12H88a12,12,0,0,1,0-24h80A12,12,0,0,1,180,232Zm40-128a91.51,91.51,0,0,1-35.17,72.35A12.26,12.26,0,0,0,180,186v2a20,20,0,0,1-20,20H96a20,20,0,0,1-20-20v-2a12,12,0,0,0-4.7-9.51A91.57,91.57,0,0,1,36,104.52C35.73,54.69,76,13.2,125.79,12A92,92,0,0,1,220,104Zm-24,0a68,68,0,0,0-69.65-68C89.56,36.88,59.8,67.55,60,104.38a67.71,67.71,0,0,0,26.1,53.19A35.87,35.87,0,0,1,100,184h56.1A36.13,36.13,0,0,1,170,157.49,67.68,67.68,0,0,0,196,104Zm-20.07-5.32a48.5,48.5,0,0,0-31.91-40,12,12,0,0,0-8,22.62,24.31,24.31,0,0,1,16.09,20,12,12,0,0,0,23.86-2.64Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,104a79.86,79.86,0,0,1-30.59,62.92A24.29,24.29,0,0,0,168,186v6a8,8,0,0,1-8,8H96a8,8,0,0,1-8-8v-6a24.11,24.11,0,0,0-9.3-19A79.87,79.87,0,0,1,48,104.45C47.76,61.09,82.72,25,126.07,24A80,80,0,0,1,208,104Z",opacity:"0.2"}),a.createElement("path",{d:"M176,232a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,232Zm40-128a87.55,87.55,0,0,1-33.64,69.21A16.24,16.24,0,0,0,176,186v6a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16v-6a16,16,0,0,0-6.23-12.66A87.59,87.59,0,0,1,40,104.49C39.74,56.83,78.26,17.14,125.88,16A88,88,0,0,1,216,104Zm-16,0a72,72,0,0,0-73.74-72c-39,.92-70.47,33.39-70.26,72.39a71.65,71.65,0,0,0,27.64,56.3A32,32,0,0,1,96,186v6h64v-6a32.15,32.15,0,0,1,12.47-25.35A71.65,71.65,0,0,0,200,104Zm-16.11-9.34a57.6,57.6,0,0,0-46.56-46.55,8,8,0,0,0-2.66,15.78c16.57,2.79,30.63,16.85,33.44,33.45A8,8,0,0,0,176,104a9,9,0,0,0,1.35-.11A8,8,0,0,0,183.89,94.66Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176,232a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,232Zm40-128a87.55,87.55,0,0,1-33.64,69.21A16.24,16.24,0,0,0,176,186v6a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16v-6a16,16,0,0,0-6.23-12.66A87.59,87.59,0,0,1,40,104.49C39.74,56.83,78.26,17.14,125.88,16A88,88,0,0,1,216,104Zm-32.11-9.34a57.6,57.6,0,0,0-46.56-46.55,8,8,0,0,0-2.66,15.78c16.57,2.79,30.63,16.85,33.44,33.45A8,8,0,0,0,176,104a9,9,0,0,0,1.35-.11A8,8,0,0,0,183.89,94.66Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M174,232a6,6,0,0,1-6,6H88a6,6,0,0,1,0-12h80A6,6,0,0,1,174,232Zm40-128a85.56,85.56,0,0,1-32.88,67.64A18.23,18.23,0,0,0,174,186v6a14,14,0,0,1-14,14H96a14,14,0,0,1-14-14v-6a18,18,0,0,0-7-14.23h0a85.59,85.59,0,0,1-33-67.24C41.74,57.91,79.39,19.12,125.93,18A86,86,0,0,1,214,104Zm-12,0a74,74,0,0,0-75.79-74C86.17,31,53.78,64.34,54,104.42a73.67,73.67,0,0,0,28.4,57.87A29.92,29.92,0,0,1,94,186v6a2,2,0,0,0,2,2h64a2,2,0,0,0,2-2v-6a30.18,30.18,0,0,1,11.7-23.78A73.59,73.59,0,0,0,202,104Zm-20.08-9A55.58,55.58,0,0,0,137,50.08a6,6,0,1,0-2,11.84C152.38,64.84,167.13,79.6,170.08,97a6,6,0,0,0,5.91,5,6.87,6.87,0,0,0,1-.08A6,6,0,0,0,181.92,95Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176,232a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,232Zm40-128a87.55,87.55,0,0,1-33.64,69.21A16.24,16.24,0,0,0,176,186v6a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16v-6a16,16,0,0,0-6.23-12.66A87.59,87.59,0,0,1,40,104.49C39.74,56.83,78.26,17.14,125.88,16A88,88,0,0,1,216,104Zm-16,0a72,72,0,0,0-73.74-72c-39,.92-70.47,33.39-70.26,72.39a71.65,71.65,0,0,0,27.64,56.3A32,32,0,0,1,96,186v6h64v-6a32.15,32.15,0,0,1,12.47-25.35A71.65,71.65,0,0,0,200,104Zm-16.11-9.34a57.6,57.6,0,0,0-46.56-46.55,8,8,0,0,0-2.66,15.78c16.57,2.79,30.63,16.85,33.44,33.45A8,8,0,0,0,176,104a9,9,0,0,0,1.35-.11A8,8,0,0,0,183.89,94.66Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M172,232a4,4,0,0,1-4,4H88a4,4,0,0,1,0-8h80A4,4,0,0,1,172,232Zm40-128a83.59,83.59,0,0,1-32.11,66.06A20.2,20.2,0,0,0,172,186v6a12,12,0,0,1-12,12H96a12,12,0,0,1-12-12v-6a20,20,0,0,0-7.76-15.81A83.58,83.58,0,0,1,44,104.47C43.75,59,80.52,21.09,126,20a84,84,0,0,1,86,84Zm-8,0a76,76,0,0,0-77.83-76C85,29,51.77,63.27,52,104.43a75.62,75.62,0,0,0,29.17,59.43A28,28,0,0,1,92,186v6a4,4,0,0,0,4,4h64a4,4,0,0,0,4-4v-6a28.14,28.14,0,0,1,10.94-22.2A75.62,75.62,0,0,0,204,104ZM136.66,52.06a4,4,0,0,0-1.32,7.88C153.53,63,169,78.45,172.06,96.67A4,4,0,0,0,176,100a3.88,3.88,0,0,0,.67-.06,4,4,0,0,0,3.27-4.61A53.51,53.51,0,0,0,136.66,52.06Z"}))]]),P0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M219.71,117.38a12,12,0,0,0-7.25-8.52L161.28,88.39l10.59-70.61a12,12,0,0,0-20.64-10l-112,120a12,12,0,0,0,4.31,19.33l51.18,20.47L84.13,238.22a12,12,0,0,0,20.64,10l112-120A12,12,0,0,0,219.71,117.38ZM113.6,203.55l6.27-41.77a12,12,0,0,0-7.41-12.92L68.74,131.37,142.4,52.45l-6.27,41.77a12,12,0,0,0,7.41,12.92l43.72,17.49Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M96,240l16-80L48,136,160,16,144,96l64,24Z",opacity:"0.2"}),a.createElement("path",{d:"M215.79,118.17a8,8,0,0,0-5-5.66L153.18,90.9l14.66-73.33a8,8,0,0,0-13.69-7l-112,120a8,8,0,0,0,3,13l57.63,21.61L88.16,238.43a8,8,0,0,0,13.69,7l112-120A8,8,0,0,0,215.79,118.17ZM109.37,214l10.47-52.38a8,8,0,0,0-5-9.06L62,132.71l84.62-90.66L136.16,94.43a8,8,0,0,0,5,9.06l52.8,19.8Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M213.85,125.46l-112,120a8,8,0,0,1-13.69-7l14.66-73.33L45.19,143.49a8,8,0,0,1-3-13l112-120a8,8,0,0,1,13.69,7L153.18,90.9l57.63,21.61a8,8,0,0,1,3,12.95Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M213.84,118.63a6,6,0,0,0-3.73-4.25L150.88,92.17l15-75a6,6,0,0,0-10.27-5.27l-112,120a6,6,0,0,0,2.28,9.71l59.23,22.21-15,75a6,6,0,0,0,3.14,6.52A6.07,6.07,0,0,0,96,246a6,6,0,0,0,4.39-1.91l112-120A6,6,0,0,0,213.84,118.63ZM106,220.46l11.85-59.28a6,6,0,0,0-3.77-6.8l-55.6-20.85,91.46-98L138.12,94.82a6,6,0,0,0,3.77,6.8l55.6,20.85Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M215.79,118.17a8,8,0,0,0-5-5.66L153.18,90.9l14.66-73.33a8,8,0,0,0-13.69-7l-112,120a8,8,0,0,0,3,13l57.63,21.61L88.16,238.43a8,8,0,0,0,13.69,7l112-120A8,8,0,0,0,215.79,118.17ZM109.37,214l10.47-52.38a8,8,0,0,0-5-9.06L62,132.71l84.62-90.66L136.16,94.43a8,8,0,0,0,5,9.06l52.8,19.8Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M211.89,119.09a4,4,0,0,0-2.49-2.84l-60.81-22.8,15.33-76.67a4,4,0,0,0-6.84-3.51l-112,120a4,4,0,0,0-1,3.64,4,4,0,0,0,2.49,2.84l60.81,22.8L92.08,239.22a4,4,0,0,0,6.84,3.51l112-120A4,4,0,0,0,211.89,119.09ZM102.68,227l13.24-66.2a4,4,0,0,0-2.52-4.53L55,134.36,153.32,29l-13.24,66.2a4,4,0,0,0,2.52,4.53L201,121.64Z"}))]]),Y0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M218.34,119.6,183.6,154.34a46.58,46.58,0,0,1-44.31,12.26c-.31.34-.62.67-.95,1L103.6,202.34A46.63,46.63,0,1,1,37.66,136.4L72.4,101.66A46.6,46.6,0,0,1,116.71,89.4c.31-.34.62-.67,1-1L152.4,53.66a46.63,46.63,0,0,1,65.94,65.94Z",opacity:"0.2"}),a.createElement("path",{d:"M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,7.78,8.22H152a8,8,0,0,0,8-7.78A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM115.7,192.49a43.31,43.31,0,0,1-55-66.43l25.37-25.37a43.35,43.35,0,0,1,61.25,0,42.9,42.9,0,0,1,9.95,15.43,8,8,0,1,1-15,5.6A27.33,27.33,0,0,0,97.37,112L72,137.37a27.32,27.32,0,0,0,34.68,41.91,8,8,0,1,1,9,13.21Zm79.61-62.55-25.37,25.37A43,43,0,0,1,139.32,168h0a43.35,43.35,0,0,1-40.53-28.12,8,8,0,1,1,15-5.6A27.35,27.35,0,0,0,139.28,152h0a27.14,27.14,0,0,0,19.32-8L184,118.63a27.32,27.32,0,0,0-34.68-41.91,8,8,0,1,1-9-13.21,43.32,43.32,0,0,1,55,66.43Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M238,88.18a52.42,52.42,0,0,1-15.4,35.66l-34.75,34.75A52.28,52.28,0,0,1,150.62,174h-.05A52.63,52.63,0,0,1,98,119.9a6,6,0,0,1,6-5.84h.17a6,6,0,0,1,5.83,6.16A40.62,40.62,0,0,0,150.58,162h0a40.4,40.4,0,0,0,28.73-11.9l34.75-34.74A40.63,40.63,0,0,0,156.63,57.9l-11,11a6,6,0,0,1-8.49-8.49l11-11a52.62,52.62,0,0,1,74.43,0A52.83,52.83,0,0,1,238,88.18Zm-127.62,98.9-11,11A40.36,40.36,0,0,1,70.6,210h0a40.63,40.63,0,0,1-28.7-69.36L76.62,105.9A40.63,40.63,0,0,1,146,135.77a6,6,0,0,0,5.83,6.16H152a6,6,0,0,0,6-5.84A52.63,52.63,0,0,0,68.14,97.42L33.38,132.16A52.63,52.63,0,0,0,70.56,222h0a52.26,52.26,0,0,0,37.22-15.42l11-11a6,6,0,1,0-8.49-8.48Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,16,.45A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236,88.12a50.44,50.44,0,0,1-14.81,34.31l-34.75,34.74A50.33,50.33,0,0,1,150.62,172h-.05A50.63,50.63,0,0,1,100,120a4,4,0,0,1,4-3.89h.11a4,4,0,0,1,3.89,4.11A42.64,42.64,0,0,0,150.58,164h0a42.32,42.32,0,0,0,30.14-12.49l34.75-34.74a42.63,42.63,0,1,0-60.29-60.28l-11,11a4,4,0,0,1-5.66-5.65l11-11A50.64,50.64,0,0,1,236,88.12ZM111.78,188.49l-11,11A42.33,42.33,0,0,1,70.6,212h0a42.63,42.63,0,0,1-30.11-72.77l34.75-34.74A42.63,42.63,0,0,1,148,135.82a4,4,0,0,0,8,.23A50.64,50.64,0,0,0,69.55,98.83L34.8,133.57A50.63,50.63,0,0,0,70.56,220h0a50.33,50.33,0,0,0,35.81-14.83l11-11a4,4,0,1,0-5.65-5.66Z"}))]]),_0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,76H180V56A52,52,0,0,0,76,56V76H48A20,20,0,0,0,28,96V208a20,20,0,0,0,20,20H208a20,20,0,0,0,20-20V96A20,20,0,0,0,208,76ZM100,56a28,28,0,0,1,56,0V76H100ZM204,204H52V100H204Zm-60-52a16,16,0,1,1-16-16A16,16,0,0,1,144,152Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,96V208a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8H208A8,8,0,0,1,216,96Z",opacity:"0.2"}),a.createElement("path",{d:"M208,80H176V56a48,48,0,0,0-96,0V80H48A16,16,0,0,0,32,96V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80ZM96,56a32,32,0,0,1,64,0V80H96ZM208,208H48V96H208V208Zm-68-56a12,12,0,1,1-12-12A12,12,0,0,1,140,152Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,80H176V56a48,48,0,0,0-96,0V80H48A16,16,0,0,0,32,96V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80Zm-80,84a12,12,0,1,1,12-12A12,12,0,0,1,128,164Zm32-84H96V56a32,32,0,0,1,64,0Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,82H174V56a46,46,0,0,0-92,0V82H48A14,14,0,0,0,34,96V208a14,14,0,0,0,14,14H208a14,14,0,0,0,14-14V96A14,14,0,0,0,208,82ZM94,56a34,34,0,0,1,68,0V82H94ZM210,208a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V96a2,2,0,0,1,2-2H208a2,2,0,0,1,2,2Zm-72-56a10,10,0,1,1-10-10A10,10,0,0,1,138,152Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,80H176V56a48,48,0,0,0-96,0V80H48A16,16,0,0,0,32,96V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80ZM96,56a32,32,0,0,1,64,0V80H96ZM208,208H48V96H208V208Zm-68-56a12,12,0,1,1-12-12A12,12,0,0,1,140,152Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,84H172V56a44,44,0,0,0-88,0V84H48A12,12,0,0,0,36,96V208a12,12,0,0,0,12,12H208a12,12,0,0,0,12-12V96A12,12,0,0,0,208,84ZM92,56a36,36,0,0,1,72,0V84H92ZM212,208a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V96a4,4,0,0,1,4-4H208a4,4,0,0,1,4,4Zm-76-56a8,8,0,1,1-8-8A8,8,0,0,1,136,152Z"}))]]),a1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232.49,215.51,185,168a92.12,92.12,0,1,0-17,17l47.53,47.54a12,12,0,0,0,17-17ZM44,112a68,68,0,1,1,68,68A68.07,68.07,0,0,1,44,112Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M192,112a80,80,0,1,1-80-80A80,80,0,0,1,192,112Z",opacity:"0.2"}),a.createElement("path",{d:"M229.66,218.34,179.6,168.28a88.21,88.21,0,1,0-11.32,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M168,112a56,56,0,1,1-56-56A56,56,0,0,1,168,112Zm61.66,117.66a8,8,0,0,1-11.32,0l-50.06-50.07a88,88,0,1,1,11.32-11.31l50.06,50.06A8,8,0,0,1,229.66,229.66ZM112,184a72,72,0,1,0-72-72A72.08,72.08,0,0,0,112,184Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228.24,219.76l-51.38-51.38a86.15,86.15,0,1,0-8.48,8.48l51.38,51.38a6,6,0,0,0,8.48-8.48ZM38,112a74,74,0,1,1,74,74A74.09,74.09,0,0,1,38,112Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M226.83,221.17l-52.7-52.7a84.1,84.1,0,1,0-5.66,5.66l52.7,52.7a4,4,0,0,0,5.66-5.66ZM36,112a76,76,0,1,1,76,76A76.08,76.08,0,0,1,36,112Z"}))]]),e1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,36H48A28,28,0,0,0,20,64V176a28,28,0,0,0,28,28H208a28,28,0,0,0,28-28V64A28,28,0,0,0,208,36Zm4,140a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V64a4,4,0,0,1,4-4H208a4,4,0,0,1,4,4Zm-40,52a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,228Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,64V176a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V64A16,16,0,0,1,48,48H208A16,16,0,0,1,224,64Z",opacity:"0.2"}),a.createElement("path",{d:"M208,40H48A24,24,0,0,0,24,64V176a24,24,0,0,0,24,24H208a24,24,0,0,0,24-24V64A24,24,0,0,0,208,40Zm8,136a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H208a8,8,0,0,1,8,8Zm-48,48a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,224Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,64V176a24,24,0,0,1-24,24H48a24,24,0,0,1-24-24V64A24,24,0,0,1,48,40H208A24,24,0,0,1,232,64ZM160,216H96a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,42H48A22,22,0,0,0,26,64V176a22,22,0,0,0,22,22H208a22,22,0,0,0,22-22V64A22,22,0,0,0,208,42Zm10,134a10,10,0,0,1-10,10H48a10,10,0,0,1-10-10V64A10,10,0,0,1,48,54H208a10,10,0,0,1,10,10Zm-52,48a6,6,0,0,1-6,6H96a6,6,0,0,1,0-12h64A6,6,0,0,1,166,224Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,40H48A24,24,0,0,0,24,64V176a24,24,0,0,0,24,24H208a24,24,0,0,0,24-24V64A24,24,0,0,0,208,40Zm8,136a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H208a8,8,0,0,1,8,8Zm-48,48a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,224Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,44H48A20,20,0,0,0,28,64V176a20,20,0,0,0,20,20H208a20,20,0,0,0,20-20V64A20,20,0,0,0,208,44Zm12,132a12,12,0,0,1-12,12H48a12,12,0,0,1-12-12V64A12,12,0,0,1,48,52H208a12,12,0,0,1,12,12Zm-56,48a4,4,0,0,1-4,4H96a4,4,0,0,1,0-8h64A4,4,0,0,1,164,224Z"}))]]),t1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236.37,139.4a12,12,0,0,0-12-3A84.07,84.07,0,0,1,119.6,31.59a12,12,0,0,0-15-15A108.86,108.86,0,0,0,49.69,55.07,108,108,0,0,0,136,228a107.09,107.09,0,0,0,64.93-21.69,108.86,108.86,0,0,0,38.44-54.94A12,12,0,0,0,236.37,139.4Zm-49.88,47.74A84,84,0,0,1,68.86,69.51,84.93,84.93,0,0,1,92.27,48.29Q92,52.13,92,56A108.12,108.12,0,0,0,200,164q3.87,0,7.71-.27A84.79,84.79,0,0,1,186.49,187.14Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M227.89,147.89A96,96,0,1,1,108.11,28.11,96.09,96.09,0,0,0,227.89,147.89Z",opacity:"0.2"}),a.createElement("path",{d:"M233.54,142.23a8,8,0,0,0-8-2,88.08,88.08,0,0,1-109.8-109.8,8,8,0,0,0-10-10,104.84,104.84,0,0,0-52.91,37A104,104,0,0,0,136,224a103.09,103.09,0,0,0,62.52-20.88,104.84,104.84,0,0,0,37-52.91A8,8,0,0,0,233.54,142.23ZM188.9,190.34A88,88,0,0,1,65.66,67.11a89,89,0,0,1,31.4-26A106,106,0,0,0,96,56,104.11,104.11,0,0,0,200,160a106,106,0,0,0,14.92-1.06A89,89,0,0,1,188.9,190.34Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M235.54,150.21a104.84,104.84,0,0,1-37,52.91A104,104,0,0,1,32,120,103.09,103.09,0,0,1,52.88,57.48a104.84,104.84,0,0,1,52.91-37,8,8,0,0,1,10,10,88.08,88.08,0,0,0,109.8,109.8,8,8,0,0,1,10,10Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232.13,143.64a6,6,0,0,0-6-1.49A90.07,90.07,0,0,1,113.86,29.85a6,6,0,0,0-7.49-7.48A102.88,102.88,0,0,0,54.48,58.68,102,102,0,0,0,197.32,201.52a102.88,102.88,0,0,0,36.31-51.89A6,6,0,0,0,232.13,143.64Zm-42,48.29a90,90,0,0,1-126-126A90.9,90.9,0,0,1,99.65,37.66,102.06,102.06,0,0,0,218.34,156.35,90.9,90.9,0,0,1,190.1,191.93Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M233.54,142.23a8,8,0,0,0-8-2,88.08,88.08,0,0,1-109.8-109.8,8,8,0,0,0-10-10,104.84,104.84,0,0,0-52.91,37A104,104,0,0,0,136,224a103.09,103.09,0,0,0,62.52-20.88,104.84,104.84,0,0,0,37-52.91A8,8,0,0,0,233.54,142.23ZM188.9,190.34A88,88,0,0,1,65.66,67.11a89,89,0,0,1,31.4-26A106,106,0,0,0,96,56,104.11,104.11,0,0,0,200,160a106,106,0,0,0,14.92-1.06A89,89,0,0,1,188.9,190.34Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M230.72,145.06a4,4,0,0,0-4-1A92.08,92.08,0,0,1,111.94,29.27a4,4,0,0,0-5-5A100.78,100.78,0,0,0,56.08,59.88a100,100,0,0,0,140,140,100.78,100.78,0,0,0,35.59-50.87A4,4,0,0,0,230.72,145.06ZM191.3,193.53A92,92,0,0,1,62.47,64.7a93,93,0,0,1,39.88-30.35,100.09,100.09,0,0,0,119.3,119.3A93,93,0,0,1,191.3,193.53Z"}))]]),l1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",opacity:"0.2"}),a.createElement("path",{d:"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H136v48a8,8,0,0,1-16,0V136H72a8,8,0,0,1,0-16h48V72a8,8,0,0,1,16,0v48h48a8,8,0,0,1,0,16Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M222,128a6,6,0,0,1-6,6H134v82a6,6,0,0,1-12,0V134H40a6,6,0,0,1,0-12h82V40a6,6,0,0,1,12,0v82h82A6,6,0,0,1,222,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M220,128a4,4,0,0,1-4,4H132v84a4,4,0,0,1-8,0V132H40a4,4,0,0,1,0-8h84V40a4,4,0,0,1,8,0v84h84A4,4,0,0,1,220,128Z"}))]]),n1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M144,180a16,16,0,1,1-16-16A16,16,0,0,1,144,180Zm92-52A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-24,0a84,84,0,1,0-84,84A84.09,84.09,0,0,0,212,128ZM128,64c-24.26,0-44,17.94-44,40v4a12,12,0,0,0,24,0v-4c0-8.82,9-16,20-16s20,7.18,20,16-9,16-20,16a12,12,0,0,0-12,12v8a12,12,0,0,0,23.73,2.56C158.31,137.88,172,122.37,172,104,172,81.94,152.26,64,128,64Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),a.createElement("path",{d:"M140,180a12,12,0,1,1-12-12A12,12,0,0,1,140,180ZM128,72c-22.06,0-40,16.15-40,36v4a8,8,0,0,0,16,0v-4c0-11,10.77-20,24-20s24,9,24,20-10.77,20-24,20a8,8,0,0,0-8,8v8a8,8,0,0,0,16,0v-.72c18.24-3.35,32-17.9,32-35.28C168,88.15,150.06,72,128,72Zm104,56A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,168a12,12,0,1,1,12-12A12,12,0,0,1,128,192Zm8-48.72V144a8,8,0,0,1-16,0v-8a8,8,0,0,1,8-8c13.23,0,24-9,24-20s-10.77-20-24-20-24,9-24,20v4a8,8,0,0,1-16,0v-4c0-19.85,17.94-36,40-36s40,16.15,40,36C168,125.38,154.24,139.93,136,143.28Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M138,180a10,10,0,1,1-10-10A10,10,0,0,1,138,180ZM128,74c-21,0-38,15.25-38,34v4a6,6,0,0,0,12,0v-4c0-12.13,11.66-22,26-22s26,9.87,26,22-11.66,22-26,22a6,6,0,0,0-6,6v8a6,6,0,0,0,12,0v-2.42c18.11-2.58,32-16.66,32-33.58C166,89.25,149,74,128,74Zm102,54A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M140,180a12,12,0,1,1-12-12A12,12,0,0,1,140,180ZM128,72c-22.06,0-40,16.15-40,36v4a8,8,0,0,0,16,0v-4c0-11,10.77-20,24-20s24,9,24,20-10.77,20-24,20a8,8,0,0,0-8,8v8a8,8,0,0,0,16,0v-.72c18.24-3.35,32-17.9,32-35.28C168,88.15,150.06,72,128,72Zm104,56A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M136,180a8,8,0,1,1-8-8A8,8,0,0,1,136,180ZM128,76c-19.85,0-36,14.36-36,32v4a4,4,0,0,0,8,0v-4c0-13.23,12.56-24,28-24s28,10.77,28,24-12.56,24-28,24a4,4,0,0,0-4,4v8a4,4,0,0,0,8,0v-4.2c18-1.77,32-15.36,32-31.8C164,90.36,147.85,76,128,76Zm100,52A100,100,0,1,1,128,28,100.11,100.11,0,0,1,228,128Zm-8,0a92,92,0,1,0-92,92A92.1,92.1,0,0,0,220,128Z"}))]]),m1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176,156a43.78,43.78,0,0,0-29.09,11L106.1,140.8a44.07,44.07,0,0,0,0-25.6L146.91,89a43.83,43.83,0,1,0-13-20.17L93.09,95a44,44,0,1,0,0,65.94L133.9,187.2A44,44,0,1,0,176,156Zm0-120a20,20,0,1,1-20,20A20,20,0,0,1,176,36ZM64,148a20,20,0,1,1,20-20A20,20,0,0,1,64,148Zm112,72a20,20,0,1,1,20-20A20,20,0,0,1,176,220Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,200a32,32,0,1,1-32-32A32,32,0,0,1,208,200ZM176,88a32,32,0,1,0-32-32A32,32,0,0,0,176,88Z",opacity:"0.2"}),a.createElement("path",{d:"M176,160a39.89,39.89,0,0,0-28.62,12.09l-46.1-29.63a39.8,39.8,0,0,0,0-28.92l46.1-29.63a40,40,0,1,0-8.66-13.45l-46.1,29.63a40,40,0,1,0,0,55.82l46.1,29.63A40,40,0,1,0,176,160Zm0-128a24,24,0,1,1-24,24A24,24,0,0,1,176,32ZM64,152a24,24,0,1,1,24-24A24,24,0,0,1,64,152Zm112,72a24,24,0,1,1,24-24A24,24,0,0,1,176,224Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M212,200a36,36,0,1,1-69.85-12.25l-53-34.05a36,36,0,1,1,0-51.4l53-34a36.09,36.09,0,1,1,8.67,13.45l-53,34.05a36,36,0,0,1,0,24.5l53,34.05A36,36,0,0,1,212,200Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176,162a37.91,37.91,0,0,0-28.3,12.67L98.8,143.24a37.89,37.89,0,0,0,0-30.48l48.9-31.43a38,38,0,1,0-6.5-10.09L92.3,102.67a38,38,0,1,0,0,50.66l48.9,31.43A38,38,0,1,0,176,162Zm0-132a26,26,0,1,1-26,26A26,26,0,0,1,176,30ZM64,154a26,26,0,1,1,26-26A26,26,0,0,1,64,154Zm112,72a26,26,0,1,1,26-26A26,26,0,0,1,176,226Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176,160a39.89,39.89,0,0,0-28.62,12.09l-46.1-29.63a39.8,39.8,0,0,0,0-28.92l46.1-29.63a40,40,0,1,0-8.66-13.45l-46.1,29.63a40,40,0,1,0,0,55.82l46.1,29.63A40,40,0,1,0,176,160Zm0-128a24,24,0,1,1-24,24A24,24,0,0,1,176,32ZM64,152a24,24,0,1,1,24-24A24,24,0,0,1,64,152Zm112,72a24,24,0,1,1,24-24A24,24,0,0,1,176,224Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176,164a36,36,0,0,0-27.92,13.3L96.25,144a35.92,35.92,0,0,0,0-32L148.08,78.7A35.93,35.93,0,1,0,143.75,72L91.92,105.3a36,36,0,1,0,0,45.4L143.75,184A36,36,0,1,0,176,164Zm0-136a28,28,0,1,1-28,28A28,28,0,0,1,176,28ZM64,156a28,28,0,1,1,28-28A28,28,0,0,1,64,156Zm112,72a28,28,0,1,1,28-28A28,28,0,0,1,176,228Z"}))]]),r1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,36H48A20,20,0,0,0,28,56v56c0,54.29,26.32,87.22,48.4,105.29,23.71,19.39,47.44,26,48.44,26.29a12.1,12.1,0,0,0,6.32,0c1-.28,24.73-6.9,48.44-26.29,22.08-18.07,48.4-51,48.4-105.29V56A20,20,0,0,0,208,36Zm-4,76c0,35.71-13.09,64.69-38.91,86.15A126.28,126.28,0,0,1,128,219.38a126.14,126.14,0,0,1-37.09-21.23C65.09,176.69,52,147.71,52,112V60H204Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,56v56c0,96-88,120-88,120S40,208,40,112V56a8,8,0,0,1,8-8H208A8,8,0,0,1,216,56Z",opacity:"0.2"}),a.createElement("path",{d:"M208,40H48A16,16,0,0,0,32,56v56c0,52.72,25.52,84.67,46.93,102.19,23.06,18.86,46,25.27,47,25.53a8,8,0,0,0,4.2,0c1-.26,23.91-6.67,47-25.53C198.48,196.67,224,164.72,224,112V56A16,16,0,0,0,208,40Zm0,72c0,37.07-13.66,67.16-40.6,89.42A129.3,129.3,0,0,1,128,223.62a128.25,128.25,0,0,1-38.92-21.81C61.82,179.51,48,149.3,48,112l0-56,160,0Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,56v56c0,52.72-25.52,84.67-46.93,102.19-23.06,18.86-46,25.27-47,25.53a8,8,0,0,1-4.2,0c-1-.26-23.91-6.67-47-25.53C57.52,196.67,32,164.72,32,112V56A16,16,0,0,1,48,40H208A16,16,0,0,1,224,56Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,42H48A14,14,0,0,0,34,56v56c0,51.94,25.12,83.4,46.2,100.64,22.73,18.6,45.27,24.89,46.22,25.15a6,6,0,0,0,3.16,0c.95-.26,23.49-6.55,46.22-25.15C196.88,195.4,222,163.94,222,112V56A14,14,0,0,0,208,42Zm2,70c0,37.76-13.94,68.39-41.44,91.06A131.17,131.17,0,0,1,128,225.72a130.94,130.94,0,0,1-40.56-22.66C59.94,180.39,46,149.76,46,112V56a2,2,0,0,1,2-2H208a2,2,0,0,1,2,2Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,40H48A16,16,0,0,0,32,56v56c0,52.72,25.52,84.67,46.93,102.19,23.06,18.86,46,25.27,47,25.53a8,8,0,0,0,4.2,0c1-.26,23.91-6.67,47-25.53C198.48,196.67,224,164.72,224,112V56A16,16,0,0,0,208,40Zm0,72c0,37.07-13.66,67.16-40.6,89.42A129.3,129.3,0,0,1,128,223.62a128.25,128.25,0,0,1-38.92-21.81C61.82,179.51,48,149.3,48,112l0-56,160,0Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,44H48A12,12,0,0,0,36,56v56c0,51.16,24.73,82.12,45.47,99.1,22.4,18.32,44.55,24.5,45.48,24.76a4,4,0,0,0,2.1,0c.93-.26,23.08-6.44,45.48-24.76,20.74-17,45.47-47.94,45.47-99.1V56A12,12,0,0,0,208,44Zm4,68c0,38.44-14.23,69.63-42.29,92.71A132.45,132.45,0,0,1,128,227.82a132.23,132.23,0,0,1-41.71-23.11C58.23,181.63,44,150.44,44,112V56a4,4,0,0,1,4-4H208a4,4,0,0,1,4,4Z"}))]]),c1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M116,132V96a12,12,0,0,1,24,0v36a12,12,0,0,1-24,0Zm12,56a16,16,0,1,0-16-16A16,16,0,0,0,128,188ZM228,56v56c0,54.29-26.32,87.22-48.4,105.29-23.71,19.39-47.44,26-48.44,26.29a12.1,12.1,0,0,1-6.32,0c-1-.28-24.73-6.9-48.44-26.29C54.32,199.22,28,166.29,28,112V56A20,20,0,0,1,48,36H208A20,20,0,0,1,228,56Zm-24,4H52v52c0,35.71,13.09,64.69,38.91,86.15A126.14,126.14,0,0,0,128,219.38a126.28,126.28,0,0,0,37.09-21.23C190.91,176.69,204,147.71,204,112Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,56v56c0,96-88,120-88,120S40,208,40,112V56a8,8,0,0,1,8-8H208A8,8,0,0,1,216,56Z",opacity:"0.2"}),a.createElement("path",{d:"M120,136V96a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,48a12,12,0,1,0-12-12A12,12,0,0,0,128,184ZM224,56v56c0,52.72-25.52,84.67-46.93,102.19-23.06,18.86-46,25.27-47,25.53a8,8,0,0,1-4.2,0c-1-.26-23.91-6.67-47-25.53C57.52,196.67,32,164.72,32,112V56A16,16,0,0,1,48,40H208A16,16,0,0,1,224,56Zm-16,0L48,56l0,56c0,37.3,13.82,67.51,41.07,89.81A128.25,128.25,0,0,0,128,223.62a129.3,129.3,0,0,0,39.41-22.2C194.34,179.16,208,149.07,208,112Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,40H48A16,16,0,0,0,32,56v56c0,52.72,25.52,84.67,46.93,102.19,23.06,18.86,46,25.27,47,25.53a8,8,0,0,0,4.2,0c1-.26,23.91-6.67,47-25.53C198.48,196.67,224,164.72,224,112V56A16,16,0,0,0,208,40ZM120,96a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,88a12,12,0,1,1,12-12A12,12,0,0,1,128,184Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M122,136V96a6,6,0,0,1,12,0v40a6,6,0,0,1-12,0Zm6,26a10,10,0,1,0,10,10A10,10,0,0,0,128,162ZM222,56v56c0,51.94-25.12,83.4-46.2,100.64-22.73,18.6-45.27,24.89-46.22,25.15a6,6,0,0,1-3.16,0c-1-.26-23.49-6.55-46.22-25.15C59.12,195.4,34,163.94,34,112V56A14,14,0,0,1,48,42H208A14,14,0,0,1,222,56Zm-12,0a2,2,0,0,0-2-2H48a2,2,0,0,0-2,2v56c0,37.75,13.94,68.39,41.44,91.06A130.94,130.94,0,0,0,128,225.72a131.17,131.17,0,0,0,40.56-22.66C196.06,180.39,210,149.75,210,112Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M120,136V96a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,48a12,12,0,1,0-12-12A12,12,0,0,0,128,184ZM224,56v56c0,52.72-25.52,84.67-46.93,102.19-23.06,18.86-46,25.27-47,25.53a8,8,0,0,1-4.2,0c-1-.26-23.91-6.67-47-25.53C57.52,196.67,32,164.72,32,112V56A16,16,0,0,1,48,40H208A16,16,0,0,1,224,56Zm-16,0L48,56l0,56c0,37.3,13.82,67.51,41.07,89.81A128.25,128.25,0,0,0,128,223.62a129.3,129.3,0,0,0,39.41-22.2C194.34,179.16,208,149.07,208,112Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M124,136V96a4,4,0,0,1,8,0v40a4,4,0,0,1-8,0Zm4,28a8,8,0,1,0,8,8A8,8,0,0,0,128,164ZM220,56v56c0,51.16-24.73,82.12-45.47,99.1-22.4,18.32-44.55,24.5-45.48,24.76a4,4,0,0,1-2.1,0c-.93-.26-23.08-6.44-45.48-24.76C60.73,194.12,36,163.16,36,112V56A12,12,0,0,1,48,44H208A12,12,0,0,1,220,56Zm-8,0a4,4,0,0,0-4-4H48a4,4,0,0,0-4,4v56c0,38.44,14.23,69.63,42.29,92.71A132.23,132.23,0,0,0,128,227.82a132.45,132.45,0,0,0,41.71-23.11C197.77,181.63,212,150.44,212,112Z"}))]]),A1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240.49,175.51a12,12,0,0,1,0,17l-24,24a12,12,0,0,1-17-17L203,196h-2.09a76.17,76.17,0,0,1-61.85-31.83L97.38,105.78A52.1,52.1,0,0,0,55.06,84H32a12,12,0,0,1,0-24H55.06a76.17,76.17,0,0,1,61.85,31.83l41.71,58.39A52.1,52.1,0,0,0,200.94,172H203l-3.52-3.51a12,12,0,0,1,17-17Zm-95.62-72.62a12,12,0,0,0,16.93-1.13A52,52,0,0,1,200.94,84H203l-3.52,3.51a12,12,0,0,0,17,17l24-24a12,12,0,0,0,0-17l-24-24a12,12,0,0,0-17,17L203,60h-2.09a76,76,0,0,0-57.2,26A12,12,0,0,0,144.87,102.89Zm-33.74,50.22a12,12,0,0,0-16.93,1.13A52,52,0,0,1,55.06,172H32a12,12,0,0,0,0,24H55.06a76,76,0,0,0,57.2-26A12,12,0,0,0,111.13,153.11Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M107.14,98.8,128,128l-20.86,29.2A64,64,0,0,1,55.06,184H32V72H55.06A64,64,0,0,1,107.14,98.8ZM200.94,72a64,64,0,0,0-52.08,26.8L128,128l20.86,29.2A64,64,0,0,0,200.94,184H232V72Z",opacity:"0.2"}),a.createElement("path",{d:"M237.66,178.34a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L212.69,192H200.94a72.12,72.12,0,0,1-58.59-30.15l-41.72-58.4A56.1,56.1,0,0,0,55.06,80H32a8,8,0,0,1,0-16H55.06a72.12,72.12,0,0,1,58.59,30.15l41.72,58.4A56.1,56.1,0,0,0,200.94,176h11.75l-10.35-10.34a8,8,0,0,1,11.32-11.32ZM143,107a8,8,0,0,0,11.16-1.86l1.2-1.67A56.1,56.1,0,0,1,200.94,80h11.75L202.34,90.34a8,8,0,0,0,11.32,11.32l24-24a8,8,0,0,0,0-11.32l-24-24a8,8,0,0,0-11.32,11.32L212.69,64H200.94a72.12,72.12,0,0,0-58.59,30.15l-1.2,1.67A8,8,0,0,0,143,107Zm-30,42a8,8,0,0,0-11.16,1.86l-1.2,1.67A56.1,56.1,0,0,1,55.06,176H32a8,8,0,0,0,0,16H55.06a72.12,72.12,0,0,0,58.59-30.15l1.2-1.67A8,8,0,0,0,113,149Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M237.66,178.34a8,8,0,0,1,0,11.32l-24,24A8,8,0,0,1,200,208V192a72.15,72.15,0,0,1-57.65-30.14l-41.72-58.4A56.1,56.1,0,0,0,55.06,80H32a8,8,0,0,1,0-16H55.06a72.12,72.12,0,0,1,58.59,30.15l41.72,58.4A56.08,56.08,0,0,0,200,176V160a8,8,0,0,1,13.66-5.66ZM143,107a8,8,0,0,0,11.16-1.86l1.2-1.67A56.08,56.08,0,0,1,200,80V96a8,8,0,0,0,13.66,5.66l24-24a8,8,0,0,0,0-11.32l-24-24A8,8,0,0,0,200,48V64a72.15,72.15,0,0,0-57.65,30.14l-1.2,1.67A8,8,0,0,0,143,107Zm-30,42a8,8,0,0,0-11.16,1.86l-1.2,1.67A56.1,56.1,0,0,1,55.06,176H32a8,8,0,0,0,0,16H55.06a72.12,72.12,0,0,0,58.59-30.15l1.2-1.67A8,8,0,0,0,113,149Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236.24,179.76a6,6,0,0,1,0,8.48l-24,24a6,6,0,0,1-8.48-8.48L217.52,190H200.94a70.16,70.16,0,0,1-57-29.31l-41.71-58.4A58.11,58.11,0,0,0,55.06,78H32a6,6,0,0,1,0-12H55.06a70.16,70.16,0,0,1,57,29.31l41.71,58.4A58.11,58.11,0,0,0,200.94,178h16.58l-13.76-13.76a6,6,0,0,1,8.48-8.48Zm-92.06-74.41a5.91,5.91,0,0,0,3.48,1.12,6,6,0,0,0,4.89-2.51l1.19-1.67A58.11,58.11,0,0,1,200.94,78h16.58L203.76,91.76a6,6,0,1,0,8.48,8.48l24-24a6,6,0,0,0,0-8.48l-24-24a6,6,0,0,0-8.48,8.48L217.52,66H200.94a70.16,70.16,0,0,0-57,29.31L142.78,97A6,6,0,0,0,144.18,105.35Zm-32.36,45.3a6,6,0,0,0-8.37,1.39l-1.19,1.67A58.11,58.11,0,0,1,55.06,178H32a6,6,0,0,0,0,12H55.06a70.16,70.16,0,0,0,57-29.31l1.19-1.67A6,6,0,0,0,111.82,150.65Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M237.66,178.34a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L212.69,192H200.94a72.12,72.12,0,0,1-58.59-30.15l-41.72-58.4A56.1,56.1,0,0,0,55.06,80H32a8,8,0,0,1,0-16H55.06a72.12,72.12,0,0,1,58.59,30.15l41.72,58.4A56.1,56.1,0,0,0,200.94,176h11.75l-10.35-10.34a8,8,0,0,1,11.32-11.32ZM143,107a8,8,0,0,0,11.16-1.86l1.2-1.67A56.1,56.1,0,0,1,200.94,80h11.75L202.34,90.34a8,8,0,0,0,11.32,11.32l24-24a8,8,0,0,0,0-11.32l-24-24a8,8,0,0,0-11.32,11.32L212.69,64H200.94a72.12,72.12,0,0,0-58.59,30.15l-1.2,1.67A8,8,0,0,0,143,107Zm-30,42a8,8,0,0,0-11.16,1.86l-1.2,1.67A56.1,56.1,0,0,1,55.06,176H32a8,8,0,0,0,0,16H55.06a72.12,72.12,0,0,0,58.59-30.15l1.2-1.67A8,8,0,0,0,113,149Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M234.83,181.17a4,4,0,0,1,0,5.66l-24,24a4,4,0,0,1-5.66-5.66L222.34,188h-21.4a68.15,68.15,0,0,1-55.34-28.48l-41.71-58.39A60.11,60.11,0,0,0,55.06,76H32a4,4,0,0,1,0-8H55.06A68.15,68.15,0,0,1,110.4,96.48l41.71,58.39A60.11,60.11,0,0,0,200.94,180h21.4l-17.17-17.17a4,4,0,0,1,5.66-5.66Zm-89.49-77.44a4,4,0,0,0,5.58-.93l1.19-1.67A60.11,60.11,0,0,1,200.94,76h21.4L205.17,93.17a4,4,0,0,0,5.66,5.66l24-24a4,4,0,0,0,0-5.66l-24-24a4,4,0,0,0-5.66,5.66L222.34,68h-21.4A68.15,68.15,0,0,0,145.6,96.48l-1.19,1.67A4,4,0,0,0,145.34,103.73Zm-34.68,48.54a4,4,0,0,0-5.58.93l-1.19,1.67A60.11,60.11,0,0,1,55.06,180H32a4,4,0,0,0,0,8H55.06a68.15,68.15,0,0,0,55.34-28.48l1.19-1.67A4,4,0,0,0,110.66,152.27Z"}))]]),Z1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,36H40A20,20,0,0,0,20,56V200a20,20,0,0,0,20,20H216a20,20,0,0,0,20-20V56A20,20,0,0,0,216,36ZM44,60H76V196H44ZM212,196H100V60H212Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M88,48V208H40a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8Z",opacity:"0.2"}),a.createElement("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,56H80V200H40ZM216,200H96V56H216V200Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,160H88V56H216V200Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,42H40A14,14,0,0,0,26,56V200a14,14,0,0,0,14,14H216a14,14,0,0,0,14-14V56A14,14,0,0,0,216,42ZM38,200V56a2,2,0,0,1,2-2H82V202H40A2,2,0,0,1,38,200Zm180,0a2,2,0,0,1-2,2H94V54H216a2,2,0,0,1,2,2Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,56H80V200H40ZM216,200H96V56H216V200Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,44H40A12,12,0,0,0,28,56V200a12,12,0,0,0,12,12H216a12,12,0,0,0,12-12V56A12,12,0,0,0,216,44ZM36,200V56a4,4,0,0,1,4-4H84V204H40A4,4,0,0,1,36,200Zm184,0a4,4,0,0,1-4,4H92V52H216a4,4,0,0,1,4,4Z"}))]]),h1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M199,125.31l-49.88-18.39L130.69,57a19.92,19.92,0,0,0-37.38,0L74.92,106.92,25,125.31a19.92,19.92,0,0,0,0,37.38l49.88,18.39L93.31,231a19.92,19.92,0,0,0,37.38,0l18.39-49.88L199,162.69a19.92,19.92,0,0,0,0-37.38Zm-63.38,35.16a12,12,0,0,0-7.11,7.11L112,212.28l-16.47-44.7a12,12,0,0,0-7.11-7.11L43.72,144l44.7-16.47a12,12,0,0,0,7.11-7.11L112,75.72l16.47,44.7a12,12,0,0,0,7.11,7.11L180.28,144ZM140,40a12,12,0,0,1,12-12h12V16a12,12,0,0,1,24,0V28h12a12,12,0,0,1,0,24H188V64a12,12,0,0,1-24,0V52H152A12,12,0,0,1,140,40ZM252,88a12,12,0,0,1-12,12h-4v4a12,12,0,0,1-24,0v-4h-4a12,12,0,0,1,0-24h4V72a12,12,0,0,1,24,0v4h4A12,12,0,0,1,252,88Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M194.82,151.43l-55.09,20.3-20.3,55.09a7.92,7.92,0,0,1-14.86,0l-20.3-55.09-55.09-20.3a7.92,7.92,0,0,1,0-14.86l55.09-20.3,20.3-55.09a7.92,7.92,0,0,1,14.86,0l20.3,55.09,55.09,20.3A7.92,7.92,0,0,1,194.82,151.43Z",opacity:"0.2"}),a.createElement("path",{d:"M197.58,129.06,146,110l-19-51.62a15.92,15.92,0,0,0-29.88,0L78,110l-51.62,19a15.92,15.92,0,0,0,0,29.88L78,178l19,51.62a15.92,15.92,0,0,0,29.88,0L146,178l51.62-19a15.92,15.92,0,0,0,0-29.88ZM137,164.22a8,8,0,0,0-4.74,4.74L112,223.85,91.78,169A8,8,0,0,0,87,164.22L32.15,144,87,123.78A8,8,0,0,0,91.78,119L112,64.15,132.22,119a8,8,0,0,0,4.74,4.74L191.85,144ZM144,40a8,8,0,0,1,8-8h16V16a8,8,0,0,1,16,0V32h16a8,8,0,0,1,0,16H184V64a8,8,0,0,1-16,0V48H152A8,8,0,0,1,144,40ZM248,88a8,8,0,0,1-8,8h-8v8a8,8,0,0,1-16,0V96h-8a8,8,0,0,1,0-16h8V72a8,8,0,0,1,16,0v8h8A8,8,0,0,1,248,88Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,144a15.78,15.78,0,0,1-10.42,14.94L146,178l-19,51.62a15.92,15.92,0,0,1-29.88,0L78,178l-51.62-19a15.92,15.92,0,0,1,0-29.88L78,110l19-51.62a15.92,15.92,0,0,1,29.88,0L146,110l51.62,19A15.78,15.78,0,0,1,208,144ZM152,48h16V64a8,8,0,0,0,16,0V48h16a8,8,0,0,0,0-16H184V16a8,8,0,0,0-16,0V32H152a8,8,0,0,0,0,16Zm88,32h-8V72a8,8,0,0,0-16,0v8h-8a8,8,0,0,0,0,16h8v8a8,8,0,0,0,16,0V96h8a8,8,0,0,0,0-16Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M196.89,130.94,144.4,111.6,125.06,59.11a13.92,13.92,0,0,0-26.12,0L79.6,111.6,27.11,130.94a13.92,13.92,0,0,0,0,26.12L79.6,176.4l19.34,52.49a13.92,13.92,0,0,0,26.12,0L144.4,176.4l52.49-19.34a13.92,13.92,0,0,0,0-26.12Zm-4.15,14.86-55.08,20.3a6,6,0,0,0-3.56,3.56l-20.3,55.08a1.92,1.92,0,0,1-3.6,0L89.9,169.66a6,6,0,0,0-3.56-3.56L31.26,145.8a1.92,1.92,0,0,1,0-3.6l55.08-20.3a6,6,0,0,0,3.56-3.56l20.3-55.08a1.92,1.92,0,0,1,3.6,0l20.3,55.08a6,6,0,0,0,3.56,3.56l55.08,20.3a1.92,1.92,0,0,1,0,3.6ZM146,40a6,6,0,0,1,6-6h18V16a6,6,0,0,1,12,0V34h18a6,6,0,0,1,0,12H182V64a6,6,0,0,1-12,0V46H152A6,6,0,0,1,146,40ZM246,88a6,6,0,0,1-6,6H230v10a6,6,0,0,1-12,0V94H208a6,6,0,0,1,0-12h10V72a6,6,0,0,1,12,0V82h10A6,6,0,0,1,246,88Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M197.58,129.06,146,110l-19-51.62a15.92,15.92,0,0,0-29.88,0L78,110l-51.62,19a15.92,15.92,0,0,0,0,29.88L78,178l19,51.62a15.92,15.92,0,0,0,29.88,0L146,178l51.62-19a15.92,15.92,0,0,0,0-29.88ZM137,164.22a8,8,0,0,0-4.74,4.74L112,223.85,91.78,169A8,8,0,0,0,87,164.22L32.15,144,87,123.78A8,8,0,0,0,91.78,119L112,64.15,132.22,119a8,8,0,0,0,4.74,4.74L191.85,144ZM144,40a8,8,0,0,1,8-8h16V16a8,8,0,0,1,16,0V32h16a8,8,0,0,1,0,16H184V64a8,8,0,0,1-16,0V48H152A8,8,0,0,1,144,40ZM248,88a8,8,0,0,1-8,8h-8v8a8,8,0,0,1-16,0V96h-8a8,8,0,0,1,0-16h8V72a8,8,0,0,1,16,0v8h8A8,8,0,0,1,248,88Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M196.2,132.81l-53.36-19.65L123.19,59.8a11.93,11.93,0,0,0-22.38,0L81.16,113.16,27.8,132.81a11.93,11.93,0,0,0,0,22.38l53.36,19.65,19.65,53.36a11.93,11.93,0,0,0,22.38,0l19.65-53.36,53.36-19.65a11.93,11.93,0,0,0,0-22.38Zm-2.77,14.87L138.35,168a4,4,0,0,0-2.37,2.37l-20.3,55.08a3.92,3.92,0,0,1-7.36,0L88,170.35A4,4,0,0,0,85.65,168l-55.08-20.3a3.92,3.92,0,0,1,0-7.36L85.65,120A4,4,0,0,0,88,117.65l20.3-55.08a3.92,3.92,0,0,1,7.36,0L136,117.65a4,4,0,0,0,2.37,2.37l55.08,20.3a3.92,3.92,0,0,1,0,7.36ZM148,40a4,4,0,0,1,4-4h20V16a4,4,0,0,1,8,0V36h20a4,4,0,0,1,0,8H180V64a4,4,0,0,1-8,0V44H152A4,4,0,0,1,148,40Zm96,48a4,4,0,0,1-4,4H228v12a4,4,0,0,1-8,0V92H208a4,4,0,0,1,0-8h12V72a4,4,0,0,1,8,0V84h12A4,4,0,0,1,244,88Z"}))]]),H1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M100,36H56A20,20,0,0,0,36,56v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V56A20,20,0,0,0,100,36ZM96,96H60V60H96ZM200,36H156a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V56A20,20,0,0,0,200,36Zm-4,60H160V60h36Zm-96,40H56a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V156A20,20,0,0,0,100,136Zm-4,60H60V160H96Zm104-60H156a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V156A20,20,0,0,0,200,136Zm-4,60H160V160h36Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M112,56v48a8,8,0,0,1-8,8H56a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8h48A8,8,0,0,1,112,56Zm88-8H152a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V56A8,8,0,0,0,200,48Zm-96,96H56a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V152A8,8,0,0,0,104,144Zm96,0H152a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V152A8,8,0,0,0,200,144Z",opacity:"0.2"}),a.createElement("path",{d:"M200,136H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Zm0,64H152V152h48v48ZM104,40H56A16,16,0,0,0,40,56v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,104,40Zm0,64H56V56h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,64H152V56h48v48Zm-96,32H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm0,64H56V152h48v48Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M120,56v48a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40h48A16,16,0,0,1,120,56Zm80-16H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm-96,96H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm96,0H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M104,42H56A14,14,0,0,0,42,56v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V56A14,14,0,0,0,104,42Zm2,62a2,2,0,0,1-2,2H56a2,2,0,0,1-2-2V56a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm94-62H152a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V56A14,14,0,0,0,200,42Zm2,62a2,2,0,0,1-2,2H152a2,2,0,0,1-2-2V56a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm-98,34H56a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V152A14,14,0,0,0,104,138Zm2,62a2,2,0,0,1-2,2H56a2,2,0,0,1-2-2V152a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm94-62H152a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V152A14,14,0,0,0,200,138Zm2,62a2,2,0,0,1-2,2H152a2,2,0,0,1-2-2V152a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M104,40H56A16,16,0,0,0,40,56v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,104,40Zm0,64H56V56h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,64H152V56h48v48Zm-96,32H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm0,64H56V152h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Zm0,64H152V152h48v48Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M104,44H56A12,12,0,0,0,44,56v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V56A12,12,0,0,0,104,44Zm4,60a4,4,0,0,1-4,4H56a4,4,0,0,1-4-4V56a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Zm92-60H152a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V56A12,12,0,0,0,200,44Zm4,60a4,4,0,0,1-4,4H152a4,4,0,0,1-4-4V56a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4ZM104,140H56a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V152A12,12,0,0,0,104,140Zm4,60a4,4,0,0,1-4,4H56a4,4,0,0,1-4-4V152a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Zm92-60H152a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V152A12,12,0,0,0,200,140Zm4,60a4,4,0,0,1-4,4H152a4,4,0,0,1-4-4V152a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Z"}))]]),V1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M234.36,170A12,12,0,0,1,230,186.37l-96,56a12,12,0,0,1-12.1,0l-96-56a12,12,0,0,1,12.09-20.74l90,52.48L218,165.63A12,12,0,0,1,234.36,170ZM218,117.63,128,170.11,38.05,117.63A12,12,0,0,0,26,138.37l96,56a12,12,0,0,0,12.1,0l96-56A12,12,0,0,0,218,117.63ZM20,80a12,12,0,0,1,6-10.37l96-56a12.06,12.06,0,0,1,12.1,0l96,56a12,12,0,0,1,0,20.74l-96,56a12,12,0,0,1-12.1,0l-96-56A12,12,0,0,1,20,80Zm35.82,0L128,122.11,200.18,80,128,37.89Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,80l-96,56L32,80l96-56Z",opacity:"0.2"}),a.createElement("path",{d:"M230.91,172A8,8,0,0,1,228,182.91l-96,56a8,8,0,0,1-8.06,0l-96-56A8,8,0,0,1,36,169.09l92,53.65,92-53.65A8,8,0,0,1,230.91,172ZM220,121.09l-92,53.65L36,121.09A8,8,0,0,0,28,134.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,121.09ZM24,80a8,8,0,0,1,4-6.91l96-56a8,8,0,0,1,8.06,0l96,56a8,8,0,0,1,0,13.82l-96,56a8,8,0,0,1-8.06,0l-96-56A8,8,0,0,1,24,80Zm23.88,0L128,126.74,208.12,80,128,33.26Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M220,169.09l-92,53.65L36,169.09A8,8,0,0,0,28,182.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,169.09Z"}),a.createElement("path",{d:"M220,121.09l-92,53.65L36,121.09A8,8,0,0,0,28,134.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,121.09Z"}),a.createElement("path",{d:"M28,86.91l96,56a8,8,0,0,0,8.06,0l96-56a8,8,0,0,0,0-13.82l-96-56a8,8,0,0,0-8.06,0l-96,56a8,8,0,0,0,0,13.82Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M229.18,173a6,6,0,0,1-2.16,8.2l-96,56a6,6,0,0,1-6,0l-96-56a6,6,0,0,1,6-10.36l93,54.23,93-54.23A6,6,0,0,1,229.18,173ZM221,122.82l-93,54.23L35,122.82a6,6,0,0,0-6,10.36l96,56a6,6,0,0,0,6,0l96-56a6,6,0,0,0-6-10.36ZM26,80a6,6,0,0,1,3-5.18l96-56a6,6,0,0,1,6,0l96,56a6,6,0,0,1,0,10.36l-96,56a6,6,0,0,1-6,0l-96-56A6,6,0,0,1,26,80Zm17.91,0L128,129.05,212.09,80,128,31Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M230.91,172A8,8,0,0,1,228,182.91l-96,56a8,8,0,0,1-8.06,0l-96-56A8,8,0,0,1,36,169.09l92,53.65,92-53.65A8,8,0,0,1,230.91,172ZM220,121.09l-92,53.65L36,121.09A8,8,0,0,0,28,134.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,121.09ZM24,80a8,8,0,0,1,4-6.91l96-56a8,8,0,0,1,8.06,0l96,56a8,8,0,0,1,0,13.82l-96,56a8,8,0,0,1-8.06,0l-96-56A8,8,0,0,1,24,80Zm23.88,0L128,126.74,208.12,80,128,33.26Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M227.45,174a4,4,0,0,1-1.44,5.48l-96,56a4,4,0,0,1-4,0l-96-56a4,4,0,0,1,4-6.92l94,54.83,94-54.83A4,4,0,0,1,227.45,174ZM222,124.54l-94,54.83L34,124.54a4,4,0,0,0-4,6.92l96,56a4,4,0,0,0,4,0l96-56a4,4,0,0,0-4-6.92ZM28,80a4,4,0,0,1,2-3.46l96-56a4,4,0,0,1,4,0l96,56a4,4,0,0,1,0,6.92l-96,56a4,4,0,0,1-4,0l-96-56A4,4,0,0,1,28,80Zm11.94,0L128,131.37,216.06,80,128,28.63Z"}))]]),M1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M116,36V20a12,12,0,0,1,24,0V36a12,12,0,0,1-24,0Zm80,92a68,68,0,1,1-68-68A68.07,68.07,0,0,1,196,128Zm-24,0a44,44,0,1,0-44,44A44.05,44.05,0,0,0,172,128ZM51.51,68.49a12,12,0,1,0,17-17l-12-12a12,12,0,0,0-17,17Zm0,119-12,12a12,12,0,0,0,17,17l12-12a12,12,0,1,0-17-17ZM196,72a12,12,0,0,0,8.49-3.51l12-12a12,12,0,0,0-17-17l-12,12A12,12,0,0,0,196,72Zm8.49,115.51a12,12,0,0,0-17,17l12,12a12,12,0,0,0,17-17ZM48,128a12,12,0,0,0-12-12H20a12,12,0,0,0,0,24H36A12,12,0,0,0,48,128Zm80,80a12,12,0,0,0-12,12v16a12,12,0,0,0,24,0V220A12,12,0,0,0,128,208Zm108-92H220a12,12,0,0,0,0,24h16a12,12,0,0,0,0-24Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M184,128a56,56,0,1,1-56-56A56,56,0,0,1,184,128Z",opacity:"0.2"}),a.createElement("path",{d:"M120,40V16a8,8,0,0,1,16,0V40a8,8,0,0,1-16,0Zm72,88a64,64,0,1,1-64-64A64.07,64.07,0,0,1,192,128Zm-16,0a48,48,0,1,0-48,48A48.05,48.05,0,0,0,176,128ZM58.34,69.66A8,8,0,0,0,69.66,58.34l-16-16A8,8,0,0,0,42.34,53.66Zm0,116.68-16,16a8,8,0,0,0,11.32,11.32l16-16a8,8,0,0,0-11.32-11.32ZM192,72a8,8,0,0,0,5.66-2.34l16-16a8,8,0,0,0-11.32-11.32l-16,16A8,8,0,0,0,192,72Zm5.66,114.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32-11.32ZM48,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H40A8,8,0,0,0,48,128Zm80,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V216A8,8,0,0,0,128,208Zm112-88H216a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M120,40V16a8,8,0,0,1,16,0V40a8,8,0,0,1-16,0Zm8,24a64,64,0,1,0,64,64A64.07,64.07,0,0,0,128,64ZM58.34,69.66A8,8,0,0,0,69.66,58.34l-16-16A8,8,0,0,0,42.34,53.66Zm0,116.68-16,16a8,8,0,0,0,11.32,11.32l16-16a8,8,0,0,0-11.32-11.32ZM192,72a8,8,0,0,0,5.66-2.34l16-16a8,8,0,0,0-11.32-11.32l-16,16A8,8,0,0,0,192,72Zm5.66,114.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32-11.32ZM48,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H40A8,8,0,0,0,48,128Zm80,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V216A8,8,0,0,0,128,208Zm112-88H216a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M122,40V16a6,6,0,0,1,12,0V40a6,6,0,0,1-12,0Zm68,88a62,62,0,1,1-62-62A62.07,62.07,0,0,1,190,128Zm-12,0a50,50,0,1,0-50,50A50.06,50.06,0,0,0,178,128ZM59.76,68.24a6,6,0,1,0,8.48-8.48l-16-16a6,6,0,0,0-8.48,8.48Zm0,119.52-16,16a6,6,0,1,0,8.48,8.48l16-16a6,6,0,1,0-8.48-8.48ZM192,70a6,6,0,0,0,4.24-1.76l16-16a6,6,0,0,0-8.48-8.48l-16,16A6,6,0,0,0,192,70Zm4.24,117.76a6,6,0,0,0-8.48,8.48l16,16a6,6,0,0,0,8.48-8.48ZM46,128a6,6,0,0,0-6-6H16a6,6,0,0,0,0,12H40A6,6,0,0,0,46,128Zm82,82a6,6,0,0,0-6,6v24a6,6,0,0,0,12,0V216A6,6,0,0,0,128,210Zm112-88H216a6,6,0,0,0,0,12h24a6,6,0,0,0,0-12Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M120,40V16a8,8,0,0,1,16,0V40a8,8,0,0,1-16,0Zm72,88a64,64,0,1,1-64-64A64.07,64.07,0,0,1,192,128Zm-16,0a48,48,0,1,0-48,48A48.05,48.05,0,0,0,176,128ZM58.34,69.66A8,8,0,0,0,69.66,58.34l-16-16A8,8,0,0,0,42.34,53.66Zm0,116.68-16,16a8,8,0,0,0,11.32,11.32l16-16a8,8,0,0,0-11.32-11.32ZM192,72a8,8,0,0,0,5.66-2.34l16-16a8,8,0,0,0-11.32-11.32l-16,16A8,8,0,0,0,192,72Zm5.66,114.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32-11.32ZM48,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H40A8,8,0,0,0,48,128Zm80,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V216A8,8,0,0,0,128,208Zm112-88H216a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M124,40V16a4,4,0,0,1,8,0V40a4,4,0,0,1-8,0Zm64,88a60,60,0,1,1-60-60A60.07,60.07,0,0,1,188,128Zm-8,0a52,52,0,1,0-52,52A52.06,52.06,0,0,0,180,128ZM61.17,66.83a4,4,0,0,0,5.66-5.66l-16-16a4,4,0,0,0-5.66,5.66Zm0,122.34-16,16a4,4,0,0,0,5.66,5.66l16-16a4,4,0,0,0-5.66-5.66ZM192,68a4,4,0,0,0,2.83-1.17l16-16a4,4,0,1,0-5.66-5.66l-16,16A4,4,0,0,0,192,68Zm2.83,121.17a4,4,0,0,0-5.66,5.66l16,16a4,4,0,0,0,5.66-5.66ZM40,124H16a4,4,0,0,0,0,8H40a4,4,0,0,0,0-8Zm88,88a4,4,0,0,0-4,4v24a4,4,0,0,0,8,0V216A4,4,0,0,0,128,212Zm112-88H216a4,4,0,0,0,0,8h24a4,4,0,0,0,0-8Z"}))]]),E1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,48V152a20,20,0,0,1-20,20H112.92a12,12,0,0,1-17.41,16.49l-20-20a12,12,0,0,1,0-17l20-20A12,12,0,0,1,112.92,148H204V52H100a12,12,0,0,1-24,0V48A20,20,0,0,1,96,28H208A20,20,0,0,1,228,48ZM168,192a12,12,0,0,0-12,12H52V108h91.08a12,12,0,0,0,17.41,16.49l20-20a12,12,0,0,0,0-17l-20-20A12,12,0,0,0,143.08,84H48a20,20,0,0,0-20,20V208a20,20,0,0,0,20,20H160a20,20,0,0,0,20-20v-4A12,12,0,0,0,168,192Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48V152a8,8,0,0,1-8,8H168v48a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V104a8,8,0,0,1,8-8H88V48a8,8,0,0,1,8-8H208A8,8,0,0,1,216,48Z",opacity:"0.2"}),a.createElement("path",{d:"M224,48V152a16,16,0,0,1-16,16H99.31l10.35,10.34a8,8,0,0,1-11.32,11.32l-24-24a8,8,0,0,1,0-11.32l24-24a8,8,0,0,1,11.32,11.32L99.31,152H208V48H96v8a8,8,0,0,1-16,0V48A16,16,0,0,1,96,32H208A16,16,0,0,1,224,48ZM168,192a8,8,0,0,0-8,8v8H48V104H156.69l-10.35,10.34a8,8,0,0,0,11.32,11.32l24-24a8,8,0,0,0,0-11.32l-24-24a8,8,0,0,0-11.32,11.32L156.69,88H48a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16H160a16,16,0,0,0,16-16v-8A8,8,0,0,0,168,192Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,48V152a16,16,0,0,1-16,16H112v16a8,8,0,0,1-13.66,5.66l-24-24a8,8,0,0,1,0-11.32l24-24A8,8,0,0,1,112,136v16h96V48H96v8a8,8,0,0,1-16,0V48A16,16,0,0,1,96,32H208A16,16,0,0,1,224,48ZM168,192a8,8,0,0,0-8,8v8H48V104h96v16a8,8,0,0,0,13.66,5.66l24-24a8,8,0,0,0,0-11.32l-24-24A8,8,0,0,0,144,72V88H48a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16H160a16,16,0,0,0,16-16v-8A8,8,0,0,0,168,192Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M222,48V152a14,14,0,0,1-14,14H94.49l13.75,13.76a6,6,0,1,1-8.48,8.48l-24-24a6,6,0,0,1,0-8.48l24-24a6,6,0,0,1,8.48,8.48L94.49,154H208a2,2,0,0,0,2-2V48a2,2,0,0,0-2-2H96a2,2,0,0,0-2,2v8a6,6,0,0,1-12,0V48A14,14,0,0,1,96,34H208A14,14,0,0,1,222,48ZM168,194a6,6,0,0,0-6,6v8a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V104a2,2,0,0,1,2-2H161.51l-13.75,13.76a6,6,0,1,0,8.48,8.48l24-24a6,6,0,0,0,0-8.48l-24-24a6,6,0,0,0-8.48,8.48L161.51,90H48a14,14,0,0,0-14,14V208a14,14,0,0,0,14,14H160a14,14,0,0,0,14-14v-8A6,6,0,0,0,168,194Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,48V152a16,16,0,0,1-16,16H99.31l10.35,10.34a8,8,0,0,1-11.32,11.32l-24-24a8,8,0,0,1,0-11.32l24-24a8,8,0,0,1,11.32,11.32L99.31,152H208V48H96v8a8,8,0,0,1-16,0V48A16,16,0,0,1,96,32H208A16,16,0,0,1,224,48ZM168,192a8,8,0,0,0-8,8v8H48V104H156.69l-10.35,10.34a8,8,0,0,0,11.32,11.32l24-24a8,8,0,0,0,0-11.32l-24-24a8,8,0,0,0-11.32,11.32L156.69,88H48a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16H160a16,16,0,0,0,16-16v-8A8,8,0,0,0,168,192Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M220,48V152a12,12,0,0,1-12,12H89.66l17.17,17.17a4,4,0,0,1-5.66,5.66l-24-24a4,4,0,0,1,0-5.66l24-24a4,4,0,0,1,5.66,5.66L89.66,156H208a4,4,0,0,0,4-4V48a4,4,0,0,0-4-4H96a4,4,0,0,0-4,4v8a4,4,0,0,1-8,0V48A12,12,0,0,1,96,36H208A12,12,0,0,1,220,48ZM168,196a4,4,0,0,0-4,4v8a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V104a4,4,0,0,1,4-4H166.34l-17.17,17.17a4,4,0,0,0,5.66,5.66l24-24a4,4,0,0,0,0-5.66l-24-24a4,4,0,0,0-5.66,5.66L166.34,92H48a12,12,0,0,0-12,12V208a12,12,0,0,0,12,12H160a12,12,0,0,0,12-12v-8A4,4,0,0,0,168,196Z"}))]]),d1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,28H152a12,12,0,0,0-9.33,4.45L79.5,110.51l-4.66-4.65a20,20,0,0,0-28.29,0L29.86,122.55a20,20,0,0,0,0,28.29h0L45,166,23.86,187.17a20,20,0,0,0,0,28.28l16.69,16.69a20,20,0,0,0,28.28,0L90,211l15.17,15.16a20,20,0,0,0,28.29,0l16.69-16.69a20,20,0,0,0,0-28.3l-4.65-4.65,78.06-63.17A12,12,0,0,0,228,104V40A12,12,0,0,0,216,28ZM54.69,212.34l-11-11L62,183l11,11Zm64.61-6L49.65,136.7l11.05-11,69.65,69.65ZM204,98.27l-75.58,61.17L121,152l47.51-47.5a12,12,0,0,0-17-17L104,135l-7.45-7.44L157.73,52H204Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M141.66,201,129,213.66a8,8,0,0,1-11.32,0L92,188,58.35,221.66a8,8,0,0,1-11.32,0L34.34,209a8,8,0,0,1,0-11.31L68,164,42.34,138.36a8,8,0,0,1,0-11.32L55,114.34a8,8,0,0,1,11.32,0l75.3,75.3A8,8,0,0,1,141.66,201Z",opacity:"0.2"}),a.createElement("path",{d:"M216,32H152a8,8,0,0,0-6.34,3.12l-64,83.21L72,108.69a16,16,0,0,0-22.64,0l-12.69,12.7a16,16,0,0,0,0,22.63l20,20-28,28a16,16,0,0,0,0,22.63l12.69,12.68a16,16,0,0,0,22.62,0l28-28,20,20a16,16,0,0,0,22.64,0l12.69-12.7a16,16,0,0,0,0-22.63l-9.64-9.64,83.21-64A8,8,0,0,0,224,104V40A8,8,0,0,0,216,32ZM52.69,216,40,203.32l28-28L80.68,188Zm70.61-8L48,132.71,60.7,120,136,195.31ZM208,100.06l-81.74,62.88L115.32,152l50.34-50.34a8,8,0,0,0-11.32-11.31L104,140.68,93.07,129.74,155.94,48H208Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,32H152a8,8,0,0,0-6.34,3.12l-64,83.21L72,108.69a16,16,0,0,0-22.64,0l-8.69,8.7a16,16,0,0,0,0,22.63l22,22-32,32a16,16,0,0,0,0,22.63l8.69,8.68a16,16,0,0,0,22.62,0l32-32,22,22a16,16,0,0,0,22.64,0l8.69-8.7a16,16,0,0,0,0-22.63l-9.64-9.64,83.21-64A8,8,0,0,0,224,104V40A8,8,0,0,0,216,32Zm-8,68.06-81.74,62.88L115.32,152l50.34-50.34a8,8,0,0,0-11.32-11.31L104,140.68,93.07,129.74,155.94,48H208Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,34H152a6,6,0,0,0-4.76,2.34l-65.39,85L70.6,110.1a14,14,0,0,0-19.8,0L38.1,122.8a14,14,0,0,0,0,19.81h0L59.51,164,30.1,193.42a14,14,0,0,0,0,19.8l12.69,12.69a14,14,0,0,0,19.8,0L92,196.5l21.4,21.4a14,14,0,0,0,19.8,0l12.7-12.69a14,14,0,0,0,0-19.81l-11.25-11.25,85-65.39A6,6,0,0,0,222,104V40A6,6,0,0,0,216,34ZM54.1,217.42a2,2,0,0,1-2.83,0L38.59,204.73a2,2,0,0,1,0-2.82L68,172.5,83.51,188Zm83.31-20.7-12.69,12.7a2,2,0,0,1-2.84,0l-75.29-75.3h0a2,2,0,0,1,0-2.83l12.69-12.7a2,2,0,0,1,2.84,0l75.29,75.3A2,2,0,0,1,137.41,196.72ZM210,101.05,126.09,165.6,112.49,152l51.75-51.76a6,6,0,0,0-8.48-8.48L104,143.51l-13.6-13.6L155,46H210Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,32H152a8,8,0,0,0-6.34,3.12l-64,83.21L72,108.69a16,16,0,0,0-22.64,0l-12.69,12.7a16,16,0,0,0,0,22.63l20,20-28,28a16,16,0,0,0,0,22.63l12.69,12.68a16,16,0,0,0,22.62,0l28-28,20,20a16,16,0,0,0,22.64,0l12.69-12.7a16,16,0,0,0,0-22.63l-9.64-9.64,83.21-64A8,8,0,0,0,224,104V40A8,8,0,0,0,216,32ZM52.69,216,40,203.32l28-28L80.68,188Zm70.61-8L48,132.71,60.7,120,136,195.31ZM208,100.06l-81.74,62.88L115.32,152l50.34-50.34a8,8,0,0,0-11.32-11.31L104,140.68,93.07,129.74,155.94,48H208Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,36H152a4,4,0,0,0-3.17,1.56L82.05,124.38,69.19,111.52a12,12,0,0,0-17,0L39.52,124.21a12,12,0,0,0,0,17L62.34,164,31.52,194.83a12,12,0,0,0,0,17L44.2,224.49a12,12,0,0,0,17,0L92,193.67l22.81,22.82a12,12,0,0,0,17,0l12.69-12.7a12,12,0,0,0,0-17L131.62,174l86.82-66.79A4,4,0,0,0,220,104V40A4,4,0,0,0,216,36ZM55.52,218.83a4,4,0,0,1-5.66,0L37.17,206.15a4,4,0,0,1,0-5.66L68,169.67,86.34,188Zm83.31-26.36a4,4,0,0,1,0,5.67l-12.7,12.69a4,4,0,0,1-5.66,0l-75.3-75.3a4,4,0,0,1,0-5.66l12.7-12.69a4,4,0,0,1,5.66,0ZM212,102l-86.08,66.22L109.66,152l53.17-53.17a4,4,0,1,0-5.66-5.66L104,146.34,87.75,130.08,154,44h58Z"}))]]),o1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48H180V36A28,28,0,0,0,152,8H104A28,28,0,0,0,76,36V48H40a12,12,0,0,0,0,24h4V208a20,20,0,0,0,20,20H192a20,20,0,0,0,20-20V72h4a12,12,0,0,0,0-24ZM100,36a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4V48H100Zm88,168H68V72H188ZM116,104v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Zm48,0v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,56V208a8,8,0,0,1-8,8H64a8,8,0,0,1-8-8V56Z",opacity:"0.2"}),a.createElement("path",{d:"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM112,168a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm0-120H96V40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,50H174V40a22,22,0,0,0-22-22H104A22,22,0,0,0,82,40V50H40a6,6,0,0,0,0,12H50V208a14,14,0,0,0,14,14H192a14,14,0,0,0,14-14V62h10a6,6,0,0,0,0-12ZM94,40a10,10,0,0,1,10-10h48a10,10,0,0,1,10,10V50H94ZM194,208a2,2,0,0,1-2,2H64a2,2,0,0,1-2-2V62H194ZM110,104v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Zm48,0v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,52H172V40a20,20,0,0,0-20-20H104A20,20,0,0,0,84,40V52H40a4,4,0,0,0,0,8H52V208a12,12,0,0,0,12,12H192a12,12,0,0,0,12-12V60h12a4,4,0,0,0,0-8ZM92,40a12,12,0,0,1,12-12h48a12,12,0,0,1,12,12V52H92ZM196,208a4,4,0,0,1-4,4H64a4,4,0,0,1-4-4V60H196ZM108,104v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Zm48,0v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Z"}))]]),p1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M244,56v64a12,12,0,0,1-24,0V85l-75.51,75.52a12,12,0,0,1-17,0L96,129,32.49,192.49a12,12,0,0,1-17-17l72-72a12,12,0,0,1,17,0L136,135l67-67H168a12,12,0,0,1,0-24h64A12,12,0,0,1,244,56Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,56v64L168,56Z",opacity:"0.2"}),a.createElement("path",{d:"M232,48H168a8,8,0,0,0-5.66,13.66L188.69,88,136,140.69l-34.34-34.35a8,8,0,0,0-11.32,0l-72,72a8,8,0,0,0,11.32,11.32L96,123.31l34.34,34.35a8,8,0,0,0,11.32,0L200,99.31l26.34,26.35A8,8,0,0,0,240,120V56A8,8,0,0,0,232,48Zm-8,52.69L187.31,64H224Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,56v64a8,8,0,0,1-13.66,5.66L200,99.31l-58.34,58.35a8,8,0,0,1-11.32,0L96,123.31,29.66,189.66a8,8,0,0,1-11.32-11.32l72-72a8,8,0,0,1,11.32,0L136,140.69,188.69,88,162.34,61.66A8,8,0,0,1,168,48h64A8,8,0,0,1,240,56Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M238,56v64a6,6,0,0,1-12,0V70.48l-85.76,85.76a6,6,0,0,1-8.48,0L96,120.49,28.24,188.24a6,6,0,0,1-8.48-8.48l72-72a6,6,0,0,1,8.48,0L136,143.51,217.52,62H168a6,6,0,0,1,0-12h64A6,6,0,0,1,238,56Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,56v64a8,8,0,0,1-16,0V75.31l-82.34,82.35a8,8,0,0,1-11.32,0L96,123.31,29.66,189.66a8,8,0,0,1-11.32-11.32l72-72a8,8,0,0,1,11.32,0L136,140.69,212.69,64H168a8,8,0,0,1,0-16h64A8,8,0,0,1,240,56Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236,56v64a4,4,0,0,1-8,0V65.66l-89.17,89.17a4,4,0,0,1-5.66,0L96,117.66,26.83,186.83a4,4,0,0,1-5.66-5.66l72-72a4,4,0,0,1,5.66,0L136,146.34,222.34,60H168a4,4,0,0,1,0-8h64A4,4,0,0,1,236,56Z"}))]]),g1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,60H212V48a12,12,0,0,0-12-12H56A12,12,0,0,0,44,48V60H24A20,20,0,0,0,4,80V96a44.05,44.05,0,0,0,44,44h.77A84.18,84.18,0,0,0,116,195.15V212H96a12,12,0,0,0,0,24h64a12,12,0,0,0,0-24H140V195.11c30.94-4.51,56.53-26.2,67-55.11h1a44.05,44.05,0,0,0,44-44V80A20,20,0,0,0,232,60ZM28,96V84H44v28c0,1.21,0,2.41.09,3.61A20,20,0,0,1,28,96Zm160,15.1c0,33.33-26.71,60.65-59.54,60.9A60,60,0,0,1,68,112V60H188ZM228,96a20,20,0,0,1-16.12,19.62c.08-1.5.12-3,.12-4.52V84h16Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,48v63.1c0,39.7-31.75,72.6-71.45,72.9A72,72,0,0,1,56,112V48Z",opacity:"0.2"}),a.createElement("path",{d:"M232,64H208V48a8,8,0,0,0-8-8H56a8,8,0,0,0-8,8V64H24A16,16,0,0,0,8,80V96a40,40,0,0,0,40,40h3.65A80.13,80.13,0,0,0,120,191.61V216H96a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16H136V191.58c31.94-3.23,58.44-25.64,68.08-55.58H208a40,40,0,0,0,40-40V80A16,16,0,0,0,232,64ZM48,120A24,24,0,0,1,24,96V80H48v32q0,4,.39,8Zm144-8.9c0,35.52-29,64.64-64,64.9a64,64,0,0,1-64-64V56H192ZM232,96a24,24,0,0,1-24,24h-.5a81.81,81.81,0,0,0,.5-8.9V80h24Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,64H208V48a8,8,0,0,0-8-8H56a8,8,0,0,0-8,8V64H24A16,16,0,0,0,8,80V96a40,40,0,0,0,40,40h3.65A80.13,80.13,0,0,0,120,191.61V216H96a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16H136V191.58c31.94-3.23,58.44-25.64,68.08-55.58H208a40,40,0,0,0,40-40V80A16,16,0,0,0,232,64ZM48,120A24,24,0,0,1,24,96V80H48v32q0,4,.39,8ZM232,96a24,24,0,0,1-24,24h-.5a81.81,81.81,0,0,0,.5-8.9V80h24Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,66H206V48a6,6,0,0,0-6-6H56a6,6,0,0,0-6,6V66H24A14,14,0,0,0,10,80V96a38,38,0,0,0,38,38h5.14A78,78,0,0,0,122,189.75V218H96a6,6,0,0,0,0,12h64a6,6,0,0,0,0-12H134V189.75c32.44-2.52,59.43-25.3,68.62-55.75H208a38,38,0,0,0,38-38V80A14,14,0,0,0,232,66ZM48,122A26,26,0,0,1,22,96V80a2,2,0,0,1,2-2H50v34a80.87,80.87,0,0,0,.65,10Zm146-10.9c0,36.62-29.38,66.63-65.5,66.9A66,66,0,0,1,62,112V54H194ZM234,96a26,26,0,0,1-26,26h-2.77a78.45,78.45,0,0,0,.77-10.9V78h26a2,2,0,0,1,2,2Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,64H208V48a8,8,0,0,0-8-8H56a8,8,0,0,0-8,8V64H24A16,16,0,0,0,8,80V96a40,40,0,0,0,40,40h3.65A80.13,80.13,0,0,0,120,191.61V216H96a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16H136V191.58c31.94-3.23,58.44-25.64,68.08-55.58H208a40,40,0,0,0,40-40V80A16,16,0,0,0,232,64ZM48,120A24,24,0,0,1,24,96V80H48v32q0,4,.39,8Zm144-8.9c0,35.52-29,64.64-64,64.9a64,64,0,0,1-64-64V56H192ZM232,96a24,24,0,0,1-24,24h-.5a81.81,81.81,0,0,0,.5-8.9V80h24Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,68H204V48a4,4,0,0,0-4-4H56a4,4,0,0,0-4,4V68H24A12,12,0,0,0,12,80V96a36,36,0,0,0,36,36h6.66A76,76,0,0,0,124,187.89V220H96a4,4,0,0,0,0,8h64a4,4,0,0,0,0-8H132V187.88c32.93-1.74,60.41-24.91,69.11-55.88H208a36,36,0,0,0,36-36V80A12,12,0,0,0,232,68ZM48,124A28,28,0,0,1,20,96V80a4,4,0,0,1,4-4H52v36a77,77,0,0,0,1,12Zm148-12.9c0,37.71-30.79,68.62-68,68.9a68,68,0,0,1-68-68V52H196ZM236,96a28,28,0,0,1-28,28h-5.1a77.35,77.35,0,0,0,1.1-12.9V76h28a4,4,0,0,1,4,4Z"}))]]),L1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240.26,186.1,152.81,34.23h0a28.74,28.74,0,0,0-49.62,0L15.74,186.1a27.45,27.45,0,0,0,0,27.71A28.31,28.31,0,0,0,40.55,228h174.9a28.31,28.31,0,0,0,24.79-14.19A27.45,27.45,0,0,0,240.26,186.1Zm-20.8,15.7a4.46,4.46,0,0,1-4,2.2H40.55a4.46,4.46,0,0,1-4-2.2,3.56,3.56,0,0,1,0-3.73L124,46.2a4.77,4.77,0,0,1,8,0l87.44,151.87A3.56,3.56,0,0,1,219.46,201.8ZM116,136V104a12,12,0,0,1,24,0v32a12,12,0,0,1-24,0Zm28,40a16,16,0,1,1-16-16A16,16,0,0,1,144,176Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M215.46,216H40.54C27.92,216,20,202.79,26.13,192.09L113.59,40.22c6.3-11,22.52-11,28.82,0l87.46,151.87C236,202.79,228.08,216,215.46,216Z",opacity:"0.2"}),a.createElement("path",{d:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM222.93,203.8a8.5,8.5,0,0,1-7.48,4.2H40.55a8.5,8.5,0,0,1-7.48-4.2,7.59,7.59,0,0,1,0-7.72L120.52,44.21a8.75,8.75,0,0,1,15,0l87.45,151.87A7.59,7.59,0,0,1,222.93,203.8ZM120,144V104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,180Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM120,104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,88a12,12,0,1,1,12-12A12,12,0,0,1,128,192Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M235.07,189.09,147.61,37.22h0a22.75,22.75,0,0,0-39.22,0L20.93,189.09a21.53,21.53,0,0,0,0,21.72A22.35,22.35,0,0,0,40.55,222h174.9a22.35,22.35,0,0,0,19.6-11.19A21.53,21.53,0,0,0,235.07,189.09ZM224.66,204.8a10.46,10.46,0,0,1-9.21,5.2H40.55a10.46,10.46,0,0,1-9.21-5.2,9.51,9.51,0,0,1,0-9.72L118.79,43.21a10.75,10.75,0,0,1,18.42,0l87.46,151.87A9.51,9.51,0,0,1,224.66,204.8ZM122,144V104a6,6,0,0,1,12,0v40a6,6,0,0,1-12,0Zm16,36a10,10,0,1,1-10-10A10,10,0,0,1,138,180Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM222.93,203.8a8.5,8.5,0,0,1-7.48,4.2H40.55a8.5,8.5,0,0,1-7.48-4.2,7.59,7.59,0,0,1,0-7.72L120.52,44.21a8.75,8.75,0,0,1,15,0l87.45,151.87A7.59,7.59,0,0,1,222.93,203.8ZM120,144V104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,180Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M233.34,190.09,145.88,38.22h0a20.75,20.75,0,0,0-35.76,0L22.66,190.09a19.52,19.52,0,0,0,0,19.71A20.36,20.36,0,0,0,40.54,220H215.46a20.36,20.36,0,0,0,17.86-10.2A19.52,19.52,0,0,0,233.34,190.09ZM226.4,205.8a12.47,12.47,0,0,1-10.94,6.2H40.54a12.47,12.47,0,0,1-10.94-6.2,11.45,11.45,0,0,1,0-11.72L117.05,42.21a12.76,12.76,0,0,1,21.9,0L226.4,194.08A11.45,11.45,0,0,1,226.4,205.8ZM124,144V104a4,4,0,0,1,8,0v40a4,4,0,0,1-8,0Zm12,36a8,8,0,1,1-8-8A8,8,0,0,1,136,180Z"}))]]),u1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M144,204a16,16,0,1,1-16-16A16,16,0,0,1,144,204ZM239.61,83.91a176,176,0,0,0-223.22,0,12,12,0,1,0,15.23,18.55,152,152,0,0,1,192.76,0,12,12,0,1,0,15.23-18.55Zm-32.16,35.73a128,128,0,0,0-158.9,0,12,12,0,0,0,14.9,18.81,104,104,0,0,1,129.1,0,12,12,0,0,0,14.9-18.81ZM175.07,155.3a80.05,80.05,0,0,0-94.14,0,12,12,0,0,0,14.14,19.4,56,56,0,0,1,65.86,0,12,12,0,1,0,14.14-19.4Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M238.2,87.69l-104,125.43a8,8,0,0,1-12.3,0L17.8,87.69a7.79,7.79,0,0,1,1.31-11.21,180.75,180.75,0,0,1,217.78,0A7.79,7.79,0,0,1,238.2,87.69Z",opacity:"0.2"}),a.createElement("path",{d:"M247.89,80.91a15.93,15.93,0,0,0-6.17-10.81A186.67,186.67,0,0,0,128,32,186.67,186.67,0,0,0,14.28,70.1,15.93,15.93,0,0,0,8.11,80.91,15.65,15.65,0,0,0,11.65,92.8l104,125.43A15.93,15.93,0,0,0,128,224h0a15.93,15.93,0,0,0,12.31-5.77l104-125.43A15.65,15.65,0,0,0,247.89,80.91ZM128,208,24.09,82.74A170.76,170.76,0,0,1,128,48,170.76,170.76,0,0,1,231.91,82.74Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M244.35,92.8l-104,125.43A15.93,15.93,0,0,1,128,224h0a15.93,15.93,0,0,1-12.31-5.77L11.65,92.8A15.65,15.65,0,0,1,8.11,80.91,15.93,15.93,0,0,1,14.28,70.1,186.67,186.67,0,0,1,128,32,186.67,186.67,0,0,1,241.72,70.1a15.93,15.93,0,0,1,6.17,10.81A15.65,15.65,0,0,1,244.35,92.8Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M138,204a10,10,0,1,1-10-10A10,10,0,0,1,138,204ZM235.81,88.55a170,170,0,0,0-215.62,0,6,6,0,1,0,7.62,9.27,158,158,0,0,1,200.38,0,6,6,0,1,0,7.62-9.27Zm-32.08,35.79a122,122,0,0,0-151.46,0,6,6,0,0,0,7.46,9.41,110,110,0,0,1,136.54,0A6,6,0,0,0,200,135a6,6,0,0,0,3.73-10.7Zm-32.2,35.81a74,74,0,0,0-87.06,0,6,6,0,0,0,7.06,9.7,62,62,0,0,1,72.94,0,6,6,0,0,0,8.38-1.32A6,6,0,0,0,171.53,160.15Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M140,204a12,12,0,1,1-12-12A12,12,0,0,1,140,204ZM237.08,87A172,172,0,0,0,18.92,87,8,8,0,0,0,29.08,99.37a156,156,0,0,1,197.84,0A8,8,0,0,0,237.08,87ZM205,122.77a124,124,0,0,0-153.94,0A8,8,0,0,0,61,135.31a108,108,0,0,1,134.06,0,8,8,0,0,0,11.24-1.3A8,8,0,0,0,205,122.77Zm-32.26,35.76a76.05,76.05,0,0,0-89.42,0,8,8,0,0,0,9.42,12.94,60,60,0,0,1,70.58,0,8,8,0,1,0,9.42-12.94Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M136,204a8,8,0,1,1-8-8A8,8,0,0,1,136,204ZM234.54,90.1a168,168,0,0,0-213.08,0,4,4,0,1,0,5.08,6.18,160,160,0,0,1,202.92,0,4,4,0,0,0,5.08-6.18Zm-32.06,35.81a120,120,0,0,0-149,0,4,4,0,0,0,5,6.27,112,112,0,0,1,139,0,4,4,0,0,0,5-6.27Zm-32.13,35.86a72,72,0,0,0-84.7,0,4,4,0,1,0,4.7,6.46,64.07,64.07,0,0,1,75.3,0,4,4,0,0,0,5.58-.87A4,4,0,0,0,170.35,161.77Z"}))]]),v1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208.49,191.51a12,12,0,0,1-17,17L128,145,64.49,208.49a12,12,0,0,1-17-17L111,128,47.51,64.49a12,12,0,0,1,17-17L128,111l63.51-63.52a12,12,0,0,1,17,17L145,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",opacity:"0.2"}),a.createElement("path",{d:"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM181.66,170.34a8,8,0,0,1-11.32,11.32L128,139.31,85.66,181.66a8,8,0,0,1-11.32-11.32L116.69,128,74.34,85.66A8,8,0,0,1,85.66,74.34L128,116.69l42.34-42.35a8,8,0,0,1,11.32,11.32L139.31,128Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M204.24,195.76a6,6,0,1,1-8.48,8.48L128,136.49,60.24,204.24a6,6,0,0,1-8.48-8.48L119.51,128,51.76,60.24a6,6,0,0,1,8.48-8.48L128,119.51l67.76-67.75a6,6,0,0,1,8.48,8.48L136.49,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M202.83,197.17a4,4,0,0,1-5.66,5.66L128,133.66,58.83,202.83a4,4,0,0,1-5.66-5.66L122.34,128,53.17,58.83a4,4,0,0,1,5.66-5.66L128,122.34l69.17-69.17a4,4,0,1,1,5.66,5.66L133.66,128Z"}))]]),s1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M168.49,104.49,145,128l23.52,23.51a12,12,0,0,1-17,17L128,145l-23.51,23.52a12,12,0,0,1-17-17L111,128,87.51,104.49a12,12,0,0,1,17-17L128,111l23.51-23.52a12,12,0,0,1,17,17ZM236,128A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-24,0a84,84,0,1,0-84,84A84.09,84.09,0,0,0,212,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),a.createElement("path",{d:"M165.66,101.66,139.31,128l26.35,26.34a8,8,0,0,1-11.32,11.32L128,139.31l-26.34,26.35a8,8,0,0,1-11.32-11.32L116.69,128,90.34,101.66a8,8,0,0,1,11.32-11.32L128,116.69l26.34-26.35a8,8,0,0,1,11.32,11.32ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm37.66,130.34a8,8,0,0,1-11.32,11.32L128,139.31l-26.34,26.35a8,8,0,0,1-11.32-11.32L116.69,128,90.34,101.66a8,8,0,0,1,11.32-11.32L128,116.69l26.34-26.35a8,8,0,0,1,11.32,11.32L139.31,128Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M164.24,100.24,136.48,128l27.76,27.76a6,6,0,1,1-8.48,8.48L128,136.48l-27.76,27.76a6,6,0,0,1-8.48-8.48L119.52,128,91.76,100.24a6,6,0,0,1,8.48-8.48L128,119.52l27.76-27.76a6,6,0,0,1,8.48,8.48ZM230,128A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M165.66,101.66,139.31,128l26.35,26.34a8,8,0,0,1-11.32,11.32L128,139.31l-26.34,26.35a8,8,0,0,1-11.32-11.32L116.69,128,90.34,101.66a8,8,0,0,1,11.32-11.32L128,116.69l26.34-26.35a8,8,0,0,1,11.32,11.32ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M162.83,98.83,133.66,128l29.17,29.17a4,4,0,0,1-5.66,5.66L128,133.66,98.83,162.83a4,4,0,0,1-5.66-5.66L122.34,128,93.17,98.83a4,4,0,0,1,5.66-5.66L128,122.34l29.17-29.17a4,4,0,1,1,5.66,5.66ZM228,128A100,100,0,1,1,128,28,100.11,100.11,0,0,1,228,128Zm-8,0a92,92,0,1,0-92,92A92.1,92.1,0,0,0,220,128Z"}))]]),i1=a.createContext({color:"currentColor",size:"1em",weight:"regular",mirrored:!1}),l=a.forwardRef((e,t)=>{const{alt:m,color:r,size:n,weight:c,mirrored:V0,children:M0,weights:E0,...d0}=e,{color:o0="currentColor",size:A,weight:p0="regular",mirrored:g0=!1,...L0}=a.useContext(i1);return a.createElement("svg",{ref:t,xmlns:"http://www.w3.org/2000/svg",width:n??A,height:n??A,fill:r??o0,viewBox:"0 0 256 256",transform:V0||g0?"scale(-1, 1)":void 0,...L0,...d0},!!m&&a.createElement("title",null,m),M0,E0.get(c??p0))});l.displayName="IconBase";const Z=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:u0}));Z.displayName="ArrowRightIcon";const f1=Z,h=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:v0}));h.displayName="ArrowSquareOutIcon";const w1=h,H=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:s0}));H.displayName="ArrowsClockwiseIcon";const $1=H,V=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:i0}));V.displayName="BookOpenIcon";const C1=V,M=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:F0}));M.displayName="BrainIcon";const y1=M,E=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:f0}));E.displayName="BugIcon";const b1=E,d=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:w0}));d.displayName="CalendarBlankIcon";const I1=d,o=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:$0}));o.displayName="CaretDownIcon";const N1=o,p=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:C0}));p.displayName="CaretUpIcon";const R1=p,g=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:y0}));g.displayName="ChartBarIcon";const q1=g,L=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:b0}));L.displayName="ChartLineIcon";const S1=L,u=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:I0}));u.displayName="ChatTextIcon";const k1=u,v=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:N0}));v.displayName="CheckIcon";const x1=v,s=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:R0}));s.displayName="CheckCircleIcon";const B1=s,i=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:q0}));i.displayName="ClockIcon";const Q1=i,F=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:S0}));F.displayName="ClockCountdownIcon";const G1=F,f=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:k0}));f.displayName="CloudIcon";const D1=f,w=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:x0}));w.displayName="CloudSlashIcon";const z1=w,$=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:B0}));$.displayName="CommandIcon";const T1=$,C=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:Q0}));C.displayName="CopyIcon";const W1=C,y=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:G0}));y.displayName="DatabaseIcon";const j1=y,b=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:D0}));b.displayName="DownloadSimpleIcon";const O1=b,I=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:z0}));I.displayName="GearIcon";const U1=I,N=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:T0}));N.displayName="GitBranchIcon";const X1=N,R=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:W0}));R.displayName="GithubLogoIcon";const J1=R,q=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:j0}));q.displayName="GraduationCapIcon";const K1=q,S=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:O0}));S.displayName="GraphIcon";const P1=S,k=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:U0}));k.displayName="HardDriveIcon";const Y1=k,x=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:X0}));x.displayName="HeartbeatIcon";const _1=x,B=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:J0}));B.displayName="InfoIcon";const a2=B,Q=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:K0}));Q.displayName="LightbulbIcon";const e2=Q,G=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:P0}));G.displayName="LightningIcon";const t2=G,D=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:Y0}));D.displayName="LinkIcon";const l2=D,z=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:_0}));z.displayName="LockIcon";const n2=z,T=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:a1}));T.displayName="MagnifyingGlassIcon";const m2=T,W=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:e1}));W.displayName="MonitorIcon";const r2=W,j=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:t1}));j.displayName="MoonIcon";const c2=j,O=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:l1}));O.displayName="PlusIcon";const A2=O,U=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:n1}));U.displayName="QuestionIcon";const Z2=U,X=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:m1}));X.displayName="ShareNetworkIcon";const h2=X,J=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:r1}));J.displayName="ShieldIcon";const H2=J,K=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:c1}));K.displayName="ShieldWarningIcon";const V2=K,P=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:A1}));P.displayName="ShuffleIcon";const M2=P,Y=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:Z1}));Y.displayName="SidebarSimpleIcon";const E2=Y,_=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:h1}));_.displayName="SparkleIcon";const d2=_,a0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:H1}));a0.displayName="SquaresFourIcon";const o2=a0,e0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:V1}));e0.displayName="StackIcon";const p2=e0,t0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:M1}));t0.displayName="SunIcon";const g2=t0,l0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:E1}));l0.displayName="SwapIcon";const L2=l0,n0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:d1}));n0.displayName="SwordIcon";const u2=n0,m0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:o1}));m0.displayName="TrashIcon";const v2=m0,r0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:p1}));r0.displayName="TrendUpIcon";const s2=r0,c0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:g1}));c0.displayName="TrophyIcon";const i2=c0,A0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:L1}));A0.displayName="WarningIcon";const F2=A0,Z0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:u1}));Z0.displayName="WifiHighIcon";const f2=Z0,h0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:v1}));h0.displayName="XIcon";const w2=h0,H0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:s1}));H0.displayName="XCircleIcon";const $2=H0;export{O1 as $,$2 as A,F2 as B,W1 as C,C1 as D,w1 as E,w2 as F,l2 as G,t2 as H,v2 as I,R1 as J,N1 as K,e2 as L,f1 as M,G1 as N,L2 as O,X1 as P,I1 as Q,b1 as R,k1 as S,J1 as T,$1 as U,z1 as V,f2 as W,H2 as X,M2 as Y,u2 as Z,x1 as _,_1 as a,i2 as a0,j1 as a1,A2 as a2,V2 as b,y1 as c,Q1 as d,s2 as e,h2 as f,D1 as g,d2 as h,q1 as i,S1 as j,Y1 as k,U1 as l,m2 as m,o2 as n,T1 as o,K1 as p,p2 as q,n2 as r,P1 as s,E2 as t,Z2 as u,r2 as v,c2 as w,g2 as x,B1 as y,a2 as z}; diff --git a/src/surreal_memory/server/static/dist/assets/vendor-icons-IAbuZhWE.js b/src/surreal_memory/server/static/dist/assets/vendor-icons-IAbuZhWE.js deleted file mode 100644 index 53250e9a..00000000 --- a/src/surreal_memory/server/static/dist/assets/vendor-icons-IAbuZhWE.js +++ /dev/null @@ -1 +0,0 @@ -import{r as a}from"./vendor-react-BfuodpLv.js";const g0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224.49,136.49l-72,72a12,12,0,0,1-17-17L187,140H40a12,12,0,0,1,0-24H187L135.51,64.48a12,12,0,0,1,17-17l72,72A12,12,0,0,1,224.49,136.49Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,128l-72,72V56Z",opacity:"0.2"}),a.createElement("path",{d:"M221.66,122.34l-72-72A8,8,0,0,0,136,56v64H40a8,8,0,0,0,0,16h96v64a8,8,0,0,0,13.66,5.66l72-72A8,8,0,0,0,221.66,122.34ZM152,180.69V75.31L204.69,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M221.66,133.66l-72,72A8,8,0,0,1,136,200V136H40a8,8,0,0,1,0-16h96V56a8,8,0,0,1,13.66-5.66l72,72A8,8,0,0,1,221.66,133.66Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M220.24,132.24l-72,72a6,6,0,0,1-8.48-8.48L201.51,134H40a6,6,0,0,1,0-12H201.51L139.76,60.24a6,6,0,0,1,8.48-8.48l72,72A6,6,0,0,1,220.24,132.24Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M218.83,130.83l-72,72a4,4,0,0,1-5.66-5.66L206.34,132H40a4,4,0,0,1,0-8H206.34L141.17,58.83a4,4,0,0,1,5.66-5.66l72,72A4,4,0,0,1,218.83,130.83Z"}))]]),L0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M184,80V208a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V80a8,8,0,0,1,8-8H176A8,8,0,0,1,184,80Z",opacity:"0.2"}),a.createElement("path",{d:"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M192,136v72a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V80A16,16,0,0,1,48,64h72a8,8,0,0,1,0,16H48V208H176V136a8,8,0,0,1,16,0Zm32-96a8,8,0,0,0-8-8H152a8,8,0,0,0-5.66,13.66L172.69,72l-42.35,42.34a8,8,0,0,0,11.32,11.32L184,83.31l26.34,26.35A8,8,0,0,0,224,104Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M222,104a6,6,0,0,1-12,0V54.49l-69.75,69.75a6,6,0,0,1-8.48-8.48L201.51,46H152a6,6,0,0,1,0-12h64a6,6,0,0,1,6,6Zm-38,26a6,6,0,0,0-6,6v72a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V80a2,2,0,0,1,2-2h72a6,6,0,0,0,0-12H48A14,14,0,0,0,34,80V208a14,14,0,0,0,14,14H176a14,14,0,0,0,14-14V136A6,6,0,0,0,184,130Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M220,104a4,4,0,0,1-8,0V49.66l-73.16,73.17a4,4,0,0,1-5.66-5.66L206.34,44H152a4,4,0,0,1,0-8h64a4,4,0,0,1,4,4Zm-36,28a4,4,0,0,0-4,4v72a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V80a4,4,0,0,1,4-4h72a4,4,0,0,0,0-8H48A12,12,0,0,0,36,80V208a12,12,0,0,0,12,12H176a12,12,0,0,0,12-12V136A4,4,0,0,0,184,132Z"}))]]),u0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,48V96a12,12,0,0,1-12,12H168a12,12,0,0,1,0-24h19l-7.8-7.8a75.55,75.55,0,0,0-53.32-22.26h-.43A75.49,75.49,0,0,0,72.39,75.57,12,12,0,1,1,55.61,58.41a99.38,99.38,0,0,1,69.87-28.47H126A99.42,99.42,0,0,1,196.2,59.23L204,67V48a12,12,0,0,1,24,0ZM183.61,180.43a75.49,75.49,0,0,1-53.09,21.63h-.43A75.55,75.55,0,0,1,76.77,179.8L69,172H88a12,12,0,0,0,0-24H40a12,12,0,0,0-12,12v48a12,12,0,0,0,24,0V189l7.8,7.8A99.42,99.42,0,0,0,130,226.06h.56a99.38,99.38,0,0,0,69.87-28.47,12,12,0,0,0-16.78-17.16Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,128a88,88,0,1,1-88-88A88,88,0,0,1,216,128Z",opacity:"0.2"}),a.createElement("path",{d:"M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h28.69L182.06,73.37a79.56,79.56,0,0,0-56.13-23.43h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27a96,96,0,0,1,135,.79L208,76.69V48a8,8,0,0,1,16,0ZM186.41,183.29a80,80,0,0,1-112.47-.66L59.31,168H88a8,8,0,0,0,0-16H40a8,8,0,0,0-8,8v48a8,8,0,0,0,16,0V179.31l14.63,14.63A95.43,95.43,0,0,0,130,222.06h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1-5.66-13.66L180.65,72a79.48,79.48,0,0,0-54.72-22.09h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27,96,96,0,0,1,192,60.7l18.36-18.36A8,8,0,0,1,224,48ZM186.41,183.29A80,80,0,0,1,75.35,184l18.31-18.31A8,8,0,0,0,88,152H40a8,8,0,0,0-8,8v48a8,8,0,0,0,13.66,5.66L64,195.3a95.42,95.42,0,0,0,66,26.76h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M222,48V96a6,6,0,0,1-6,6H168a6,6,0,0,1,0-12h33.52L183.47,72a81.51,81.51,0,0,0-57.53-24h-.46A81.5,81.5,0,0,0,68.19,71.28a6,6,0,1,1-8.38-8.58,93.38,93.38,0,0,1,65.67-26.76H126a93.45,93.45,0,0,1,66,27.53l18,18V48a6,6,0,0,1,12,0ZM187.81,184.72a81.5,81.5,0,0,1-57.29,23.34h-.46a81.51,81.51,0,0,1-57.53-24L54.48,166H88a6,6,0,0,0,0-12H40a6,6,0,0,0-6,6v48a6,6,0,0,0,12,0V174.48l18,18.05a93.45,93.45,0,0,0,66,27.53h.52a93.38,93.38,0,0,0,65.67-26.76,6,6,0,1,0-8.38-8.58Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h28.69L182.06,73.37a79.56,79.56,0,0,0-56.13-23.43h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27a96,96,0,0,1,135,.79L208,76.69V48a8,8,0,0,1,16,0ZM186.41,183.29a80,80,0,0,1-112.47-.66L59.31,168H88a8,8,0,0,0,0-16H40a8,8,0,0,0-8,8v48a8,8,0,0,0,16,0V179.31l14.63,14.63A95.43,95.43,0,0,0,130,222.06h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M220,48V96a4,4,0,0,1-4,4H168a4,4,0,0,1,0-8h38.34L184.89,70.54A84,84,0,0,0,66.8,69.85a4,4,0,1,1-5.6-5.72,92,92,0,0,1,129.34.76L212,86.34V48a4,4,0,0,1,8,0ZM189.2,186.15a83.44,83.44,0,0,1-58.68,23.91h-.47a83.52,83.52,0,0,1-58.94-24.6L49.66,164H88a4,4,0,0,0,0-8H40a4,4,0,0,0-4,4v48a4,4,0,0,0,8,0V169.66l21.46,21.45A91.43,91.43,0,0,0,130,218.06h.51a91.45,91.45,0,0,0,64.28-26.19,4,4,0,1,0-5.6-5.72Z"}))]]),s0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,44H160a43.86,43.86,0,0,0-32,13.85A43.86,43.86,0,0,0,96,44H24A12,12,0,0,0,12,56V200a12,12,0,0,0,12,12H96a20,20,0,0,1,20,20,12,12,0,0,0,24,0,20,20,0,0,1,20-20h72a12,12,0,0,0,12-12V56A12,12,0,0,0,232,44ZM96,188H36V68H96a20,20,0,0,1,20,20V192.81A43.79,43.79,0,0,0,96,188Zm124,0H160a43.71,43.71,0,0,0-20,4.83V88a20,20,0,0,1,20-20h60Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,56V200H160a32,32,0,0,0-32,32,32,32,0,0,0-32-32H24V56H96a32,32,0,0,1,32,32,32,32,0,0,1,32-32Z",opacity:"0.2"}),a.createElement("path",{d:"M232,48H160a40,40,0,0,0-32,16A40,40,0,0,0,96,48H24a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8H96a24,24,0,0,1,24,24,8,8,0,0,0,16,0,24,24,0,0,1,24-24h72a8,8,0,0,0,8-8V56A8,8,0,0,0,232,48ZM96,192H32V64H96a24,24,0,0,1,24,24V200A39.81,39.81,0,0,0,96,192Zm128,0H160a39.81,39.81,0,0,0-24,8V88a24,24,0,0,1,24-24h64Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,56V200a8,8,0,0,1-8,8H160a24,24,0,0,0-24,23.94,7.9,7.9,0,0,1-5.12,7.55A8,8,0,0,1,120,232a24,24,0,0,0-24-24H24a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8H88a32,32,0,0,1,32,32v87.73a8.17,8.17,0,0,0,7.47,8.25,8,8,0,0,0,8.53-8V80a32,32,0,0,1,32-32h64A8,8,0,0,1,240,56Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,50H160a38,38,0,0,0-32,17.55A38,38,0,0,0,96,50H24a6,6,0,0,0-6,6V200a6,6,0,0,0,6,6H96a26,26,0,0,1,26,26,6,6,0,0,0,12,0,26,26,0,0,1,26-26h72a6,6,0,0,0,6-6V56A6,6,0,0,0,232,50ZM96,194H30V62H96a26,26,0,0,1,26,26V204.31A37.86,37.86,0,0,0,96,194Zm130,0H160a37.87,37.87,0,0,0-26,10.32V88a26,26,0,0,1,26-26h66Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,48H160a40,40,0,0,0-32,16A40,40,0,0,0,96,48H24a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8H96a24,24,0,0,1,24,24,8,8,0,0,0,16,0,24,24,0,0,1,24-24h72a8,8,0,0,0,8-8V56A8,8,0,0,0,232,48ZM96,192H32V64H96a24,24,0,0,1,24,24V200A39.81,39.81,0,0,0,96,192Zm128,0H160a39.81,39.81,0,0,0-24,8V88a24,24,0,0,1,24-24h64Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,52H160a36,36,0,0,0-32,19.54A36,36,0,0,0,96,52H24a4,4,0,0,0-4,4V200a4,4,0,0,0,4,4H96a28,28,0,0,1,28,28,4,4,0,0,0,8,0,28,28,0,0,1,28-28h72a4,4,0,0,0,4-4V56A4,4,0,0,0,232,52ZM96,196H28V60H96a28,28,0,0,1,28,28V209.4A35.93,35.93,0,0,0,96,196Zm132,0H160a35.94,35.94,0,0,0-28,13.41V88a28,28,0,0,1,28-28h68Z"}))]]),v0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M252,124a60.14,60.14,0,0,0-32-53.08,52,52,0,0,0-92-32.11A52,52,0,0,0,36,70.92a60,60,0,0,0,0,106.14,52,52,0,0,0,92,32.13,52,52,0,0,0,92-32.13A60.05,60.05,0,0,0,252,124ZM88,204a28,28,0,0,1-26.85-20.07c1,0,1.89.07,2.85.07h8a12,12,0,0,0,0-24H64A36,36,0,0,1,52,90.05a12,12,0,0,0,8-11.32V72a28,28,0,0,1,56,0v60.18a51.61,51.61,0,0,0-7.2-3.85,12,12,0,1,0-9.6,22A28,28,0,0,1,88,204Zm104-44h-8a12,12,0,0,0,0,24h8c1,0,1.9,0,2.85-.07a28,28,0,1,1-38-33.61,12,12,0,1,0-9.6-22,51.61,51.61,0,0,0-7.2,3.85V72a28,28,0,0,1,56,0v6.73a12,12,0,0,0,8,11.32,36,36,0,0,1-12,70Zm16-44a12,12,0,0,1-12,12,40,40,0,0,1-40-40V84a12,12,0,0,1,24,0v4a16,16,0,0,0,16,16A12,12,0,0,1,208,116ZM100,88a40,40,0,0,1-40,40,12,12,0,0,1,0-24A16,16,0,0,0,76,88V84a12,12,0,0,1,24,0Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,124a48,48,0,0,1-32,45.27h0V176a40,40,0,0,1-80,0,40,40,0,0,1-80,0v-6.73h0a48,48,0,0,1,0-90.54V72a40,40,0,0,1,80,0,40,40,0,0,1,80,0v6.73A48,48,0,0,1,240,124Z",opacity:"0.2"}),a.createElement("path",{d:"M248,124a56.11,56.11,0,0,0-32-50.61V72a48,48,0,0,0-88-26.49A48,48,0,0,0,40,72v1.39a56,56,0,0,0,0,101.2V176a48,48,0,0,0,88,26.49A48,48,0,0,0,216,176v-1.41A56.09,56.09,0,0,0,248,124ZM88,208a32,32,0,0,1-31.81-28.56A55.87,55.87,0,0,0,64,180h8a8,8,0,0,0,0-16H64A40,40,0,0,1,50.67,86.27,8,8,0,0,0,56,78.73V72a32,32,0,0,1,64,0v68.26A47.8,47.8,0,0,0,88,128a8,8,0,0,0,0,16,32,32,0,0,1,0,64Zm104-44h-8a8,8,0,0,0,0,16h8a55.87,55.87,0,0,0,7.81-.56A32,32,0,1,1,168,144a8,8,0,0,0,0-16,47.8,47.8,0,0,0-32,12.26V72a32,32,0,0,1,64,0v6.73a8,8,0,0,0,5.33,7.54A40,40,0,0,1,192,164Zm16-52a8,8,0,0,1-8,8h-4a36,36,0,0,1-36-36V80a8,8,0,0,1,16,0v4a20,20,0,0,0,20,20h4A8,8,0,0,1,208,112ZM60,120H56a8,8,0,0,1,0-16h4A20,20,0,0,0,80,84V80a8,8,0,0,1,16,0v4A36,36,0,0,1,60,120Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M212,76V72a44,44,0,0,0-74.86-31.31,3.93,3.93,0,0,0-1.14,2.8v88.72a4,4,0,0,0,6.2,3.33A47.67,47.67,0,0,1,167.68,128a8.18,8.18,0,0,1,8.31,7.58,8,8,0,0,1-8,8.42,32,32,0,0,0-32,32v33.88a4,4,0,0,0,1.49,3.12,47.92,47.92,0,0,0,74.21-17.16,4,4,0,0,0-4.49-5.56A68.06,68.06,0,0,1,192,192h-7.73a8.18,8.18,0,0,1-8.25-7.47,8,8,0,0,1,8-8.53h8a51.6,51.6,0,0,0,24-5.88v0A52,52,0,0,0,212,76Zm-12,36h-4a36,36,0,0,1-36-36V72a8,8,0,0,1,16,0v4a20,20,0,0,0,20,20h4a8,8,0,0,1,0,16ZM88,28A44.05,44.05,0,0,0,44,72v4a52,52,0,0,0-4,94.12h0A51.6,51.6,0,0,0,64,176h7.73A8.18,8.18,0,0,1,80,183.47,8,8,0,0,1,72,192H64a67.48,67.48,0,0,1-15.21-1.73,4,4,0,0,0-4.5,5.55A47.93,47.93,0,0,0,118.51,213a4,4,0,0,0,1.49-3.12V176a32,32,0,0,0-32-32,8,8,0,0,1-8-8.42A8.18,8.18,0,0,1,88.32,128a47.67,47.67,0,0,1,25.48,7.54,4,4,0,0,0,6.2-3.33V43.49a4,4,0,0,0-1.14-2.81A43.85,43.85,0,0,0,88,28Zm8,48a36,36,0,0,1-36,36H56a8,8,0,0,1,0-16h4A20,20,0,0,0,80,76V72a8,8,0,0,1,16,0Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M246,124a54.13,54.13,0,0,0-32-49.33V72a46,46,0,0,0-86-22.67A46,46,0,0,0,42,72v2.67a54,54,0,0,0,0,98.63V176a46,46,0,0,0,86,22.67A46,46,0,0,0,214,176v-2.7A54.07,54.07,0,0,0,246,124ZM88,210a34,34,0,0,1-34-32.94A53.67,53.67,0,0,0,64,178h8a6,6,0,0,0,0-12H64A42,42,0,0,1,50,84.39a6,6,0,0,0,4-5.66V72a34,34,0,0,1,68,0v73.05A45.89,45.89,0,0,0,88,130a6,6,0,0,0,0,12,34,34,0,0,1,0,68Zm104-44h-8a6,6,0,0,0,0,12h8a53.67,53.67,0,0,0,10-.94A34,34,0,1,1,168,142a6,6,0,0,0,0-12,45.89,45.89,0,0,0-34,15.05V72a34,34,0,0,1,68,0v6.73a6,6,0,0,0,4,5.66A42,42,0,0,1,192,166Zm14-54a6,6,0,0,1-6,6h-4a34,34,0,0,1-34-34V80a6,6,0,0,1,12,0v4a22,22,0,0,0,22,22h4A6,6,0,0,1,206,112ZM60,118H56a6,6,0,0,1,0-12h4A22,22,0,0,0,82,84V80a6,6,0,0,1,12,0v4A34,34,0,0,1,60,118Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M248,124a56.11,56.11,0,0,0-32-50.61V72a48,48,0,0,0-88-26.49A48,48,0,0,0,40,72v1.39a56,56,0,0,0,0,101.2V176a48,48,0,0,0,88,26.49A48,48,0,0,0,216,176v-1.41A56.09,56.09,0,0,0,248,124ZM88,208a32,32,0,0,1-31.81-28.56A55.87,55.87,0,0,0,64,180h8a8,8,0,0,0,0-16H64A40,40,0,0,1,50.67,86.27,8,8,0,0,0,56,78.73V72a32,32,0,0,1,64,0v68.26A47.8,47.8,0,0,0,88,128a8,8,0,0,0,0,16,32,32,0,0,1,0,64Zm104-44h-8a8,8,0,0,0,0,16h8a55.87,55.87,0,0,0,7.81-.56A32,32,0,1,1,168,144a8,8,0,0,0,0-16,47.8,47.8,0,0,0-32,12.26V72a32,32,0,0,1,64,0v6.73a8,8,0,0,0,5.33,7.54A40,40,0,0,1,192,164Zm16-52a8,8,0,0,1-8,8h-4a36,36,0,0,1-36-36V80a8,8,0,0,1,16,0v4a20,20,0,0,0,20,20h4A8,8,0,0,1,208,112ZM60,120H56a8,8,0,0,1,0-16h4A20,20,0,0,0,80,84V80a8,8,0,0,1,16,0v4A36,36,0,0,1,60,120Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M244,124a52.1,52.1,0,0,0-32-48V72a44,44,0,0,0-84-18.3A44,44,0,0,0,44,72v4a52,52,0,0,0,0,96v4a44,44,0,0,0,84,18.3A44,44,0,0,0,212,176v-4A52.07,52.07,0,0,0,244,124ZM88,212a36,36,0,0,1-36-36v-1.41A52.13,52.13,0,0,0,64,176h8a4,4,0,0,0,0-8H64A44,44,0,0,1,49.33,82.5,4,4,0,0,0,52,78.73V72a36,36,0,0,1,72,0v78.75A44,44,0,0,0,88,132a4,4,0,0,0,0,8,36,36,0,0,1,0,72Zm104-44h-8a4,4,0,0,0,0,8h8a52.13,52.13,0,0,0,12-1.41V176a36,36,0,1,1-36-36,4,4,0,0,0,0-8,44,44,0,0,0-36,18.75V72a36,36,0,0,1,72,0v6.73a4,4,0,0,0,2.67,3.77A44,44,0,0,1,192,168Zm12-56a4,4,0,0,1-4,4h-4a32,32,0,0,1-32-32V80a4,4,0,0,1,8,0v4a24,24,0,0,0,24,24h4A4,4,0,0,1,204,112ZM92,84a32,32,0,0,1-32,32H56a4,4,0,0,1,0-8h4A24,24,0,0,0,84,84V80a4,4,0,0,1,8,0Z"}))]]),i0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M140,88a16,16,0,1,1,16,16A16,16,0,0,1,140,88ZM100,72a16,16,0,1,0,16,16A16,16,0,0,0,100,72Zm120,72a91.84,91.84,0,0,1-2.34,20.64L236.81,173a12,12,0,0,1-9.62,22l-18-7.85a92,92,0,0,1-162.46,0l-18,7.85a12,12,0,1,1-9.62-22l19.15-8.36A91.84,91.84,0,0,1,36,144v-4H16a12,12,0,0,1,0-24H36v-4a91.84,91.84,0,0,1,2.34-20.64L19.19,83a12,12,0,0,1,9.62-22l18,7.85a92,92,0,0,1,162.46,0l18-7.85a12,12,0,1,1,9.62,22l-19.15,8.36A91.84,91.84,0,0,1,220,112v4h20a12,12,0,0,1,0,24H220ZM60,116H196v-4a68,68,0,0,0-136,0Zm56,94.92V140H60v4A68.1,68.1,0,0,0,116,210.92ZM196,144v-4H140v70.92A68.1,68.1,0,0,0,196,144Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,128v16a80,80,0,0,1-160,0V128Z",opacity:"0.2"}),a.createElement("path",{d:"M144,92a12,12,0,1,1,12,12A12,12,0,0,1,144,92ZM100,80a12,12,0,1,0,12,12A12,12,0,0,0,100,80Zm116,64A87.76,87.76,0,0,1,213,167l22.24,9.72A8,8,0,0,1,232,192a7.89,7.89,0,0,1-3.2-.67L207.38,182a88,88,0,0,1-158.76,0L27.2,191.33A7.89,7.89,0,0,1,24,192a8,8,0,0,1-3.2-15.33L43,167A87.76,87.76,0,0,1,40,144v-8H16a8,8,0,0,1,0-16H40v-8a87.76,87.76,0,0,1,3-23L20.8,79.33a8,8,0,1,1,6.4-14.66L48.62,74a88,88,0,0,1,158.76,0l21.42-9.36a8,8,0,0,1,6.4,14.66L213,89.05a87.76,87.76,0,0,1,3,23v8h24a8,8,0,0,1,0,16H216ZM56,120H200v-8a72,72,0,0,0-144,0Zm64,95.54V136H56v8A72.08,72.08,0,0,0,120,215.54ZM200,144v-8H136v79.54A72.08,72.08,0,0,0,200,144Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M168,92a12,12,0,1,1-12-12A12,12,0,0,1,168,92ZM100,80a12,12,0,1,0,12,12A12,12,0,0,0,100,80Zm116,64A87.76,87.76,0,0,1,213,167l22.24,9.72A8,8,0,0,1,232,192a7.89,7.89,0,0,1-3.2-.67L207.38,182a88,88,0,0,1-158.76,0L27.2,191.33A7.89,7.89,0,0,1,24,192a8,8,0,0,1-3.2-15.33L43,167A87.76,87.76,0,0,1,40,144v-8H16a8,8,0,0,1,0-16H40v-8a87.76,87.76,0,0,1,3-23L20.8,79.33a8,8,0,1,1,6.4-14.66L48.62,74a88,88,0,0,1,158.76,0l21.42-9.36a8,8,0,0,1,6.4,14.66L213,89.05a87.76,87.76,0,0,1,3,23v8h24a8,8,0,0,1,0,16H216Zm-80,0a8,8,0,0,0-16,0v64a8,8,0,0,0,16,0Zm64-32a72,72,0,0,0-144,0v8H200Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M146,92a10,10,0,1,1,10,10A10,10,0,0,1,146,92ZM100,82a10,10,0,1,0,10,10A10,10,0,0,0,100,82Zm146,46a6,6,0,0,1-6,6H214v10a85.88,85.88,0,0,1-3.45,24.08L234.4,178.5a6,6,0,0,1-4.8,11l-23.23-10.15a86,86,0,0,1-156.74,0L26.4,189.5a6,6,0,1,1-4.8-11l23.85-10.42A85.88,85.88,0,0,1,42,144V134H16a6,6,0,0,1,0-12H42V112a85.88,85.88,0,0,1,3.45-24.08L21.6,77.5a6,6,0,0,1,4.8-11L49.63,76.65a86,86,0,0,1,156.74,0L229.6,66.5a6,6,0,1,1,4.8,11L210.55,87.92A85.88,85.88,0,0,1,214,112v10h26A6,6,0,0,1,246,128ZM54,122H202V112a74,74,0,0,0-148,0Zm68,95.74V134H54v10A74.09,74.09,0,0,0,122,217.74ZM202,134H134v83.74A74.09,74.09,0,0,0,202,144Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M144,92a12,12,0,1,1,12,12A12,12,0,0,1,144,92ZM100,80a12,12,0,1,0,12,12A12,12,0,0,0,100,80Zm116,64A87.76,87.76,0,0,1,213,167l22.24,9.72A8,8,0,0,1,232,192a7.89,7.89,0,0,1-3.2-.67L207.38,182a88,88,0,0,1-158.76,0L27.2,191.33A7.89,7.89,0,0,1,24,192a8,8,0,0,1-3.2-15.33L43,167A87.76,87.76,0,0,1,40,144v-8H16a8,8,0,0,1,0-16H40v-8a87.76,87.76,0,0,1,3-23L20.8,79.33a8,8,0,1,1,6.4-14.66L48.62,74a88,88,0,0,1,158.76,0l21.42-9.36a8,8,0,0,1,6.4,14.66L213,89.05a87.76,87.76,0,0,1,3,23v8h24a8,8,0,0,1,0,16H216ZM56,120H200v-8a72,72,0,0,0-144,0Zm64,95.54V136H56v8A72.08,72.08,0,0,0,120,215.54ZM200,144v-8H136v79.54A72.08,72.08,0,0,0,200,144Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M148,92a8,8,0,1,1,8,8A8,8,0,0,1,148,92Zm-48-8a8,8,0,1,0,8,8A8,8,0,0,0,100,84Zm144,44a4,4,0,0,1-4,4H212v12a83.64,83.64,0,0,1-3.87,25.2l25.47,11.13A4,4,0,0,1,232,188a4.09,4.09,0,0,1-1.6-.33l-25-10.95a84,84,0,0,1-154.72,0l-25,10.95A4.09,4.09,0,0,1,24,188a4,4,0,0,1-1.6-7.67L47.87,169.2A83.64,83.64,0,0,1,44,144V132H16a4,4,0,0,1,0-8H44V112a83.64,83.64,0,0,1,3.87-25.2L22.4,75.67a4,4,0,0,1,3.2-7.34l25,11a84,84,0,0,1,154.72,0l25-11a4,4,0,1,1,3.2,7.34L208.13,86.8A83.64,83.64,0,0,1,212,112v12h28A4,4,0,0,1,244,128ZM52,124H204V112a76,76,0,0,0-152,0Zm72,95.89V132H52v12A76.09,76.09,0,0,0,124,219.89ZM204,132H132v87.89A76.09,76.09,0,0,0,204,144Z"}))]]),F0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,28H188V24a12,12,0,0,0-24,0v4H92V24a12,12,0,0,0-24,0v4H48A20,20,0,0,0,28,48V208a20,20,0,0,0,20,20H208a20,20,0,0,0,20-20V48A20,20,0,0,0,208,28ZM68,52a12,12,0,0,0,24,0h72a12,12,0,0,0,24,0h16V76H52V52ZM52,204V100H204V204Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48V88H40V48a8,8,0,0,1,8-8H208A8,8,0,0,1,216,48Z",opacity:"0.2"}),a.createElement("path",{d:"M208,32H184V24a8,8,0,0,0-16,0v8H88V24a8,8,0,0,0-16,0v8H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM72,48v8a8,8,0,0,0,16,0V48h80v8a8,8,0,0,0,16,0V48h24V80H48V48ZM208,208H48V96H208V208Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,32H184V24a8,8,0,0,0-16,0v8H88V24a8,8,0,0,0-16,0v8H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32Zm0,48H48V48H72v8a8,8,0,0,0,16,0V48h80v8a8,8,0,0,0,16,0V48h24Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,34H182V24a6,6,0,0,0-12,0V34H86V24a6,6,0,0,0-12,0V34H48A14,14,0,0,0,34,48V208a14,14,0,0,0,14,14H208a14,14,0,0,0,14-14V48A14,14,0,0,0,208,34ZM48,46H74V56a6,6,0,0,0,12,0V46h84V56a6,6,0,0,0,12,0V46h26a2,2,0,0,1,2,2V82H46V48A2,2,0,0,1,48,46ZM208,210H48a2,2,0,0,1-2-2V94H210V208A2,2,0,0,1,208,210Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,32H184V24a8,8,0,0,0-16,0v8H88V24a8,8,0,0,0-16,0v8H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM72,48v8a8,8,0,0,0,16,0V48h80v8a8,8,0,0,0,16,0V48h24V80H48V48ZM208,208H48V96H208V208Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,36H180V24a4,4,0,0,0-8,0V36H84V24a4,4,0,0,0-8,0V36H48A12,12,0,0,0,36,48V208a12,12,0,0,0,12,12H208a12,12,0,0,0,12-12V48A12,12,0,0,0,208,36ZM48,44H76V56a4,4,0,0,0,8,0V44h88V56a4,4,0,0,0,8,0V44h28a4,4,0,0,1,4,4V84H44V48A4,4,0,0,1,48,44ZM208,212H48a4,4,0,0,1-4-4V92H212V208A4,4,0,0,1,208,212Z"}))]]),f0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216.49,104.49l-80,80a12,12,0,0,1-17,0l-80-80a12,12,0,0,1,17-17L128,159l71.51-71.52a12,12,0,0,1,17,17Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,96l-80,80L48,96Z",opacity:"0.2"}),a.createElement("path",{d:"M215.39,92.94A8,8,0,0,0,208,88H48a8,8,0,0,0-5.66,13.66l80,80a8,8,0,0,0,11.32,0l80-80A8,8,0,0,0,215.39,92.94ZM128,164.69,67.31,104H188.69Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M213.66,101.66l-80,80a8,8,0,0,1-11.32,0l-80-80A8,8,0,0,1,48,88H208a8,8,0,0,1,5.66,13.66Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M212.24,100.24l-80,80a6,6,0,0,1-8.48,0l-80-80a6,6,0,0,1,8.48-8.48L128,167.51l75.76-75.75a6,6,0,0,1,8.48,8.48Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M213.66,101.66l-80,80a8,8,0,0,1-11.32,0l-80-80A8,8,0,0,1,53.66,90.34L128,164.69l74.34-74.35a8,8,0,0,1,11.32,11.32Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M210.83,98.83l-80,80a4,4,0,0,1-5.66,0l-80-80a4,4,0,0,1,5.66-5.66L128,170.34l77.17-77.17a4,4,0,1,1,5.66,5.66Z"}))]]),w0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216.49,168.49a12,12,0,0,1-17,0L128,97,56.49,168.49a12,12,0,0,1-17-17l80-80a12,12,0,0,1,17,0l80,80A12,12,0,0,1,216.49,168.49Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,160H48l80-80Z",opacity:"0.2"}),a.createElement("path",{d:"M213.66,154.34l-80-80a8,8,0,0,0-11.32,0l-80,80A8,8,0,0,0,48,168H208a8,8,0,0,0,5.66-13.66ZM67.31,152,128,91.31,188.69,152Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M215.39,163.06A8,8,0,0,1,208,168H48a8,8,0,0,1-5.66-13.66l80-80a8,8,0,0,1,11.32,0l80,80A8,8,0,0,1,215.39,163.06Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M212.24,164.24a6,6,0,0,1-8.48,0L128,88.49,52.24,164.24a6,6,0,0,1-8.48-8.48l80-80a6,6,0,0,1,8.48,0l80,80A6,6,0,0,1,212.24,164.24Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M213.66,165.66a8,8,0,0,1-11.32,0L128,91.31,53.66,165.66a8,8,0,0,1-11.32-11.32l80-80a8,8,0,0,1,11.32,0l80,80A8,8,0,0,1,213.66,165.66Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M210.83,162.83a4,4,0,0,1-5.66,0L128,85.66,50.83,162.83a4,4,0,0,1-5.66-5.66l80-80a4,4,0,0,1,5.66,0l80,80A4,4,0,0,1,210.83,162.83Z"}))]]),$0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,196h-4V40a12,12,0,0,0-12-12H152a12,12,0,0,0-12,12V76H96A12,12,0,0,0,84,88v36H48a12,12,0,0,0-12,12v60H32a12,12,0,0,0,0,24H224a12,12,0,0,0,0-24ZM164,52h32V196H164Zm-56,48h32v96H108ZM60,148H84v48H60Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,40V208H152V40Z",opacity:"0.2"}),a.createElement("path",{d:"M224,200h-8V40a8,8,0,0,0-8-8H152a8,8,0,0,0-8,8V80H96a8,8,0,0,0-8,8v40H48a8,8,0,0,0-8,8v64H32a8,8,0,0,0,0,16H224a8,8,0,0,0,0-16ZM160,48h40V200H160ZM104,96h40V200H104ZM56,144H88v56H56Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,208a8,8,0,0,1-8,8H32a8,8,0,0,1,0-16h8V136a8,8,0,0,1,8-8H72a8,8,0,0,1,8,8v64H96V88a8,8,0,0,1,8-8h32a8,8,0,0,1,8,8V200h16V40a8,8,0,0,1,8-8h40a8,8,0,0,1,8,8V200h8A8,8,0,0,1,232,208Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,202H214V40a6,6,0,0,0-6-6H152a6,6,0,0,0-6,6V82H96a6,6,0,0,0-6,6v42H48a6,6,0,0,0-6,6v66H32a6,6,0,0,0,0,12H224a6,6,0,0,0,0-12ZM158,46h44V202H158ZM102,94h44V202H102ZM54,142H90v60H54Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,200h-8V40a8,8,0,0,0-8-8H152a8,8,0,0,0-8,8V80H96a8,8,0,0,0-8,8v40H48a8,8,0,0,0-8,8v64H32a8,8,0,0,0,0,16H224a8,8,0,0,0,0-16ZM160,48h40V200H160ZM104,96h40V200H104ZM56,144H88v56H56Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,204H212V40a4,4,0,0,0-4-4H152a4,4,0,0,0-4,4V84H96a4,4,0,0,0-4,4v44H48a4,4,0,0,0-4,4v68H32a4,4,0,0,0,0,8H224a4,4,0,0,0,0-8ZM156,44h48V204H156ZM100,92h48V204H100ZM52,140H92v64H52Z"}))]]),C0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236,208a12,12,0,0,1-12,12H32a12,12,0,0,1-12-12V48a12,12,0,0,1,24,0v85.55L88.1,95a12,12,0,0,1,15.1-.57l56.22,42.16L216.1,87A12,12,0,1,1,231.9,105l-64,56a12,12,0,0,1-15.1.57L96.58,119.44,44,165.45V196H224A12,12,0,0,1,236,208Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,64V208H32V48H208A16,16,0,0,1,224,64Z",opacity:"0.2"}),a.createElement("path",{d:"M232,208a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V48a8,8,0,0,1,16,0v94.37L90.73,98a8,8,0,0,1,10.07-.38l58.81,44.11L218.73,90a8,8,0,1,1,10.54,12l-64,56a8,8,0,0,1-10.07.38L96.39,114.29,40,163.63V200H224A8,8,0,0,1,232,208Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM200,176a8,8,0,0,1,0,16H56a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v62.92l34.88-29.07a8,8,0,0,1,9.56-.51l43,28.69,43.41-36.18a8,8,0,0,1,10.24,12.3l-48,40a8,8,0,0,1-9.56.51l-43-28.69L64,155.75V176Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M230,208a6,6,0,0,1-6,6H32a6,6,0,0,1-6-6V48a6,6,0,0,1,12,0v98.78l54.05-47.3a6,6,0,0,1,7.55-.28l60.11,45.08,60.34-52.8a6,6,0,0,1,7.9,9l-64,56a6,6,0,0,1-7.55.28L96.29,111.72,38,162.72V202H224A6,6,0,0,1,230,208Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,208a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V48a8,8,0,0,1,16,0v94.37L90.73,98a8,8,0,0,1,10.07-.38l58.81,44.11L218.73,90a8,8,0,1,1,10.54,12l-64,56a8,8,0,0,1-10.07.38L96.39,114.29,40,163.63V200H224A8,8,0,0,1,232,208Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,208a4,4,0,0,1-4,4H32a4,4,0,0,1-4-4V48a4,4,0,0,1,8,0V151.19L93.37,101a4,4,0,0,1,5-.19l61.41,46.05L221.37,93a4,4,0,0,1,5.26,6l-64,56a4,4,0,0,1-5,.19l-61.41-46L36,161.81V204H224A4,4,0,0,1,228,208Z"}))]]),y0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,44H40A20,20,0,0,0,20,64V224A19.82,19.82,0,0,0,31.56,242.1a20.14,20.14,0,0,0,8.49,1.9,19.91,19.91,0,0,0,12.82-4.72l.12-.11L84.47,212H216a20,20,0,0,0,20-20V64A20,20,0,0,0,216,44Zm-4,144H80a11.93,11.93,0,0,0-7.84,2.92L44,215.23V68H212ZM84,108A12,12,0,0,1,96,96h64a12,12,0,1,1,0,24H96A12,12,0,0,1,84,108Zm0,40a12,12,0,0,1,12-12h64a12,12,0,0,1,0,24H96A12,12,0,0,1,84,148Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,64V192a8,8,0,0,1-8,8H80L45.15,230.11A8,8,0,0,1,32,224V64a8,8,0,0,1,8-8H216A8,8,0,0,1,224,64Z",opacity:"0.2"}),a.createElement("path",{d:"M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78l.09-.07L83,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H80a8,8,0,0,0-5.23,1.95L40,224V64H216ZM88,112a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H96A8,8,0,0,1,88,112Zm0,32a8,8,0,0,1,8-8h64a8,8,0,1,1,0,16H96A8,8,0,0,1,88,144Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48H40A16,16,0,0,0,24,64V224a15.84,15.84,0,0,0,9.25,14.5A16.05,16.05,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78l.09-.07L83,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM160,152H96a8,8,0,0,1,0-16h64a8,8,0,0,1,0,16Zm0-32H96a8,8,0,0,1,0-16h64a8,8,0,0,1,0,16Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,50H40A14,14,0,0,0,26,64V224a13.88,13.88,0,0,0,8.09,12.69A14.11,14.11,0,0,0,40,238a13.87,13.87,0,0,0,9-3.31l.06-.05L82.23,206H216a14,14,0,0,0,14-14V64A14,14,0,0,0,216,50Zm2,142a2,2,0,0,1-2,2H80a6,6,0,0,0-3.92,1.46L41.26,225.53A2,2,0,0,1,38,224V64a2,2,0,0,1,2-2H216a2,2,0,0,1,2,2Zm-52-80a6,6,0,0,1-6,6H96a6,6,0,0,1,0-12h64A6,6,0,0,1,166,112Zm0,32a6,6,0,0,1-6,6H96a6,6,0,0,1,0-12h64A6,6,0,0,1,166,144Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78l.09-.07L83,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H80a8,8,0,0,0-5.23,1.95L40,224V64H216ZM88,112a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H96A8,8,0,0,1,88,112Zm0,32a8,8,0,0,1,8-8h64a8,8,0,1,1,0,16H96A8,8,0,0,1,88,144Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,52H40A12,12,0,0,0,28,64V224a11.89,11.89,0,0,0,6.93,10.88A12.17,12.17,0,0,0,40,236a11.89,11.89,0,0,0,7.69-2.83l0,0L81.49,204H216a12,12,0,0,0,12-12V64A12,12,0,0,0,216,52Zm4,140a4,4,0,0,1-4,4H80a4,4,0,0,0-2.62,1L42.56,227.06A4,4,0,0,1,36,224V64a4,4,0,0,1,4-4H216a4,4,0,0,1,4,4Zm-56-80a4,4,0,0,1-4,4H96a4,4,0,0,1,0-8h64A4,4,0,0,1,164,112Zm0,32a4,4,0,0,1-4,4H96a4,4,0,0,1,0-8h64A4,4,0,0,1,164,144Z"}))]]),b0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232.49,80.49l-128,128a12,12,0,0,1-17,0l-56-56a12,12,0,1,1,17-17L96,183,215.51,63.51a12,12,0,0,1,17,17Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,56V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56Z",opacity:"0.2"}),a.createElement("path",{d:"M205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM205.66,85.66l-96,96a8,8,0,0,1-11.32,0l-40-40a8,8,0,0,1,11.32-11.32L104,164.69l90.34-90.35a8,8,0,0,1,11.32,11.32Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228.24,76.24l-128,128a6,6,0,0,1-8.48,0l-56-56a6,6,0,0,1,8.48-8.48L96,191.51,219.76,67.76a6,6,0,0,1,8.48,8.48Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M226.83,74.83l-128,128a4,4,0,0,1-5.66,0l-56-56a4,4,0,0,1,5.66-5.66L96,194.34,221.17,69.17a4,4,0,1,1,5.66,5.66Z"}))]]),I0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176.49,95.51a12,12,0,0,1,0,17l-56,56a12,12,0,0,1-17,0l-24-24a12,12,0,1,1,17-17L112,143l47.51-47.52A12,12,0,0,1,176.49,95.51ZM236,128A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-24,0a84,84,0,1,0-84,84A84.09,84.09,0,0,0,212,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),a.createElement("path",{d:"M173.66,98.34a8,8,0,0,1,0,11.32l-56,56a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35A8,8,0,0,1,173.66,98.34ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm45.66,85.66-56,56a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35a8,8,0,0,1,11.32,11.32Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M172.24,99.76a6,6,0,0,1,0,8.48l-56,56a6,6,0,0,1-8.48,0l-24-24a6,6,0,0,1,8.48-8.48L112,151.51l51.76-51.75A6,6,0,0,1,172.24,99.76ZM230,128A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M173.66,98.34a8,8,0,0,1,0,11.32l-56,56a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35A8,8,0,0,1,173.66,98.34ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M170.83,101.17a4,4,0,0,1,0,5.66l-56,56a4,4,0,0,1-5.66,0l-24-24a4,4,0,0,1,5.66-5.66L112,154.34l53.17-53.17A4,4,0,0,1,170.83,101.17ZM228,128A100,100,0,1,1,128,28,100.11,100.11,0,0,1,228,128Zm-8,0a92,92,0,1,0-92,92A92.1,92.1,0,0,0,220,128Z"}))]]),N0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20Zm0,192a84,84,0,1,1,84-84A84.09,84.09,0,0,1,128,212Zm68-84a12,12,0,0,1-12,12H128a12,12,0,0,1-12-12V72a12,12,0,0,1,24,0v44h44A12,12,0,0,1,196,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm64-88a8,8,0,0,1-8,8H128a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v48h48A8,8,0,0,1,192,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm56,112H128a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v48h48a8,8,0,0,1,0,16Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26Zm0,192a90,90,0,1,1,90-90A90.1,90.1,0,0,1,128,218Zm62-90a6,6,0,0,1-6,6H128a6,6,0,0,1-6-6V72a6,6,0,0,1,12,0v50h50A6,6,0,0,1,190,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm64-88a8,8,0,0,1-8,8H128a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v48h48A8,8,0,0,1,192,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28Zm0,192a92,92,0,1,1,92-92A92.1,92.1,0,0,1,128,220Zm60-92a4,4,0,0,1-4,4H128a4,4,0,0,1-4-4V72a4,4,0,0,1,8,0v52h52A4,4,0,0,1,188,128Z"}))]]),R0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236,137A108.13,108.13,0,1,1,119,20,12,12,0,0,1,121,44,84.12,84.12,0,1,0,212,135,12,12,0,1,1,236,137ZM116,76v52a12,12,0,0,0,12,12h52a12,12,0,0,0,0-24H140V76a12,12,0,0,0-24,0Zm92,20a16,16,0,1,0-16-16A16,16,0,0,0,208,96ZM176,64a16,16,0,1,0-16-16A16,16,0,0,0,176,64Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),a.createElement("path",{d:"M232,136.66A104.12,104.12,0,1,1,119.34,24,8,8,0,0,1,120.66,40,88.12,88.12,0,1,0,216,135.34,8,8,0,0,1,232,136.66ZM120,72v56a8,8,0,0,0,8,8h56a8,8,0,0,0,0-16H136V72a8,8,0,0,0-16,0Zm40-24a12,12,0,1,0-12-12A12,12,0,0,0,160,48Zm36,24a12,12,0,1,0-12-12A12,12,0,0,0,196,72Zm24,36a12,12,0,1,0-12-12A12,12,0,0,0,220,108Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,96a12,12,0,1,1,12,12A12,12,0,0,1,208,96ZM196,72a12,12,0,1,0-12-12A12,12,0,0,0,196,72Zm28.66,56a8,8,0,0,0-8.63,7.31A88.12,88.12,0,1,1,120.66,40,8,8,0,0,0,119.34,24,104.12,104.12,0,1,0,232,136.66,8,8,0,0,0,224.66,128ZM128,56a72,72,0,1,1-72,72A72.08,72.08,0,0,1,128,56Zm-8,72a8,8,0,0,0,8,8h48a8,8,0,0,0,0-16H136V80a8,8,0,0,0-16,0Zm40-80a12,12,0,1,0-12-12A12,12,0,0,0,160,48Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M230,136.49A102.12,102.12,0,1,1,119.51,26a6,6,0,0,1,1,12A90.13,90.13,0,1,0,218,135.51a6,6,0,1,1,12,1ZM122,72v56a6,6,0,0,0,6,6h56a6,6,0,0,0,0-12H134V72a6,6,0,0,0-12,0Zm38-26a10,10,0,1,0-10-10A10,10,0,0,0,160,46Zm36,24a10,10,0,1,0-10-10A10,10,0,0,0,196,70Zm24,36a10,10,0,1,0-10-10A10,10,0,0,0,220,106Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,136.66A104.12,104.12,0,1,1,119.34,24,8,8,0,0,1,120.66,40,88.12,88.12,0,1,0,216,135.34,8,8,0,0,1,232,136.66ZM120,72v56a8,8,0,0,0,8,8h56a8,8,0,0,0,0-16H136V72a8,8,0,0,0-16,0Zm40-24a12,12,0,1,0-12-12A12,12,0,0,0,160,48Zm36,24a12,12,0,1,0-12-12A12,12,0,0,0,196,72Zm24,36a12,12,0,1,0-12-12A12,12,0,0,0,220,108Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,136.33A100.13,100.13,0,1,1,119.67,28a4,4,0,1,1,.66,8A92.13,92.13,0,1,0,220,135.67a4,4,0,1,1,8,.66ZM128,132h56a4,4,0,0,0,0-8H132V72a4,4,0,0,0-8,0v56A4,4,0,0,0,128,132Zm32-88a8,8,0,1,0-8-8A8,8,0,0,0,160,44Zm36,24a8,8,0,1,0-8-8A8,8,0,0,0,196,68Zm24,36a8,8,0,1,0-8-8A8,8,0,0,0,220,104Z"}))]]),q0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M160,36A92.09,92.09,0,0,0,79,84.36,68,68,0,1,0,72,220h88a92,92,0,0,0,0-184Zm0,160H72a44,44,0,0,1-1.82-88A91.86,91.86,0,0,0,68,128a12,12,0,0,0,24,0,68,68,0,1,1,68,68Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,128a80,80,0,0,1-80,80H72A56,56,0,1,1,85.92,97.74l0,.1A80,80,0,0,1,240,128Z",opacity:"0.2"}),a.createElement("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M160.06,40A88.1,88.1,0,0,0,81.29,88.67h0A87.48,87.48,0,0,0,72,127.73,8.18,8.18,0,0,1,64.57,136,8,8,0,0,1,56,128a103.66,103.66,0,0,1,5.34-32.92,4,4,0,0,0-4.75-5.18A64.09,64.09,0,0,0,8,152c0,35.19,29.75,64,65,64H160a88.09,88.09,0,0,0,87.93-91.48C246.11,77.54,207.07,40,160.06,40Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M160,42A86.11,86.11,0,0,0,82.43,90.88,62,62,0,1,0,72,214h88a86,86,0,0,0,0-172Zm0,160H72a50,50,0,0,1,0-100,50.67,50.67,0,0,1,5.91.35A85.61,85.61,0,0,0,74,128a6,6,0,0,0,12,0,74,74,0,1,1,74,74Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M160,44A84.11,84.11,0,0,0,83.59,93.12,60.71,60.71,0,0,0,72,92a60,60,0,0,0,0,120h88a84,84,0,0,0,0-168Zm0,160H72a52,52,0,1,1,8.55-103.3A83.66,83.66,0,0,0,76,128a4,4,0,0,0,8,0,76,76,0,1,1,76,76Z"}))]]),S0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M56.88,31.93A12,12,0,1,0,39.12,48.07L71.79,84A68,68,0,0,0,72,220h88a91.26,91.26,0,0,0,30.66-5.24l8.46,9.31a12,12,0,0,0,17.76-16.14ZM160,196H72a44,44,0,0,1-1.8-87.95A91.91,91.91,0,0,0,68,128a12,12,0,0,0,24,0,68.22,68.22,0,0,1,2.66-18.84l77.88,85.67A68.67,68.67,0,0,1,160,196Zm92-68a91.32,91.32,0,0,1-17.53,54,12,12,0,1,1-19.41-14.11,68,68,0,0,0-89.57-98.53,12,12,0,0,1-12.2-20.66A92,92,0,0,1,252,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,128a80,80,0,0,1-80,80H72A56,56,0,1,1,85.92,97.74l0,.1A80,80,0,0,1,240,128Z",opacity:"0.2"}),a.createElement("path",{d:"M53.92,34.62A8,8,0,1,0,42.08,45.38L81.32,88.55l-.06.12A65,65,0,0,0,72,88a64,64,0,0,0,0,128h88a87.34,87.34,0,0,0,31.8-5.93l10.28,11.31a8,8,0,1,0,11.84-10.76ZM160,200H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.3.12A88.4,88.4,0,0,0,72,128a8,8,0,0,0,16,0,72.25,72.25,0,0,1,5.06-26.54l87,95.7A71.66,71.66,0,0,1,160,200Zm88-72a87.89,87.89,0,0,1-22.35,58.61A8,8,0,0,1,213.71,176,72,72,0,0,0,117.37,70a8,8,0,0,1-9.48-12.89A88,88,0,0,1,248,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M248,128.72A87.74,87.74,0,0,1,222.41,190a4,4,0,0,1-5.77-.16L103.78,65.67a4,4,0,0,1,.39-5.76A87.82,87.82,0,0,1,160.87,40C209.15,40.47,248.38,80.43,248,128.72ZM53.92,34.62A8,8,0,1,0,42.08,45.38L81.33,88.56l-.06.11A64,64,0,0,0,8,153c.53,35.12,29.84,63,65,63h87a87.65,87.65,0,0,0,31.78-5.95l10.3,11.33a8,8,0,0,0,11.33.52,8.32,8.32,0,0,0,.29-11.52Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M52.44,36A6,6,0,0,0,43.56,44l40.18,44.2c-.45.87-.9,1.75-1.32,2.64A62,62,0,1,0,72,214h88a85.23,85.23,0,0,0,32.35-6.3L203.56,220a6,6,0,0,0,8.88-8.08ZM160,202H72a50,50,0,1,1,5.9-99.64A86.25,86.25,0,0,0,74,128a6,6,0,0,0,12,0,73.92,73.92,0,0,1,6.44-30.2l91.22,100.34A73.65,73.65,0,0,1,160,202Zm86-74a85.85,85.85,0,0,1-21.85,57.27,6,6,0,0,1-4.47,2,6,6,0,0,1-4.47-10,74,74,0,0,0-99-108.92,6,6,0,1,1-7.11-9.67A86,86,0,0,1,246,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M53.92,34.62A8,8,0,1,0,42.08,45.38L81.32,88.55l-.06.12A65,65,0,0,0,72,88a64,64,0,0,0,0,128h88a87.34,87.34,0,0,0,31.8-5.93l10.28,11.31a8,8,0,1,0,11.84-10.76ZM160,200H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.3.12A88.4,88.4,0,0,0,72,128a8,8,0,0,0,16,0,72.25,72.25,0,0,1,5.06-26.54l87,95.7A71.66,71.66,0,0,1,160,200Zm88-72a87.89,87.89,0,0,1-22.35,58.61A8,8,0,0,1,213.71,176,72,72,0,0,0,117.37,70a8,8,0,0,1-9.48-12.89A88,88,0,0,1,248,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M51,37.31A4,4,0,0,0,45,42.69L86.16,87.93q-1.38,2.55-2.59,5.19A60,60,0,1,0,72,212h88a83.19,83.19,0,0,0,32.88-6.69L205,218.69a4,4,0,1,0,5.92-5.38ZM160,204H72a52,52,0,0,1,0-104,52.92,52.92,0,0,1,8.54.72A84.21,84.21,0,0,0,76,128a4,4,0,0,0,8,0,76,76,0,0,1,7.9-33.76L187.13,199A75.37,75.37,0,0,1,160,204Zm84-76a83.86,83.86,0,0,1-21.34,55.94,4,4,0,1,1-6-5.33A76,76,0,0,0,115,66.75a4,4,0,0,1-4.74-6.45A84,84,0,0,1,244,128Z"}))]]),k0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M180,140H164V116h16a40,40,0,1,0-40-40V92H116V76a40,40,0,1,0-40,40H92v24H76a40,40,0,1,0,40,40V164h24v16a40,40,0,1,0,40-40ZM164,76a16,16,0,1,1,16,16H164ZM60,76a16,16,0,0,1,32,0V92H76A16,16,0,0,1,60,76ZM92,180a16,16,0,1,1-16-16H92Zm24-64h24v24H116Zm64,80a16,16,0,0,1-16-16V164h16a16,16,0,0,1,0,32Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,76h0a28,28,0,0,1-28,28H152V76a28,28,0,0,1,28-28h0A28,28,0,0,1,208,76ZM76,48h0A28,28,0,0,0,48,76h0a28,28,0,0,0,28,28h28V76A28,28,0,0,0,76,48ZM180,152H152v28a28,28,0,0,0,28,28h0a28,28,0,0,0,28-28h0A28,28,0,0,0,180,152ZM48,180h0a28,28,0,0,0,28,28h0a28,28,0,0,0,28-28V152H76A28,28,0,0,0,48,180Z",opacity:"0.2"}),a.createElement("path",{d:"M180,144H160V112h20a36,36,0,1,0-36-36V96H112V76a36,36,0,1,0-36,36H96v32H76a36,36,0,1,0,36,36V160h32v20a36,36,0,1,0,36-36ZM160,76a20,20,0,1,1,20,20H160ZM56,76a20,20,0,0,1,40,0V96H76A20,20,0,0,1,56,76ZM96,180a20,20,0,1,1-20-20H96Zm16-68h32v32H112Zm68,88a20,20,0,0,1-20-20V160h20a20,20,0,0,1,0,40Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M116,116h24v24H116ZM86,72a14,14,0,0,0,0,28h14V86A14,14,0,0,0,86,72Zm98,14a14,14,0,0,0-28,0v14h14A14,14,0,0,0,184,86ZM72,170a14,14,0,0,0,28,0V156H86A14,14,0,0,0,72,170ZM224,48V208a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V48A16,16,0,0,1,48,32H208A16,16,0,0,1,224,48Zm-68,92V116h14a30,30,0,1,0-30-30v14H116V86a30,30,0,1,0-30,30h14v24H86a30,30,0,1,0,30,30V156h24v14a30,30,0,1,0,30-30Zm0,30a14,14,0,1,0,14-14H156Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M180,146H158V110h22a34,34,0,1,0-34-34V98H110V76a34,34,0,1,0-34,34H98v36H76a34,34,0,1,0,34,34V158h36v22a34,34,0,1,0,34-34ZM158,76a22,22,0,1,1,22,22H158ZM54,76a22,22,0,0,1,44,0V98H76A22,22,0,0,1,54,76ZM98,180a22,22,0,1,1-22-22H98Zm12-70h36v36H110Zm70,92a22,22,0,0,1-22-22V158h22a22,22,0,0,1,0,44Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M180,144H160V112h20a36,36,0,1,0-36-36V96H112V76a36,36,0,1,0-36,36H96v32H76a36,36,0,1,0,36,36V160h32v20a36,36,0,1,0,36-36ZM160,76a20,20,0,1,1,20,20H160ZM56,76a20,20,0,0,1,40,0V96H76A20,20,0,0,1,56,76ZM96,180a20,20,0,1,1-20-20H96Zm16-68h32v32H112Zm68,88a20,20,0,0,1-20-20V160h20a20,20,0,0,1,0,40Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M180,148H156V108h24a32,32,0,1,0-32-32v24H108V76a32,32,0,1,0-32,32h24v40H76a32,32,0,1,0,32,32V156h40v24a32,32,0,1,0,32-32ZM156,76a24,24,0,1,1,24,24H156ZM52,76a24,24,0,0,1,48,0v24H76A24,24,0,0,1,52,76Zm48,104a24,24,0,1,1-24-24h24Zm8-72h40v40H108Zm72,96a24,24,0,0,1-24-24V156h24a24,24,0,0,1,0,48Z"}))]]),x0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,28H88A12,12,0,0,0,76,40V76H40A12,12,0,0,0,28,88V216a12,12,0,0,0,12,12H168a12,12,0,0,0,12-12V180h36a12,12,0,0,0,12-12V40A12,12,0,0,0,216,28ZM156,204H52V100H156Zm48-48H180V88a12,12,0,0,0-12-12H100V52H204Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,40V168H168V88H88V40Z",opacity:"0.2"}),a.createElement("path",{d:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32Zm-8,128H176V88a8,8,0,0,0-8-8H96V48H208Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,34H88a6,6,0,0,0-6,6V82H40a6,6,0,0,0-6,6V216a6,6,0,0,0,6,6H168a6,6,0,0,0,6-6V174h42a6,6,0,0,0,6-6V40A6,6,0,0,0,216,34ZM162,210H46V94H162Zm48-48H174V88a6,6,0,0,0-6-6H94V46H210Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,32H88a8,8,0,0,0-8,8V80H40a8,8,0,0,0-8,8V216a8,8,0,0,0,8,8H168a8,8,0,0,0,8-8V176h40a8,8,0,0,0,8-8V40A8,8,0,0,0,216,32ZM160,208H48V96H160Zm48-48H176V88a8,8,0,0,0-8-8H96V48H208Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,36H88a4,4,0,0,0-4,4V84H40a4,4,0,0,0-4,4V216a4,4,0,0,0,4,4H168a4,4,0,0,0,4-4V172h44a4,4,0,0,0,4-4V40A4,4,0,0,0,216,36ZM164,212H44V92H164Zm48-48H172V88a4,4,0,0,0-4-4H92V44H212Z"}))]]),B0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M196,35.52C177.62,25.51,153.48,20,128,20S78.38,25.51,60,35.52C39.37,46.79,28,62.58,28,80v96c0,17.42,11.37,33.21,32,44.48,18.35,10,42.49,15.52,68,15.52s49.62-5.51,68-15.52c20.66-11.27,32-27.06,32-44.48V80C228,62.58,216.63,46.79,196,35.52ZM204,128c0,17-31.21,36-76,36s-76-19-76-36v-8.46a88.9,88.9,0,0,0,8,4.94c18.35,10,42.49,15.52,68,15.52s49.62-5.51,68-15.52a88.9,88.9,0,0,0,8-4.94ZM128,44c44.79,0,76,19,76,36s-31.21,36-76,36S52,97,52,80,83.21,44,128,44Zm0,168c-44.79,0-76-19-76-36v-8.46a88.9,88.9,0,0,0,8,4.94c18.35,10,42.49,15.52,68,15.52s49.62-5.51,68-15.52a88.9,88.9,0,0,0,8-4.94V176C204,193,172.79,212,128,212Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,80c0,26.51-39.4,48-88,48S40,106.51,40,80s39.4-48,88-48S216,53.49,216,80Z",opacity:"0.2"}),a.createElement("path",{d:"M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64ZM69.61,53.08C85.07,44.65,105.81,40,128,40s42.93,4.65,58.39,13.08C200.12,60.57,208,70.38,208,80s-7.88,19.43-21.61,26.92C170.93,115.35,150.19,120,128,120s-42.93-4.65-58.39-13.08C55.88,99.43,48,89.62,48,80S55.88,60.57,69.61,53.08ZM186.39,202.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64Zm-21.61,74.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,26C75.29,26,34,49.72,34,80v96c0,30.28,41.29,54,94,54s94-23.72,94-54V80C222,49.72,180.71,26,128,26Zm0,12c44.45,0,82,19.23,82,42s-37.55,42-82,42S46,102.77,46,80,83.55,38,128,38Zm82,138c0,22.77-37.55,42-82,42s-82-19.23-82-42V154.79C62,171.16,92.37,182,128,182s66-10.84,82-27.21Zm0-48c0,22.77-37.55,42-82,42s-82-19.23-82-42V106.79C62,123.16,92.37,134,128,134s66-10.84,82-27.21Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64ZM69.61,53.08C85.07,44.65,105.81,40,128,40s42.93,4.65,58.39,13.08C200.12,60.57,208,70.38,208,80s-7.88,19.43-21.61,26.92C170.93,115.35,150.19,120,128,120s-42.93-4.65-58.39-13.08C55.88,99.43,48,89.62,48,80S55.88,60.57,69.61,53.08ZM186.39,202.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M192.14,42.55C174.94,33.17,152.16,28,128,28S81.06,33.17,63.86,42.55C45.89,52.35,36,65.65,36,80v96c0,14.35,9.89,27.65,27.86,37.45,17.2,9.38,40,14.55,64.14,14.55s46.94-5.17,64.14-14.55c18-9.8,27.86-23.1,27.86-37.45V80C220,65.65,210.11,52.35,192.14,42.55ZM212,176c0,11.29-8.41,22.1-23.69,30.43C172.27,215.18,150.85,220,128,220s-44.27-4.82-60.31-13.57C52.41,198.1,44,187.29,44,176V149.48c4.69,5.93,11.37,11.34,19.86,16,17.2,9.38,40,14.55,64.14,14.55s46.94-5.17,64.14-14.55c8.49-4.63,15.17-10,19.86-16Zm0-48c0,11.29-8.41,22.1-23.69,30.43C172.27,167.18,150.85,172,128,172s-44.27-4.82-60.31-13.57C52.41,150.1,44,139.29,44,128V101.48c4.69,5.93,11.37,11.34,19.86,16,17.2,9.38,40,14.55,64.14,14.55s46.94-5.17,64.14-14.55c8.49-4.63,15.17-10,19.86-16Zm-23.69-17.57C172.27,119.18,150.85,124,128,124s-44.27-4.82-60.31-13.57C52.41,102.1,44,91.29,44,80s8.41-22.1,23.69-30.43C83.73,40.82,105.15,36,128,36s44.27,4.82,60.31,13.57C203.59,57.9,212,68.71,212,80S203.59,102.1,188.31,110.43Z"}))]]),Q0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,144v64a12,12,0,0,1-12,12H40a12,12,0,0,1-12-12V144a12,12,0,0,1,24,0v52H204V144a12,12,0,0,1,24,0Zm-108.49,8.49a12,12,0,0,0,17,0l40-40a12,12,0,0,0-17-17L140,115V32a12,12,0,0,0-24,0v83L96.49,95.51a12,12,0,0,0-17,17Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48V208H40V48A16,16,0,0,1,56,32H200A16,16,0,0,1,216,48Z",opacity:"0.2"}),a.createElement("path",{d:"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40A8,8,0,0,0,168,96H136V32a8,8,0,0,0-16,0V96H88a8,8,0,0,0-5.66,13.66Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M222,144v64a6,6,0,0,1-6,6H40a6,6,0,0,1-6-6V144a6,6,0,0,1,12,0v58H210V144a6,6,0,0,1,12,0Zm-98.24,4.24a6,6,0,0,0,8.48,0l40-40a6,6,0,0,0-8.48-8.48L134,129.51V32a6,6,0,0,0-12,0v97.51L92.24,99.76a6,6,0,0,0-8.48,8.48Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M220,144v64a4,4,0,0,1-4,4H40a4,4,0,0,1-4-4V144a4,4,0,0,1,8,0v60H212V144a4,4,0,0,1,8,0Zm-94.83,2.83a4,4,0,0,0,5.66,0l40-40a4,4,0,1,0-5.66-5.66L132,134.34V32a4,4,0,0,0-8,0V134.34L90.83,101.17a4,4,0,0,0-5.66,5.66Z"}))]]),G0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,76a52,52,0,1,0,52,52A52.06,52.06,0,0,0,128,76Zm0,80a28,28,0,1,1,28-28A28,28,0,0,1,128,156Zm92-27.21v-1.58l14-17.51a12,12,0,0,0,2.23-10.59A111.75,111.75,0,0,0,225,71.89,12,12,0,0,0,215.89,66L193.61,63.5l-1.11-1.11L190,40.1A12,12,0,0,0,184.11,31a111.67,111.67,0,0,0-27.23-11.27A12,12,0,0,0,146.3,22L128.79,36h-1.58L109.7,22a12,12,0,0,0-10.59-2.23A111.75,111.75,0,0,0,71.89,31.05,12,12,0,0,0,66,40.11L63.5,62.39,62.39,63.5,40.1,66A12,12,0,0,0,31,71.89,111.67,111.67,0,0,0,19.77,99.12,12,12,0,0,0,22,109.7l14,17.51v1.58L22,146.3a12,12,0,0,0-2.23,10.59,111.75,111.75,0,0,0,11.29,27.22A12,12,0,0,0,40.11,190l22.28,2.48,1.11,1.11L66,215.9A12,12,0,0,0,71.89,225a111.67,111.67,0,0,0,27.23,11.27A12,12,0,0,0,109.7,234l17.51-14h1.58l17.51,14a12,12,0,0,0,10.59,2.23A111.75,111.75,0,0,0,184.11,225a12,12,0,0,0,5.91-9.06l2.48-22.28,1.11-1.11L215.9,190a12,12,0,0,0,9.06-5.91,111.67,111.67,0,0,0,11.27-27.23A12,12,0,0,0,234,146.3Zm-24.12-4.89a70.1,70.1,0,0,1,0,8.2,12,12,0,0,0,2.61,8.22l12.84,16.05A86.47,86.47,0,0,1,207,166.86l-20.43,2.27a12,12,0,0,0-7.65,4,69,69,0,0,1-5.8,5.8,12,12,0,0,0-4,7.65L166.86,207a86.47,86.47,0,0,1-10.49,4.35l-16.05-12.85a12,12,0,0,0-7.5-2.62c-.24,0-.48,0-.72,0a70.1,70.1,0,0,1-8.2,0,12.06,12.06,0,0,0-8.22,2.6L99.63,211.33A86.47,86.47,0,0,1,89.14,207l-2.27-20.43a12,12,0,0,0-4-7.65,69,69,0,0,1-5.8-5.8,12,12,0,0,0-7.65-4L49,166.86a86.47,86.47,0,0,1-4.35-10.49l12.84-16.05a12,12,0,0,0,2.61-8.22,70.1,70.1,0,0,1,0-8.2,12,12,0,0,0-2.61-8.22L44.67,99.63A86.47,86.47,0,0,1,49,89.14l20.43-2.27a12,12,0,0,0,7.65-4,69,69,0,0,1,5.8-5.8,12,12,0,0,0,4-7.65L89.14,49a86.47,86.47,0,0,1,10.49-4.35l16.05,12.85a12.06,12.06,0,0,0,8.22,2.6,70.1,70.1,0,0,1,8.2,0,12,12,0,0,0,8.22-2.6l16.05-12.85A86.47,86.47,0,0,1,166.86,49l2.27,20.43a12,12,0,0,0,4,7.65,69,69,0,0,1,5.8,5.8,12,12,0,0,0,7.65,4L207,89.14a86.47,86.47,0,0,1,4.35,10.49l-12.84,16.05A12,12,0,0,0,195.88,123.9Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M207.86,123.18l16.78-21a99.14,99.14,0,0,0-10.07-24.29l-26.7-3a81,81,0,0,0-6.81-6.81l-3-26.71a99.43,99.43,0,0,0-24.3-10l-21,16.77a81.59,81.59,0,0,0-9.64,0l-21-16.78A99.14,99.14,0,0,0,77.91,41.43l-3,26.7a81,81,0,0,0-6.81,6.81l-26.71,3a99.43,99.43,0,0,0-10,24.3l16.77,21a81.59,81.59,0,0,0,0,9.64l-16.78,21a99.14,99.14,0,0,0,10.07,24.29l26.7,3a81,81,0,0,0,6.81,6.81l3,26.71a99.43,99.43,0,0,0,24.3,10l21-16.77a81.59,81.59,0,0,0,9.64,0l21,16.78a99.14,99.14,0,0,0,24.29-10.07l3-26.7a81,81,0,0,0,6.81-6.81l26.71-3a99.43,99.43,0,0,0,10-24.3l-16.77-21A81.59,81.59,0,0,0,207.86,123.18ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z",opacity:"0.2"}),a.createElement("path",{d:"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.6,107.6,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.29,107.29,0,0,0-26.25-10.86,8,8,0,0,0-7.06,1.48L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.6,107.6,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8.06,8.06,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8.06,8.06,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,130.16q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.6,107.6,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.29,107.29,0,0,0-26.25-10.86,8,8,0,0,0-7.06,1.48L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.6,107.6,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,82a46,46,0,1,0,46,46A46.06,46.06,0,0,0,128,82Zm0,80a34,34,0,1,1,34-34A34,34,0,0,1,128,162ZM214,130.84c.06-1.89.06-3.79,0-5.68L229.33,106a6,6,0,0,0,1.11-5.29A105.34,105.34,0,0,0,219.76,74.9a6,6,0,0,0-4.53-3l-24.45-2.71q-1.93-2.07-4-4l-2.72-24.46a6,6,0,0,0-3-4.53,105.65,105.65,0,0,0-25.77-10.66A6,6,0,0,0,150,26.68l-19.2,15.37c-1.89-.06-3.79-.06-5.68,0L106,26.67a6,6,0,0,0-5.29-1.11A105.34,105.34,0,0,0,74.9,36.24a6,6,0,0,0-3,4.53L69.23,65.22q-2.07,1.94-4,4L40.76,72a6,6,0,0,0-4.53,3,105.65,105.65,0,0,0-10.66,25.77A6,6,0,0,0,26.68,106l15.37,19.2c-.06,1.89-.06,3.79,0,5.68L26.67,150.05a6,6,0,0,0-1.11,5.29A105.34,105.34,0,0,0,36.24,181.1a6,6,0,0,0,4.53,3l24.45,2.71q1.94,2.07,4,4L72,215.24a6,6,0,0,0,3,4.53,105.65,105.65,0,0,0,25.77,10.66,6,6,0,0,0,5.29-1.11L125.16,214c1.89.06,3.79.06,5.68,0l19.21,15.38a6,6,0,0,0,3.75,1.31,6.2,6.2,0,0,0,1.54-.2,105.34,105.34,0,0,0,25.76-10.68,6,6,0,0,0,3-4.53l2.71-24.45q2.07-1.93,4-4l24.46-2.72a6,6,0,0,0,4.53-3,105.49,105.49,0,0,0,10.66-25.77,6,6,0,0,0-1.11-5.29Zm-3.1,41.63-23.64,2.63a6,6,0,0,0-3.82,2,75.14,75.14,0,0,1-6.31,6.31,6,6,0,0,0-2,3.82l-2.63,23.63A94.28,94.28,0,0,1,155.14,218l-18.57-14.86a6,6,0,0,0-3.75-1.31h-.36a78.07,78.07,0,0,1-8.92,0,6,6,0,0,0-4.11,1.3L100.87,218a94.13,94.13,0,0,1-17.34-7.17L80.9,187.21a6,6,0,0,0-2-3.82,75.14,75.14,0,0,1-6.31-6.31,6,6,0,0,0-3.82-2l-23.63-2.63A94.28,94.28,0,0,1,38,155.14l14.86-18.57a6,6,0,0,0,1.3-4.11,78.07,78.07,0,0,1,0-8.92,6,6,0,0,0-1.3-4.11L38,100.87a94.13,94.13,0,0,1,7.17-17.34L68.79,80.9a6,6,0,0,0,3.82-2,75.14,75.14,0,0,1,6.31-6.31,6,6,0,0,0,2-3.82l2.63-23.63A94.28,94.28,0,0,1,100.86,38l18.57,14.86a6,6,0,0,0,4.11,1.3,78.07,78.07,0,0,1,8.92,0,6,6,0,0,0,4.11-1.3L155.13,38a94.13,94.13,0,0,1,17.34,7.17l2.63,23.64a6,6,0,0,0,2,3.82,75.14,75.14,0,0,1,6.31,6.31,6,6,0,0,0,3.82,2l23.63,2.63A94.28,94.28,0,0,1,218,100.86l-14.86,18.57a6,6,0,0,0-1.3,4.11,78.07,78.07,0,0,1,0,8.92,6,6,0,0,0,1.3,4.11L218,155.13A94.13,94.13,0,0,1,210.85,172.47Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.21,107.21,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.71,107.71,0,0,0-26.25-10.87,8,8,0,0,0-7.06,1.49L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.21,107.21,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8,8,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8,8,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,84a44,44,0,1,0,44,44A44.05,44.05,0,0,0,128,84Zm0,80a36,36,0,1,1,36-36A36,36,0,0,1,128,164Zm83.93-32.49q.13-3.51,0-7l15.83-19.79a4,4,0,0,0,.75-3.53A103.64,103.64,0,0,0,218,75.9a4,4,0,0,0-3-2l-25.19-2.8c-1.58-1.71-3.24-3.37-4.95-4.95L182.07,41a4,4,0,0,0-2-3A104,104,0,0,0,154.82,27.5a4,4,0,0,0-3.53.74L131.51,44.07q-3.51-.14-7,0L104.7,28.24a4,4,0,0,0-3.53-.75A103.64,103.64,0,0,0,75.9,38a4,4,0,0,0-2,3l-2.8,25.19c-1.71,1.58-3.37,3.24-4.95,4.95L41,73.93a4,4,0,0,0-3,2A104,104,0,0,0,27.5,101.18a4,4,0,0,0,.74,3.53l15.83,19.78q-.14,3.51,0,7L28.24,151.3a4,4,0,0,0-.75,3.53A103.64,103.64,0,0,0,38,180.1a4,4,0,0,0,3,2l25.19,2.8c1.58,1.71,3.24,3.37,4.95,4.95l2.8,25.2a4,4,0,0,0,2,3,104,104,0,0,0,25.28,10.46,4,4,0,0,0,3.53-.74l19.78-15.83q3.51.13,7,0l19.79,15.83a4,4,0,0,0,2.5.88,4,4,0,0,0,1-.13A103.64,103.64,0,0,0,180.1,218a4,4,0,0,0,2-3l2.8-25.19c1.71-1.58,3.37-3.24,4.95-4.95l25.2-2.8a4,4,0,0,0,3-2,104,104,0,0,0,10.46-25.28,4,4,0,0,0-.74-3.53Zm.17,42.83-24.67,2.74a4,4,0,0,0-2.55,1.32,76.2,76.2,0,0,1-6.48,6.48,4,4,0,0,0-1.32,2.55l-2.74,24.66a95.45,95.45,0,0,1-19.64,8.15l-19.38-15.51a4,4,0,0,0-2.5-.87h-.24a73.67,73.67,0,0,1-9.16,0,4,4,0,0,0-2.74.87l-19.37,15.5a95.33,95.33,0,0,1-19.65-8.13l-2.74-24.67a4,4,0,0,0-1.32-2.55,76.2,76.2,0,0,1-6.48-6.48,4,4,0,0,0-2.55-1.32l-24.66-2.74a95.45,95.45,0,0,1-8.15-19.64l15.51-19.38a4,4,0,0,0,.87-2.74,77.76,77.76,0,0,1,0-9.16,4,4,0,0,0-.87-2.74l-15.5-19.37A95.33,95.33,0,0,1,43.9,81.66l24.67-2.74a4,4,0,0,0,2.55-1.32,76.2,76.2,0,0,1,6.48-6.48,4,4,0,0,0,1.32-2.55l2.74-24.66a95.45,95.45,0,0,1,19.64-8.15l19.38,15.51a4,4,0,0,0,2.74.87,73.67,73.67,0,0,1,9.16,0,4,4,0,0,0,2.74-.87l19.37-15.5a95.33,95.33,0,0,1,19.65,8.13l2.74,24.67a4,4,0,0,0,1.32,2.55,76.2,76.2,0,0,1,6.48,6.48,4,4,0,0,0,2.55,1.32l24.66,2.74a95.45,95.45,0,0,1,8.15,19.64l-15.51,19.38a4,4,0,0,0-.87,2.74,77.76,77.76,0,0,1,0,9.16,4,4,0,0,0,.87,2.74l15.5,19.37A95.33,95.33,0,0,1,212.1,174.34Z"}))]]),D0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236,64a36,36,0,1,0-48,33.94V112a4,4,0,0,1-4,4H96a27.8,27.8,0,0,0-4,.29V97.94a36,36,0,1,0-24,0v60.12a36,36,0,1,0,24,0V144a4,4,0,0,1,4-4h88a28,28,0,0,0,28-28V97.94A36.07,36.07,0,0,0,236,64ZM80,52A12,12,0,1,1,68,64,12,12,0,0,1,80,52Zm0,152a12,12,0,1,1,12-12A12,12,0,0,1,80,204ZM200,76a12,12,0,1,1,12-12A12,12,0,0,1,200,76Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,64a24,24,0,1,1-24-24A24,24,0,0,1,224,64Z",opacity:"0.2"}),a.createElement("path",{d:"M232,64a32,32,0,1,0-40,31v17a8,8,0,0,1-8,8H96a23.84,23.84,0,0,0-8,1.38V95a32,32,0,1,0-16,0v66a32,32,0,1,0,16,0V144a8,8,0,0,1,8-8h88a24,24,0,0,0,24-24V95A32.06,32.06,0,0,0,232,64ZM64,64A16,16,0,1,1,80,80,16,16,0,0,1,64,64ZM96,192a16,16,0,1,1-16-16A16,16,0,0,1,96,192ZM200,80a16,16,0,1,1,16-16A16,16,0,0,1,200,80Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,64a32,32,0,1,0-40,31v17a8,8,0,0,1-8,8H96a23.84,23.84,0,0,0-8,1.38V95a32,32,0,1,0-16,0v66a32,32,0,1,0,16,0V144a8,8,0,0,1,8-8h88a24,24,0,0,0,24-24V95A32.06,32.06,0,0,0,232,64ZM64,64A16,16,0,1,1,80,80,16,16,0,0,1,64,64ZM96,192a16,16,0,1,1-16-16A16,16,0,0,1,96,192Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M230,64a30,30,0,1,0-36,29.4V112a10,10,0,0,1-10,10H96a21.84,21.84,0,0,0-10,2.42v-31a30,30,0,1,0-12,0v69.2a30,30,0,1,0,12,0V144a10,10,0,0,1,10-10h88a22,22,0,0,0,22-22V93.4A30.05,30.05,0,0,0,230,64ZM62,64A18,18,0,1,1,80,82,18,18,0,0,1,62,64ZM98,192a18,18,0,1,1-18-18A18,18,0,0,1,98,192ZM200,82a18,18,0,1,1,18-18A18,18,0,0,1,200,82Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,64a32,32,0,1,0-40,31v17a8,8,0,0,1-8,8H96a23.84,23.84,0,0,0-8,1.38V95a32,32,0,1,0-16,0v66a32,32,0,1,0,16,0V144a8,8,0,0,1,8-8h88a24,24,0,0,0,24-24V95A32.06,32.06,0,0,0,232,64ZM64,64A16,16,0,1,1,80,80,16,16,0,0,1,64,64ZM96,192a16,16,0,1,1-16-16A16,16,0,0,1,96,192ZM200,80a16,16,0,1,1,16-16A16,16,0,0,1,200,80Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,64a28,28,0,1,0-32,27.71V112a12,12,0,0,1-12,12H96a19.91,19.91,0,0,0-12,4V91.71a28,28,0,1,0-8,0v72.58a28,28,0,1,0,8,0V144a12,12,0,0,1,12-12h88a20,20,0,0,0,20-20V91.71A28,28,0,0,0,228,64ZM60,64A20,20,0,1,1,80,84,20,20,0,0,1,60,64Zm40,128a20,20,0,1,1-20-20A20,20,0,0,1,100,192ZM200,84a20,20,0,1,1,20-20A20,20,0,0,1,200,84Z"}))]]),z0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M212.62,75.17A63.7,63.7,0,0,0,206.39,26,12,12,0,0,0,196,20a63.71,63.71,0,0,0-50,24H126A63.71,63.71,0,0,0,76,20a12,12,0,0,0-10.39,6,63.7,63.7,0,0,0-6.23,49.17A61.5,61.5,0,0,0,52,104v8a60.1,60.1,0,0,0,45.76,58.28A43.66,43.66,0,0,0,92,192v4H76a20,20,0,0,1-20-20,44.05,44.05,0,0,0-44-44,12,12,0,0,0,0,24,20,20,0,0,1,20,20,44.05,44.05,0,0,0,44,44H92v12a12,12,0,0,0,24,0V192a20,20,0,0,1,40,0v40a12,12,0,0,0,24,0V192a43.66,43.66,0,0,0-5.76-21.72A60.1,60.1,0,0,0,220,112v-8A61.5,61.5,0,0,0,212.62,75.17ZM196,112a36,36,0,0,1-36,36H112a36,36,0,0,1-36-36v-8a37.87,37.87,0,0,1,6.13-20.12,11.65,11.65,0,0,0,1.58-11.49,39.9,39.9,0,0,1-.4-27.72,39.87,39.87,0,0,1,26.41,17.8A12,12,0,0,0,119.82,68h32.35a12,12,0,0,0,10.11-5.53,39.84,39.84,0,0,1,26.41-17.8,39.9,39.9,0,0,1-.4,27.72,12,12,0,0,0,1.61,11.53A37.85,37.85,0,0,1,196,104Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,104v8a48,48,0,0,1-48,48H136a32,32,0,0,1,32,32v40H104V192a32,32,0,0,1,32-32H112a48,48,0,0,1-48-48v-8a49.28,49.28,0,0,1,8.51-27.3A51.92,51.92,0,0,1,76,32a52,52,0,0,1,43.83,24h32.34A52,52,0,0,1,196,32a51.92,51.92,0,0,1,3.49,44.7A49.28,49.28,0,0,1,208,104Z",opacity:"0.2"}),a.createElement("path",{d:"M208.3,75.68A59.74,59.74,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58,58,0,0,0,208.3,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.76,41.76,0,0,1,200,104Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,104v8a56.06,56.06,0,0,1-48.44,55.47A39.8,39.8,0,0,1,176,192v40a8,8,0,0,1-8,8H104a8,8,0,0,1-8-8V216H72a40,40,0,0,1-40-40A24,24,0,0,0,8,152a8,8,0,0,1,0-16,40,40,0,0,1,40,40,24,24,0,0,0,24,24H96v-8a39.8,39.8,0,0,1,8.44-24.53A56.06,56.06,0,0,1,56,112v-8a58.14,58.14,0,0,1,7.69-28.32A59.78,59.78,0,0,1,69.07,28,8,8,0,0,1,76,24a59.75,59.75,0,0,1,48,24h24a59.75,59.75,0,0,1,48-24,8,8,0,0,1,6.93,4,59.74,59.74,0,0,1,5.37,47.68A58,58,0,0,1,216,104Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M206.13,75.92A57.79,57.79,0,0,0,201.2,29a6,6,0,0,0-5.2-3,57.77,57.77,0,0,0-47,24H123A57.77,57.77,0,0,0,76,26a6,6,0,0,0-5.2,3,57.79,57.79,0,0,0-4.93,46.92A55.88,55.88,0,0,0,58,104v8a54.06,54.06,0,0,0,50.45,53.87A37.85,37.85,0,0,0,98,192v10H72a26,26,0,0,1-26-26A38,38,0,0,0,8,138a6,6,0,0,0,0,12,26,26,0,0,1,26,26,38,38,0,0,0,38,38H98v18a6,6,0,0,0,12,0V192a26,26,0,0,1,52,0v40a6,6,0,0,0,12,0V192a37.85,37.85,0,0,0-10.45-26.13A54.06,54.06,0,0,0,214,112v-8A55.88,55.88,0,0,0,206.13,75.92ZM202,112a42,42,0,0,1-42,42H112a42,42,0,0,1-42-42v-8a43.86,43.86,0,0,1,7.3-23.69,6,6,0,0,0,.81-5.76,45.85,45.85,0,0,1,1.43-36.42,45.85,45.85,0,0,1,35.23,21.1A6,6,0,0,0,119.83,62h32.34a6,6,0,0,0,5.06-2.76,45.83,45.83,0,0,1,35.23-21.11,45.85,45.85,0,0,1,1.43,36.42,6,6,0,0,0,.79,5.74A43.78,43.78,0,0,1,202,104Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208.31,75.68A59.78,59.78,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58.14,58.14,0,0,0,208.31,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.72,41.72,0,0,1,200,104Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M203.94,76.16A55.73,55.73,0,0,0,199.46,30,4,4,0,0,0,196,28a55.78,55.78,0,0,0-46,24H122A55.78,55.78,0,0,0,76,28a4,4,0,0,0-3.46,2,55.73,55.73,0,0,0-4.48,46.16A53.78,53.78,0,0,0,60,104v8a52.06,52.06,0,0,0,52,52h1.41A36,36,0,0,0,100,192v12H72a28,28,0,0,1-28-28A36,36,0,0,0,8,140a4,4,0,0,0,0,8,28,28,0,0,1,28,28,36,36,0,0,0,36,36h28v20a4,4,0,0,0,8,0V192a28,28,0,0,1,56,0v40a4,4,0,0,0,8,0V192a36,36,0,0,0-13.41-28H160a52.06,52.06,0,0,0,52-52v-8A53.78,53.78,0,0,0,203.94,76.16ZM204,112a44.05,44.05,0,0,1-44,44H112a44.05,44.05,0,0,1-44-44v-8a45.76,45.76,0,0,1,7.71-24.89,4,4,0,0,0,.53-3.84,47.82,47.82,0,0,1,2.1-39.21,47.8,47.8,0,0,1,38.12,22.1A4,4,0,0,0,119.83,60h32.34a4,4,0,0,0,3.37-1.84,47.8,47.8,0,0,1,38.12-22.1,47.82,47.82,0,0,1,2.1,39.21,4,4,0,0,0,.53,3.83A45.85,45.85,0,0,1,204,104Z"}))]]),T0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,152a35.77,35.77,0,0,0-16.46,4l-21.39-16.64A35.49,35.49,0,0,0,164,128.65l10.35-3.44A36,36,0,1,0,164,100c0,1.11.06,2.21.16,3.3l-7.78,2.59A36,36,0,0,0,128,92c-1,0-1.88,0-2.81.12l-4.45-10A36,36,0,1,0,96,92c1,0,1.88,0,2.81-.12l4.45,10a35.91,35.91,0,0,0-8.59,39.7L73.39,160.49a36,36,0,1,0,15.94,17.93l21.28-18.91a35.91,35.91,0,0,0,36.8-1.21L167,173.56A36,36,0,1,0,200,152Zm0-64a12,12,0,1,1-12,12A12,12,0,0,1,200,88ZM84,56A12,12,0,1,1,96,68,12,12,0,0,1,84,56ZM56,204a12,12,0,1,1,12-12A12,12,0,0,1,56,204Zm60-76a12,12,0,1,1,12,12A12,12,0,0,1,116,128Zm84,72a12,12,0,1,1,12-12A12,12,0,0,1,200,200Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M152,128a24,24,0,1,1-24-24A24,24,0,0,1,152,128Z",opacity:"0.2"}),a.createElement("path",{d:"M200,152a31.84,31.84,0,0,0-19.53,6.68l-23.11-18A31.65,31.65,0,0,0,160,128c0-.74,0-1.48-.08-2.21l13.23-4.41A32,32,0,1,0,168,104c0,.74,0,1.48.08,2.21l-13.23,4.41A32,32,0,0,0,128,96a32.59,32.59,0,0,0-5.27.44L115.89,81A32,32,0,1,0,96,88a32.59,32.59,0,0,0,5.27-.44l6.84,15.4a31.92,31.92,0,0,0-8.57,39.64L73.83,165.44a32.06,32.06,0,1,0,10.63,12l25.71-22.84a31.91,31.91,0,0,0,37.36-1.24l23.11,18A31.65,31.65,0,0,0,168,184a32,32,0,1,0,32-32Zm0-64a16,16,0,1,1-16,16A16,16,0,0,1,200,88ZM80,56A16,16,0,1,1,96,72,16,16,0,0,1,80,56ZM56,208a16,16,0,1,1,16-16A16,16,0,0,1,56,208Zm56-80a16,16,0,1,1,16,16A16,16,0,0,1,112,128Zm88,72a16,16,0,1,1,16-16A16,16,0,0,1,200,200Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,152a31.84,31.84,0,0,0-19.53,6.68l-23.11-18A31.65,31.65,0,0,0,160,128c0-.74,0-1.48-.08-2.21l13.23-4.41A32,32,0,1,0,168,104c0,.74,0,1.48.08,2.21l-13.23,4.41A32,32,0,0,0,128,96a32.59,32.59,0,0,0-5.27.44L115.89,81A32,32,0,1,0,96,88a32.59,32.59,0,0,0,5.27-.44l6.84,15.4a31.92,31.92,0,0,0-8.57,39.64L73.83,165.44a32.06,32.06,0,1,0,10.63,12l25.71-22.84a31.91,31.91,0,0,0,37.36-1.24l23.11,18A31.65,31.65,0,0,0,168,184a32,32,0,1,0,32-32Zm0-64a16,16,0,1,1-16,16A16,16,0,0,1,200,88ZM80,56A16,16,0,1,1,96,72,16,16,0,0,1,80,56ZM56,208a16,16,0,1,1,16-16A16,16,0,0,1,56,208Zm144-8a16,16,0,1,1,16-16A16,16,0,0,1,200,200Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,154a29.87,29.87,0,0,0-19.5,7.23L154.88,141.3A29.83,29.83,0,0,0,158,128a30.52,30.52,0,0,0-.22-3.6L174,119a30,30,0,1,0-4-15,30.52,30.52,0,0,0,.22,3.6L154,113a29.91,29.91,0,0,0-32.42-14.31l-8.14-18.3a30,30,0,1,0-11,4.88l8.14,18.3A29.92,29.92,0,0,0,102.06,143L74,168a30.08,30.08,0,1,0,8,9L110,152a29.91,29.91,0,0,0,37.47-1.23l25.62,19.93A30,30,0,1,0,200,154Zm0-68a18,18,0,1,1-18,18A18,18,0,0,1,200,86ZM78,56A18,18,0,1,1,96,74,18,18,0,0,1,78,56ZM56,210a18,18,0,1,1,18-18A18,18,0,0,1,56,210Zm72-64a18,18,0,1,1,18-18A18,18,0,0,1,128,146Zm72,56a18,18,0,1,1,18-18A18,18,0,0,1,200,202Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,152a31.84,31.84,0,0,0-19.53,6.68l-23.11-18A31.65,31.65,0,0,0,160,128c0-.74,0-1.48-.08-2.21l13.23-4.41A32,32,0,1,0,168,104c0,.74,0,1.48.08,2.21l-13.23,4.41A32,32,0,0,0,128,96a32.59,32.59,0,0,0-5.27.44L115.89,81A32,32,0,1,0,96,88a32.59,32.59,0,0,0,5.27-.44l6.84,15.4a31.92,31.92,0,0,0-8.57,39.64L73.83,165.44a32.06,32.06,0,1,0,10.63,12l25.71-22.84a31.91,31.91,0,0,0,37.36-1.24l23.11,18A31.65,31.65,0,0,0,168,184a32,32,0,1,0,32-32Zm0-64a16,16,0,1,1-16,16A16,16,0,0,1,200,88ZM80,56A16,16,0,1,1,96,72,16,16,0,0,1,80,56ZM56,208a16,16,0,1,1,16-16A16,16,0,0,1,56,208Zm56-80a16,16,0,1,1,16,16A16,16,0,0,1,112,128Zm88,72a16,16,0,1,1,16-16A16,16,0,0,1,200,200Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,156a27.87,27.87,0,0,0-19.4,7.84l-28.28-22A27.78,27.78,0,0,0,156,128a28.09,28.09,0,0,0-.45-5L175,116.55a28.07,28.07,0,1,0-2.53-7.58L153,115.45A28,28,0,0,0,128,100a27.68,27.68,0,0,0-7.6,1.06l-9.5-21.37A28,28,0,1,0,96,84a27.68,27.68,0,0,0,7.6-1.06l9.5,21.37a27.95,27.95,0,0,0-8.46,39.1L74,170.61a28,28,0,1,0,5.32,6l30.6-27.2a27.92,27.92,0,0,0,37.44-1.23l28.28,22A28,28,0,1,0,200,156Zm0-72a20,20,0,1,1-20,20A20,20,0,0,1,200,84ZM76,56A20,20,0,1,1,96,76,20,20,0,0,1,76,56ZM56,212a20,20,0,1,1,20-20A20,20,0,0,1,56,212Zm72-64a20,20,0,1,1,20-20A20,20,0,0,1,128,148Zm72,56a20,20,0,1,1,20-20A20,20,0,0,1,200,204Z"}))]]),W0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,60H32A20,20,0,0,0,12,80v96a20,20,0,0,0,20,20H224a20,20,0,0,0,20-20V80A20,20,0,0,0,224,60Zm-4,112H36V84H220Zm-56-44a16,16,0,1,1,16,16A16,16,0,0,1,164,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,80v96a8,8,0,0,1-8,8H32a8,8,0,0,1-8-8V80a8,8,0,0,1,8-8H224A8,8,0,0,1,232,80Z",opacity:"0.2"}),a.createElement("path",{d:"M224,64H32A16,16,0,0,0,16,80v96a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V80A16,16,0,0,0,224,64Zm0,112H32V80H224v96Zm-24-48a12,12,0,1,1-12-12A12,12,0,0,1,200,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,64H32A16,16,0,0,0,16,80v96a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V80A16,16,0,0,0,224,64Zm-36,76a12,12,0,1,1,12-12A12,12,0,0,1,188,140Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,66H32A14,14,0,0,0,18,80v96a14,14,0,0,0,14,14H224a14,14,0,0,0,14-14V80A14,14,0,0,0,224,66Zm2,110a2,2,0,0,1-2,2H32a2,2,0,0,1-2-2V80a2,2,0,0,1,2-2H224a2,2,0,0,1,2,2Zm-28-48a10,10,0,1,1-10-10A10,10,0,0,1,198,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,64H32A16,16,0,0,0,16,80v96a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V80A16,16,0,0,0,224,64Zm0,112H32V80H224v96Zm-24-48a12,12,0,1,1-12-12A12,12,0,0,1,200,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,68H32A12,12,0,0,0,20,80v96a12,12,0,0,0,12,12H224a12,12,0,0,0,12-12V80A12,12,0,0,0,224,68Zm4,108a4,4,0,0,1-4,4H32a4,4,0,0,1-4-4V80a4,4,0,0,1,4-4H224a4,4,0,0,1,4,4Zm-32-48a8,8,0,1,1-8-8A8,8,0,0,1,196,128Z"}))]]),j0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M71.76,148H31.7a12,12,0,1,1,0-24H65.33l12.45-18.66a12,12,0,0,1,20,0l22,33,6-9a12,12,0,0,1,10-5.34h24a12,12,0,1,1,0,24h-17.6l-12.46,18.66a12,12,0,0,1-20,0l-22-33-6,9A12,12,0,0,1,71.76,148ZM177.91,36c-20.12,0-38,7.93-50.07,21.56C115.74,43.93,97.89,36,77.76,36A66,66,0,0,0,12.07,94.68,12,12,0,0,0,36,97.32,42,42,0,0,1,77.76,60c17.83,0,32.75,9.4,38.95,24.54a12,12,0,0,0,22.25,0C145.16,69.4,160.08,60,177.91,60A42.08,42.08,0,0,1,220,102c0,29.42-25.86,57.77-47.56,76.36a329,329,0,0,1-44.58,31.81c-10.87-6.45-35.37-22-56.51-42.73a12,12,0,1,0-16.84,17.12c30.39,29.81,66.15,49.2,67.66,50a12.06,12.06,0,0,0,11.39,0C138,232.14,244,174.34,244,102A66.12,66.12,0,0,0,177.91,36Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,102c0,66-104,122-104,122S24,168,24,102A54,54,0,0,1,78,48c22.59,0,41.94,12.31,50,32,8.06-19.69,27.41-32,50-32A54,54,0,0,1,232,102Z",opacity:"0.2"}),a.createElement("path",{d:"M72,144H32a8,8,0,0,1,0-16H67.72l13.62-20.44a8,8,0,0,1,13.32,0l25.34,38,9.34-14A8,8,0,0,1,136,128h24a8,8,0,0,1,0,16H140.28l-13.62,20.44a8,8,0,0,1-13.32,0L88,126.42l-9.34,14A8,8,0,0,1,72,144ZM178,40c-20.65,0-38.73,8.88-50,23.89C116.73,48.88,98.65,40,78,40a62.07,62.07,0,0,0-62,62c0,.75,0,1.5,0,2.25a8,8,0,1,0,16-.5c0-.58,0-1.17,0-1.75A46.06,46.06,0,0,1,78,56c19.45,0,35.78,10.36,42.6,27a8,8,0,0,0,14.8,0c6.82-16.67,23.15-27,42.6-27a46.06,46.06,0,0,1,46,46c0,53.61-77.76,102.15-96,112.8-10.83-6.31-42.63-26-66.68-52.21a8,8,0,1,0-11.8,10.82c31.17,34,72.93,56.68,74.69,57.63a8,8,0,0,0,7.58,0C136.21,228.66,240,172,240,102A62.07,62.07,0,0,0,178,40Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,102c0,70-103.79,126.66-108.21,129a8,8,0,0,1-7.58,0c-3.35-1.8-63.55-34.69-92.68-80.89A4,4,0,0,1,34.92,144H72a8,8,0,0,0,6.66-3.56l9.34-14,25.34,38a8,8,0,0,0,9.16,3.16,8.23,8.23,0,0,0,4.28-3.34L140.28,144H160a8,8,0,0,0,8-8.53,8.18,8.18,0,0,0-8.25-7.47H136a8,8,0,0,0-6.66,3.56l-9.34,14-25.34-38a8,8,0,0,0-9.17-3.16,8.25,8.25,0,0,0-4.27,3.34L67.72,128H23.53a4,4,0,0,1-3.83-2.81A76.93,76.93,0,0,1,16,102,62.07,62.07,0,0,1,78,40c20.65,0,38.73,8.88,50,23.89C139.27,48.88,157.35,40,178,40A62.07,62.07,0,0,1,240,102Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M72,142H32a6,6,0,0,1,0-12H68.79L83,108.67a6,6,0,0,1,10,0l27,40.51,11-16.51a6,6,0,0,1,5-2.67h24a6,6,0,0,1,0,12H139.21L125,163.33a6,6,0,0,1-10,0L88,122.82,77,139.33A6,6,0,0,1,72,142ZM178,42c-21,0-39.26,9.47-50,25.34C117.26,51.47,99,42,78,42a60.07,60.07,0,0,0-60,60q0,1.09,0,2.19a6,6,0,0,0,12-.38c0-.6,0-1.21,0-1.81A48.05,48.05,0,0,1,78,54c20.28,0,37.31,10.83,44.45,28.27a6,6,0,0,0,11.1,0C140.69,64.83,157.72,54,178,54a48.05,48.05,0,0,1,48,48c0,55.73-81.61,105.65-98,115.11-9.84-5.66-43.09-25.82-68.16-53.16a6,6,0,1,0-8.84,8.1c30.94,33.77,72.41,56.29,74.16,57.23a6,6,0,0,0,5.68,0,334.68,334.68,0,0,0,53.06-37C219.8,161.59,238,131.2,238,102A60.07,60.07,0,0,0,178,42Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M72,144H32a8,8,0,0,1,0-16H67.72l13.62-20.44a8,8,0,0,1,13.32,0l25.34,38,9.34-14A8,8,0,0,1,136,128h24a8,8,0,0,1,0,16H140.28l-13.62,20.44a8,8,0,0,1-13.32,0L88,126.42l-9.34,14A8,8,0,0,1,72,144ZM178,40c-20.65,0-38.73,8.88-50,23.89C116.73,48.88,98.65,40,78,40a62.07,62.07,0,0,0-62,62c0,.75,0,1.5,0,2.25a8,8,0,1,0,16-.5c0-.58,0-1.17,0-1.75A46.06,46.06,0,0,1,78,56c19.45,0,35.78,10.36,42.6,27a8,8,0,0,0,14.8,0c6.82-16.67,23.15-27,42.6-27a46.06,46.06,0,0,1,46,46c0,53.61-77.76,102.15-96,112.8-10.83-6.31-42.63-26-66.68-52.21a8,8,0,1,0-11.8,10.82c31.17,34,72.93,56.68,74.69,57.63a8,8,0,0,0,7.58,0C136.21,228.66,240,172,240,102A62.07,62.07,0,0,0,178,40Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M72,140H32a4,4,0,0,1,0-8H69.86l14.81-22.22a4,4,0,0,1,6.66,0l28.67,43,12.67-19A4,4,0,0,1,136,132h24a4,4,0,0,1,0,8H138.14l-14.81,22.22a4,4,0,0,1-6.66,0L88,119.21l-12.67,19A4,4,0,0,1,72,140ZM178,44c-21.44,0-39.92,10.19-50,27.07C117.92,54.19,99.44,44,78,44a58.07,58.07,0,0,0-58,58q0,1.06,0,2.13a4,4,0,1,0,8-.26c0-.62,0-1.24,0-1.87A50.06,50.06,0,0,1,78,52c21.11,0,38.85,11.31,46.3,29.51a4,4,0,0,0,7.4,0C139.15,63.31,156.89,52,178,52a50.06,50.06,0,0,1,50,50c0,58-86,109.46-100,117.42-8.47-4.82-43.5-25.61-69.63-54.12a4,4,0,0,0-5.9,5.4c30.72,33.52,71.9,55.89,73.63,56.82a4,4,0,0,0,3.8,0,333.81,333.81,0,0,0,52.7-36.73C218,160.47,236,130.59,236,102A58.07,58.07,0,0,0,178,44Z"}))]]),O0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M108,84a16,16,0,1,1,16,16A16,16,0,0,1,108,84Zm128,44A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-24,0a84,84,0,1,0-84,84A84.09,84.09,0,0,0,212,128Zm-72,36.68V132a20,20,0,0,0-20-20,12,12,0,0,0-4,23.32V168a20,20,0,0,0,20,20,12,12,0,0,0,4-23.32Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),a.createElement("path",{d:"M144,176a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176Zm88-48A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128ZM124,96a12,12,0,1,0-12-12A12,12,0,0,0,124,96Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-4,48a12,12,0,1,1-12,12A12,12,0,0,1,124,72Zm12,112a16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40a8,8,0,0,1,0,16Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M142,176a6,6,0,0,1-6,6,14,14,0,0,1-14-14V128a2,2,0,0,0-2-2,6,6,0,0,1,0-12,14,14,0,0,1,14,14v40a2,2,0,0,0,2,2A6,6,0,0,1,142,176ZM124,94a10,10,0,1,0-10-10A10,10,0,0,0,124,94Zm106,34A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M140,176a4,4,0,0,1-4,4,12,12,0,0,1-12-12V128a4,4,0,0,0-4-4,4,4,0,0,1,0-8,12,12,0,0,1,12,12v40a4,4,0,0,0,4,4A4,4,0,0,1,140,176ZM124,92a8,8,0,1,0-8-8A8,8,0,0,0,124,92Zm104,36A100,100,0,1,1,128,28,100.11,100.11,0,0,1,228,128Zm-8,0a92,92,0,1,0-92,92A92.1,92.1,0,0,0,220,128Z"}))]]),U0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M180,232a12,12,0,0,1-12,12H88a12,12,0,0,1,0-24h80A12,12,0,0,1,180,232Zm40-128a91.51,91.51,0,0,1-35.17,72.35A12.26,12.26,0,0,0,180,186v2a20,20,0,0,1-20,20H96a20,20,0,0,1-20-20v-2a12,12,0,0,0-4.7-9.51A91.57,91.57,0,0,1,36,104.52C35.73,54.69,76,13.2,125.79,12A92,92,0,0,1,220,104Zm-24,0a68,68,0,0,0-69.65-68C89.56,36.88,59.8,67.55,60,104.38a67.71,67.71,0,0,0,26.1,53.19A35.87,35.87,0,0,1,100,184h56.1A36.13,36.13,0,0,1,170,157.49,67.68,67.68,0,0,0,196,104Zm-20.07-5.32a48.5,48.5,0,0,0-31.91-40,12,12,0,0,0-8,22.62,24.31,24.31,0,0,1,16.09,20,12,12,0,0,0,23.86-2.64Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,104a79.86,79.86,0,0,1-30.59,62.92A24.29,24.29,0,0,0,168,186v6a8,8,0,0,1-8,8H96a8,8,0,0,1-8-8v-6a24.11,24.11,0,0,0-9.3-19A79.87,79.87,0,0,1,48,104.45C47.76,61.09,82.72,25,126.07,24A80,80,0,0,1,208,104Z",opacity:"0.2"}),a.createElement("path",{d:"M176,232a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,232Zm40-128a87.55,87.55,0,0,1-33.64,69.21A16.24,16.24,0,0,0,176,186v6a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16v-6a16,16,0,0,0-6.23-12.66A87.59,87.59,0,0,1,40,104.49C39.74,56.83,78.26,17.14,125.88,16A88,88,0,0,1,216,104Zm-16,0a72,72,0,0,0-73.74-72c-39,.92-70.47,33.39-70.26,72.39a71.65,71.65,0,0,0,27.64,56.3A32,32,0,0,1,96,186v6h64v-6a32.15,32.15,0,0,1,12.47-25.35A71.65,71.65,0,0,0,200,104Zm-16.11-9.34a57.6,57.6,0,0,0-46.56-46.55,8,8,0,0,0-2.66,15.78c16.57,2.79,30.63,16.85,33.44,33.45A8,8,0,0,0,176,104a9,9,0,0,0,1.35-.11A8,8,0,0,0,183.89,94.66Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176,232a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,232Zm40-128a87.55,87.55,0,0,1-33.64,69.21A16.24,16.24,0,0,0,176,186v6a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16v-6a16,16,0,0,0-6.23-12.66A87.59,87.59,0,0,1,40,104.49C39.74,56.83,78.26,17.14,125.88,16A88,88,0,0,1,216,104Zm-32.11-9.34a57.6,57.6,0,0,0-46.56-46.55,8,8,0,0,0-2.66,15.78c16.57,2.79,30.63,16.85,33.44,33.45A8,8,0,0,0,176,104a9,9,0,0,0,1.35-.11A8,8,0,0,0,183.89,94.66Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M174,232a6,6,0,0,1-6,6H88a6,6,0,0,1,0-12h80A6,6,0,0,1,174,232Zm40-128a85.56,85.56,0,0,1-32.88,67.64A18.23,18.23,0,0,0,174,186v6a14,14,0,0,1-14,14H96a14,14,0,0,1-14-14v-6a18,18,0,0,0-7-14.23h0a85.59,85.59,0,0,1-33-67.24C41.74,57.91,79.39,19.12,125.93,18A86,86,0,0,1,214,104Zm-12,0a74,74,0,0,0-75.79-74C86.17,31,53.78,64.34,54,104.42a73.67,73.67,0,0,0,28.4,57.87A29.92,29.92,0,0,1,94,186v6a2,2,0,0,0,2,2h64a2,2,0,0,0,2-2v-6a30.18,30.18,0,0,1,11.7-23.78A73.59,73.59,0,0,0,202,104Zm-20.08-9A55.58,55.58,0,0,0,137,50.08a6,6,0,1,0-2,11.84C152.38,64.84,167.13,79.6,170.08,97a6,6,0,0,0,5.91,5,6.87,6.87,0,0,0,1-.08A6,6,0,0,0,181.92,95Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176,232a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,232Zm40-128a87.55,87.55,0,0,1-33.64,69.21A16.24,16.24,0,0,0,176,186v6a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16v-6a16,16,0,0,0-6.23-12.66A87.59,87.59,0,0,1,40,104.49C39.74,56.83,78.26,17.14,125.88,16A88,88,0,0,1,216,104Zm-16,0a72,72,0,0,0-73.74-72c-39,.92-70.47,33.39-70.26,72.39a71.65,71.65,0,0,0,27.64,56.3A32,32,0,0,1,96,186v6h64v-6a32.15,32.15,0,0,1,12.47-25.35A71.65,71.65,0,0,0,200,104Zm-16.11-9.34a57.6,57.6,0,0,0-46.56-46.55,8,8,0,0,0-2.66,15.78c16.57,2.79,30.63,16.85,33.44,33.45A8,8,0,0,0,176,104a9,9,0,0,0,1.35-.11A8,8,0,0,0,183.89,94.66Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M172,232a4,4,0,0,1-4,4H88a4,4,0,0,1,0-8h80A4,4,0,0,1,172,232Zm40-128a83.59,83.59,0,0,1-32.11,66.06A20.2,20.2,0,0,0,172,186v6a12,12,0,0,1-12,12H96a12,12,0,0,1-12-12v-6a20,20,0,0,0-7.76-15.81A83.58,83.58,0,0,1,44,104.47C43.75,59,80.52,21.09,126,20a84,84,0,0,1,86,84Zm-8,0a76,76,0,0,0-77.83-76C85,29,51.77,63.27,52,104.43a75.62,75.62,0,0,0,29.17,59.43A28,28,0,0,1,92,186v6a4,4,0,0,0,4,4h64a4,4,0,0,0,4-4v-6a28.14,28.14,0,0,1,10.94-22.2A75.62,75.62,0,0,0,204,104ZM136.66,52.06a4,4,0,0,0-1.32,7.88C153.53,63,169,78.45,172.06,96.67A4,4,0,0,0,176,100a3.88,3.88,0,0,0,.67-.06,4,4,0,0,0,3.27-4.61A53.51,53.51,0,0,0,136.66,52.06Z"}))]]),X0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M219.71,117.38a12,12,0,0,0-7.25-8.52L161.28,88.39l10.59-70.61a12,12,0,0,0-20.64-10l-112,120a12,12,0,0,0,4.31,19.33l51.18,20.47L84.13,238.22a12,12,0,0,0,20.64,10l112-120A12,12,0,0,0,219.71,117.38ZM113.6,203.55l6.27-41.77a12,12,0,0,0-7.41-12.92L68.74,131.37,142.4,52.45l-6.27,41.77a12,12,0,0,0,7.41,12.92l43.72,17.49Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M96,240l16-80L48,136,160,16,144,96l64,24Z",opacity:"0.2"}),a.createElement("path",{d:"M215.79,118.17a8,8,0,0,0-5-5.66L153.18,90.9l14.66-73.33a8,8,0,0,0-13.69-7l-112,120a8,8,0,0,0,3,13l57.63,21.61L88.16,238.43a8,8,0,0,0,13.69,7l112-120A8,8,0,0,0,215.79,118.17ZM109.37,214l10.47-52.38a8,8,0,0,0-5-9.06L62,132.71l84.62-90.66L136.16,94.43a8,8,0,0,0,5,9.06l52.8,19.8Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M213.85,125.46l-112,120a8,8,0,0,1-13.69-7l14.66-73.33L45.19,143.49a8,8,0,0,1-3-13l112-120a8,8,0,0,1,13.69,7L153.18,90.9l57.63,21.61a8,8,0,0,1,3,12.95Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M213.84,118.63a6,6,0,0,0-3.73-4.25L150.88,92.17l15-75a6,6,0,0,0-10.27-5.27l-112,120a6,6,0,0,0,2.28,9.71l59.23,22.21-15,75a6,6,0,0,0,3.14,6.52A6.07,6.07,0,0,0,96,246a6,6,0,0,0,4.39-1.91l112-120A6,6,0,0,0,213.84,118.63ZM106,220.46l11.85-59.28a6,6,0,0,0-3.77-6.8l-55.6-20.85,91.46-98L138.12,94.82a6,6,0,0,0,3.77,6.8l55.6,20.85Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M215.79,118.17a8,8,0,0,0-5-5.66L153.18,90.9l14.66-73.33a8,8,0,0,0-13.69-7l-112,120a8,8,0,0,0,3,13l57.63,21.61L88.16,238.43a8,8,0,0,0,13.69,7l112-120A8,8,0,0,0,215.79,118.17ZM109.37,214l10.47-52.38a8,8,0,0,0-5-9.06L62,132.71l84.62-90.66L136.16,94.43a8,8,0,0,0,5,9.06l52.8,19.8Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M211.89,119.09a4,4,0,0,0-2.49-2.84l-60.81-22.8,15.33-76.67a4,4,0,0,0-6.84-3.51l-112,120a4,4,0,0,0-1,3.64,4,4,0,0,0,2.49,2.84l60.81,22.8L92.08,239.22a4,4,0,0,0,6.84,3.51l112-120A4,4,0,0,0,211.89,119.09ZM102.68,227l13.24-66.2a4,4,0,0,0-2.52-4.53L55,134.36,153.32,29l-13.24,66.2a4,4,0,0,0,2.52,4.53L201,121.64Z"}))]]),J0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M218.34,119.6,183.6,154.34a46.58,46.58,0,0,1-44.31,12.26c-.31.34-.62.67-.95,1L103.6,202.34A46.63,46.63,0,1,1,37.66,136.4L72.4,101.66A46.6,46.6,0,0,1,116.71,89.4c.31-.34.62-.67,1-1L152.4,53.66a46.63,46.63,0,0,1,65.94,65.94Z",opacity:"0.2"}),a.createElement("path",{d:"M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,7.78,8.22H152a8,8,0,0,0,8-7.78A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM115.7,192.49a43.31,43.31,0,0,1-55-66.43l25.37-25.37a43.35,43.35,0,0,1,61.25,0,42.9,42.9,0,0,1,9.95,15.43,8,8,0,1,1-15,5.6A27.33,27.33,0,0,0,97.37,112L72,137.37a27.32,27.32,0,0,0,34.68,41.91,8,8,0,1,1,9,13.21Zm79.61-62.55-25.37,25.37A43,43,0,0,1,139.32,168h0a43.35,43.35,0,0,1-40.53-28.12,8,8,0,1,1,15-5.6A27.35,27.35,0,0,0,139.28,152h0a27.14,27.14,0,0,0,19.32-8L184,118.63a27.32,27.32,0,0,0-34.68-41.91,8,8,0,1,1-9-13.21,43.32,43.32,0,0,1,55,66.43Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M238,88.18a52.42,52.42,0,0,1-15.4,35.66l-34.75,34.75A52.28,52.28,0,0,1,150.62,174h-.05A52.63,52.63,0,0,1,98,119.9a6,6,0,0,1,6-5.84h.17a6,6,0,0,1,5.83,6.16A40.62,40.62,0,0,0,150.58,162h0a40.4,40.4,0,0,0,28.73-11.9l34.75-34.74A40.63,40.63,0,0,0,156.63,57.9l-11,11a6,6,0,0,1-8.49-8.49l11-11a52.62,52.62,0,0,1,74.43,0A52.83,52.83,0,0,1,238,88.18Zm-127.62,98.9-11,11A40.36,40.36,0,0,1,70.6,210h0a40.63,40.63,0,0,1-28.7-69.36L76.62,105.9A40.63,40.63,0,0,1,146,135.77a6,6,0,0,0,5.83,6.16H152a6,6,0,0,0,6-5.84A52.63,52.63,0,0,0,68.14,97.42L33.38,132.16A52.63,52.63,0,0,0,70.56,222h0a52.26,52.26,0,0,0,37.22-15.42l11-11a6,6,0,1,0-8.49-8.48Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,16,.45A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236,88.12a50.44,50.44,0,0,1-14.81,34.31l-34.75,34.74A50.33,50.33,0,0,1,150.62,172h-.05A50.63,50.63,0,0,1,100,120a4,4,0,0,1,4-3.89h.11a4,4,0,0,1,3.89,4.11A42.64,42.64,0,0,0,150.58,164h0a42.32,42.32,0,0,0,30.14-12.49l34.75-34.74a42.63,42.63,0,1,0-60.29-60.28l-11,11a4,4,0,0,1-5.66-5.65l11-11A50.64,50.64,0,0,1,236,88.12ZM111.78,188.49l-11,11A42.33,42.33,0,0,1,70.6,212h0a42.63,42.63,0,0,1-30.11-72.77l34.75-34.74A42.63,42.63,0,0,1,148,135.82a4,4,0,0,0,8,.23A50.64,50.64,0,0,0,69.55,98.83L34.8,133.57A50.63,50.63,0,0,0,70.56,220h0a50.33,50.33,0,0,0,35.81-14.83l11-11a4,4,0,1,0-5.65-5.66Z"}))]]),K0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,76H180V56A52,52,0,0,0,76,56V76H48A20,20,0,0,0,28,96V208a20,20,0,0,0,20,20H208a20,20,0,0,0,20-20V96A20,20,0,0,0,208,76ZM100,56a28,28,0,0,1,56,0V76H100ZM204,204H52V100H204Zm-60-52a16,16,0,1,1-16-16A16,16,0,0,1,144,152Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,96V208a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V96a8,8,0,0,1,8-8H208A8,8,0,0,1,216,96Z",opacity:"0.2"}),a.createElement("path",{d:"M208,80H176V56a48,48,0,0,0-96,0V80H48A16,16,0,0,0,32,96V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80ZM96,56a32,32,0,0,1,64,0V80H96ZM208,208H48V96H208V208Zm-68-56a12,12,0,1,1-12-12A12,12,0,0,1,140,152Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,80H176V56a48,48,0,0,0-96,0V80H48A16,16,0,0,0,32,96V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80Zm-80,84a12,12,0,1,1,12-12A12,12,0,0,1,128,164Zm32-84H96V56a32,32,0,0,1,64,0Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,82H174V56a46,46,0,0,0-92,0V82H48A14,14,0,0,0,34,96V208a14,14,0,0,0,14,14H208a14,14,0,0,0,14-14V96A14,14,0,0,0,208,82ZM94,56a34,34,0,0,1,68,0V82H94ZM210,208a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V96a2,2,0,0,1,2-2H208a2,2,0,0,1,2,2Zm-72-56a10,10,0,1,1-10-10A10,10,0,0,1,138,152Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,80H176V56a48,48,0,0,0-96,0V80H48A16,16,0,0,0,32,96V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80ZM96,56a32,32,0,0,1,64,0V80H96ZM208,208H48V96H208V208Zm-68-56a12,12,0,1,1-12-12A12,12,0,0,1,140,152Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,84H172V56a44,44,0,0,0-88,0V84H48A12,12,0,0,0,36,96V208a12,12,0,0,0,12,12H208a12,12,0,0,0,12-12V96A12,12,0,0,0,208,84ZM92,56a36,36,0,0,1,72,0V84H92ZM212,208a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V96a4,4,0,0,1,4-4H208a4,4,0,0,1,4,4Zm-76-56a8,8,0,1,1-8-8A8,8,0,0,1,136,152Z"}))]]),P0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232.49,215.51,185,168a92.12,92.12,0,1,0-17,17l47.53,47.54a12,12,0,0,0,17-17ZM44,112a68,68,0,1,1,68,68A68.07,68.07,0,0,1,44,112Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M192,112a80,80,0,1,1-80-80A80,80,0,0,1,192,112Z",opacity:"0.2"}),a.createElement("path",{d:"M229.66,218.34,179.6,168.28a88.21,88.21,0,1,0-11.32,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M168,112a56,56,0,1,1-56-56A56,56,0,0,1,168,112Zm61.66,117.66a8,8,0,0,1-11.32,0l-50.06-50.07a88,88,0,1,1,11.32-11.31l50.06,50.06A8,8,0,0,1,229.66,229.66ZM112,184a72,72,0,1,0-72-72A72.08,72.08,0,0,0,112,184Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228.24,219.76l-51.38-51.38a86.15,86.15,0,1,0-8.48,8.48l51.38,51.38a6,6,0,0,0,8.48-8.48ZM38,112a74,74,0,1,1,74,74A74.09,74.09,0,0,1,38,112Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M226.83,221.17l-52.7-52.7a84.1,84.1,0,1,0-5.66,5.66l52.7,52.7a4,4,0,0,0,5.66-5.66ZM36,112a76,76,0,1,1,76,76A76.08,76.08,0,0,1,36,112Z"}))]]),Y0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,36H48A28,28,0,0,0,20,64V176a28,28,0,0,0,28,28H208a28,28,0,0,0,28-28V64A28,28,0,0,0,208,36Zm4,140a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V64a4,4,0,0,1,4-4H208a4,4,0,0,1,4,4Zm-40,52a12,12,0,0,1-12,12H96a12,12,0,0,1,0-24h64A12,12,0,0,1,172,228Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,64V176a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V64A16,16,0,0,1,48,48H208A16,16,0,0,1,224,64Z",opacity:"0.2"}),a.createElement("path",{d:"M208,40H48A24,24,0,0,0,24,64V176a24,24,0,0,0,24,24H208a24,24,0,0,0,24-24V64A24,24,0,0,0,208,40Zm8,136a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H208a8,8,0,0,1,8,8Zm-48,48a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,224Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,64V176a24,24,0,0,1-24,24H48a24,24,0,0,1-24-24V64A24,24,0,0,1,48,40H208A24,24,0,0,1,232,64ZM160,216H96a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,42H48A22,22,0,0,0,26,64V176a22,22,0,0,0,22,22H208a22,22,0,0,0,22-22V64A22,22,0,0,0,208,42Zm10,134a10,10,0,0,1-10,10H48a10,10,0,0,1-10-10V64A10,10,0,0,1,48,54H208a10,10,0,0,1,10,10Zm-52,48a6,6,0,0,1-6,6H96a6,6,0,0,1,0-12h64A6,6,0,0,1,166,224Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,40H48A24,24,0,0,0,24,64V176a24,24,0,0,0,24,24H208a24,24,0,0,0,24-24V64A24,24,0,0,0,208,40Zm8,136a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H208a8,8,0,0,1,8,8Zm-48,48a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,224Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,44H48A20,20,0,0,0,28,64V176a20,20,0,0,0,20,20H208a20,20,0,0,0,20-20V64A20,20,0,0,0,208,44Zm12,132a12,12,0,0,1-12,12H48a12,12,0,0,1-12-12V64A12,12,0,0,1,48,52H208a12,12,0,0,1,12,12Zm-56,48a4,4,0,0,1-4,4H96a4,4,0,0,1,0-8h64A4,4,0,0,1,164,224Z"}))]]),_0=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236.37,139.4a12,12,0,0,0-12-3A84.07,84.07,0,0,1,119.6,31.59a12,12,0,0,0-15-15A108.86,108.86,0,0,0,49.69,55.07,108,108,0,0,0,136,228a107.09,107.09,0,0,0,64.93-21.69,108.86,108.86,0,0,0,38.44-54.94A12,12,0,0,0,236.37,139.4Zm-49.88,47.74A84,84,0,0,1,68.86,69.51,84.93,84.93,0,0,1,92.27,48.29Q92,52.13,92,56A108.12,108.12,0,0,0,200,164q3.87,0,7.71-.27A84.79,84.79,0,0,1,186.49,187.14Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M227.89,147.89A96,96,0,1,1,108.11,28.11,96.09,96.09,0,0,0,227.89,147.89Z",opacity:"0.2"}),a.createElement("path",{d:"M233.54,142.23a8,8,0,0,0-8-2,88.08,88.08,0,0,1-109.8-109.8,8,8,0,0,0-10-10,104.84,104.84,0,0,0-52.91,37A104,104,0,0,0,136,224a103.09,103.09,0,0,0,62.52-20.88,104.84,104.84,0,0,0,37-52.91A8,8,0,0,0,233.54,142.23ZM188.9,190.34A88,88,0,0,1,65.66,67.11a89,89,0,0,1,31.4-26A106,106,0,0,0,96,56,104.11,104.11,0,0,0,200,160a106,106,0,0,0,14.92-1.06A89,89,0,0,1,188.9,190.34Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M235.54,150.21a104.84,104.84,0,0,1-37,52.91A104,104,0,0,1,32,120,103.09,103.09,0,0,1,52.88,57.48a104.84,104.84,0,0,1,52.91-37,8,8,0,0,1,10,10,88.08,88.08,0,0,0,109.8,109.8,8,8,0,0,1,10,10Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232.13,143.64a6,6,0,0,0-6-1.49A90.07,90.07,0,0,1,113.86,29.85a6,6,0,0,0-7.49-7.48A102.88,102.88,0,0,0,54.48,58.68,102,102,0,0,0,197.32,201.52a102.88,102.88,0,0,0,36.31-51.89A6,6,0,0,0,232.13,143.64Zm-42,48.29a90,90,0,0,1-126-126A90.9,90.9,0,0,1,99.65,37.66,102.06,102.06,0,0,0,218.34,156.35,90.9,90.9,0,0,1,190.1,191.93Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M233.54,142.23a8,8,0,0,0-8-2,88.08,88.08,0,0,1-109.8-109.8,8,8,0,0,0-10-10,104.84,104.84,0,0,0-52.91,37A104,104,0,0,0,136,224a103.09,103.09,0,0,0,62.52-20.88,104.84,104.84,0,0,0,37-52.91A8,8,0,0,0,233.54,142.23ZM188.9,190.34A88,88,0,0,1,65.66,67.11a89,89,0,0,1,31.4-26A106,106,0,0,0,96,56,104.11,104.11,0,0,0,200,160a106,106,0,0,0,14.92-1.06A89,89,0,0,1,188.9,190.34Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M230.72,145.06a4,4,0,0,0-4-1A92.08,92.08,0,0,1,111.94,29.27a4,4,0,0,0-5-5A100.78,100.78,0,0,0,56.08,59.88a100,100,0,0,0,140,140,100.78,100.78,0,0,0,35.59-50.87A4,4,0,0,0,230.72,145.06ZM191.3,193.53A92,92,0,0,1,62.47,64.7a93,93,0,0,1,39.88-30.35,100.09,100.09,0,0,0,119.3,119.3A93,93,0,0,1,191.3,193.53Z"}))]]),a1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M144,180a16,16,0,1,1-16-16A16,16,0,0,1,144,180Zm92-52A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-24,0a84,84,0,1,0-84,84A84.09,84.09,0,0,0,212,128ZM128,64c-24.26,0-44,17.94-44,40v4a12,12,0,0,0,24,0v-4c0-8.82,9-16,20-16s20,7.18,20,16-9,16-20,16a12,12,0,0,0-12,12v8a12,12,0,0,0,23.73,2.56C158.31,137.88,172,122.37,172,104,172,81.94,152.26,64,128,64Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),a.createElement("path",{d:"M140,180a12,12,0,1,1-12-12A12,12,0,0,1,140,180ZM128,72c-22.06,0-40,16.15-40,36v4a8,8,0,0,0,16,0v-4c0-11,10.77-20,24-20s24,9,24,20-10.77,20-24,20a8,8,0,0,0-8,8v8a8,8,0,0,0,16,0v-.72c18.24-3.35,32-17.9,32-35.28C168,88.15,150.06,72,128,72Zm104,56A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,168a12,12,0,1,1,12-12A12,12,0,0,1,128,192Zm8-48.72V144a8,8,0,0,1-16,0v-8a8,8,0,0,1,8-8c13.23,0,24-9,24-20s-10.77-20-24-20-24,9-24,20v4a8,8,0,0,1-16,0v-4c0-19.85,17.94-36,40-36s40,16.15,40,36C168,125.38,154.24,139.93,136,143.28Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M138,180a10,10,0,1,1-10-10A10,10,0,0,1,138,180ZM128,74c-21,0-38,15.25-38,34v4a6,6,0,0,0,12,0v-4c0-12.13,11.66-22,26-22s26,9.87,26,22-11.66,22-26,22a6,6,0,0,0-6,6v8a6,6,0,0,0,12,0v-2.42c18.11-2.58,32-16.66,32-33.58C166,89.25,149,74,128,74Zm102,54A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M140,180a12,12,0,1,1-12-12A12,12,0,0,1,140,180ZM128,72c-22.06,0-40,16.15-40,36v4a8,8,0,0,0,16,0v-4c0-11,10.77-20,24-20s24,9,24,20-10.77,20-24,20a8,8,0,0,0-8,8v8a8,8,0,0,0,16,0v-.72c18.24-3.35,32-17.9,32-35.28C168,88.15,150.06,72,128,72Zm104,56A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M136,180a8,8,0,1,1-8-8A8,8,0,0,1,136,180ZM128,76c-19.85,0-36,14.36-36,32v4a4,4,0,0,0,8,0v-4c0-13.23,12.56-24,28-24s28,10.77,28,24-12.56,24-28,24a4,4,0,0,0-4,4v8a4,4,0,0,0,8,0v-4.2c18-1.77,32-15.36,32-31.8C164,90.36,147.85,76,128,76Zm100,52A100,100,0,1,1,128,28,100.11,100.11,0,0,1,228,128Zm-8,0a92,92,0,1,0-92,92A92.1,92.1,0,0,0,220,128Z"}))]]),e1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176,156a43.78,43.78,0,0,0-29.09,11L106.1,140.8a44.07,44.07,0,0,0,0-25.6L146.91,89a43.83,43.83,0,1,0-13-20.17L93.09,95a44,44,0,1,0,0,65.94L133.9,187.2A44,44,0,1,0,176,156Zm0-120a20,20,0,1,1-20,20A20,20,0,0,1,176,36ZM64,148a20,20,0,1,1,20-20A20,20,0,0,1,64,148Zm112,72a20,20,0,1,1,20-20A20,20,0,0,1,176,220Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,200a32,32,0,1,1-32-32A32,32,0,0,1,208,200ZM176,88a32,32,0,1,0-32-32A32,32,0,0,0,176,88Z",opacity:"0.2"}),a.createElement("path",{d:"M176,160a39.89,39.89,0,0,0-28.62,12.09l-46.1-29.63a39.8,39.8,0,0,0,0-28.92l46.1-29.63a40,40,0,1,0-8.66-13.45l-46.1,29.63a40,40,0,1,0,0,55.82l46.1,29.63A40,40,0,1,0,176,160Zm0-128a24,24,0,1,1-24,24A24,24,0,0,1,176,32ZM64,152a24,24,0,1,1,24-24A24,24,0,0,1,64,152Zm112,72a24,24,0,1,1,24-24A24,24,0,0,1,176,224Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M212,200a36,36,0,1,1-69.85-12.25l-53-34.05a36,36,0,1,1,0-51.4l53-34a36.09,36.09,0,1,1,8.67,13.45l-53,34.05a36,36,0,0,1,0,24.5l53,34.05A36,36,0,0,1,212,200Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176,162a37.91,37.91,0,0,0-28.3,12.67L98.8,143.24a37.89,37.89,0,0,0,0-30.48l48.9-31.43a38,38,0,1,0-6.5-10.09L92.3,102.67a38,38,0,1,0,0,50.66l48.9,31.43A38,38,0,1,0,176,162Zm0-132a26,26,0,1,1-26,26A26,26,0,0,1,176,30ZM64,154a26,26,0,1,1,26-26A26,26,0,0,1,64,154Zm112,72a26,26,0,1,1,26-26A26,26,0,0,1,176,226Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176,160a39.89,39.89,0,0,0-28.62,12.09l-46.1-29.63a39.8,39.8,0,0,0,0-28.92l46.1-29.63a40,40,0,1,0-8.66-13.45l-46.1,29.63a40,40,0,1,0,0,55.82l46.1,29.63A40,40,0,1,0,176,160Zm0-128a24,24,0,1,1-24,24A24,24,0,0,1,176,32ZM64,152a24,24,0,1,1,24-24A24,24,0,0,1,64,152Zm112,72a24,24,0,1,1,24-24A24,24,0,0,1,176,224Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M176,164a36,36,0,0,0-27.92,13.3L96.25,144a35.92,35.92,0,0,0,0-32L148.08,78.7A35.93,35.93,0,1,0,143.75,72L91.92,105.3a36,36,0,1,0,0,45.4L143.75,184A36,36,0,1,0,176,164Zm0-136a28,28,0,1,1-28,28A28,28,0,0,1,176,28ZM64,156a28,28,0,1,1,28-28A28,28,0,0,1,64,156Zm112,72a28,28,0,1,1,28-28A28,28,0,0,1,176,228Z"}))]]),t1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,36H48A20,20,0,0,0,28,56v56c0,54.29,26.32,87.22,48.4,105.29,23.71,19.39,47.44,26,48.44,26.29a12.1,12.1,0,0,0,6.32,0c1-.28,24.73-6.9,48.44-26.29,22.08-18.07,48.4-51,48.4-105.29V56A20,20,0,0,0,208,36Zm-4,76c0,35.71-13.09,64.69-38.91,86.15A126.28,126.28,0,0,1,128,219.38a126.14,126.14,0,0,1-37.09-21.23C65.09,176.69,52,147.71,52,112V60H204Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,56v56c0,96-88,120-88,120S40,208,40,112V56a8,8,0,0,1,8-8H208A8,8,0,0,1,216,56Z",opacity:"0.2"}),a.createElement("path",{d:"M208,40H48A16,16,0,0,0,32,56v56c0,52.72,25.52,84.67,46.93,102.19,23.06,18.86,46,25.27,47,25.53a8,8,0,0,0,4.2,0c1-.26,23.91-6.67,47-25.53C198.48,196.67,224,164.72,224,112V56A16,16,0,0,0,208,40Zm0,72c0,37.07-13.66,67.16-40.6,89.42A129.3,129.3,0,0,1,128,223.62a128.25,128.25,0,0,1-38.92-21.81C61.82,179.51,48,149.3,48,112l0-56,160,0Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,56v56c0,52.72-25.52,84.67-46.93,102.19-23.06,18.86-46,25.27-47,25.53a8,8,0,0,1-4.2,0c-1-.26-23.91-6.67-47-25.53C57.52,196.67,32,164.72,32,112V56A16,16,0,0,1,48,40H208A16,16,0,0,1,224,56Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,42H48A14,14,0,0,0,34,56v56c0,51.94,25.12,83.4,46.2,100.64,22.73,18.6,45.27,24.89,46.22,25.15a6,6,0,0,0,3.16,0c.95-.26,23.49-6.55,46.22-25.15C196.88,195.4,222,163.94,222,112V56A14,14,0,0,0,208,42Zm2,70c0,37.76-13.94,68.39-41.44,91.06A131.17,131.17,0,0,1,128,225.72a130.94,130.94,0,0,1-40.56-22.66C59.94,180.39,46,149.76,46,112V56a2,2,0,0,1,2-2H208a2,2,0,0,1,2,2Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,40H48A16,16,0,0,0,32,56v56c0,52.72,25.52,84.67,46.93,102.19,23.06,18.86,46,25.27,47,25.53a8,8,0,0,0,4.2,0c1-.26,23.91-6.67,47-25.53C198.48,196.67,224,164.72,224,112V56A16,16,0,0,0,208,40Zm0,72c0,37.07-13.66,67.16-40.6,89.42A129.3,129.3,0,0,1,128,223.62a128.25,128.25,0,0,1-38.92-21.81C61.82,179.51,48,149.3,48,112l0-56,160,0Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,44H48A12,12,0,0,0,36,56v56c0,51.16,24.73,82.12,45.47,99.1,22.4,18.32,44.55,24.5,45.48,24.76a4,4,0,0,0,2.1,0c.93-.26,23.08-6.44,45.48-24.76,20.74-17,45.47-47.94,45.47-99.1V56A12,12,0,0,0,208,44Zm4,68c0,38.44-14.23,69.63-42.29,92.71A132.45,132.45,0,0,1,128,227.82a132.23,132.23,0,0,1-41.71-23.11C58.23,181.63,44,150.44,44,112V56a4,4,0,0,1,4-4H208a4,4,0,0,1,4,4Z"}))]]),l1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M116,132V96a12,12,0,0,1,24,0v36a12,12,0,0,1-24,0Zm12,56a16,16,0,1,0-16-16A16,16,0,0,0,128,188ZM228,56v56c0,54.29-26.32,87.22-48.4,105.29-23.71,19.39-47.44,26-48.44,26.29a12.1,12.1,0,0,1-6.32,0c-1-.28-24.73-6.9-48.44-26.29C54.32,199.22,28,166.29,28,112V56A20,20,0,0,1,48,36H208A20,20,0,0,1,228,56Zm-24,4H52v52c0,35.71,13.09,64.69,38.91,86.15A126.14,126.14,0,0,0,128,219.38a126.28,126.28,0,0,0,37.09-21.23C190.91,176.69,204,147.71,204,112Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,56v56c0,96-88,120-88,120S40,208,40,112V56a8,8,0,0,1,8-8H208A8,8,0,0,1,216,56Z",opacity:"0.2"}),a.createElement("path",{d:"M120,136V96a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,48a12,12,0,1,0-12-12A12,12,0,0,0,128,184ZM224,56v56c0,52.72-25.52,84.67-46.93,102.19-23.06,18.86-46,25.27-47,25.53a8,8,0,0,1-4.2,0c-1-.26-23.91-6.67-47-25.53C57.52,196.67,32,164.72,32,112V56A16,16,0,0,1,48,40H208A16,16,0,0,1,224,56Zm-16,0L48,56l0,56c0,37.3,13.82,67.51,41.07,89.81A128.25,128.25,0,0,0,128,223.62a129.3,129.3,0,0,0,39.41-22.2C194.34,179.16,208,149.07,208,112Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,40H48A16,16,0,0,0,32,56v56c0,52.72,25.52,84.67,46.93,102.19,23.06,18.86,46,25.27,47,25.53a8,8,0,0,0,4.2,0c1-.26,23.91-6.67,47-25.53C198.48,196.67,224,164.72,224,112V56A16,16,0,0,0,208,40ZM120,96a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,88a12,12,0,1,1,12-12A12,12,0,0,1,128,184Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M122,136V96a6,6,0,0,1,12,0v40a6,6,0,0,1-12,0Zm6,26a10,10,0,1,0,10,10A10,10,0,0,0,128,162ZM222,56v56c0,51.94-25.12,83.4-46.2,100.64-22.73,18.6-45.27,24.89-46.22,25.15a6,6,0,0,1-3.16,0c-1-.26-23.49-6.55-46.22-25.15C59.12,195.4,34,163.94,34,112V56A14,14,0,0,1,48,42H208A14,14,0,0,1,222,56Zm-12,0a2,2,0,0,0-2-2H48a2,2,0,0,0-2,2v56c0,37.75,13.94,68.39,41.44,91.06A130.94,130.94,0,0,0,128,225.72a131.17,131.17,0,0,0,40.56-22.66C196.06,180.39,210,149.75,210,112Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M120,136V96a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,48a12,12,0,1,0-12-12A12,12,0,0,0,128,184ZM224,56v56c0,52.72-25.52,84.67-46.93,102.19-23.06,18.86-46,25.27-47,25.53a8,8,0,0,1-4.2,0c-1-.26-23.91-6.67-47-25.53C57.52,196.67,32,164.72,32,112V56A16,16,0,0,1,48,40H208A16,16,0,0,1,224,56Zm-16,0L48,56l0,56c0,37.3,13.82,67.51,41.07,89.81A128.25,128.25,0,0,0,128,223.62a129.3,129.3,0,0,0,39.41-22.2C194.34,179.16,208,149.07,208,112Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M124,136V96a4,4,0,0,1,8,0v40a4,4,0,0,1-8,0Zm4,28a8,8,0,1,0,8,8A8,8,0,0,0,128,164ZM220,56v56c0,51.16-24.73,82.12-45.47,99.1-22.4,18.32-44.55,24.5-45.48,24.76a4,4,0,0,1-2.1,0c-.93-.26-23.08-6.44-45.48-24.76C60.73,194.12,36,163.16,36,112V56A12,12,0,0,1,48,44H208A12,12,0,0,1,220,56Zm-8,0a4,4,0,0,0-4-4H48a4,4,0,0,0-4,4v56c0,38.44,14.23,69.63,42.29,92.71A132.23,132.23,0,0,0,128,227.82a132.45,132.45,0,0,0,41.71-23.11C197.77,181.63,212,150.44,212,112Z"}))]]),n1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240.49,175.51a12,12,0,0,1,0,17l-24,24a12,12,0,0,1-17-17L203,196h-2.09a76.17,76.17,0,0,1-61.85-31.83L97.38,105.78A52.1,52.1,0,0,0,55.06,84H32a12,12,0,0,1,0-24H55.06a76.17,76.17,0,0,1,61.85,31.83l41.71,58.39A52.1,52.1,0,0,0,200.94,172H203l-3.52-3.51a12,12,0,0,1,17-17Zm-95.62-72.62a12,12,0,0,0,16.93-1.13A52,52,0,0,1,200.94,84H203l-3.52,3.51a12,12,0,0,0,17,17l24-24a12,12,0,0,0,0-17l-24-24a12,12,0,0,0-17,17L203,60h-2.09a76,76,0,0,0-57.2,26A12,12,0,0,0,144.87,102.89Zm-33.74,50.22a12,12,0,0,0-16.93,1.13A52,52,0,0,1,55.06,172H32a12,12,0,0,0,0,24H55.06a76,76,0,0,0,57.2-26A12,12,0,0,0,111.13,153.11Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M107.14,98.8,128,128l-20.86,29.2A64,64,0,0,1,55.06,184H32V72H55.06A64,64,0,0,1,107.14,98.8ZM200.94,72a64,64,0,0,0-52.08,26.8L128,128l20.86,29.2A64,64,0,0,0,200.94,184H232V72Z",opacity:"0.2"}),a.createElement("path",{d:"M237.66,178.34a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L212.69,192H200.94a72.12,72.12,0,0,1-58.59-30.15l-41.72-58.4A56.1,56.1,0,0,0,55.06,80H32a8,8,0,0,1,0-16H55.06a72.12,72.12,0,0,1,58.59,30.15l41.72,58.4A56.1,56.1,0,0,0,200.94,176h11.75l-10.35-10.34a8,8,0,0,1,11.32-11.32ZM143,107a8,8,0,0,0,11.16-1.86l1.2-1.67A56.1,56.1,0,0,1,200.94,80h11.75L202.34,90.34a8,8,0,0,0,11.32,11.32l24-24a8,8,0,0,0,0-11.32l-24-24a8,8,0,0,0-11.32,11.32L212.69,64H200.94a72.12,72.12,0,0,0-58.59,30.15l-1.2,1.67A8,8,0,0,0,143,107Zm-30,42a8,8,0,0,0-11.16,1.86l-1.2,1.67A56.1,56.1,0,0,1,55.06,176H32a8,8,0,0,0,0,16H55.06a72.12,72.12,0,0,0,58.59-30.15l1.2-1.67A8,8,0,0,0,113,149Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M237.66,178.34a8,8,0,0,1,0,11.32l-24,24A8,8,0,0,1,200,208V192a72.15,72.15,0,0,1-57.65-30.14l-41.72-58.4A56.1,56.1,0,0,0,55.06,80H32a8,8,0,0,1,0-16H55.06a72.12,72.12,0,0,1,58.59,30.15l41.72,58.4A56.08,56.08,0,0,0,200,176V160a8,8,0,0,1,13.66-5.66ZM143,107a8,8,0,0,0,11.16-1.86l1.2-1.67A56.08,56.08,0,0,1,200,80V96a8,8,0,0,0,13.66,5.66l24-24a8,8,0,0,0,0-11.32l-24-24A8,8,0,0,0,200,48V64a72.15,72.15,0,0,0-57.65,30.14l-1.2,1.67A8,8,0,0,0,143,107Zm-30,42a8,8,0,0,0-11.16,1.86l-1.2,1.67A56.1,56.1,0,0,1,55.06,176H32a8,8,0,0,0,0,16H55.06a72.12,72.12,0,0,0,58.59-30.15l1.2-1.67A8,8,0,0,0,113,149Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236.24,179.76a6,6,0,0,1,0,8.48l-24,24a6,6,0,0,1-8.48-8.48L217.52,190H200.94a70.16,70.16,0,0,1-57-29.31l-41.71-58.4A58.11,58.11,0,0,0,55.06,78H32a6,6,0,0,1,0-12H55.06a70.16,70.16,0,0,1,57,29.31l41.71,58.4A58.11,58.11,0,0,0,200.94,178h16.58l-13.76-13.76a6,6,0,0,1,8.48-8.48Zm-92.06-74.41a5.91,5.91,0,0,0,3.48,1.12,6,6,0,0,0,4.89-2.51l1.19-1.67A58.11,58.11,0,0,1,200.94,78h16.58L203.76,91.76a6,6,0,1,0,8.48,8.48l24-24a6,6,0,0,0,0-8.48l-24-24a6,6,0,0,0-8.48,8.48L217.52,66H200.94a70.16,70.16,0,0,0-57,29.31L142.78,97A6,6,0,0,0,144.18,105.35Zm-32.36,45.3a6,6,0,0,0-8.37,1.39l-1.19,1.67A58.11,58.11,0,0,1,55.06,178H32a6,6,0,0,0,0,12H55.06a70.16,70.16,0,0,0,57-29.31l1.19-1.67A6,6,0,0,0,111.82,150.65Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M237.66,178.34a8,8,0,0,1,0,11.32l-24,24a8,8,0,0,1-11.32-11.32L212.69,192H200.94a72.12,72.12,0,0,1-58.59-30.15l-41.72-58.4A56.1,56.1,0,0,0,55.06,80H32a8,8,0,0,1,0-16H55.06a72.12,72.12,0,0,1,58.59,30.15l41.72,58.4A56.1,56.1,0,0,0,200.94,176h11.75l-10.35-10.34a8,8,0,0,1,11.32-11.32ZM143,107a8,8,0,0,0,11.16-1.86l1.2-1.67A56.1,56.1,0,0,1,200.94,80h11.75L202.34,90.34a8,8,0,0,0,11.32,11.32l24-24a8,8,0,0,0,0-11.32l-24-24a8,8,0,0,0-11.32,11.32L212.69,64H200.94a72.12,72.12,0,0,0-58.59,30.15l-1.2,1.67A8,8,0,0,0,143,107Zm-30,42a8,8,0,0,0-11.16,1.86l-1.2,1.67A56.1,56.1,0,0,1,55.06,176H32a8,8,0,0,0,0,16H55.06a72.12,72.12,0,0,0,58.59-30.15l1.2-1.67A8,8,0,0,0,113,149Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M234.83,181.17a4,4,0,0,1,0,5.66l-24,24a4,4,0,0,1-5.66-5.66L222.34,188h-21.4a68.15,68.15,0,0,1-55.34-28.48l-41.71-58.39A60.11,60.11,0,0,0,55.06,76H32a4,4,0,0,1,0-8H55.06A68.15,68.15,0,0,1,110.4,96.48l41.71,58.39A60.11,60.11,0,0,0,200.94,180h21.4l-17.17-17.17a4,4,0,0,1,5.66-5.66Zm-89.49-77.44a4,4,0,0,0,5.58-.93l1.19-1.67A60.11,60.11,0,0,1,200.94,76h21.4L205.17,93.17a4,4,0,0,0,5.66,5.66l24-24a4,4,0,0,0,0-5.66l-24-24a4,4,0,0,0-5.66,5.66L222.34,68h-21.4A68.15,68.15,0,0,0,145.6,96.48l-1.19,1.67A4,4,0,0,0,145.34,103.73Zm-34.68,48.54a4,4,0,0,0-5.58.93l-1.19,1.67A60.11,60.11,0,0,1,55.06,180H32a4,4,0,0,0,0,8H55.06a68.15,68.15,0,0,0,55.34-28.48l1.19-1.67A4,4,0,0,0,110.66,152.27Z"}))]]),m1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,36H40A20,20,0,0,0,20,56V200a20,20,0,0,0,20,20H216a20,20,0,0,0,20-20V56A20,20,0,0,0,216,36ZM44,60H76V196H44ZM212,196H100V60H212Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M88,48V208H40a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8Z",opacity:"0.2"}),a.createElement("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,56H80V200H40ZM216,200H96V56H216V200Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,160H88V56H216V200Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,42H40A14,14,0,0,0,26,56V200a14,14,0,0,0,14,14H216a14,14,0,0,0,14-14V56A14,14,0,0,0,216,42ZM38,200V56a2,2,0,0,1,2-2H82V202H40A2,2,0,0,1,38,200Zm180,0a2,2,0,0,1-2,2H94V54H216a2,2,0,0,1,2,2Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,56H80V200H40ZM216,200H96V56H216V200Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,44H40A12,12,0,0,0,28,56V200a12,12,0,0,0,12,12H216a12,12,0,0,0,12-12V56A12,12,0,0,0,216,44ZM36,200V56a4,4,0,0,1,4-4H84V204H40A4,4,0,0,1,36,200Zm184,0a4,4,0,0,1-4,4H92V52H216a4,4,0,0,1,4,4Z"}))]]),r1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M199,125.31l-49.88-18.39L130.69,57a19.92,19.92,0,0,0-37.38,0L74.92,106.92,25,125.31a19.92,19.92,0,0,0,0,37.38l49.88,18.39L93.31,231a19.92,19.92,0,0,0,37.38,0l18.39-49.88L199,162.69a19.92,19.92,0,0,0,0-37.38Zm-63.38,35.16a12,12,0,0,0-7.11,7.11L112,212.28l-16.47-44.7a12,12,0,0,0-7.11-7.11L43.72,144l44.7-16.47a12,12,0,0,0,7.11-7.11L112,75.72l16.47,44.7a12,12,0,0,0,7.11,7.11L180.28,144ZM140,40a12,12,0,0,1,12-12h12V16a12,12,0,0,1,24,0V28h12a12,12,0,0,1,0,24H188V64a12,12,0,0,1-24,0V52H152A12,12,0,0,1,140,40ZM252,88a12,12,0,0,1-12,12h-4v4a12,12,0,0,1-24,0v-4h-4a12,12,0,0,1,0-24h4V72a12,12,0,0,1,24,0v4h4A12,12,0,0,1,252,88Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M194.82,151.43l-55.09,20.3-20.3,55.09a7.92,7.92,0,0,1-14.86,0l-20.3-55.09-55.09-20.3a7.92,7.92,0,0,1,0-14.86l55.09-20.3,20.3-55.09a7.92,7.92,0,0,1,14.86,0l20.3,55.09,55.09,20.3A7.92,7.92,0,0,1,194.82,151.43Z",opacity:"0.2"}),a.createElement("path",{d:"M197.58,129.06,146,110l-19-51.62a15.92,15.92,0,0,0-29.88,0L78,110l-51.62,19a15.92,15.92,0,0,0,0,29.88L78,178l19,51.62a15.92,15.92,0,0,0,29.88,0L146,178l51.62-19a15.92,15.92,0,0,0,0-29.88ZM137,164.22a8,8,0,0,0-4.74,4.74L112,223.85,91.78,169A8,8,0,0,0,87,164.22L32.15,144,87,123.78A8,8,0,0,0,91.78,119L112,64.15,132.22,119a8,8,0,0,0,4.74,4.74L191.85,144ZM144,40a8,8,0,0,1,8-8h16V16a8,8,0,0,1,16,0V32h16a8,8,0,0,1,0,16H184V64a8,8,0,0,1-16,0V48H152A8,8,0,0,1,144,40ZM248,88a8,8,0,0,1-8,8h-8v8a8,8,0,0,1-16,0V96h-8a8,8,0,0,1,0-16h8V72a8,8,0,0,1,16,0v8h8A8,8,0,0,1,248,88Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,144a15.78,15.78,0,0,1-10.42,14.94L146,178l-19,51.62a15.92,15.92,0,0,1-29.88,0L78,178l-51.62-19a15.92,15.92,0,0,1,0-29.88L78,110l19-51.62a15.92,15.92,0,0,1,29.88,0L146,110l51.62,19A15.78,15.78,0,0,1,208,144ZM152,48h16V64a8,8,0,0,0,16,0V48h16a8,8,0,0,0,0-16H184V16a8,8,0,0,0-16,0V32H152a8,8,0,0,0,0,16Zm88,32h-8V72a8,8,0,0,0-16,0v8h-8a8,8,0,0,0,0,16h8v8a8,8,0,0,0,16,0V96h8a8,8,0,0,0,0-16Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M196.89,130.94,144.4,111.6,125.06,59.11a13.92,13.92,0,0,0-26.12,0L79.6,111.6,27.11,130.94a13.92,13.92,0,0,0,0,26.12L79.6,176.4l19.34,52.49a13.92,13.92,0,0,0,26.12,0L144.4,176.4l52.49-19.34a13.92,13.92,0,0,0,0-26.12Zm-4.15,14.86-55.08,20.3a6,6,0,0,0-3.56,3.56l-20.3,55.08a1.92,1.92,0,0,1-3.6,0L89.9,169.66a6,6,0,0,0-3.56-3.56L31.26,145.8a1.92,1.92,0,0,1,0-3.6l55.08-20.3a6,6,0,0,0,3.56-3.56l20.3-55.08a1.92,1.92,0,0,1,3.6,0l20.3,55.08a6,6,0,0,0,3.56,3.56l55.08,20.3a1.92,1.92,0,0,1,0,3.6ZM146,40a6,6,0,0,1,6-6h18V16a6,6,0,0,1,12,0V34h18a6,6,0,0,1,0,12H182V64a6,6,0,0,1-12,0V46H152A6,6,0,0,1,146,40ZM246,88a6,6,0,0,1-6,6H230v10a6,6,0,0,1-12,0V94H208a6,6,0,0,1,0-12h10V72a6,6,0,0,1,12,0V82h10A6,6,0,0,1,246,88Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M197.58,129.06,146,110l-19-51.62a15.92,15.92,0,0,0-29.88,0L78,110l-51.62,19a15.92,15.92,0,0,0,0,29.88L78,178l19,51.62a15.92,15.92,0,0,0,29.88,0L146,178l51.62-19a15.92,15.92,0,0,0,0-29.88ZM137,164.22a8,8,0,0,0-4.74,4.74L112,223.85,91.78,169A8,8,0,0,0,87,164.22L32.15,144,87,123.78A8,8,0,0,0,91.78,119L112,64.15,132.22,119a8,8,0,0,0,4.74,4.74L191.85,144ZM144,40a8,8,0,0,1,8-8h16V16a8,8,0,0,1,16,0V32h16a8,8,0,0,1,0,16H184V64a8,8,0,0,1-16,0V48H152A8,8,0,0,1,144,40ZM248,88a8,8,0,0,1-8,8h-8v8a8,8,0,0,1-16,0V96h-8a8,8,0,0,1,0-16h8V72a8,8,0,0,1,16,0v8h8A8,8,0,0,1,248,88Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M196.2,132.81l-53.36-19.65L123.19,59.8a11.93,11.93,0,0,0-22.38,0L81.16,113.16,27.8,132.81a11.93,11.93,0,0,0,0,22.38l53.36,19.65,19.65,53.36a11.93,11.93,0,0,0,22.38,0l19.65-53.36,53.36-19.65a11.93,11.93,0,0,0,0-22.38Zm-2.77,14.87L138.35,168a4,4,0,0,0-2.37,2.37l-20.3,55.08a3.92,3.92,0,0,1-7.36,0L88,170.35A4,4,0,0,0,85.65,168l-55.08-20.3a3.92,3.92,0,0,1,0-7.36L85.65,120A4,4,0,0,0,88,117.65l20.3-55.08a3.92,3.92,0,0,1,7.36,0L136,117.65a4,4,0,0,0,2.37,2.37l55.08,20.3a3.92,3.92,0,0,1,0,7.36ZM148,40a4,4,0,0,1,4-4h20V16a4,4,0,0,1,8,0V36h20a4,4,0,0,1,0,8H180V64a4,4,0,0,1-8,0V44H152A4,4,0,0,1,148,40Zm96,48a4,4,0,0,1-4,4H228v12a4,4,0,0,1-8,0V92H208a4,4,0,0,1,0-8h12V72a4,4,0,0,1,8,0V84h12A4,4,0,0,1,244,88Z"}))]]),c1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M100,36H56A20,20,0,0,0,36,56v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V56A20,20,0,0,0,100,36ZM96,96H60V60H96ZM200,36H156a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V56A20,20,0,0,0,200,36Zm-4,60H160V60h36Zm-96,40H56a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V156A20,20,0,0,0,100,136Zm-4,60H60V160H96Zm104-60H156a20,20,0,0,0-20,20v44a20,20,0,0,0,20,20h44a20,20,0,0,0,20-20V156A20,20,0,0,0,200,136Zm-4,60H160V160h36Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M112,56v48a8,8,0,0,1-8,8H56a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8h48A8,8,0,0,1,112,56Zm88-8H152a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V56A8,8,0,0,0,200,48Zm-96,96H56a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V152A8,8,0,0,0,104,144Zm96,0H152a8,8,0,0,0-8,8v48a8,8,0,0,0,8,8h48a8,8,0,0,0,8-8V152A8,8,0,0,0,200,144Z",opacity:"0.2"}),a.createElement("path",{d:"M200,136H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Zm0,64H152V152h48v48ZM104,40H56A16,16,0,0,0,40,56v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,104,40Zm0,64H56V56h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,64H152V56h48v48Zm-96,32H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm0,64H56V152h48v48Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M120,56v48a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40h48A16,16,0,0,1,120,56Zm80-16H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm-96,96H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm96,0H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M104,42H56A14,14,0,0,0,42,56v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V56A14,14,0,0,0,104,42Zm2,62a2,2,0,0,1-2,2H56a2,2,0,0,1-2-2V56a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm94-62H152a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V56A14,14,0,0,0,200,42Zm2,62a2,2,0,0,1-2,2H152a2,2,0,0,1-2-2V56a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm-98,34H56a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V152A14,14,0,0,0,104,138Zm2,62a2,2,0,0,1-2,2H56a2,2,0,0,1-2-2V152a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Zm94-62H152a14,14,0,0,0-14,14v48a14,14,0,0,0,14,14h48a14,14,0,0,0,14-14V152A14,14,0,0,0,200,138Zm2,62a2,2,0,0,1-2,2H152a2,2,0,0,1-2-2V152a2,2,0,0,1,2-2h48a2,2,0,0,1,2,2Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M104,40H56A16,16,0,0,0,40,56v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,104,40Zm0,64H56V56h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V56A16,16,0,0,0,200,40Zm0,64H152V56h48v48Zm-96,32H56a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,104,136Zm0,64H56V152h48v48Zm96-64H152a16,16,0,0,0-16,16v48a16,16,0,0,0,16,16h48a16,16,0,0,0,16-16V152A16,16,0,0,0,200,136Zm0,64H152V152h48v48Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M104,44H56A12,12,0,0,0,44,56v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V56A12,12,0,0,0,104,44Zm4,60a4,4,0,0,1-4,4H56a4,4,0,0,1-4-4V56a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Zm92-60H152a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V56A12,12,0,0,0,200,44Zm4,60a4,4,0,0,1-4,4H152a4,4,0,0,1-4-4V56a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4ZM104,140H56a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V152A12,12,0,0,0,104,140Zm4,60a4,4,0,0,1-4,4H56a4,4,0,0,1-4-4V152a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Zm92-60H152a12,12,0,0,0-12,12v48a12,12,0,0,0,12,12h48a12,12,0,0,0,12-12V152A12,12,0,0,0,200,140Zm4,60a4,4,0,0,1-4,4H152a4,4,0,0,1-4-4V152a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4Z"}))]]),A1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M234.36,170A12,12,0,0,1,230,186.37l-96,56a12,12,0,0,1-12.1,0l-96-56a12,12,0,0,1,12.09-20.74l90,52.48L218,165.63A12,12,0,0,1,234.36,170ZM218,117.63,128,170.11,38.05,117.63A12,12,0,0,0,26,138.37l96,56a12,12,0,0,0,12.1,0l96-56A12,12,0,0,0,218,117.63ZM20,80a12,12,0,0,1,6-10.37l96-56a12.06,12.06,0,0,1,12.1,0l96,56a12,12,0,0,1,0,20.74l-96,56a12,12,0,0,1-12.1,0l-96-56A12,12,0,0,1,20,80Zm35.82,0L128,122.11,200.18,80,128,37.89Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,80l-96,56L32,80l96-56Z",opacity:"0.2"}),a.createElement("path",{d:"M230.91,172A8,8,0,0,1,228,182.91l-96,56a8,8,0,0,1-8.06,0l-96-56A8,8,0,0,1,36,169.09l92,53.65,92-53.65A8,8,0,0,1,230.91,172ZM220,121.09l-92,53.65L36,121.09A8,8,0,0,0,28,134.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,121.09ZM24,80a8,8,0,0,1,4-6.91l96-56a8,8,0,0,1,8.06,0l96,56a8,8,0,0,1,0,13.82l-96,56a8,8,0,0,1-8.06,0l-96-56A8,8,0,0,1,24,80Zm23.88,0L128,126.74,208.12,80,128,33.26Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M220,169.09l-92,53.65L36,169.09A8,8,0,0,0,28,182.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,169.09Z"}),a.createElement("path",{d:"M220,121.09l-92,53.65L36,121.09A8,8,0,0,0,28,134.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,121.09Z"}),a.createElement("path",{d:"M28,86.91l96,56a8,8,0,0,0,8.06,0l96-56a8,8,0,0,0,0-13.82l-96-56a8,8,0,0,0-8.06,0l-96,56a8,8,0,0,0,0,13.82Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M229.18,173a6,6,0,0,1-2.16,8.2l-96,56a6,6,0,0,1-6,0l-96-56a6,6,0,0,1,6-10.36l93,54.23,93-54.23A6,6,0,0,1,229.18,173ZM221,122.82l-93,54.23L35,122.82a6,6,0,0,0-6,10.36l96,56a6,6,0,0,0,6,0l96-56a6,6,0,0,0-6-10.36ZM26,80a6,6,0,0,1,3-5.18l96-56a6,6,0,0,1,6,0l96,56a6,6,0,0,1,0,10.36l-96,56a6,6,0,0,1-6,0l-96-56A6,6,0,0,1,26,80Zm17.91,0L128,129.05,212.09,80,128,31Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M230.91,172A8,8,0,0,1,228,182.91l-96,56a8,8,0,0,1-8.06,0l-96-56A8,8,0,0,1,36,169.09l92,53.65,92-53.65A8,8,0,0,1,230.91,172ZM220,121.09l-92,53.65L36,121.09A8,8,0,0,0,28,134.91l96,56a8,8,0,0,0,8.06,0l96-56A8,8,0,1,0,220,121.09ZM24,80a8,8,0,0,1,4-6.91l96-56a8,8,0,0,1,8.06,0l96,56a8,8,0,0,1,0,13.82l-96,56a8,8,0,0,1-8.06,0l-96-56A8,8,0,0,1,24,80Zm23.88,0L128,126.74,208.12,80,128,33.26Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M227.45,174a4,4,0,0,1-1.44,5.48l-96,56a4,4,0,0,1-4,0l-96-56a4,4,0,0,1,4-6.92l94,54.83,94-54.83A4,4,0,0,1,227.45,174ZM222,124.54l-94,54.83L34,124.54a4,4,0,0,0-4,6.92l96,56a4,4,0,0,0,4,0l96-56a4,4,0,0,0-4-6.92ZM28,80a4,4,0,0,1,2-3.46l96-56a4,4,0,0,1,4,0l96,56a4,4,0,0,1,0,6.92l-96,56a4,4,0,0,1-4,0l-96-56A4,4,0,0,1,28,80Zm11.94,0L128,131.37,216.06,80,128,28.63Z"}))]]),Z1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M116,36V20a12,12,0,0,1,24,0V36a12,12,0,0,1-24,0Zm80,92a68,68,0,1,1-68-68A68.07,68.07,0,0,1,196,128Zm-24,0a44,44,0,1,0-44,44A44.05,44.05,0,0,0,172,128ZM51.51,68.49a12,12,0,1,0,17-17l-12-12a12,12,0,0,0-17,17Zm0,119-12,12a12,12,0,0,0,17,17l12-12a12,12,0,1,0-17-17ZM196,72a12,12,0,0,0,8.49-3.51l12-12a12,12,0,0,0-17-17l-12,12A12,12,0,0,0,196,72Zm8.49,115.51a12,12,0,0,0-17,17l12,12a12,12,0,0,0,17-17ZM48,128a12,12,0,0,0-12-12H20a12,12,0,0,0,0,24H36A12,12,0,0,0,48,128Zm80,80a12,12,0,0,0-12,12v16a12,12,0,0,0,24,0V220A12,12,0,0,0,128,208Zm108-92H220a12,12,0,0,0,0,24h16a12,12,0,0,0,0-24Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M184,128a56,56,0,1,1-56-56A56,56,0,0,1,184,128Z",opacity:"0.2"}),a.createElement("path",{d:"M120,40V16a8,8,0,0,1,16,0V40a8,8,0,0,1-16,0Zm72,88a64,64,0,1,1-64-64A64.07,64.07,0,0,1,192,128Zm-16,0a48,48,0,1,0-48,48A48.05,48.05,0,0,0,176,128ZM58.34,69.66A8,8,0,0,0,69.66,58.34l-16-16A8,8,0,0,0,42.34,53.66Zm0,116.68-16,16a8,8,0,0,0,11.32,11.32l16-16a8,8,0,0,0-11.32-11.32ZM192,72a8,8,0,0,0,5.66-2.34l16-16a8,8,0,0,0-11.32-11.32l-16,16A8,8,0,0,0,192,72Zm5.66,114.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32-11.32ZM48,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H40A8,8,0,0,0,48,128Zm80,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V216A8,8,0,0,0,128,208Zm112-88H216a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M120,40V16a8,8,0,0,1,16,0V40a8,8,0,0,1-16,0Zm8,24a64,64,0,1,0,64,64A64.07,64.07,0,0,0,128,64ZM58.34,69.66A8,8,0,0,0,69.66,58.34l-16-16A8,8,0,0,0,42.34,53.66Zm0,116.68-16,16a8,8,0,0,0,11.32,11.32l16-16a8,8,0,0,0-11.32-11.32ZM192,72a8,8,0,0,0,5.66-2.34l16-16a8,8,0,0,0-11.32-11.32l-16,16A8,8,0,0,0,192,72Zm5.66,114.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32-11.32ZM48,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H40A8,8,0,0,0,48,128Zm80,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V216A8,8,0,0,0,128,208Zm112-88H216a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M122,40V16a6,6,0,0,1,12,0V40a6,6,0,0,1-12,0Zm68,88a62,62,0,1,1-62-62A62.07,62.07,0,0,1,190,128Zm-12,0a50,50,0,1,0-50,50A50.06,50.06,0,0,0,178,128ZM59.76,68.24a6,6,0,1,0,8.48-8.48l-16-16a6,6,0,0,0-8.48,8.48Zm0,119.52-16,16a6,6,0,1,0,8.48,8.48l16-16a6,6,0,1,0-8.48-8.48ZM192,70a6,6,0,0,0,4.24-1.76l16-16a6,6,0,0,0-8.48-8.48l-16,16A6,6,0,0,0,192,70Zm4.24,117.76a6,6,0,0,0-8.48,8.48l16,16a6,6,0,0,0,8.48-8.48ZM46,128a6,6,0,0,0-6-6H16a6,6,0,0,0,0,12H40A6,6,0,0,0,46,128Zm82,82a6,6,0,0,0-6,6v24a6,6,0,0,0,12,0V216A6,6,0,0,0,128,210Zm112-88H216a6,6,0,0,0,0,12h24a6,6,0,0,0,0-12Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M120,40V16a8,8,0,0,1,16,0V40a8,8,0,0,1-16,0Zm72,88a64,64,0,1,1-64-64A64.07,64.07,0,0,1,192,128Zm-16,0a48,48,0,1,0-48,48A48.05,48.05,0,0,0,176,128ZM58.34,69.66A8,8,0,0,0,69.66,58.34l-16-16A8,8,0,0,0,42.34,53.66Zm0,116.68-16,16a8,8,0,0,0,11.32,11.32l16-16a8,8,0,0,0-11.32-11.32ZM192,72a8,8,0,0,0,5.66-2.34l16-16a8,8,0,0,0-11.32-11.32l-16,16A8,8,0,0,0,192,72Zm5.66,114.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32-11.32ZM48,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H40A8,8,0,0,0,48,128Zm80,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V216A8,8,0,0,0,128,208Zm112-88H216a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M124,40V16a4,4,0,0,1,8,0V40a4,4,0,0,1-8,0Zm64,88a60,60,0,1,1-60-60A60.07,60.07,0,0,1,188,128Zm-8,0a52,52,0,1,0-52,52A52.06,52.06,0,0,0,180,128ZM61.17,66.83a4,4,0,0,0,5.66-5.66l-16-16a4,4,0,0,0-5.66,5.66Zm0,122.34-16,16a4,4,0,0,0,5.66,5.66l16-16a4,4,0,0,0-5.66-5.66ZM192,68a4,4,0,0,0,2.83-1.17l16-16a4,4,0,1,0-5.66-5.66l-16,16A4,4,0,0,0,192,68Zm2.83,121.17a4,4,0,0,0-5.66,5.66l16,16a4,4,0,0,0,5.66-5.66ZM40,124H16a4,4,0,0,0,0,8H40a4,4,0,0,0,0-8Zm88,88a4,4,0,0,0-4,4v24a4,4,0,0,0,8,0V216A4,4,0,0,0,128,212Zm112-88H216a4,4,0,0,0,0,8h24a4,4,0,0,0,0-8Z"}))]]),h1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M228,48V152a20,20,0,0,1-20,20H112.92a12,12,0,0,1-17.41,16.49l-20-20a12,12,0,0,1,0-17l20-20A12,12,0,0,1,112.92,148H204V52H100a12,12,0,0,1-24,0V48A20,20,0,0,1,96,28H208A20,20,0,0,1,228,48ZM168,192a12,12,0,0,0-12,12H52V108h91.08a12,12,0,0,0,17.41,16.49l20-20a12,12,0,0,0,0-17l-20-20A12,12,0,0,0,143.08,84H48a20,20,0,0,0-20,20V208a20,20,0,0,0,20,20H160a20,20,0,0,0,20-20v-4A12,12,0,0,0,168,192Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48V152a8,8,0,0,1-8,8H168v48a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V104a8,8,0,0,1,8-8H88V48a8,8,0,0,1,8-8H208A8,8,0,0,1,216,48Z",opacity:"0.2"}),a.createElement("path",{d:"M224,48V152a16,16,0,0,1-16,16H99.31l10.35,10.34a8,8,0,0,1-11.32,11.32l-24-24a8,8,0,0,1,0-11.32l24-24a8,8,0,0,1,11.32,11.32L99.31,152H208V48H96v8a8,8,0,0,1-16,0V48A16,16,0,0,1,96,32H208A16,16,0,0,1,224,48ZM168,192a8,8,0,0,0-8,8v8H48V104H156.69l-10.35,10.34a8,8,0,0,0,11.32,11.32l24-24a8,8,0,0,0,0-11.32l-24-24a8,8,0,0,0-11.32,11.32L156.69,88H48a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16H160a16,16,0,0,0,16-16v-8A8,8,0,0,0,168,192Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,48V152a16,16,0,0,1-16,16H112v16a8,8,0,0,1-13.66,5.66l-24-24a8,8,0,0,1,0-11.32l24-24A8,8,0,0,1,112,136v16h96V48H96v8a8,8,0,0,1-16,0V48A16,16,0,0,1,96,32H208A16,16,0,0,1,224,48ZM168,192a8,8,0,0,0-8,8v8H48V104h96v16a8,8,0,0,0,13.66,5.66l24-24a8,8,0,0,0,0-11.32l-24-24A8,8,0,0,0,144,72V88H48a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16H160a16,16,0,0,0,16-16v-8A8,8,0,0,0,168,192Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M222,48V152a14,14,0,0,1-14,14H94.49l13.75,13.76a6,6,0,1,1-8.48,8.48l-24-24a6,6,0,0,1,0-8.48l24-24a6,6,0,0,1,8.48,8.48L94.49,154H208a2,2,0,0,0,2-2V48a2,2,0,0,0-2-2H96a2,2,0,0,0-2,2v8a6,6,0,0,1-12,0V48A14,14,0,0,1,96,34H208A14,14,0,0,1,222,48ZM168,194a6,6,0,0,0-6,6v8a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V104a2,2,0,0,1,2-2H161.51l-13.75,13.76a6,6,0,1,0,8.48,8.48l24-24a6,6,0,0,0,0-8.48l-24-24a6,6,0,0,0-8.48,8.48L161.51,90H48a14,14,0,0,0-14,14V208a14,14,0,0,0,14,14H160a14,14,0,0,0,14-14v-8A6,6,0,0,0,168,194Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,48V152a16,16,0,0,1-16,16H99.31l10.35,10.34a8,8,0,0,1-11.32,11.32l-24-24a8,8,0,0,1,0-11.32l24-24a8,8,0,0,1,11.32,11.32L99.31,152H208V48H96v8a8,8,0,0,1-16,0V48A16,16,0,0,1,96,32H208A16,16,0,0,1,224,48ZM168,192a8,8,0,0,0-8,8v8H48V104H156.69l-10.35,10.34a8,8,0,0,0,11.32,11.32l24-24a8,8,0,0,0,0-11.32l-24-24a8,8,0,0,0-11.32,11.32L156.69,88H48a16,16,0,0,0-16,16V208a16,16,0,0,0,16,16H160a16,16,0,0,0,16-16v-8A8,8,0,0,0,168,192Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M220,48V152a12,12,0,0,1-12,12H89.66l17.17,17.17a4,4,0,0,1-5.66,5.66l-24-24a4,4,0,0,1,0-5.66l24-24a4,4,0,0,1,5.66,5.66L89.66,156H208a4,4,0,0,0,4-4V48a4,4,0,0,0-4-4H96a4,4,0,0,0-4,4v8a4,4,0,0,1-8,0V48A12,12,0,0,1,96,36H208A12,12,0,0,1,220,48ZM168,196a4,4,0,0,0-4,4v8a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V104a4,4,0,0,1,4-4H166.34l-17.17,17.17a4,4,0,0,0,5.66,5.66l24-24a4,4,0,0,0,0-5.66l-24-24a4,4,0,0,0-5.66,5.66L166.34,92H48a12,12,0,0,0-12,12V208a12,12,0,0,0,12,12H160a12,12,0,0,0,12-12v-8A4,4,0,0,0,168,196Z"}))]]),H1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,28H152a12,12,0,0,0-9.33,4.45L79.5,110.51l-4.66-4.65a20,20,0,0,0-28.29,0L29.86,122.55a20,20,0,0,0,0,28.29h0L45,166,23.86,187.17a20,20,0,0,0,0,28.28l16.69,16.69a20,20,0,0,0,28.28,0L90,211l15.17,15.16a20,20,0,0,0,28.29,0l16.69-16.69a20,20,0,0,0,0-28.3l-4.65-4.65,78.06-63.17A12,12,0,0,0,228,104V40A12,12,0,0,0,216,28ZM54.69,212.34l-11-11L62,183l11,11Zm64.61-6L49.65,136.7l11.05-11,69.65,69.65ZM204,98.27l-75.58,61.17L121,152l47.51-47.5a12,12,0,0,0-17-17L104,135l-7.45-7.44L157.73,52H204Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M141.66,201,129,213.66a8,8,0,0,1-11.32,0L92,188,58.35,221.66a8,8,0,0,1-11.32,0L34.34,209a8,8,0,0,1,0-11.31L68,164,42.34,138.36a8,8,0,0,1,0-11.32L55,114.34a8,8,0,0,1,11.32,0l75.3,75.3A8,8,0,0,1,141.66,201Z",opacity:"0.2"}),a.createElement("path",{d:"M216,32H152a8,8,0,0,0-6.34,3.12l-64,83.21L72,108.69a16,16,0,0,0-22.64,0l-12.69,12.7a16,16,0,0,0,0,22.63l20,20-28,28a16,16,0,0,0,0,22.63l12.69,12.68a16,16,0,0,0,22.62,0l28-28,20,20a16,16,0,0,0,22.64,0l12.69-12.7a16,16,0,0,0,0-22.63l-9.64-9.64,83.21-64A8,8,0,0,0,224,104V40A8,8,0,0,0,216,32ZM52.69,216,40,203.32l28-28L80.68,188Zm70.61-8L48,132.71,60.7,120,136,195.31ZM208,100.06l-81.74,62.88L115.32,152l50.34-50.34a8,8,0,0,0-11.32-11.31L104,140.68,93.07,129.74,155.94,48H208Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,32H152a8,8,0,0,0-6.34,3.12l-64,83.21L72,108.69a16,16,0,0,0-22.64,0l-8.69,8.7a16,16,0,0,0,0,22.63l22,22-32,32a16,16,0,0,0,0,22.63l8.69,8.68a16,16,0,0,0,22.62,0l32-32,22,22a16,16,0,0,0,22.64,0l8.69-8.7a16,16,0,0,0,0-22.63l-9.64-9.64,83.21-64A8,8,0,0,0,224,104V40A8,8,0,0,0,216,32Zm-8,68.06-81.74,62.88L115.32,152l50.34-50.34a8,8,0,0,0-11.32-11.31L104,140.68,93.07,129.74,155.94,48H208Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,34H152a6,6,0,0,0-4.76,2.34l-65.39,85L70.6,110.1a14,14,0,0,0-19.8,0L38.1,122.8a14,14,0,0,0,0,19.81h0L59.51,164,30.1,193.42a14,14,0,0,0,0,19.8l12.69,12.69a14,14,0,0,0,19.8,0L92,196.5l21.4,21.4a14,14,0,0,0,19.8,0l12.7-12.69a14,14,0,0,0,0-19.81l-11.25-11.25,85-65.39A6,6,0,0,0,222,104V40A6,6,0,0,0,216,34ZM54.1,217.42a2,2,0,0,1-2.83,0L38.59,204.73a2,2,0,0,1,0-2.82L68,172.5,83.51,188Zm83.31-20.7-12.69,12.7a2,2,0,0,1-2.84,0l-75.29-75.3h0a2,2,0,0,1,0-2.83l12.69-12.7a2,2,0,0,1,2.84,0l75.29,75.3A2,2,0,0,1,137.41,196.72ZM210,101.05,126.09,165.6,112.49,152l51.75-51.76a6,6,0,0,0-8.48-8.48L104,143.51l-13.6-13.6L155,46H210Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,32H152a8,8,0,0,0-6.34,3.12l-64,83.21L72,108.69a16,16,0,0,0-22.64,0l-12.69,12.7a16,16,0,0,0,0,22.63l20,20-28,28a16,16,0,0,0,0,22.63l12.69,12.68a16,16,0,0,0,22.62,0l28-28,20,20a16,16,0,0,0,22.64,0l12.69-12.7a16,16,0,0,0,0-22.63l-9.64-9.64,83.21-64A8,8,0,0,0,224,104V40A8,8,0,0,0,216,32ZM52.69,216,40,203.32l28-28L80.68,188Zm70.61-8L48,132.71,60.7,120,136,195.31ZM208,100.06l-81.74,62.88L115.32,152l50.34-50.34a8,8,0,0,0-11.32-11.31L104,140.68,93.07,129.74,155.94,48H208Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,36H152a4,4,0,0,0-3.17,1.56L82.05,124.38,69.19,111.52a12,12,0,0,0-17,0L39.52,124.21a12,12,0,0,0,0,17L62.34,164,31.52,194.83a12,12,0,0,0,0,17L44.2,224.49a12,12,0,0,0,17,0L92,193.67l22.81,22.82a12,12,0,0,0,17,0l12.69-12.7a12,12,0,0,0,0-17L131.62,174l86.82-66.79A4,4,0,0,0,220,104V40A4,4,0,0,0,216,36ZM55.52,218.83a4,4,0,0,1-5.66,0L37.17,206.15a4,4,0,0,1,0-5.66L68,169.67,86.34,188Zm83.31-26.36a4,4,0,0,1,0,5.67l-12.7,12.69a4,4,0,0,1-5.66,0l-75.3-75.3a4,4,0,0,1,0-5.66l12.7-12.69a4,4,0,0,1,5.66,0ZM212,102l-86.08,66.22L109.66,152l53.17-53.17a4,4,0,1,0-5.66-5.66L104,146.34,87.75,130.08,154,44h58Z"}))]]),V1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48H180V36A28,28,0,0,0,152,8H104A28,28,0,0,0,76,36V48H40a12,12,0,0,0,0,24h4V208a20,20,0,0,0,20,20H192a20,20,0,0,0,20-20V72h4a12,12,0,0,0,0-24ZM100,36a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4V48H100Zm88,168H68V72H188ZM116,104v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Zm48,0v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,56V208a8,8,0,0,1-8,8H64a8,8,0,0,1-8-8V56Z",opacity:"0.2"}),a.createElement("path",{d:"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM112,168a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm0-120H96V40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,50H174V40a22,22,0,0,0-22-22H104A22,22,0,0,0,82,40V50H40a6,6,0,0,0,0,12H50V208a14,14,0,0,0,14,14H192a14,14,0,0,0,14-14V62h10a6,6,0,0,0,0-12ZM94,40a10,10,0,0,1,10-10h48a10,10,0,0,1,10,10V50H94ZM194,208a2,2,0,0,1-2,2H64a2,2,0,0,1-2-2V62H194ZM110,104v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Zm48,0v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,52H172V40a20,20,0,0,0-20-20H104A20,20,0,0,0,84,40V52H40a4,4,0,0,0,0,8H52V208a12,12,0,0,0,12,12H192a12,12,0,0,0,12-12V60h12a4,4,0,0,0,0-8ZM92,40a12,12,0,0,1,12-12h48a12,12,0,0,1,12,12V52H92ZM196,208a4,4,0,0,1-4,4H64a4,4,0,0,1-4-4V60H196ZM108,104v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Zm48,0v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Z"}))]]),M1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M244,56v64a12,12,0,0,1-24,0V85l-75.51,75.52a12,12,0,0,1-17,0L96,129,32.49,192.49a12,12,0,0,1-17-17l72-72a12,12,0,0,1,17,0L136,135l67-67H168a12,12,0,0,1,0-24h64A12,12,0,0,1,244,56Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,56v64L168,56Z",opacity:"0.2"}),a.createElement("path",{d:"M232,48H168a8,8,0,0,0-5.66,13.66L188.69,88,136,140.69l-34.34-34.35a8,8,0,0,0-11.32,0l-72,72a8,8,0,0,0,11.32,11.32L96,123.31l34.34,34.35a8,8,0,0,0,11.32,0L200,99.31l26.34,26.35A8,8,0,0,0,240,120V56A8,8,0,0,0,232,48Zm-8,52.69L187.31,64H224Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,56v64a8,8,0,0,1-13.66,5.66L200,99.31l-58.34,58.35a8,8,0,0,1-11.32,0L96,123.31,29.66,189.66a8,8,0,0,1-11.32-11.32l72-72a8,8,0,0,1,11.32,0L136,140.69,188.69,88,162.34,61.66A8,8,0,0,1,168,48h64A8,8,0,0,1,240,56Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M238,56v64a6,6,0,0,1-12,0V70.48l-85.76,85.76a6,6,0,0,1-8.48,0L96,120.49,28.24,188.24a6,6,0,0,1-8.48-8.48l72-72a6,6,0,0,1,8.48,0L136,143.51,217.52,62H168a6,6,0,0,1,0-12h64A6,6,0,0,1,238,56Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240,56v64a8,8,0,0,1-16,0V75.31l-82.34,82.35a8,8,0,0,1-11.32,0L96,123.31,29.66,189.66a8,8,0,0,1-11.32-11.32l72-72a8,8,0,0,1,11.32,0L136,140.69,212.69,64H168a8,8,0,0,1,0-16h64A8,8,0,0,1,240,56Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236,56v64a4,4,0,0,1-8,0V65.66l-89.17,89.17a4,4,0,0,1-5.66,0L96,117.66,26.83,186.83a4,4,0,0,1-5.66-5.66l72-72a4,4,0,0,1,5.66,0L136,146.34,222.34,60H168a4,4,0,0,1,0-8h64A4,4,0,0,1,236,56Z"}))]]),E1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,60H212V48a12,12,0,0,0-12-12H56A12,12,0,0,0,44,48V60H24A20,20,0,0,0,4,80V96a44.05,44.05,0,0,0,44,44h.77A84.18,84.18,0,0,0,116,195.15V212H96a12,12,0,0,0,0,24h64a12,12,0,0,0,0-24H140V195.11c30.94-4.51,56.53-26.2,67-55.11h1a44.05,44.05,0,0,0,44-44V80A20,20,0,0,0,232,60ZM28,96V84H44v28c0,1.21,0,2.41.09,3.61A20,20,0,0,1,28,96Zm160,15.1c0,33.33-26.71,60.65-59.54,60.9A60,60,0,0,1,68,112V60H188ZM228,96a20,20,0,0,1-16.12,19.62c.08-1.5.12-3,.12-4.52V84h16Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M200,48v63.1c0,39.7-31.75,72.6-71.45,72.9A72,72,0,0,1,56,112V48Z",opacity:"0.2"}),a.createElement("path",{d:"M232,64H208V48a8,8,0,0,0-8-8H56a8,8,0,0,0-8,8V64H24A16,16,0,0,0,8,80V96a40,40,0,0,0,40,40h3.65A80.13,80.13,0,0,0,120,191.61V216H96a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16H136V191.58c31.94-3.23,58.44-25.64,68.08-55.58H208a40,40,0,0,0,40-40V80A16,16,0,0,0,232,64ZM48,120A24,24,0,0,1,24,96V80H48v32q0,4,.39,8Zm144-8.9c0,35.52-29,64.64-64,64.9a64,64,0,0,1-64-64V56H192ZM232,96a24,24,0,0,1-24,24h-.5a81.81,81.81,0,0,0,.5-8.9V80h24Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,64H208V48a8,8,0,0,0-8-8H56a8,8,0,0,0-8,8V64H24A16,16,0,0,0,8,80V96a40,40,0,0,0,40,40h3.65A80.13,80.13,0,0,0,120,191.61V216H96a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16H136V191.58c31.94-3.23,58.44-25.64,68.08-55.58H208a40,40,0,0,0,40-40V80A16,16,0,0,0,232,64ZM48,120A24,24,0,0,1,24,96V80H48v32q0,4,.39,8ZM232,96a24,24,0,0,1-24,24h-.5a81.81,81.81,0,0,0,.5-8.9V80h24Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,66H206V48a6,6,0,0,0-6-6H56a6,6,0,0,0-6,6V66H24A14,14,0,0,0,10,80V96a38,38,0,0,0,38,38h5.14A78,78,0,0,0,122,189.75V218H96a6,6,0,0,0,0,12h64a6,6,0,0,0,0-12H134V189.75c32.44-2.52,59.43-25.3,68.62-55.75H208a38,38,0,0,0,38-38V80A14,14,0,0,0,232,66ZM48,122A26,26,0,0,1,22,96V80a2,2,0,0,1,2-2H50v34a80.87,80.87,0,0,0,.65,10Zm146-10.9c0,36.62-29.38,66.63-65.5,66.9A66,66,0,0,1,62,112V54H194ZM234,96a26,26,0,0,1-26,26h-2.77a78.45,78.45,0,0,0,.77-10.9V78h26a2,2,0,0,1,2,2Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,64H208V48a8,8,0,0,0-8-8H56a8,8,0,0,0-8,8V64H24A16,16,0,0,0,8,80V96a40,40,0,0,0,40,40h3.65A80.13,80.13,0,0,0,120,191.61V216H96a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16H136V191.58c31.94-3.23,58.44-25.64,68.08-55.58H208a40,40,0,0,0,40-40V80A16,16,0,0,0,232,64ZM48,120A24,24,0,0,1,24,96V80H48v32q0,4,.39,8Zm144-8.9c0,35.52-29,64.64-64,64.9a64,64,0,0,1-64-64V56H192ZM232,96a24,24,0,0,1-24,24h-.5a81.81,81.81,0,0,0,.5-8.9V80h24Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M232,68H204V48a4,4,0,0,0-4-4H56a4,4,0,0,0-4,4V68H24A12,12,0,0,0,12,80V96a36,36,0,0,0,36,36h6.66A76,76,0,0,0,124,187.89V220H96a4,4,0,0,0,0,8h64a4,4,0,0,0,0-8H132V187.88c32.93-1.74,60.41-24.91,69.11-55.88H208a36,36,0,0,0,36-36V80A12,12,0,0,0,232,68ZM48,124A28,28,0,0,1,20,96V80a4,4,0,0,1,4-4H52v36a77,77,0,0,0,1,12Zm148-12.9c0,37.71-30.79,68.62-68,68.9a68,68,0,0,1-68-68V52H196ZM236,96a28,28,0,0,1-28,28h-5.1a77.35,77.35,0,0,0,1.1-12.9V76h28a4,4,0,0,1,4,4Z"}))]]),d1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M240.26,186.1,152.81,34.23h0a28.74,28.74,0,0,0-49.62,0L15.74,186.1a27.45,27.45,0,0,0,0,27.71A28.31,28.31,0,0,0,40.55,228h174.9a28.31,28.31,0,0,0,24.79-14.19A27.45,27.45,0,0,0,240.26,186.1Zm-20.8,15.7a4.46,4.46,0,0,1-4,2.2H40.55a4.46,4.46,0,0,1-4-2.2,3.56,3.56,0,0,1,0-3.73L124,46.2a4.77,4.77,0,0,1,8,0l87.44,151.87A3.56,3.56,0,0,1,219.46,201.8ZM116,136V104a12,12,0,0,1,24,0v32a12,12,0,0,1-24,0Zm28,40a16,16,0,1,1-16-16A16,16,0,0,1,144,176Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M215.46,216H40.54C27.92,216,20,202.79,26.13,192.09L113.59,40.22c6.3-11,22.52-11,28.82,0l87.46,151.87C236,202.79,228.08,216,215.46,216Z",opacity:"0.2"}),a.createElement("path",{d:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM222.93,203.8a8.5,8.5,0,0,1-7.48,4.2H40.55a8.5,8.5,0,0,1-7.48-4.2,7.59,7.59,0,0,1,0-7.72L120.52,44.21a8.75,8.75,0,0,1,15,0l87.45,151.87A7.59,7.59,0,0,1,222.93,203.8ZM120,144V104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,180Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM120,104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,88a12,12,0,1,1,12-12A12,12,0,0,1,128,192Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M235.07,189.09,147.61,37.22h0a22.75,22.75,0,0,0-39.22,0L20.93,189.09a21.53,21.53,0,0,0,0,21.72A22.35,22.35,0,0,0,40.55,222h174.9a22.35,22.35,0,0,0,19.6-11.19A21.53,21.53,0,0,0,235.07,189.09ZM224.66,204.8a10.46,10.46,0,0,1-9.21,5.2H40.55a10.46,10.46,0,0,1-9.21-5.2,9.51,9.51,0,0,1,0-9.72L118.79,43.21a10.75,10.75,0,0,1,18.42,0l87.46,151.87A9.51,9.51,0,0,1,224.66,204.8ZM122,144V104a6,6,0,0,1,12,0v40a6,6,0,0,1-12,0Zm16,36a10,10,0,1,1-10-10A10,10,0,0,1,138,180Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM222.93,203.8a8.5,8.5,0,0,1-7.48,4.2H40.55a8.5,8.5,0,0,1-7.48-4.2,7.59,7.59,0,0,1,0-7.72L120.52,44.21a8.75,8.75,0,0,1,15,0l87.45,151.87A7.59,7.59,0,0,1,222.93,203.8ZM120,144V104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,180Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M233.34,190.09,145.88,38.22h0a20.75,20.75,0,0,0-35.76,0L22.66,190.09a19.52,19.52,0,0,0,0,19.71A20.36,20.36,0,0,0,40.54,220H215.46a20.36,20.36,0,0,0,17.86-10.2A19.52,19.52,0,0,0,233.34,190.09ZM226.4,205.8a12.47,12.47,0,0,1-10.94,6.2H40.54a12.47,12.47,0,0,1-10.94-6.2,11.45,11.45,0,0,1,0-11.72L117.05,42.21a12.76,12.76,0,0,1,21.9,0L226.4,194.08A11.45,11.45,0,0,1,226.4,205.8ZM124,144V104a4,4,0,0,1,8,0v40a4,4,0,0,1-8,0Zm12,36a8,8,0,1,1-8-8A8,8,0,0,1,136,180Z"}))]]),o1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M144,204a16,16,0,1,1-16-16A16,16,0,0,1,144,204ZM239.61,83.91a176,176,0,0,0-223.22,0,12,12,0,1,0,15.23,18.55,152,152,0,0,1,192.76,0,12,12,0,1,0,15.23-18.55Zm-32.16,35.73a128,128,0,0,0-158.9,0,12,12,0,0,0,14.9,18.81,104,104,0,0,1,129.1,0,12,12,0,0,0,14.9-18.81ZM175.07,155.3a80.05,80.05,0,0,0-94.14,0,12,12,0,0,0,14.14,19.4,56,56,0,0,1,65.86,0,12,12,0,1,0,14.14-19.4Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M238.2,87.69l-104,125.43a8,8,0,0,1-12.3,0L17.8,87.69a7.79,7.79,0,0,1,1.31-11.21,180.75,180.75,0,0,1,217.78,0A7.79,7.79,0,0,1,238.2,87.69Z",opacity:"0.2"}),a.createElement("path",{d:"M247.89,80.91a15.93,15.93,0,0,0-6.17-10.81A186.67,186.67,0,0,0,128,32,186.67,186.67,0,0,0,14.28,70.1,15.93,15.93,0,0,0,8.11,80.91,15.65,15.65,0,0,0,11.65,92.8l104,125.43A15.93,15.93,0,0,0,128,224h0a15.93,15.93,0,0,0,12.31-5.77l104-125.43A15.65,15.65,0,0,0,247.89,80.91ZM128,208,24.09,82.74A170.76,170.76,0,0,1,128,48,170.76,170.76,0,0,1,231.91,82.74Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M244.35,92.8l-104,125.43A15.93,15.93,0,0,1,128,224h0a15.93,15.93,0,0,1-12.31-5.77L11.65,92.8A15.65,15.65,0,0,1,8.11,80.91,15.93,15.93,0,0,1,14.28,70.1,186.67,186.67,0,0,1,128,32,186.67,186.67,0,0,1,241.72,70.1a15.93,15.93,0,0,1,6.17,10.81A15.65,15.65,0,0,1,244.35,92.8Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M138,204a10,10,0,1,1-10-10A10,10,0,0,1,138,204ZM235.81,88.55a170,170,0,0,0-215.62,0,6,6,0,1,0,7.62,9.27,158,158,0,0,1,200.38,0,6,6,0,1,0,7.62-9.27Zm-32.08,35.79a122,122,0,0,0-151.46,0,6,6,0,0,0,7.46,9.41,110,110,0,0,1,136.54,0A6,6,0,0,0,200,135a6,6,0,0,0,3.73-10.7Zm-32.2,35.81a74,74,0,0,0-87.06,0,6,6,0,0,0,7.06,9.7,62,62,0,0,1,72.94,0,6,6,0,0,0,8.38-1.32A6,6,0,0,0,171.53,160.15Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M140,204a12,12,0,1,1-12-12A12,12,0,0,1,140,204ZM237.08,87A172,172,0,0,0,18.92,87,8,8,0,0,0,29.08,99.37a156,156,0,0,1,197.84,0A8,8,0,0,0,237.08,87ZM205,122.77a124,124,0,0,0-153.94,0A8,8,0,0,0,61,135.31a108,108,0,0,1,134.06,0,8,8,0,0,0,11.24-1.3A8,8,0,0,0,205,122.77Zm-32.26,35.76a76.05,76.05,0,0,0-89.42,0,8,8,0,0,0,9.42,12.94,60,60,0,0,1,70.58,0,8,8,0,1,0,9.42-12.94Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M136,204a8,8,0,1,1-8-8A8,8,0,0,1,136,204ZM234.54,90.1a168,168,0,0,0-213.08,0,4,4,0,1,0,5.08,6.18,160,160,0,0,1,202.92,0,4,4,0,0,0,5.08-6.18Zm-32.06,35.81a120,120,0,0,0-149,0,4,4,0,0,0,5,6.27,112,112,0,0,1,139,0,4,4,0,0,0,5-6.27Zm-32.13,35.86a72,72,0,0,0-84.7,0,4,4,0,1,0,4.7,6.46,64.07,64.07,0,0,1,75.3,0,4,4,0,0,0,5.58-.87A4,4,0,0,0,170.35,161.77Z"}))]]),p1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208.49,191.51a12,12,0,0,1-17,17L128,145,64.49,208.49a12,12,0,0,1-17-17L111,128,47.51,64.49a12,12,0,0,1,17-17L128,111l63.51-63.52a12,12,0,0,1,17,17L145,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z",opacity:"0.2"}),a.createElement("path",{d:"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM181.66,170.34a8,8,0,0,1-11.32,11.32L128,139.31,85.66,181.66a8,8,0,0,1-11.32-11.32L116.69,128,74.34,85.66A8,8,0,0,1,85.66,74.34L128,116.69l42.34-42.35a8,8,0,0,1,11.32,11.32L139.31,128Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M204.24,195.76a6,6,0,1,1-8.48,8.48L128,136.49,60.24,204.24a6,6,0,0,1-8.48-8.48L119.51,128,51.76,60.24a6,6,0,0,1,8.48-8.48L128,119.51l67.76-67.75a6,6,0,0,1,8.48,8.48L136.49,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M202.83,197.17a4,4,0,0,1-5.66,5.66L128,133.66,58.83,202.83a4,4,0,0,1-5.66-5.66L122.34,128,53.17,58.83a4,4,0,0,1,5.66-5.66L128,122.34l69.17-69.17a4,4,0,1,1,5.66,5.66L133.66,128Z"}))]]),g1=new Map([["bold",a.createElement(a.Fragment,null,a.createElement("path",{d:"M168.49,104.49,145,128l23.52,23.51a12,12,0,0,1-17,17L128,145l-23.51,23.52a12,12,0,0,1-17-17L111,128,87.51,104.49a12,12,0,0,1,17-17L128,111l23.51-23.52a12,12,0,0,1,17,17ZM236,128A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-24,0a84,84,0,1,0-84,84A84.09,84.09,0,0,0,212,128Z"}))],["duotone",a.createElement(a.Fragment,null,a.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),a.createElement("path",{d:"M165.66,101.66,139.31,128l26.35,26.34a8,8,0,0,1-11.32,11.32L128,139.31l-26.34,26.35a8,8,0,0,1-11.32-11.32L116.69,128,90.34,101.66a8,8,0,0,1,11.32-11.32L128,116.69l26.34-26.35a8,8,0,0,1,11.32,11.32ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["fill",a.createElement(a.Fragment,null,a.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm37.66,130.34a8,8,0,0,1-11.32,11.32L128,139.31l-26.34,26.35a8,8,0,0,1-11.32-11.32L116.69,128,90.34,101.66a8,8,0,0,1,11.32-11.32L128,116.69l26.34-26.35a8,8,0,0,1,11.32,11.32L139.31,128Z"}))],["light",a.createElement(a.Fragment,null,a.createElement("path",{d:"M164.24,100.24,136.48,128l27.76,27.76a6,6,0,1,1-8.48,8.48L128,136.48l-27.76,27.76a6,6,0,0,1-8.48-8.48L119.52,128,91.76,100.24a6,6,0,0,1,8.48-8.48L128,119.52l27.76-27.76a6,6,0,0,1,8.48,8.48ZM230,128A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128Z"}))],["regular",a.createElement(a.Fragment,null,a.createElement("path",{d:"M165.66,101.66,139.31,128l26.35,26.34a8,8,0,0,1-11.32,11.32L128,139.31l-26.34,26.35a8,8,0,0,1-11.32-11.32L116.69,128,90.34,101.66a8,8,0,0,1,11.32-11.32L128,116.69l26.34-26.35a8,8,0,0,1,11.32,11.32ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"}))],["thin",a.createElement(a.Fragment,null,a.createElement("path",{d:"M162.83,98.83,133.66,128l29.17,29.17a4,4,0,0,1-5.66,5.66L128,133.66,98.83,162.83a4,4,0,0,1-5.66-5.66L122.34,128,93.17,98.83a4,4,0,0,1,5.66-5.66L128,122.34l29.17-29.17a4,4,0,1,1,5.66,5.66ZM228,128A100,100,0,1,1,128,28,100.11,100.11,0,0,1,228,128Zm-8,0a92,92,0,1,0-92,92A92.1,92.1,0,0,0,220,128Z"}))]]),L1=a.createContext({color:"currentColor",size:"1em",weight:"regular",mirrored:!1}),l=a.forwardRef((e,t)=>{const{alt:m,color:r,size:n,weight:c,mirrored:h0,children:H0,weights:V0,...M0}=e,{color:E0="currentColor",size:A,weight:d0="regular",mirrored:o0=!1,...p0}=a.useContext(L1);return a.createElement("svg",{ref:t,xmlns:"http://www.w3.org/2000/svg",width:n??A,height:n??A,fill:r??E0,viewBox:"0 0 256 256",transform:h0||o0?"scale(-1, 1)":void 0,...p0,...M0},!!m&&a.createElement("title",null,m),H0,V0.get(c??d0))});l.displayName="IconBase";const Z=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:g0}));Z.displayName="ArrowRightIcon";const s1=Z,h=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:L0}));h.displayName="ArrowSquareOutIcon";const v1=h,H=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:u0}));H.displayName="ArrowsClockwiseIcon";const i1=H,V=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:s0}));V.displayName="BookOpenIcon";const F1=V,M=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:v0}));M.displayName="BrainIcon";const f1=M,E=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:i0}));E.displayName="BugIcon";const w1=E,d=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:F0}));d.displayName="CalendarBlankIcon";const $1=d,o=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:f0}));o.displayName="CaretDownIcon";const C1=o,p=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:w0}));p.displayName="CaretUpIcon";const y1=p,g=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:$0}));g.displayName="ChartBarIcon";const b1=g,L=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:C0}));L.displayName="ChartLineIcon";const I1=L,u=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:y0}));u.displayName="ChatTextIcon";const N1=u,s=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:b0}));s.displayName="CheckIcon";const R1=s,v=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:I0}));v.displayName="CheckCircleIcon";const q1=v,i=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:N0}));i.displayName="ClockIcon";const S1=i,F=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:R0}));F.displayName="ClockCountdownIcon";const k1=F,f=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:q0}));f.displayName="CloudIcon";const x1=f,w=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:S0}));w.displayName="CloudSlashIcon";const B1=w,$=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:k0}));$.displayName="CommandIcon";const Q1=$,C=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:x0}));C.displayName="CopyIcon";const G1=C,y=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:B0}));y.displayName="DatabaseIcon";const D1=y,b=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:Q0}));b.displayName="DownloadSimpleIcon";const z1=b,I=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:G0}));I.displayName="GearIcon";const T1=I,N=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:D0}));N.displayName="GitBranchIcon";const W1=N,R=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:z0}));R.displayName="GithubLogoIcon";const j1=R,q=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:T0}));q.displayName="GraphIcon";const O1=q,S=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:W0}));S.displayName="HardDriveIcon";const U1=S,k=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:j0}));k.displayName="HeartbeatIcon";const X1=k,x=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:O0}));x.displayName="InfoIcon";const J1=x,B=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:U0}));B.displayName="LightbulbIcon";const K1=B,Q=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:X0}));Q.displayName="LightningIcon";const P1=Q,G=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:J0}));G.displayName="LinkIcon";const Y1=G,D=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:K0}));D.displayName="LockIcon";const _1=D,z=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:P0}));z.displayName="MagnifyingGlassIcon";const a2=z,T=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:Y0}));T.displayName="MonitorIcon";const e2=T,W=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:_0}));W.displayName="MoonIcon";const t2=W,j=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:a1}));j.displayName="QuestionIcon";const l2=j,O=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:e1}));O.displayName="ShareNetworkIcon";const n2=O,U=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:t1}));U.displayName="ShieldIcon";const m2=U,X=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:l1}));X.displayName="ShieldWarningIcon";const r2=X,J=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:n1}));J.displayName="ShuffleIcon";const c2=J,K=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:m1}));K.displayName="SidebarSimpleIcon";const A2=K,P=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:r1}));P.displayName="SparkleIcon";const Z2=P,Y=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:c1}));Y.displayName="SquaresFourIcon";const h2=Y,_=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:A1}));_.displayName="StackIcon";const H2=_,a0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:Z1}));a0.displayName="SunIcon";const V2=a0,e0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:h1}));e0.displayName="SwapIcon";const M2=e0,t0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:H1}));t0.displayName="SwordIcon";const E2=t0,l0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:V1}));l0.displayName="TrashIcon";const d2=l0,n0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:M1}));n0.displayName="TrendUpIcon";const o2=n0,m0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:E1}));m0.displayName="TrophyIcon";const p2=m0,r0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:d1}));r0.displayName="WarningIcon";const g2=r0,c0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:o1}));c0.displayName="WifiHighIcon";const L2=c0,A0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:p1}));A0.displayName="XIcon";const u2=A0,Z0=a.forwardRef((e,t)=>a.createElement(l,{ref:t,...e,weights:g1}));Z0.displayName="XCircleIcon";const s2=Z0;export{p2 as $,g2 as A,G1 as B,F1 as C,v1 as D,u2 as E,Y1 as F,P1 as G,d2 as H,y1 as I,C1 as J,K1 as K,s1 as L,k1 as M,M2 as N,W1 as O,$1 as P,w1 as Q,N1 as R,j1 as S,i1 as T,B1 as U,L2 as V,m2 as W,c2 as X,E2 as Y,R1 as Z,z1 as _,X1 as a,D1 as a0,r2 as b,f1 as c,S1 as d,o2 as e,n2 as f,x1 as g,Z2 as h,b1 as i,I1 as j,U1 as k,T1 as l,a2 as m,h2 as n,Q1 as o,H2 as p,_1 as q,A2 as r,O1 as s,l2 as t,e2 as u,t2 as v,V2 as w,q1 as x,J1 as y,s2 as z}; diff --git a/src/surreal_memory/server/static/dist/index.html b/src/surreal_memory/server/static/dist/index.html index 083564bf..30b72795 100644 --- a/src/surreal_memory/server/static/dist/index.html +++ b/src/surreal_memory/server/static/dist/index.html @@ -5,13 +5,13 @@ dashboard - + - + - +
From ca8295d543adb917736c6396791561fea97b2ad8 Mon Sep 17 00:00:00 2001 From: Toni Nowak Date: Fri, 17 Jul 2026 16:12:28 +0200 Subject: [PATCH 09/12] feat: smem reasoning CLI + smem_reasoning MCP tool (U9) cli/commands/reasoning.py: new Typer sub-app `smem reasoning` with status (trace/pattern stats + per-model coverage), mine (--backfill/--dry-run/--models, gated on mining_enabled unless --force), patterns (--model/--category), and clear (--model privacy wipe). Registered in cli/main.py. Mirrors commands/habits.py. mcp/reasoning_handler.py: new ReasoningHandler mixin exposing smem_reasoning (actions status/mine/patterns/config), registered in mcp/server.py + schema in tool_schemas.py (58 tools now). mine runs on create_isolated_storage so a concurrent MCP call (HTTP transport is not serialized) can't redirect its graph writes into the wrong brain; gated on mining_enabled. Both surfaces are thin wrappers over the U3/U4/U7 engine + storage layer (get_reasoning_stats, reasoning_coverage, ingest+distill honoring mining_models, delete_reasoning_traces_by_model). Tests: test_cli_reasoning (8) + test_mcp_reasoning (7) + test_mcp count bump. python-reviewer APPROVE (1 HIGH + 2 MED fixed). --- src/surreal_memory/cli/commands/reasoning.py | 297 +++++++++++++++++++ src/surreal_memory/cli/main.py | 2 + src/surreal_memory/mcp/reasoning_handler.py | 162 ++++++++++ src/surreal_memory/mcp/server.py | 3 + src/surreal_memory/mcp/tool_schemas.py | 44 +++ tests/unit/test_cli_reasoning.py | 239 +++++++++++++++ tests/unit/test_mcp.py | 5 +- tests/unit/test_mcp_reasoning.py | 190 ++++++++++++ 8 files changed, 940 insertions(+), 2 deletions(-) create mode 100644 src/surreal_memory/cli/commands/reasoning.py create mode 100644 src/surreal_memory/mcp/reasoning_handler.py create mode 100644 tests/unit/test_cli_reasoning.py create mode 100644 tests/unit/test_mcp_reasoning.py diff --git a/src/surreal_memory/cli/commands/reasoning.py b/src/surreal_memory/cli/commands/reasoning.py new file mode 100644 index 00000000..6826b022 --- /dev/null +++ b/src/surreal_memory/cli/commands/reasoning.py @@ -0,0 +1,297 @@ +"""Reasoning-training CLI commands (status / mine / patterns / clear). + +Thin wrappers over the reasoning engine + storage (NOT the HTTP dashboard router): +mine model ``thinking`` into ReasoningBank patterns and inspect/clear them. +""" + +from __future__ import annotations + +from typing import Annotated, Any + +import typer + +from surreal_memory.cli._helpers import get_config, get_storage, output_result, run_async + +reasoning_app = typer.Typer( + help="Reasoning-training commands (mine model thinking into strategies)" +) + +_PATTERN_FETCH_LIMIT = 5000 + + +def _split_models(models: str | None) -> tuple[str, ...]: + """Parse a comma-separated --models value into a tuple of model names.""" + if not models: + return () + return tuple(m.strip() for m in models.split(",") if m.strip()) + + +@reasoning_app.command("status") +def reasoning_status( + json_output: Annotated[bool, typer.Option("--json", "-j", help="Output as JSON")] = False, +) -> None: + """Show reasoning-training status: trace counts, learned patterns, per-model coverage. + + Examples: + smem reasoning status + smem reasoning status --json + """ + + async def _status() -> None: + from surreal_memory.engine.reasoning_distiller import reasoning_coverage + from surreal_memory.unified_config import get_config as get_unified_config + + config = get_config() + storage = await get_storage(config) + try: + brain_id = storage.brain_id or "" + if not brain_id: + typer.secho("No brain configured.", fg=typer.colors.RED, err=True) + raise typer.Exit(1) + + ucfg = get_unified_config() + stats = await storage.get_reasoning_stats(brain_id) + fibers = await storage.find_fibers( + metadata_key="_reasoning_pattern", limit=_PATTERN_FETCH_LIMIT + ) + pattern_counts: dict[str, int] = {} + for f in fibers: + m = str(f.metadata.get("_source_model", "")) + if m: + pattern_counts[m] = pattern_counts.get(m, 0) + 1 + + models = sorted(set(stats.get("by_model", {})) | set(pattern_counts)) + per_model: list[dict[str, Any]] = [] + for m in models: + cov = await reasoning_coverage(storage, m, ucfg) + tstats = stats.get("by_model", {}).get(m, {}) + per_model.append( + { + "model": m, + "trace_count": tstats.get("trace_count", 0), + "unprocessed": tstats.get("unprocessed", 0), + "pattern_count": pattern_counts.get(m, 0), + "coverage_percent": cov["coverage_percent"], + } + ) + + result = { + "total_traces": stats.get("total", 0), + "unprocessed_traces": stats.get("unprocessed", 0), + "total_patterns": len(fibers), + "mining_enabled": ucfg.reasoning_training.mining_enabled, + "injection_enabled": ucfg.reasoning_training.injection_enabled, + "models": per_model, + } + + if json_output: + output_result(result, True) + else: + typer.echo( + f"Reasoning traces: {result['total_traces']} " + f"({result['unprocessed_traces']} unprocessed)" + ) + typer.echo(f"Learned patterns: {result['total_patterns']}") + typer.echo( + f"Mining: {'on' if result['mining_enabled'] else 'off'} | " + f"Injection: {'on' if result['injection_enabled'] else 'off'}" + ) + if per_model: + typer.echo("\nPer model:") + for pm in per_model: + typer.echo( + f" {pm['model']}: {pm['trace_count']} traces, " + f"{pm['pattern_count']} patterns, {pm['coverage_percent']}% coverage" + ) + finally: + await storage.close() + + run_async(_status()) + + +@reasoning_app.command("mine") +def reasoning_mine( + backfill: Annotated[ + bool, typer.Option("--backfill", help="Scan the full history (scan_lookback_days=0)") + ] = False, + dry_run: Annotated[ + bool, typer.Option("--dry-run", "-n", help="Don't write — report a no-op") + ] = False, + models: Annotated[ + str | None, typer.Option("--models", help="Comma-separated source models to restrict to") + ] = None, + force: Annotated[ + bool, typer.Option("--force", "-f", help="Run even if mining is disabled in config") + ] = False, + json_output: Annotated[bool, typer.Option("--json", "-j", help="Output as JSON")] = False, +) -> None: + """Mine reasoning traces from ~/.claude transcripts and distill patterns. + + Examples: + smem reasoning mine + smem reasoning mine --backfill --models claude-fable-5,claude-sonnet-5 + """ + + async def _mine() -> None: + from dataclasses import replace as dc_replace + + from surreal_memory.engine.reasoning_distiller import distill_reasoning_patterns + from surreal_memory.engine.reasoning_miner import ingest_reasoning_traces + from surreal_memory.unified_config import get_config as get_unified_config + + config = get_config() + storage = await get_storage(config) + try: + brain_id = storage.brain_id or "" + if not brain_id: + typer.secho("No brain configured.", fg=typer.colors.RED, err=True) + raise typer.Exit(1) + + ucfg = get_unified_config() + if not ucfg.reasoning_training.mining_enabled and not force: + # Privacy: don't scan ~/.claude transcripts unless mining is enabled. + typer.secho( + "Mining is disabled. Enable it in config or pass --force.", + fg=typer.colors.YELLOW, + err=True, + ) + raise typer.Exit(1) + + if dry_run: + result = {"traces_ingested": 0, "patterns_learned": 0, "dry_run": True} + if json_output: + output_result(result, True) + else: + typer.echo("Dry run: no changes.") + return + + rt = ucfg.reasoning_training + overrides: dict[str, Any] = {} + if backfill: + overrides["scan_lookback_days"] = 0 + model_list = _split_models(models) + if model_list: + overrides["mining_models"] = model_list + run_cfg = dc_replace(ucfg, reasoning_training=dc_replace(rt, **overrides)) + + ingest = await ingest_reasoning_traces(storage, brain_id, run_cfg) + distill = await distill_reasoning_patterns(storage, brain_id, run_cfg) + result = { + "traces_ingested": ingest.traces_ingested, + "patterns_learned": distill.patterns_learned, + } + if json_output: + output_result(result, True) + else: + typer.echo( + f"Mined {result['traces_ingested']} traces, " + f"learned {result['patterns_learned']} patterns." + ) + finally: + await storage.close() + + run_async(_mine()) + + +@reasoning_app.command("patterns") +def reasoning_patterns( + model: Annotated[ + str | None, typer.Option("--model", "-m", help="Filter by source model") + ] = None, + category: Annotated[ + str | None, typer.Option("--category", "-c", help="Filter by category") + ] = None, + json_output: Annotated[bool, typer.Option("--json", "-j", help="Output as JSON")] = False, +) -> None: + """List learned reasoning patterns. + + Examples: + smem reasoning patterns + smem reasoning patterns --model claude-fable-5 --category debugging + """ + + async def _patterns() -> None: + config = get_config() + storage = await get_storage(config) + try: + if not (storage.brain_id or ""): + typer.secho("No brain configured.", fg=typer.colors.RED, err=True) + raise typer.Exit(1) + fibers = await storage.find_fibers( + metadata_key="_reasoning_pattern", limit=_PATTERN_FETCH_LIMIT + ) + rows: list[dict[str, Any]] = [] + for f in fibers: + md = f.metadata + if model and md.get("_source_model") != model: + continue + if category and md.get("_reasoning_category") != category: + continue + rows.append( + { + "id": f.id, + "source_model": md.get("_source_model", ""), + "category": md.get("_reasoning_category", ""), + "title": md.get("_reasoning_title", ""), + "confidence": md.get("_reasoning_confidence", 0.0), + "frequency": md.get("_reasoning_frequency", 0), + } + ) + rows.sort( + key=lambda r: float(r["confidence"] or 0.0) * float(r["frequency"] or 0), + reverse=True, + ) + + if json_output: + output_result({"patterns": rows, "count": len(rows)}, True) + else: + if not rows: + typer.echo("No learned patterns.") + return + typer.echo(f"Learned patterns ({len(rows)}):") + for r in rows: + typer.echo( + f" [{r['category']}] {r['title']} — {r['source_model']} " + f"(conf {float(r['confidence'] or 0.0):.2f}, freq {r['frequency']})" + ) + finally: + await storage.close() + + run_async(_patterns()) + + +@reasoning_app.command("clear") +def reasoning_clear( + model: Annotated[str, typer.Option("--model", "-m", help="Model whose staged traces to wipe")], + force: Annotated[bool, typer.Option("--force", "-f", help="Skip confirmation")] = False, + json_output: Annotated[bool, typer.Option("--json", "-j", help="Output as JSON")] = False, +) -> None: + """Wipe staged reasoning traces for a model (privacy). + + Examples: + smem reasoning clear --model claude-fable-5 + smem reasoning clear --model claude-fable-5 --force + """ + + async def _clear() -> None: + config = get_config() + storage = await get_storage(config) + try: + brain_id = storage.brain_id or "" + if not brain_id: + typer.secho("No brain configured.", fg=typer.colors.RED, err=True) + raise typer.Exit(1) + + if not force and not typer.confirm(f"Wipe all staged reasoning traces for {model!r}?"): + typer.echo("Cancelled.") + return + + deleted = await storage.delete_reasoning_traces_by_model(brain_id, model) + if json_output: + output_result({"deleted": deleted}, True) + else: + typer.echo(f"Wiped {deleted} reasoning trace(s) for {model}.") + finally: + await storage.close() + + run_async(_clear()) diff --git a/src/surreal_memory/cli/main.py b/src/surreal_memory/cli/main.py index 12fdbfc5..400fb3cc 100755 --- a/src/surreal_memory/cli/main.py +++ b/src/surreal_memory/cli/main.py @@ -99,6 +99,7 @@ def _app_callback( from surreal_memory.cli.commands.config_cmd import config_app # noqa: E402 from surreal_memory.cli.commands.habits import habits_app # noqa: E402 from surreal_memory.cli.commands.project import project_app # noqa: E402 +from surreal_memory.cli.commands.reasoning import reasoning_app # noqa: E402 from surreal_memory.cli.commands.shared import shared_app # noqa: E402 from surreal_memory.cli.commands.storage import storage_app # noqa: E402 from surreal_memory.cli.commands.telegram import app as telegram_app # noqa: E402 @@ -110,6 +111,7 @@ def _app_callback( app.add_typer(shared_app, name="shared") app.add_typer(storage_app, name="storage") app.add_typer(habits_app, name="habits") +app.add_typer(reasoning_app, name="reasoning") app.add_typer(version_app, name="version") app.add_typer(telegram_app, name="telegram") diff --git a/src/surreal_memory/mcp/reasoning_handler.py b/src/surreal_memory/mcp/reasoning_handler.py new file mode 100644 index 00000000..eb806c56 --- /dev/null +++ b/src/surreal_memory/mcp/reasoning_handler.py @@ -0,0 +1,162 @@ +"""MCP handler mixin for reasoning-training (status / mine / patterns / config). + +Thin wrapper over the reasoning engine + storage, mirroring the smem_reasoning +dashboard router. Handlers return plain dicts — the server wraps them as MCP +TextContent. +""" + +from __future__ import annotations + +import logging +from typing import TYPE_CHECKING, Any + +from surreal_memory.mcp.tool_handler_utils import _get_brain_or_error + +if TYPE_CHECKING: + from surreal_memory.storage.base import NeuralStorage + from surreal_memory.unified_config import UnifiedConfig + +logger = logging.getLogger(__name__) + +_PATTERN_FETCH_LIMIT = 5000 + + +class ReasoningHandler: + """Mixin providing the ``smem_reasoning`` tool (status/mine/patterns/config).""" + + if TYPE_CHECKING: + config: UnifiedConfig + + async def get_storage(self) -> NeuralStorage: + raise NotImplementedError + + async def _reasoning(self, args: dict[str, Any]) -> dict[str, Any]: + """Dispatch the reasoning tool by ``action``.""" + action = str(args.get("action", "status")) + + # config is a pure config read — no storage/brain needed. + if action == "config": + return {"config": self.config.reasoning_training.to_dict()} + + storage = await self.get_storage() + brain, err = await _get_brain_or_error(storage) + if err: + return err + brain_id = brain.id + + if action == "status": + return await self._reasoning_status(storage, brain_id) + if action == "patterns": + return await self._reasoning_patterns(storage, args) + if action == "mine": + return await self._reasoning_mine(brain_id, args) + return {"error": f"Unknown action: {action}"} + + async def _reasoning_status(self, storage: NeuralStorage, brain_id: str) -> dict[str, Any]: + from surreal_memory.engine.reasoning_distiller import reasoning_coverage + + stats = await storage.get_reasoning_stats(brain_id) + fibers = await storage.find_fibers( + metadata_key="_reasoning_pattern", limit=_PATTERN_FETCH_LIMIT + ) + pattern_counts: dict[str, int] = {} + for f in fibers: + m = str(f.metadata.get("_source_model", "")) + if m: + pattern_counts[m] = pattern_counts.get(m, 0) + 1 + + models = sorted(set(stats.get("by_model", {})) | set(pattern_counts)) + per_model: list[dict[str, Any]] = [] + for m in models: + cov = await reasoning_coverage(storage, m, self.config) + tstats = stats.get("by_model", {}).get(m, {}) + per_model.append( + { + "model": m, + "trace_count": tstats.get("trace_count", 0), + "unprocessed": tstats.get("unprocessed", 0), + "pattern_count": pattern_counts.get(m, 0), + "coverage_percent": cov["coverage_percent"], + } + ) + + return { + "total_traces": stats.get("total", 0), + "unprocessed_traces": stats.get("unprocessed", 0), + "total_patterns": len(fibers), + "mining_enabled": self.config.reasoning_training.mining_enabled, + "injection_enabled": self.config.reasoning_training.injection_enabled, + "models": per_model, + } + + async def _reasoning_patterns( + self, storage: NeuralStorage, args: dict[str, Any] + ) -> dict[str, Any]: + model = args.get("model") + category = args.get("category") + limit = max(1, min(int(args.get("limit", 50) or 50), 100)) + + fibers = await storage.find_fibers( + metadata_key="_reasoning_pattern", limit=_PATTERN_FETCH_LIMIT + ) + rows: list[dict[str, Any]] = [] + for f in fibers: + md = f.metadata + if model and md.get("_source_model") != model: + continue + if category and md.get("_reasoning_category") != category: + continue + rows.append( + { + "id": f.id, + "source_model": md.get("_source_model", ""), + "category": md.get("_reasoning_category", ""), + "title": md.get("_reasoning_title", ""), + "confidence": md.get("_reasoning_confidence", 0.0), + "frequency": md.get("_reasoning_frequency", 0), + } + ) + rows.sort( + key=lambda r: float(r["confidence"] or 0.0) * float(r["frequency"] or 0), reverse=True + ) + return {"patterns": rows[:limit], "count": len(rows)} + + async def _reasoning_mine(self, brain_id: str, args: dict[str, Any]) -> dict[str, Any]: + from dataclasses import replace as dc_replace + + from surreal_memory.engine.reasoning_distiller import distill_reasoning_patterns + from surreal_memory.engine.reasoning_miner import ingest_reasoning_traces + from surreal_memory.unified_config import create_isolated_storage + + rt = self.config.reasoning_training + if not rt.mining_enabled: + # Privacy: don't scan ~/.claude transcripts unless mining is enabled. + return {"error": "Mining is disabled; enable reasoning_training.mining_enabled first"} + if args.get("dry_run"): + return {"traces_ingested": 0, "patterns_learned": 0, "dry_run": True} + + overrides: dict[str, Any] = {} + if args.get("backfill"): + overrides["scan_lookback_days"] = 0 + models = args.get("models") + if isinstance(models, list) and models: + overrides["mining_models"] = tuple(str(m) for m in models) + elif isinstance(models, str) and models.strip(): + overrides["mining_models"] = tuple(m.strip() for m in models.split(",") if m.strip()) + run_cfg = dc_replace(self.config, reasoning_training=dc_replace(rt, **overrides)) + + # Isolated (non-cached) storage so a concurrently-served MCP call's + # set_brain() on the shared SurrealDB singleton can't redirect this job's + # graph writes into the wrong brain (the MCP HTTP transport is not serialized). + storage = await create_isolated_storage(brain_id) + owns_storage = self.config.storage_backend == "surrealdb" + try: + ingest = await ingest_reasoning_traces(storage, brain_id, run_cfg) + distill = await distill_reasoning_patterns(storage, brain_id, run_cfg) + return { + "traces_ingested": ingest.traces_ingested, + "patterns_learned": distill.patterns_learned, + } + finally: + if owns_storage: + await storage.close() diff --git a/src/surreal_memory/mcp/server.py b/src/surreal_memory/mcp/server.py index 85b3c968..e7ceb0d5 100755 --- a/src/surreal_memory/mcp/server.py +++ b/src/surreal_memory/mcp/server.py @@ -44,6 +44,7 @@ from surreal_memory.mcp.narrative_handler import NarrativeHandler from surreal_memory.mcp.onboarding_handler import OnboardingHandler from surreal_memory.mcp.prompt import get_mcp_instructions, get_system_prompt +from surreal_memory.mcp.reasoning_handler import ReasoningHandler from surreal_memory.mcp.review_handler import ReviewHandler from surreal_memory.mcp.scheduled_consolidation_handler import ScheduledConsolidationHandler from surreal_memory.mcp.session_handler import SessionHandler @@ -109,6 +110,7 @@ class MCPServer( SyncToolHandler, TelegramHandler, DriftHandler, + ReasoningHandler, ): """MCP server that exposes Surreal-Memory tools. @@ -245,6 +247,7 @@ async def call_tool(self, name: str, arguments: dict[str, Any]) -> dict[str, Any "smem_health": self._health, "smem_evolution": self._evolution, "smem_habits": self._habits, + "smem_reasoning": self._reasoning, "smem_version": self._version, "smem_transplant": self._transplant, "smem_conflicts": self._conflicts, diff --git a/src/surreal_memory/mcp/tool_schemas.py b/src/surreal_memory/mcp/tool_schemas.py index 6216a3a9..9e083116 100755 --- a/src/surreal_memory/mcp/tool_schemas.py +++ b/src/surreal_memory/mcp/tool_schemas.py @@ -829,6 +829,50 @@ def get_tool_schemas_for_tier(tier: str) -> list[dict[str, Any]]: "required": ["action"], }, }, + { + "name": "smem_reasoning", + "description": "Reasoning training: status, mine, patterns, or config.", + "inputSchema": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": ["status", "mine", "patterns", "config"], + "description": ( + "status=trace/pattern stats + per-model coverage, " + "mine=scan ~/.claude thinking and distill patterns (needs mining_enabled), " + "patterns=list learned patterns, config=show reasoning_training config" + ), + }, + "model": { + "type": "string", + "description": "Filter patterns by source model (patterns action)", + }, + "category": { + "type": "string", + "description": "Filter patterns by category (patterns action)", + }, + "limit": { + "type": "integer", + "description": "Max patterns to return, 1-100 (patterns action, default 50)", + }, + "models": { + "type": "array", + "items": {"type": "string"}, + "description": "Restrict mining to these source models (mine action)", + }, + "backfill": { + "type": "boolean", + "description": "Scan the full history for mining (mine action)", + }, + "dry_run": { + "type": "boolean", + "description": "Mine as a no-op without writing (mine action)", + }, + }, + "required": ["action"], + }, + }, { "name": "smem_version", "description": "Brain version control: snapshot, list, rollback, diff.", diff --git a/tests/unit/test_cli_reasoning.py b/tests/unit/test_cli_reasoning.py new file mode 100644 index 00000000..bc3b4f97 --- /dev/null +++ b/tests/unit/test_cli_reasoning.py @@ -0,0 +1,239 @@ +"""Tests for the `smem reasoning` CLI (status / mine / patterns / clear). + +Drives the real Typer app via CliRunner with the reasoning command's storage + +config patched (no live DB). The command imports get_config/get_storage from its +own module, and get_unified_config / the engine fns lazily inside handlers. +""" + +from __future__ import annotations + +import json +from pathlib import Path +from types import SimpleNamespace +from unittest.mock import AsyncMock, MagicMock, patch + +from typer.testing import CliRunner + +from surreal_memory.cli.main import app +from surreal_memory.unified_config import ReasoningTrainingConfig, UnifiedConfig + +runner = CliRunner() + +CLI = "surreal_memory.cli.commands.reasoning" + + +def _fiber( + fid: str, model: str, category: str, title: str = "t", conf: float = 1.0, freq: int = 3 +) -> SimpleNamespace: + return SimpleNamespace( + id=fid, + summary=title, + metadata={ + "_reasoning_pattern": True, + "_source_model": model, + "_reasoning_category": category, + "_reasoning_title": title, + "_reasoning_confidence": conf, + "_reasoning_frequency": freq, + }, + ) + + +def _storage(stats: dict | None = None, fibers: list | None = None, deleted: int = 0) -> AsyncMock: + s = AsyncMock() + s.brain_id = "default" + s.get_reasoning_stats = AsyncMock( + return_value=stats or {"by_model": {}, "by_category": {}, "total": 0, "unprocessed": 0} + ) + s.find_fibers = AsyncMock(return_value=fibers or []) + s.delete_reasoning_traces_by_model = AsyncMock(return_value=deleted) + s.close = AsyncMock() + return s + + +def _ucfg(tmp_path: Path, **rt: object) -> UnifiedConfig: + return UnifiedConfig( + data_dir=tmp_path / ".surrealmemory", + current_brain="default", + reasoning_training=ReasoningTrainingConfig(**rt), # type: ignore[arg-type] + ) + + +def test_status_json(tmp_path: Path) -> None: + storage = _storage( + stats={ + "by_model": { + "claude-fable-5": {"trace_count": 5, "unprocessed": 2, "last_trace_at": "x"} + }, + "by_category": {}, + "total": 5, + "unprocessed": 2, + }, + fibers=[_fiber("p1", "claude-fable-5", "debugging")], + ) + with ( + patch(f"{CLI}.get_config", MagicMock()), + patch(f"{CLI}.get_storage", new=AsyncMock(return_value=storage)), + patch("surreal_memory.unified_config.get_config", return_value=_ucfg(tmp_path)), + patch( + "surreal_memory.engine.reasoning_distiller.reasoning_coverage", + new=AsyncMock( + return_value={"by_category": {}, "covered": {}, "coverage_percent": 12.5} + ), + ), + ): + result = runner.invoke(app, ["reasoning", "status", "--json"]) + + assert result.exit_code == 0, result.output + data = json.loads(result.output) + assert data["total_traces"] == 5 + assert data["total_patterns"] == 1 + assert data["models"][0]["model"] == "claude-fable-5" + assert data["models"][0]["coverage_percent"] == 12.5 + + +def test_patterns_filter_by_model(tmp_path: Path) -> None: + storage = _storage( + fibers=[ + _fiber("p1", "claude-fable-5", "debugging", "verify"), + _fiber("p2", "claude-sonnet-5", "planning", "plan"), + ] + ) + with ( + patch(f"{CLI}.get_config", MagicMock()), + patch(f"{CLI}.get_storage", new=AsyncMock(return_value=storage)), + ): + result = runner.invoke( + app, ["reasoning", "patterns", "--model", "claude-fable-5", "--json"] + ) + + assert result.exit_code == 0, result.output + data = json.loads(result.output) + assert data["count"] == 1 + assert data["patterns"][0]["source_model"] == "claude-fable-5" + + +def test_clear_force(tmp_path: Path) -> None: + storage = _storage(deleted=3) + with ( + patch(f"{CLI}.get_config", MagicMock()), + patch(f"{CLI}.get_storage", new=AsyncMock(return_value=storage)), + ): + result = runner.invoke( + app, ["reasoning", "clear", "--model", "claude-fable-5", "--force", "--json"] + ) + + assert result.exit_code == 0, result.output + assert json.loads(result.output)["deleted"] == 3 + storage.delete_reasoning_traces_by_model.assert_awaited_once_with("default", "claude-fable-5") + + +def test_mine_disabled_exits_nonzero(tmp_path: Path) -> None: + storage = _storage() + with ( + patch(f"{CLI}.get_config", MagicMock()), + patch(f"{CLI}.get_storage", new=AsyncMock(return_value=storage)), + patch("surreal_memory.unified_config.get_config", return_value=_ucfg(tmp_path)), + ): + result = runner.invoke(app, ["reasoning", "mine"]) + + assert result.exit_code == 1 # mining disabled, no --force + + +def test_mine_runs_when_enabled(tmp_path: Path) -> None: + storage = _storage() + ingest = SimpleNamespace(traces_ingested=4, traces_scanned=10) + distill = SimpleNamespace(patterns_learned=2, traces_processed=4, models_seen=1) + with ( + patch(f"{CLI}.get_config", MagicMock()), + patch(f"{CLI}.get_storage", new=AsyncMock(return_value=storage)), + patch( + "surreal_memory.unified_config.get_config", + return_value=_ucfg(tmp_path, mining_enabled=True), + ), + patch( + "surreal_memory.engine.reasoning_miner.ingest_reasoning_traces", + new=AsyncMock(return_value=ingest), + ), + patch( + "surreal_memory.engine.reasoning_distiller.distill_reasoning_patterns", + new=AsyncMock(return_value=distill), + ), + ): + result = runner.invoke(app, ["reasoning", "mine", "--json"]) + + assert result.exit_code == 0, result.output + data = json.loads(result.output) + assert data["traces_ingested"] == 4 + assert data["patterns_learned"] == 2 + + +def test_mine_dry_run(tmp_path: Path) -> None: + storage = _storage() + with ( + patch(f"{CLI}.get_config", MagicMock()), + patch(f"{CLI}.get_storage", new=AsyncMock(return_value=storage)), + patch( + "surreal_memory.unified_config.get_config", + return_value=_ucfg(tmp_path, mining_enabled=True), + ), + ): + result = runner.invoke(app, ["reasoning", "mine", "--dry-run", "--json"]) + + assert result.exit_code == 0, result.output + data = json.loads(result.output) + assert data["dry_run"] is True + assert data["traces_ingested"] == 0 + + +def test_mine_force_bypasses_disabled(tmp_path: Path) -> None: + # --force runs mining even when mining_enabled is False (the privacy escape hatch). + storage = _storage() + ingest = SimpleNamespace(traces_ingested=1, traces_scanned=1) + distill = SimpleNamespace(patterns_learned=0, traces_processed=1, models_seen=1) + with ( + patch(f"{CLI}.get_config", MagicMock()), + patch(f"{CLI}.get_storage", new=AsyncMock(return_value=storage)), + patch("surreal_memory.unified_config.get_config", return_value=_ucfg(tmp_path)), + patch( + "surreal_memory.engine.reasoning_miner.ingest_reasoning_traces", + new=AsyncMock(return_value=ingest), + ), + patch( + "surreal_memory.engine.reasoning_distiller.distill_reasoning_patterns", + new=AsyncMock(return_value=distill), + ), + ): + result = runner.invoke(app, ["reasoning", "mine", "--force", "--json"]) + + assert result.exit_code == 0, result.output + assert json.loads(result.output)["traces_ingested"] == 1 + + +def test_mine_applies_overrides(tmp_path: Path) -> None: + # --backfill + --models must flow into the run config passed to the engine. + storage = _storage() + ingest_mock = AsyncMock(return_value=SimpleNamespace(traces_ingested=1, traces_scanned=1)) + distill_mock = AsyncMock( + return_value=SimpleNamespace(patterns_learned=0, traces_processed=1, models_seen=1) + ) + with ( + patch(f"{CLI}.get_config", MagicMock()), + patch(f"{CLI}.get_storage", new=AsyncMock(return_value=storage)), + patch( + "surreal_memory.unified_config.get_config", + return_value=_ucfg(tmp_path, mining_enabled=True), + ), + patch("surreal_memory.engine.reasoning_miner.ingest_reasoning_traces", new=ingest_mock), + patch( + "surreal_memory.engine.reasoning_distiller.distill_reasoning_patterns", new=distill_mock + ), + ): + result = runner.invoke( + app, ["reasoning", "mine", "--backfill", "--models", "a,b", "--json"] + ) + + assert result.exit_code == 0, result.output + run_cfg = ingest_mock.await_args.args[2] # (storage, brain_id, config) + assert run_cfg.reasoning_training.scan_lookback_days == 0 + assert run_cfg.reasoning_training.mining_models == ("a", "b") diff --git a/tests/unit/test_mcp.py b/tests/unit/test_mcp.py index 8264fad2..4d9f2316 100755 --- a/tests/unit/test_mcp.py +++ b/tests/unit/test_mcp.py @@ -44,7 +44,7 @@ def test_get_tools(self, server: MCPServer) -> None: with patch("surreal_memory.plugins.get_plugin_tools", return_value=[]): tools = server.get_tools() - assert len(tools) == 57 + assert len(tools) == 58 tool_names = {tool["name"] for tool in tools} assert tool_names == { "smem_remember", @@ -63,6 +63,7 @@ def test_get_tools(self, server: MCPServer) -> None: "smem_health", "smem_evolution", "smem_habits", + "smem_reasoning", "smem_version", "smem_transplant", "smem_conflicts", @@ -1057,7 +1058,7 @@ async def test_tools_list_message(self, server: MCPServer) -> None: assert response["id"] == 2 assert "result" in response assert "tools" in response["result"] - assert len(response["result"]["tools"]) == 57 + assert len(response["result"]["tools"]) == 58 @pytest.mark.asyncio async def test_tools_call_message(self, server: MCPServer) -> None: diff --git a/tests/unit/test_mcp_reasoning.py b/tests/unit/test_mcp_reasoning.py new file mode 100644 index 00000000..fd6c2951 --- /dev/null +++ b/tests/unit/test_mcp_reasoning.py @@ -0,0 +1,190 @@ +"""Tests for the smem_reasoning MCP tool (status / mine / patterns / config). + +Builds an MCPServer with a real UnifiedConfig (the mine action does dc_replace on +config, which needs a real dataclass) and a mocked storage, then drives +server.call_tool directly (mirrors test_mcp.py's TestMCPToolCalls). +""" + +from __future__ import annotations + +from pathlib import Path +from types import SimpleNamespace +from unittest.mock import AsyncMock, MagicMock, patch + +import pytest + +from surreal_memory.mcp.server import MCPServer +from surreal_memory.unified_config import ReasoningTrainingConfig, UnifiedConfig + + +def _fiber( + fid: str, model: str, category: str, title: str = "t", conf: float = 1.0, freq: int = 3 +) -> SimpleNamespace: + return SimpleNamespace( + id=fid, + summary=title, + metadata={ + "_reasoning_pattern": True, + "_source_model": model, + "_reasoning_category": category, + "_reasoning_title": title, + "_reasoning_confidence": conf, + "_reasoning_frequency": freq, + }, + ) + + +def _make_server(tmp_path: Path, **rt: object) -> MCPServer: + cfg = UnifiedConfig( + data_dir=tmp_path / ".surrealmemory", + current_brain="test-brain", + reasoning_training=ReasoningTrainingConfig(**rt), # type: ignore[arg-type] + ) + with patch("surreal_memory.mcp.server.get_config", return_value=cfg): + return MCPServer() + + +def _storage(stats: dict | None = None, fibers: list | None = None) -> AsyncMock: + s = AsyncMock() + s.brain_id = "test-brain" + s.get_brain = AsyncMock(return_value=MagicMock(id="test-brain")) + s.get_reasoning_stats = AsyncMock( + return_value=stats or {"by_model": {}, "by_category": {}, "total": 0, "unprocessed": 0} + ) + s.find_fibers = AsyncMock(return_value=fibers or []) + return s + + +@pytest.mark.asyncio +async def test_reasoning_config_action(tmp_path: Path) -> None: + server = _make_server(tmp_path, mining_enabled=True) + result = await server.call_tool("smem_reasoning", {"action": "config"}) + assert result["config"]["mining_enabled"] is True + + +@pytest.mark.asyncio +async def test_reasoning_status(tmp_path: Path) -> None: + server = _make_server(tmp_path) + storage = _storage( + stats={ + "by_model": { + "claude-fable-5": {"trace_count": 5, "unprocessed": 2, "last_trace_at": "x"} + }, + "by_category": {}, + "total": 5, + "unprocessed": 2, + }, + fibers=[_fiber("p1", "claude-fable-5", "debugging")], + ) + with ( + patch.object(server, "get_storage", return_value=storage), + patch( + "surreal_memory.engine.reasoning_distiller.reasoning_coverage", + new=AsyncMock( + return_value={"by_category": {}, "covered": {}, "coverage_percent": 12.5} + ), + ), + ): + result = await server.call_tool("smem_reasoning", {"action": "status"}) + + assert result["total_traces"] == 5 + assert result["total_patterns"] == 1 + assert result["models"][0]["model"] == "claude-fable-5" + assert result["models"][0]["coverage_percent"] == 12.5 + + +@pytest.mark.asyncio +async def test_reasoning_patterns_filter(tmp_path: Path) -> None: + server = _make_server(tmp_path) + storage = _storage( + fibers=[ + _fiber("p1", "claude-fable-5", "debugging", "verify"), + _fiber("p2", "claude-sonnet-5", "planning", "plan"), + ] + ) + with patch.object(server, "get_storage", return_value=storage): + result = await server.call_tool( + "smem_reasoning", {"action": "patterns", "model": "claude-fable-5"} + ) + + assert result["count"] == 1 + assert result["patterns"][0]["source_model"] == "claude-fable-5" + + +@pytest.mark.asyncio +async def test_reasoning_mine_disabled(tmp_path: Path) -> None: + server = _make_server(tmp_path) # mining_enabled defaults False + storage = _storage() + with patch.object(server, "get_storage", return_value=storage): + result = await server.call_tool("smem_reasoning", {"action": "mine"}) + + assert "error" in result + assert "disabled" in result["error"].lower() + + +@pytest.mark.asyncio +async def test_reasoning_mine_runs(tmp_path: Path) -> None: + server = _make_server(tmp_path, mining_enabled=True) + storage = _storage() + ingest = SimpleNamespace(traces_ingested=4, traces_scanned=10) + distill = SimpleNamespace(patterns_learned=2, traces_processed=4, models_seen=1) + with ( + patch.object(server, "get_storage", return_value=storage), + # mine runs on an isolated (non-cached) storage to avoid the shared-singleton race. + patch( + "surreal_memory.unified_config.create_isolated_storage", + new=AsyncMock(return_value=storage), + ), + patch( + "surreal_memory.engine.reasoning_miner.ingest_reasoning_traces", + new=AsyncMock(return_value=ingest), + ), + patch( + "surreal_memory.engine.reasoning_distiller.distill_reasoning_patterns", + new=AsyncMock(return_value=distill), + ), + ): + result = await server.call_tool("smem_reasoning", {"action": "mine"}) + + assert result["traces_ingested"] == 4 + assert result["patterns_learned"] == 2 + + +@pytest.mark.asyncio +async def test_reasoning_mine_applies_overrides(tmp_path: Path) -> None: + # backfill + models must flow into the run config passed to the engine. + server = _make_server(tmp_path, mining_enabled=True) + storage = _storage() + ingest_mock = AsyncMock(return_value=SimpleNamespace(traces_ingested=1, traces_scanned=1)) + distill_mock = AsyncMock( + return_value=SimpleNamespace(patterns_learned=0, traces_processed=1, models_seen=1) + ) + with ( + patch.object(server, "get_storage", return_value=storage), + patch( + "surreal_memory.unified_config.create_isolated_storage", + new=AsyncMock(return_value=storage), + ), + patch("surreal_memory.engine.reasoning_miner.ingest_reasoning_traces", new=ingest_mock), + patch( + "surreal_memory.engine.reasoning_distiller.distill_reasoning_patterns", new=distill_mock + ), + ): + await server.call_tool( + "smem_reasoning", {"action": "mine", "backfill": True, "models": ["a", "b"]} + ) + + run_cfg = ingest_mock.await_args.args[2] # (storage, brain_id, config) + assert run_cfg.reasoning_training.scan_lookback_days == 0 + assert run_cfg.reasoning_training.mining_models == ("a", "b") + + +@pytest.mark.asyncio +async def test_reasoning_unknown_action(tmp_path: Path) -> None: + server = _make_server(tmp_path) + storage = _storage() + with patch.object(server, "get_storage", return_value=storage): + result = await server.call_tool("smem_reasoning", {"action": "bogus"}) + + assert "error" in result + assert "Unknown action" in result["error"] From fb08965050d42c19de1153b01299a35854439c6a Mon Sep 17 00:00:00 2001 From: Toni Nowak Date: Fri, 17 Jul 2026 17:00:47 +0200 Subject: [PATCH 10/12] test: unblock full-suite verify for reasoning-training (U10) - bump cross-cutting assertions the feature legitimately shifted: SCHEMA_VERSION 39->40 (U1 reasoning_traces) in 5 tests; MCP full-tier tool count 57->58 (U9 smem_reasoning) in test_tool_tiers - conftest: import the real surrealdb SDK early so a unit-test module's `sys.modules["surrealdb"]=MagicMock()` stub can't leak into the live SurrealDB tests in the same serial session (no-op when SDK absent) - integration/test_surrealdb_synapse_migration: update stale v8 stamp assertions to v9 (SCHEMA_VERSION/TARGET_VERSION became 9 in v2.9.0, after this test file's last edit) and tolerate a retryable SurrealDB write-conflict in the two-parallel-migration race (exactly-once is still asserted independently via the count checks) --- tests/conftest.py | 9 +++++ .../test_surrealdb_synapse_migration.py | 33 +++++++++++++------ tests/unit/test_baby_mi_features.py | 2 +- tests/unit/test_cascading_retrieval.py | 2 +- tests/unit/test_ephemeral.py | 2 +- tests/unit/test_source_registry.py | 2 +- tests/unit/test_surrealdb_store.py | 4 ++- tests/unit/test_tiered_memory_phase1.py | 2 +- tests/unit/test_tool_tiers.py | 8 ++--- 9 files changed, 44 insertions(+), 20 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 902f5496..c692b894 100755 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -15,6 +15,15 @@ from surreal_memory.core.synapse import Synapse, SynapseType from surreal_memory.storage.memory_store import InMemoryStorage +# Import the real surrealdb SDK early (when installed) so it is present in +# sys.modules before any unit test module runs its +# `if "surrealdb" not in sys.modules: sys.modules["surrealdb"] = MagicMock()` +# stub. Otherwise that MagicMock leaks into the live SurrealDB tests in the same +# serial session, breaking `from surrealdb import AsyncSurreal` and awaits on the +# fake connection. No-op when surrealdb isn't installed (the stubs then apply). +with contextlib.suppress(ImportError): + import surrealdb # noqa: F401 + @pytest.fixture def brain_config() -> BrainConfig: diff --git a/tests/integration/test_surrealdb_synapse_migration.py b/tests/integration/test_surrealdb_synapse_migration.py index e357676e..af1ec405 100644 --- a/tests/integration/test_surrealdb_synapse_migration.py +++ b/tests/integration/test_surrealdb_synapse_migration.py @@ -198,7 +198,7 @@ async def test_v7_upgrade_preserves_count_ids_endpoints_export_and_merkle() -> N assert post_merkle == pre_merkle # schema_meta stamped + backup retained - assert await M._read_stamped_version(conn) == 8 + assert await M._read_stamped_version(conn) == 9 assert await M._count(conn, M.BACKUP_TABLE) == len(expected) # get_neighbors + get_path parity via native edges @@ -238,7 +238,7 @@ async def test_second_initialize_is_noop() -> None: store2 = _store(db) await store2.initialize() store2.set_brain(brain.id) - assert await M._read_stamped_version(conn) == 8 + assert await M._read_stamped_version(conn) == 9 assert len(await store2.get_all_synapses()) == len(expected) @@ -253,7 +253,7 @@ async def test_two_parallel_apply_migrations_run_exactly_once() -> None: await seeder.save_brain(brain) expected = await _seed_v7(conn, seeder, brain.id) - # ensure the v8 schema exists (as first connect would) before the race + # ensure the current schema exists (as first connect would) before the race from surreal_memory.storage.surrealdb.schema import ensure_schema await ensure_schema(conn) @@ -264,30 +264,43 @@ async def test_two_parallel_apply_migrations_run_exactly_once() -> None: M.apply_migrations(conn2), return_exceptions=True, ) - # both calls return 8 (one migrates, the other observes the completed migration); - # any MigrationLockError is acceptable, but no duplication may occur. + + # Acceptable per-call outcomes under the race: 9 = TARGET_VERSION (this call drove the + # 7->8->9 migration or observed it already complete), a MigrationError/MigrationLockError + # (lost the lock), or a *retryable* SurrealDB write-conflict — two live connections + # stamping/DDL-ing concurrently can collide, and the server explicitly flags these + # "This transaction can be retried". None of these may break the exactly-once guarantee, + # which the state assertions below verify independently (they fail if any transient left + # the migration incomplete), so a retryable transient is only tolerated when the end + # state is still correct. + def _acceptable(r: object) -> bool: + if r == 9 or isinstance(r, M.MigrationError): + return True + return isinstance(r, Exception) and "can be retried" in str(r).lower() + for r in results: - assert r == 8 or isinstance(r, M.MigrationError), f"unexpected result {r!r}" + assert _acceptable(r), f"unexpected result {r!r}" - assert await M._read_stamped_version(conn) == 8 + # Regardless of which call won the race, the migration must have completed exactly once. + assert await M._read_stamped_version(conn) == 9 assert await M._count(conn, "synapse") == len(expected) # migrated exactly once assert await M._count(conn, M.BACKUP_TABLE) == len(expected) @pytest.mark.asyncio -async def test_fresh_db_is_v8_directly_no_backup() -> None: +async def test_fresh_db_is_target_version_directly_no_backup() -> None: db = _fresh_db() conn = await _raw_conn(db) brain = Brain.create(name="fresh-brain") store = _store(db) - await store.initialize() # fresh DB -> v8 directly, no migration + await store.initialize() # fresh DB -> v9 (target) directly, no migration store.set_brain(brain.id) await store.save_brain(brain) info = await conn.query("INFO FOR DB") sdef = (info.get("tables", {}) or {}).get("synapse", "") assert "TYPE RELATION" in str(sdef) - assert await M._read_stamped_version(conn) == 8 + assert await M._read_stamped_version(conn) == 9 # no migration ran -> no backup table rows assert await M._count(conn, M.BACKUP_TABLE) == 0 diff --git a/tests/unit/test_baby_mi_features.py b/tests/unit/test_baby_mi_features.py index a99cc512..83e30b5d 100755 --- a/tests/unit/test_baby_mi_features.py +++ b/tests/unit/test_baby_mi_features.py @@ -359,7 +359,7 @@ class TestTrustScore: """Trust score field on TypedMemory.""" def test_schema_version_25(self): - assert SCHEMA_VERSION == 39 + assert SCHEMA_VERSION == 40 def test_trust_score_field_on_typed_memory(self): tm = TypedMemory.create( diff --git a/tests/unit/test_cascading_retrieval.py b/tests/unit/test_cascading_retrieval.py index d3f17860..53c4a1fd 100755 --- a/tests/unit/test_cascading_retrieval.py +++ b/tests/unit/test_cascading_retrieval.py @@ -214,7 +214,7 @@ async def test_schema_version_is_27(self) -> None: """Schema version bumped to 27.""" from surreal_memory.storage.sqlite_schema import SCHEMA_VERSION - assert SCHEMA_VERSION == 39 + assert SCHEMA_VERSION == 40 @pytest.mark.asyncio async def test_fiber_fts_table_exists(self, storage: SQLiteStorage) -> None: diff --git a/tests/unit/test_ephemeral.py b/tests/unit/test_ephemeral.py index 6a1b643c..fab6646d 100755 --- a/tests/unit/test_ephemeral.py +++ b/tests/unit/test_ephemeral.py @@ -22,7 +22,7 @@ class TestSchemaVersion: def test_schema_version_is_33(self) -> None: - assert SCHEMA_VERSION == 39 + assert SCHEMA_VERSION == 40 # ── Neuron dataclass ──────────────────────────────────────────────── diff --git a/tests/unit/test_source_registry.py b/tests/unit/test_source_registry.py index 36ee0dbd..7584cd0d 100755 --- a/tests/unit/test_source_registry.py +++ b/tests/unit/test_source_registry.py @@ -102,7 +102,7 @@ class TestSchemaMigrationV23: def test_schema_version_is_25(self) -> None: from surreal_memory.storage.sqlite_schema import SCHEMA_VERSION - assert SCHEMA_VERSION == 39 + assert SCHEMA_VERSION == 40 def test_migration_22_23_exists(self) -> None: from surreal_memory.storage.sqlite_schema import MIGRATIONS diff --git a/tests/unit/test_surrealdb_store.py b/tests/unit/test_surrealdb_store.py index 17be2b99..ae28b91d 100644 --- a/tests/unit/test_surrealdb_store.py +++ b/tests/unit/test_surrealdb_store.py @@ -9,7 +9,9 @@ # surrealdb is an optional dependency not installed in the base test environment. # Inject a stub so that the lazy `from surrealdb import AsyncSurreal` inside -# store.py succeeds and the mock can override it. +# store.py succeeds and the mock can override it. (tests/conftest.py imports the +# real SDK early when installed, so this stub only fires in the base env — it no +# longer leaks a MagicMock into the live SurrealDB tests.) if "surrealdb" not in sys.modules: _fake_surrealdb = MagicMock() sys.modules["surrealdb"] = _fake_surrealdb diff --git a/tests/unit/test_tiered_memory_phase1.py b/tests/unit/test_tiered_memory_phase1.py index 50b77eb4..00edcb6e 100755 --- a/tests/unit/test_tiered_memory_phase1.py +++ b/tests/unit/test_tiered_memory_phase1.py @@ -164,7 +164,7 @@ class TestSchemaMigration: def test_migration_exists(self) -> None: from surreal_memory.storage.sqlite_schema import MIGRATIONS, SCHEMA_VERSION - assert SCHEMA_VERSION == 39 + assert SCHEMA_VERSION == 40 assert (36, 37) in MIGRATIONS assert (37, 38) in MIGRATIONS stmts = MIGRATIONS[(36, 37)] diff --git a/tests/unit/test_tool_tiers.py b/tests/unit/test_tool_tiers.py index 0785904f..6ec1fd23 100755 --- a/tests/unit/test_tool_tiers.py +++ b/tests/unit/test_tool_tiers.py @@ -65,7 +65,7 @@ class TestToolTiers: def test_full_tier_returns_all(self) -> None: tools = get_tool_schemas_for_tier("full") - assert len(tools) == 57 + assert len(tools) == 58 def test_full_tier_matches_get_tool_schemas(self) -> None: full = get_tool_schemas_for_tier("full") @@ -109,7 +109,7 @@ def test_minimal_tier_correct_names(self) -> None: def test_invalid_tier_defaults_to_full(self) -> None: tools = get_tool_schemas_for_tier("bogus") - assert len(tools) == 57 + assert len(tools) == 58 def test_tier_hierarchy_minimal_subset_of_standard(self) -> None: assert TOOL_TIERS["minimal"] < TOOL_TIERS["standard"] @@ -134,7 +134,7 @@ def test_get_tool_schemas_returns_copy(self) -> None: a = get_tool_schemas() b = get_tool_schemas() a.pop() - assert len(b) == 57 + assert len(b) == 58 def test_get_tool_schemas_for_tier_returns_copy(self) -> None: a = get_tool_schemas_for_tier("standard") @@ -160,7 +160,7 @@ def _make_server(self, tier: str) -> MCPServer: # noqa: F821 def test_server_full_tier(self) -> None: server = self._make_server("full") with patch("surreal_memory.plugins.get_plugin_tools", return_value=[]): - assert len(server.get_tools()) == 57 + assert len(server.get_tools()) == 58 def test_server_standard_tier(self) -> None: server = self._make_server("standard") From 60c90a1240f3d18b471d0c4f300929cfb168846f Mon Sep 17 00:00:00 2001 From: Toni Nowak Date: Fri, 17 Jul 2026 20:18:00 +0200 Subject: [PATCH 11/12] =?UTF-8?q?chore(release):=20bump=202.12.0=20?= =?UTF-8?q?=E2=80=94=20reasoning-training=20pipeline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- src/surreal_memory/__init__.py | 2 +- tests/unit/test_health_fixes.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3c12cc1c..54ecb99a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "surreal-memory" -version = "2.11.0" +version = "2.12.0" description = "Reflex-based memory system for AI agents with SurrealDB backend — retrieval through activation, not search" readme = "README.md" license = "MIT" diff --git a/src/surreal_memory/__init__.py b/src/surreal_memory/__init__.py index 9ea7bea4..52188bb0 100755 --- a/src/surreal_memory/__init__.py +++ b/src/surreal_memory/__init__.py @@ -16,7 +16,7 @@ from surreal_memory.engine.reflex_activation import CoActivation, ReflexActivation from surreal_memory.engine.retrieval import DepthLevel, ReflexPipeline, RetrievalResult -__version__ = "2.11.0" +__version__ = "2.12.0" __all__ = [ "__version__", diff --git a/tests/unit/test_health_fixes.py b/tests/unit/test_health_fixes.py index 7d0a613b..398d95ec 100755 --- a/tests/unit/test_health_fixes.py +++ b/tests/unit/test_health_fixes.py @@ -485,7 +485,7 @@ class TestVersionBump: def test_version_is_current(self) -> None: import surreal_memory - assert surreal_memory.__version__ == "2.11.0" + assert surreal_memory.__version__ == "2.12.0" class TestPackageIntegrity: From 7a33ded2935fbefff8a1e99f2b5f3d4669a49c0c Mon Sep 17 00:00:00 2001 From: Toni Nowak Date: Fri, 17 Jul 2026 20:21:56 +0200 Subject: [PATCH 12/12] docs: regenerate MCP + CLI reference for reasoning surface (smem_reasoning / smem reasoning) --- docs/api/mcp-tools.md | 21 ++++++++- docs/getting-started/cli-reference.md | 64 ++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 4 deletions(-) diff --git a/docs/api/mcp-tools.md b/docs/api/mcp-tools.md index 0aa0e339..e18c8f76 100755 --- a/docs/api/mcp-tools.md +++ b/docs/api/mcp-tools.md @@ -1,7 +1,7 @@ # MCP Tools Reference Complete reference for all Surreal-Memory MCP tools. -**57 tools** available via MCP stdio transport. +**58 tools** available via MCP stdio transport. !!! tip Tools are called as MCP tool calls, not CLI commands. In Claude Code, call `smem_recall` directly — do not run `smem recall` in terminal. @@ -62,6 +62,7 @@ Complete reference for all Surreal-Memory MCP tools. - [`smem_transplant`](#smem_transplant) - [`smem_conflicts`](#smem_conflicts) - [Other](#other) + - [`smem_reasoning`](#smem_reasoning) - [`smem_uncertainty`](#smem_uncertainty) - [`smem_visualize`](#smem_visualize) - [`smem_watch`](#smem_watch) @@ -708,6 +709,22 @@ Memory conflicts: list, resolve, or pre-check. ## Other {#other} +### `smem_reasoning` + +Reasoning training: status, mine, patterns, or config. + +| Parameter | Type | Required | Default | Description | +|-----------|------|----------|---------|-------------| +| `action` | string (`status`, `mine`, `patterns`, `config`) | Yes | — | status=trace/pattern stats + per-model coverage, mine=scan ~/.claude thinking and distill patterns (needs mining_enab... | +| `model` | string | No | — | Filter patterns by source model (patterns action) | +| `category` | string | No | — | Filter patterns by category (patterns action) | +| `limit` | integer | No | — | Max patterns to return, 1-100 (patterns action, default 50) | +| `models` | array[string] | No | — | Restrict mining to these source models (mine action) | +| `backfill` | boolean | No | — | Scan the full history for mining (mine action) | +| `dry_run` | boolean | No | — | Mine as a no-op without writing (mine action) | +| `compact` | boolean | No | — | Return compact response (strip metadata hints, truncate lists). Saves 60-80% tokens. | +| `token_budget` | integer | No | — | Max tokens for response. Progressively strips content to fit budget. | + ### `smem_uncertainty` How much can you trust this brain's memories? Uncertainty diagnostics — contradictions, low-evidence (low trust) facts, superseded facts, soon-expiring memories, and drift. Separate from smem_conflicts (which is CRUD). Read-only. Note: low_evidence/superseded sample the most-recent ~200 typed memories (see response 'scan.typed_scan_truncated'); contradiction count is capped. Drift is available on SQLite backends only. @@ -866,4 +883,4 @@ One-shot snapshot of the current working situation: active session task, top 3 r --- -*Auto-generated by `scripts/gen_mcp_docs.py` from `tool_schemas.py` — 57 tools.* +*Auto-generated by `scripts/gen_mcp_docs.py` from `tool_schemas.py` — 58 tools.* diff --git a/docs/getting-started/cli-reference.md b/docs/getting-started/cli-reference.md index 91a6afa9..7057d2a4 100755 --- a/docs/getting-started/cli-reference.md +++ b/docs/getting-started/cli-reference.md @@ -1,7 +1,7 @@ # CLI Reference Complete reference for the `smem` command-line interface. -**76 commands** available. +**80 commands** available. !!! tip Run `smem --help` or `smem --help` for the latest usage info. @@ -84,6 +84,10 @@ Complete reference for the `smem` command-line interface. - [`smem update`](#smem-update) - [Other](#other) - [`smem lifecycle`](#smem-lifecycle) + - [`smem reasoning clear`](#smem-reasoning-clear) + - [`smem reasoning mine`](#smem-reasoning-mine) + - [`smem reasoning patterns`](#smem-reasoning-patterns) + - [`smem reasoning status`](#smem-reasoning-status) - [`smem reindex`](#smem-reindex) - [`smem shared activate`](#smem-shared-activate) - [`smem storage status`](#smem-storage-status) @@ -1006,6 +1010,62 @@ smem lifecycle [OPTIONS] | `neuron_id` | text | No | — | (positional argument) | | `--brain / -b` | text | No | — | Brain name | +### `smem reasoning clear` + +Wipe staged reasoning traces for a model (privacy). + +``` +smem reasoning clear [OPTIONS] +``` + +| Option | Type | Required | Default | Description | +|--------|------|----------|---------|-------------| +| `--model / -m` | text | Yes | — | Model whose staged traces to wipe | +| `--force / -f` | boolean | No | `False` | Skip confirmation | +| `--json / -j` | boolean | No | `False` | Output as JSON | + +### `smem reasoning mine` + +Mine reasoning traces from ~/.claude transcripts and distill patterns. + +``` +smem reasoning mine [OPTIONS] +``` + +| Option | Type | Required | Default | Description | +|--------|------|----------|---------|-------------| +| `--backfill` | boolean | No | `False` | Scan the full history (scan_lookback_days=0) | +| `--dry-run / -n` | boolean | No | `False` | Don't write — report a no-op | +| `--models` | text | No | — | Comma-separated source models to restrict to | +| `--force / -f` | boolean | No | `False` | Run even if mining is disabled in config | +| `--json / -j` | boolean | No | `False` | Output as JSON | + +### `smem reasoning patterns` + +List learned reasoning patterns. + +``` +smem reasoning patterns [OPTIONS] +``` + +| Option | Type | Required | Default | Description | +|--------|------|----------|---------|-------------| +| `--model / -m` | text | No | — | Filter by source model | +| `--category / -c` | text | No | — | Filter by category | +| `--json / -j` | boolean | No | `False` | Output as JSON | + +### `smem reasoning status` + +Show reasoning-training status: trace counts, learned patterns, per-model coverage. + +``` +smem reasoning status [OPTIONS] +``` + +| Option | Type | Required | Default | Description | +|--------|------|----------|---------|-------------| +| `--json / -j` | boolean | No | `False` | Output as JSON | + ### `smem reindex` Re-embed neurons for the current brain using the effective provider. @@ -1125,4 +1185,4 @@ smem watch [OPTIONS] --- -*Auto-generated by `scripts/gen_cli_docs.py` from Typer app introspection — 76 commands.* +*Auto-generated by `scripts/gen_cli_docs.py` from Typer app introspection — 80 commands.*