From 8cffce73755697b81cd4643cdda54a16b6536fb5 Mon Sep 17 00:00:00 2001 From: LinMoQC <2896311434@qq.com> Date: Sat, 4 Apr 2026 20:31:46 +0800 Subject: [PATCH 01/21] :sparkles: feat: harden ingestion pipeline and source dispatch --- .claude/worktrees/gifted-wiles | 1 + .claude/worktrees/quizzical-albattani | 1 + .claude/worktrees/zen-pascal | 1 + apps/api/app/agents/rag/ingestion.py | 94 ++-- apps/api/app/database.py | 41 +- apps/api/app/main.py | 22 +- apps/api/app/services/source_service.py | 88 ++- apps/api/app/workers/celery_app.py | 31 ++ apps/api/app/workers/tasks/__init__.py | 1 + apps/api/app/workers/tasks/ingestion.py | 164 +++++- .../3acf8dfe-1723-4896-a9e6-23a547d5737a.md | 3 + .../85239377-83ad-478b-b819-f36d894bb9e3.pdf | Bin 0 -> 34860 bytes .../a9e24316-a846-4e3c-8b20-52234859609e.md | 240 +++++++++ apps/api/tests/unit/test_celery_routing.py | 22 + .../api/tests/unit/test_ingestion_pipeline.py | 45 ++ apps/api/tests/unit/test_ingestion_tasks.py | 64 +++ .../unit/test_source_service_dispatch.py | 88 +++ .../unit/test_source_service_web_import.py | 16 + apps/web/messages/en.json | 1 + apps/web/messages/zh.json | 1 + .../copilot/copilot-message-bubble.tsx | 308 +++++++---- .../src/features/copilot/copilot-panel.tsx | 59 ++- .../src/features/knowledge/knowledge-view.tsx | 12 +- apps/web/src/features/source/source-list.ts | 34 ++ .../web/src/features/source/sources-panel.tsx | 25 +- apps/web/src/lib/api-mappers.ts | 1 + apps/web/src/types/index.ts | 1 + apps/web/tests/source/source-list.test.ts | 47 ++ docker-compose.prod.yml | 35 +- docker-compose.yml | 25 +- ...250\350\256\276\350\256\241-template.docx" | Bin 0 -> 55382 bytes ...\350\241\250\350\256\276\350\256\241.docx" | Bin 0 -> 52234 bytes packages/cli/src/commands/local.js | 23 +- scripts/create_db_table_design_docx.py | 500 ++++++++++++++++++ 34 files changed, 1749 insertions(+), 245 deletions(-) create mode 160000 .claude/worktrees/gifted-wiles create mode 160000 .claude/worktrees/quizzical-albattani create mode 160000 .claude/worktrees/zen-pascal create mode 100644 apps/api/storage/notebooks/9a2371fa-8a99-4436-b330-f35bf43c893c/3acf8dfe-1723-4896-a9e6-23a547d5737a.md create mode 100644 apps/api/storage/notebooks/9a2371fa-8a99-4436-b330-f35bf43c893c/85239377-83ad-478b-b819-f36d894bb9e3.pdf create mode 100644 apps/api/storage/notebooks/9a2371fa-8a99-4436-b330-f35bf43c893c/a9e24316-a846-4e3c-8b20-52234859609e.md create mode 100644 apps/api/tests/unit/test_celery_routing.py create mode 100644 apps/api/tests/unit/test_ingestion_pipeline.py create mode 100644 apps/api/tests/unit/test_ingestion_tasks.py create mode 100644 apps/api/tests/unit/test_source_service_dispatch.py create mode 100644 apps/web/src/features/source/source-list.ts create mode 100644 apps/web/tests/source/source-list.test.ts create mode 100644 "output/doc/LyraNote\346\225\260\346\215\256\345\272\223\350\241\250\350\256\276\350\256\241-template.docx" create mode 100644 "output/doc/LyraNote\346\225\260\346\215\256\345\272\223\350\241\250\350\256\276\350\256\241.docx" create mode 100644 scripts/create_db_table_design_docx.py diff --git a/.claude/worktrees/gifted-wiles b/.claude/worktrees/gifted-wiles new file mode 160000 index 0000000..5638dea --- /dev/null +++ b/.claude/worktrees/gifted-wiles @@ -0,0 +1 @@ +Subproject commit 5638dea7ecee60b72e88594109dc17ad778d68c0 diff --git a/.claude/worktrees/quizzical-albattani b/.claude/worktrees/quizzical-albattani new file mode 160000 index 0000000..5638dea --- /dev/null +++ b/.claude/worktrees/quizzical-albattani @@ -0,0 +1 @@ +Subproject commit 5638dea7ecee60b72e88594109dc17ad778d68c0 diff --git a/.claude/worktrees/zen-pascal b/.claude/worktrees/zen-pascal new file mode 160000 index 0000000..5638dea --- /dev/null +++ b/.claude/worktrees/zen-pascal @@ -0,0 +1 @@ +Subproject commit 5638dea7ecee60b72e88594109dc17ad778d68c0 diff --git a/apps/api/app/agents/rag/ingestion.py b/apps/api/app/agents/rag/ingestion.py index a3e2f0b..4821d8b 100644 --- a/apps/api/app/agents/rag/ingestion.py +++ b/apps/api/app/agents/rag/ingestion.py @@ -13,6 +13,9 @@ import logging import os +import zipfile +from io import BytesIO +from xml.etree import ElementTree as ET from uuid import UUID from sqlalchemy import select @@ -34,7 +37,7 @@ async def ingest( db: AsyncSession, chunk_size: int = DEFAULT_CHUNK_SIZE, chunk_overlap: int = DEFAULT_CHUNK_OVERLAP, - splitter_type: str = "auto", + splitter_type: str = "recursive", separators: list[str] | None = None, min_chunk_size: int = 50, ) -> None: @@ -98,40 +101,10 @@ async def ingest( ) db.add(chunk) - source.summary = await _generate_summary(text[:3000]) + source.summary = _build_fallback_summary(text) source.status = "indexed" await db.flush() - from app.agents.memory import refresh_notebook_summary - try: - await refresh_notebook_summary(source.notebook_id, db) - except Exception as mem_exc: - logger.warning("Notebook summary refresh failed: %s", mem_exc) - - try: - from app.workers.tasks import extract_knowledge_graph - extract_knowledge_graph.delay(str(source.id)) - except Exception: - pass - - try: - from app.models import ProactiveInsight, Notebook as NbModel - nb_result = await db.execute( - select(NbModel.user_id).where(NbModel.id == source.notebook_id) - ) - user_id = nb_result.scalar_one_or_none() - if user_id: - insight = ProactiveInsight( - user_id=user_id, - notebook_id=source.notebook_id, - insight_type="source_indexed", - title=f"「{source.title or '新资料'}」已完成索引", - content=source.summary[:200] if source.summary else None, - ) - db.add(insight) - except Exception: - pass - except Exception as exc: source.status = "failed" raise exc @@ -144,6 +117,21 @@ def _sanitize(text: str) -> str: return text.replace("\x00", "") +def _source_extension(source: Source) -> str: + candidate = source.storage_key or source.file_path or source.title or "" + return os.path.splitext(candidate)[1].lower() + + +def _build_fallback_summary(text: str, limit: int = 200) -> str: + """Create a lightweight preview summary without an extra LLM roundtrip.""" + condensed = " ".join(text.split()) + if not condensed: + return "" + if len(condensed) <= limit: + return condensed + return condensed[: limit - 3].rstrip() + "..." + + # --------------------------------------------------------------------------- # Text extraction with metadata # --------------------------------------------------------------------------- @@ -156,8 +144,9 @@ async def _extract_text_with_metadata(source: Source) -> tuple[str, list[dict]]: that is later used when chunking to attach context to each chunk. """ from app.providers.storage import storage as get_storage + ext = _source_extension(source) - if source.type == "pdf": + if source.type == "pdf" or ext == ".pdf": if source.storage_key: content = await get_storage().download(source.storage_key) raw, meta = _parse_pdf_bytes(content) @@ -165,7 +154,16 @@ async def _extract_text_with_metadata(source: Source) -> tuple[str, list[dict]]: raw, meta = _parse_pdf_file(source.file_path) else: raw, meta = "", [] - elif source.type in ("md", "txt"): + elif ext == ".docx": + if source.storage_key: + content = await get_storage().download(source.storage_key) + raw, meta = _parse_docx_bytes(content) + elif source.file_path: + with open(source.file_path, "rb") as f: + raw, meta = _parse_docx_bytes(f.read()) + else: + raw, meta = "", [] + elif source.type in ("md", "txt", "doc"): if source.storage_key: content = await get_storage().download(source.storage_key) raw = content.decode("utf-8", errors="ignore") @@ -222,6 +220,28 @@ def _parse_pdf_file(file_path: str) -> tuple[str, list[dict]]: return _parse_pdf_bytes(f.read()) +def _parse_docx_bytes(content: bytes) -> tuple[str, list[dict]]: + """ + Parse DOCX bytes by reading the underlying WordprocessingML document. + This avoids treating the ZIP payload as plain text and extracting binary garbage. + """ + namespace = {"w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main"} + + with zipfile.ZipFile(BytesIO(content)) as docx_zip: + xml = docx_zip.read("word/document.xml") + + root = ET.fromstring(xml) + paragraphs: list[str] = [] + + for paragraph in root.findall(".//w:p", namespace): + texts = [node.text or "" for node in paragraph.findall(".//w:t", namespace)] + line = "".join(texts).strip() + if line: + paragraphs.append(line) + + return "\n\n".join(paragraphs), [] + + def _parse_pdf_bytes_pypdf(content: bytes) -> str: """Legacy pypdf fallback (no OCR, no metadata).""" import io @@ -321,7 +341,7 @@ def _chunk_text_with_metadata( Split text into chunks and attach per-chunk metadata. splitter_type controls which splitter is used: - auto – try SemanticChunker first, fall back to recursive + auto – 默认使用递归切分,保证导入链路稳定 semantic – force SemanticChunker recursive – force RecursiveCharacterTextSplitter @@ -355,8 +375,8 @@ def _split_text( return _semantic_split(text, chunk_size, chunk_overlap) if splitter_type == "recursive": return _recursive_split(text, chunk_size, chunk_overlap, separators=separators) - # auto: try semantic, fall back to recursive - return _semantic_split_with_fallback(text, chunk_size, chunk_overlap, separators=separators) + # auto: prefer the stable recursive splitter for background ingestion. + return _recursive_split(text, chunk_size, chunk_overlap, separators=separators) def _semantic_split(text: str, chunk_size: int, chunk_overlap: int) -> list[str]: diff --git a/apps/api/app/database.py b/apps/api/app/database.py index 05379f4..d8cf723 100644 --- a/apps/api/app/database.py +++ b/apps/api/app/database.py @@ -1,5 +1,10 @@ +import logging +from collections.abc import Callable +from typing import Any + +from sqlalchemy import event from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker -from sqlalchemy.orm import DeclarativeBase +from sqlalchemy.orm import DeclarativeBase, Session from app.config import settings @@ -18,11 +23,45 @@ expire_on_commit=False, ) +logger = logging.getLogger(__name__) +_AFTER_COMMIT_CALLBACKS_KEY = "_after_commit_callbacks" + class Base(DeclarativeBase): pass +def enqueue_after_commit(session: AsyncSession, callback: Callable[[], Any]) -> None: + """ + Queue a synchronous callback to run after the current SQLAlchemy transaction commits. + + This is primarily used for side effects like Celery task dispatch, where running the + side effect before commit can race the worker reading rows that are not yet visible. + Falls back to immediate execution for test doubles that do not expose a sync session. + """ + sync_session = getattr(session, "sync_session", None) + info = getattr(sync_session, "info", None) + if info is None: + callback() + return + info.setdefault(_AFTER_COMMIT_CALLBACKS_KEY, []).append(callback) + + +@event.listens_for(Session, "after_commit") +def _run_after_commit_callbacks(session: Session) -> None: + callbacks = session.info.pop(_AFTER_COMMIT_CALLBACKS_KEY, []) + for callback in callbacks: + try: + callback() + except Exception: + logger.exception("after-commit callback failed") + + +@event.listens_for(Session, "after_rollback") +def _clear_after_commit_callbacks(session: Session) -> None: + session.info.pop(_AFTER_COMMIT_CALLBACKS_KEY, None) + + async def get_db() -> AsyncSession: async with AsyncSessionLocal() as session: try: diff --git a/apps/api/app/main.py b/apps/api/app/main.py index dcb86c2..f07ed50 100644 --- a/apps/api/app/main.py +++ b/apps/api/app/main.py @@ -45,24 +45,12 @@ async def lifespan(app: FastAPI): # On startup, immediately expire any sources left stuck in 'processing' / 'pending' # from a previous process crash or restart (belt-and-suspenders alongside the beat task). try: - from datetime import datetime, timedelta, timezone - from sqlalchemy import select - from app.models import Source as _Source + from app.workers.tasks.ingestion import _expire_stuck_sources_impl + async with AsyncSessionLocal() as _db: - _cutoff = datetime.now(timezone.utc) - timedelta(minutes=5) - _result = await _db.execute( - select(_Source).where( - _Source.status.in_(["processing", "pending"]), - _Source.updated_at < _cutoff, - ) - ) - _stuck = _result.scalars().all() - if _stuck: - for _src in _stuck: - _src.status = "failed" - _src.metadata_ = {**(_src.metadata_ or {}), "error": "indexing_timeout"} - await _db.commit() - logger.warning("startup: expired %d stuck source(s)", len(_stuck)) + _expired = await _expire_stuck_sources_impl(_db) + if _expired: + logger.warning("startup: expired %d stuck source(s)", _expired) except Exception: logger.exception("startup: failed to expire stuck sources (non-fatal)") diff --git a/apps/api/app/services/source_service.py b/apps/api/app/services/source_service.py index c161a20..e39d393 100644 --- a/apps/api/app/services/source_service.py +++ b/apps/api/app/services/source_service.py @@ -21,6 +21,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.config import settings +from app.database import enqueue_after_commit from app.exceptions import ConflictError, NotFoundError from app.models import Chunk, Notebook, Source @@ -30,6 +31,7 @@ ".pdf": "application/pdf", ".md": "text/markdown", ".txt": "text/plain", + ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", } @@ -155,6 +157,49 @@ async def _stream_file(self, file_path: str) -> AsyncIterator[bytes]: while chunk := await f.read(65536): yield chunk + def _enqueue_ingestion( + self, + source_id: UUID, + *, + chunk_size: int | None = None, + chunk_overlap: int | None = None, + splitter_type: str | None = None, + separators: list[str] | None = None, + min_chunk_size: int | None = None, + ) -> None: + from app.workers.tasks import ingest_source + + def _dispatch() -> None: + logger.info( + "Dispatching ingest_source for source %s (chunk_size=%s, chunk_overlap=%s, splitter_type=%s)", + source_id, + chunk_size, + chunk_overlap, + splitter_type, + ) + if ( + chunk_size is None + and chunk_overlap is None + and splitter_type is None + and separators is None + and min_chunk_size is None + ): + ingest_source.delay(str(source_id)) + return + + ingest_source.apply_async( + args=[str(source_id)], + kwargs={ + "chunk_size": chunk_size, + "chunk_overlap": chunk_overlap, + "splitter_type": splitter_type, + "separators": separators, + "min_chunk_size": min_chunk_size, + }, + ) + + enqueue_after_commit(self.db, _dispatch) + # ── Upload / Import ──────────────────────────────────────────────────────── async def upload_source( @@ -163,7 +208,7 @@ async def upload_source( await self._assert_notebook_owner(notebook_id) ext = os.path.splitext(filename or "")[1].lower() - type_map = {".pdf": "pdf", ".md": "md", ".txt": "md"} + type_map = {".pdf": "pdf", ".md": "md", ".txt": "md", ".docx": "doc"} source_type = type_map.get(ext, "md") file_id = str(uuid.uuid4()) @@ -185,8 +230,8 @@ async def upload_source( await self.db.flush() await self.db.refresh(source) - from app.workers.tasks import ingest_source - ingest_source.delay(str(source.id)) + self._enqueue_ingestion(source.id) + await self.db.commit() return source @@ -206,8 +251,8 @@ async def import_source_url( await self.db.flush() await self.db.refresh(source) - from app.workers.tasks import ingest_source - ingest_source.delay(str(source.id)) + self._enqueue_ingestion(source.id) + await self.db.commit() return source @@ -260,14 +305,15 @@ async def import_web_sources( await self.db.flush() await self.db.refresh(source) - from app.workers.tasks import ingest_source - - ingest_source.delay(str(source.id)) + self._enqueue_ingestion(source.id) existing_urls.add(normalized_url) created_count += 1 source_ids.append(source.id) + if created_count > 0: + await self.db.commit() + return WebImportResult( notebook_id=target_notebook_id, created_count=created_count, @@ -376,17 +422,15 @@ async def rechunk_source( source.status = "pending" await self.db.flush() - from app.workers.tasks import ingest_source - ingest_source.apply_async( - args=[str(source.id)], - kwargs={ - "chunk_size": size, - "chunk_overlap": overlap, - "splitter_type": splitter_type, - "separators": separators, - "min_chunk_size": min_chunk_size, - }, + self._enqueue_ingestion( + source.id, + chunk_size=size, + chunk_overlap=overlap, + splitter_type=splitter_type, + separators=separators, + min_chunk_size=min_chunk_size, ) + await self.db.commit() return size, overlap # ── Download ────────────────────────────────────────────────────────────── @@ -485,8 +529,8 @@ async def upload_global_source(self, filename: str | None, content: bytes) -> So await self.db.flush() await self.db.refresh(source) - from app.workers.tasks import ingest_source - ingest_source.delay(str(source.id)) + self._enqueue_ingestion(source.id) + await self.db.commit() return source @@ -504,7 +548,7 @@ async def import_global_source_url(self, url: str, title: str | None) -> Source: await self.db.flush() await self.db.refresh(source) - from app.workers.tasks import ingest_source - ingest_source.delay(str(source.id)) + self._enqueue_ingestion(source.id) + await self.db.commit() return source diff --git a/apps/api/app/workers/celery_app.py b/apps/api/app/workers/celery_app.py index 2da4ec0..25af8fd 100644 --- a/apps/api/app/workers/celery_app.py +++ b/apps/api/app/workers/celery_app.py @@ -6,6 +6,7 @@ from celery import Celery from celery.schedules import crontab +from kombu import Queue from app.config import settings @@ -23,30 +24,60 @@ enable_utc=True, task_track_started=True, worker_hijack_root_logger=False, + task_default_queue="celery", + task_default_exchange="celery", + task_default_routing_key="celery", + task_create_missing_queues=True, + task_queues=( + Queue("celery"), + Queue("ingestion"), + Queue("scheduled"), + Queue("maintenance"), + ), + task_routes={ + "ingest_source": {"queue": "ingestion"}, + "extract_knowledge_graph": {"queue": "maintenance"}, + "rebuild_knowledge_graph": {"queue": "maintenance"}, + "index_note": {"queue": "ingestion"}, + "postprocess_indexed_source": {"queue": "maintenance"}, + "execute_scheduled_task": {"queue": "scheduled"}, + "check_scheduled_tasks": {"queue": "maintenance"}, + "expire_stuck_sources": {"queue": "maintenance"}, + "precompute_ai_suggestions": {"queue": "maintenance"}, + "decay_all_user_memories": {"queue": "maintenance"}, + "synthesize_all_user_portraits": {"queue": "maintenance"}, + "cleanup_observability": {"queue": "maintenance"}, + }, beat_schedule={ "decay-stale-memories-daily": { "task": "decay_all_user_memories", "schedule": 86400.0, + "options": {"queue": "maintenance"}, }, "check-scheduled-tasks": { "task": "check_scheduled_tasks", "schedule": 60.0, + "options": {"queue": "maintenance"}, }, "weekly-portrait-synthesis": { "task": "synthesize_all_user_portraits", "schedule": crontab(hour=3, day_of_week=1), # Every Monday at 03:00 UTC + "options": {"queue": "maintenance"}, }, "expire-stuck-sources": { "task": "expire_stuck_sources", "schedule": 600.0, # every 10 minutes + "options": {"queue": "maintenance"}, }, "precompute-ai-suggestions": { "task": "precompute_ai_suggestions", "schedule": 600.0, # every 10 minutes + "options": {"queue": "maintenance"}, }, "cleanup-observability-daily": { "task": "cleanup_observability", "schedule": crontab(hour=4, minute=0), + "options": {"queue": "maintenance"}, }, }, ) diff --git a/apps/api/app/workers/tasks/__init__.py b/apps/api/app/workers/tasks/__init__.py index 66d70fa..3d6e742 100644 --- a/apps/api/app/workers/tasks/__init__.py +++ b/apps/api/app/workers/tasks/__init__.py @@ -16,6 +16,7 @@ extract_knowledge_graph, expire_stuck_sources, ingest_source, + postprocess_indexed_source, rebuild_knowledge_graph_task, ) from app.workers.tasks.memory import ( # noqa: F401 diff --git a/apps/api/app/workers/tasks/ingestion.py b/apps/api/app/workers/tasks/ingestion.py index 1094743..cd64c0e 100644 --- a/apps/api/app/workers/tasks/ingestion.py +++ b/apps/api/app/workers/tasks/ingestion.py @@ -13,6 +13,46 @@ from app.workers._helpers import _run_async, _task_db +def _mark_source_failed(source, reason: str) -> None: + """Mark a source as failed without relying on fields that Source does not expose.""" + source.status = "failed" + if reason == "indexing_timeout": + message = "索引超时,请稍后重试或调整切分参数后重新导入。" + elif reason == "storage_missing": + message = "索引失败:原始文件不存在,请重新上传后重试。" + else: + message = f"索引失败:{reason}" + + if not getattr(source, "summary", None): + source.summary = message + + +async def _expire_stuck_sources_impl(db) -> int: + import logging + from datetime import datetime, timedelta, timezone + from sqlalchemy import select + from app.models import Source as SourceModel + + logger = logging.getLogger(__name__) + cutoff = datetime.now(timezone.utc) - timedelta(minutes=15) + + result = await db.execute( + select(SourceModel).where( + SourceModel.status.in_(["processing", "pending"]), + SourceModel.updated_at < cutoff, + ) + ) + stuck = result.scalars().all() + if stuck: + for src in stuck: + _mark_source_failed(src, "indexing_timeout") + await db.commit() + logger.warning( + "expire_stuck_sources: marked %d sources as failed (timeout)", len(stuck) + ) + return len(stuck) + + @celery_app.task( name="ingest_source", bind=True, @@ -25,7 +65,7 @@ def ingest_source( source_id: str, chunk_size: int = 512, chunk_overlap: int = 64, - splitter_type: str = "auto", + splitter_type: str = "recursive", separators: list | None = None, min_chunk_size: int = 50, ): @@ -44,8 +84,26 @@ async def _run(): min_chunk_size=min_chunk_size, ) await db.commit() + postprocess_indexed_source.delay(source_id) except Exception as exc: await db.rollback() + try: + if isinstance(exc, FileNotFoundError): + from uuid import UUID + from sqlalchemy import select + from app.models import Source as SourceModel + + async with _task_db() as db2: + res = await db2.execute( + select(SourceModel).where(SourceModel.id == UUID(source_id)) + ) + src = res.scalar_one_or_none() + if src: + _mark_source_failed(src, "storage_missing") + await db2.commit() + return + except Exception: + pass # On SoftTimeLimitExceeded, mark the source as failed immediately # instead of retrying (retrying a timed-out task rarely helps) try: @@ -60,8 +118,7 @@ async def _run(): ) src = res.scalar_one_or_none() if src: - src.status = "failed" - src.metadata_ = {**(src.metadata_ or {}), "error": "indexing_timeout"} + _mark_source_failed(src, "indexing_timeout") await db2.commit() return except Exception: @@ -71,37 +128,94 @@ async def _run(): _run_async(_run()) -@celery_app.task(name="expire_stuck_sources") -def expire_stuck_sources(): - """ - Celery Beat task (every 10 min): find sources stuck in 'processing' or 'pending' - for more than 15 minutes and mark them as 'failed'. - """ +@celery_app.task(name="postprocess_indexed_source", bind=True, max_retries=1) +def postprocess_indexed_source(self, source_id: str): + """Run slow, non-critical post-processing after chunks are safely committed.""" + async def _run(): import logging - from datetime import datetime, timedelta, timezone + from uuid import UUID + from sqlalchemy import select - from app.models import Source as SourceModel + + from app.agents.memory import refresh_notebook_summary + from app.agents.rag.ingestion import _generate_summary + from app.models import Notebook as NbModel + from app.models import ProactiveInsight, Source as SourceModel logger = logging.getLogger(__name__) - cutoff = datetime.now(timezone.utc) - timedelta(minutes=15) async with _task_db() as db: - result = await db.execute( - select(SourceModel).where( - SourceModel.status.in_(["processing", "pending"]), - SourceModel.updated_at < cutoff, + try: + result = await db.execute( + select(SourceModel).where(SourceModel.id == UUID(source_id)) ) - ) - stuck = result.scalars().all() - if stuck: - for src in stuck: - src.status = "failed" - src.metadata_ = {**(src.metadata_ or {}), "error": "indexing_timeout"} + source = result.scalar_one_or_none() + if source is None or source.status != "indexed" or not source.raw_text: + return + + try: + summary = await _generate_summary(source.raw_text[:3000]) + if summary: + source.summary = summary + await db.flush() + except Exception as exc: + logger.warning("Source summary generation failed for %s: %s", source_id, exc) + + try: + await refresh_notebook_summary(source.notebook_id, db) + except Exception as exc: + logger.warning( + "Notebook summary refresh failed for source %s: %s", + source_id, + exc, + ) + + try: + nb_result = await db.execute( + select(NbModel.user_id).where(NbModel.id == source.notebook_id) + ) + user_id = nb_result.scalar_one_or_none() + if user_id: + insight = ProactiveInsight( + user_id=user_id, + notebook_id=source.notebook_id, + insight_type="source_indexed", + title=f"「{source.title or '新资料'}」已完成索引", + content=(source.summary or "")[:200] or None, + ) + db.add(insight) + except Exception as exc: + logger.warning( + "Proactive insight generation failed for source %s: %s", + source_id, + exc, + ) + await db.commit() - logger.warning( - "expire_stuck_sources: marked %d sources as failed (timeout)", len(stuck) - ) + except Exception as exc: + await db.rollback() + raise self.retry(exc=exc, countdown=60) + + try: + from app.workers.tasks import extract_knowledge_graph + + extract_knowledge_graph.delay(source_id) + except Exception: + pass + + _run_async(_run()) + + +@celery_app.task(name="expire_stuck_sources") +def expire_stuck_sources(): + """ + Celery Beat task (every 10 min): find sources stuck in 'processing' or 'pending' + for more than 15 minutes and mark them as 'failed'. + """ + async def _run(): + async with _task_db() as db: + await _expire_stuck_sources_impl(db) _run_async(_run()) diff --git a/apps/api/storage/notebooks/9a2371fa-8a99-4436-b330-f35bf43c893c/3acf8dfe-1723-4896-a9e6-23a547d5737a.md b/apps/api/storage/notebooks/9a2371fa-8a99-4436-b330-f35bf43c893c/3acf8dfe-1723-4896-a9e6-23a547d5737a.md new file mode 100644 index 0000000..901fdac --- /dev/null +++ b/apps/api/storage/notebooks/9a2371fa-8a99-4436-b330-f35bf43c893c/3acf8dfe-1723-4896-a9e6-23a547d5737a.md @@ -0,0 +1,3 @@ +# test + +this is a tiny ingestion regression check \ No newline at end of file diff --git a/apps/api/storage/notebooks/9a2371fa-8a99-4436-b330-f35bf43c893c/85239377-83ad-478b-b819-f36d894bb9e3.pdf b/apps/api/storage/notebooks/9a2371fa-8a99-4436-b330-f35bf43c893c/85239377-83ad-478b-b819-f36d894bb9e3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e1571d1ffdad6711b1ad28721fe98924afb5de45 GIT binary patch literal 34860 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 literal 0 HcmV?d00001 diff --git a/apps/api/storage/notebooks/9a2371fa-8a99-4436-b330-f35bf43c893c/a9e24316-a846-4e3c-8b20-52234859609e.md b/apps/api/storage/notebooks/9a2371fa-8a99-4436-b330-f35bf43c893c/a9e24316-a846-4e3c-8b20-52234859609e.md new file mode 100644 index 0000000..d3b8c27 --- /dev/null +++ b/apps/api/storage/notebooks/9a2371fa-8a99-4436-b330-f35bf43c893c/a9e24316-a846-4e3c-8b20-52234859609e.md @@ -0,0 +1,240 @@ +# LyraNote 本科毕设全局设计说明(论文版) + +> 文档用途:用于本科毕业论文中的“研究背景、系统设计、技术特点、关键难点与创新点”章节初稿。 +> +> 版本日期:2026-03-26 +> +> 适用对象:论文作者、答辩评审、项目协作者 + +--- + +## 摘要 + +LyraNote 是一个面向个人研究与知识管理场景的 AI 驱动系统,目标是将传统“知识存储工具”升级为“可持续协作的研究伙伴”。系统围绕“私有知识优先”的设计原则,整合了 RAG 检索增强、多 Agent 编排、长期记忆、主动感知、深度研究与可视化生成界面(GenUI)等能力,形成从信息采集、理解、生成到反馈演化的闭环。 + +与常见 AI 笔记产品相比,LyraNote 不仅提供被动问答,还重点探索 AI 的主动性与持续性:在用户未显式提问时,系统仍可基于上下文状态进行低干扰主动辅助;在长周期任务中,系统支持定时调度与自动投递;在多轮交互中,系统通过多层记忆与画像机制持续提升个性化质量。该系统具有较强工程实现价值与研究讨论价值,适合作为“智能知识系统 + Agent 工程化”方向的本科毕设课题。 + +--- + +## 1. 研究背景与意义 + +### 1.1 研究背景 + +当前主流知识管理工具(笔记类应用、文档类应用)普遍存在两类不足: + +1. 知识层面:多来源信息可存储但难以深度理解,跨文档关联弱,检索结果与用户真实任务脱节。 +2. AI 层面:大多停留在“你问我答”的被动模式,缺乏持续状态感知、长期个性化与任务自动执行能力。 + +与此同时,通用大模型虽然具备强生成能力,但在真实研究流程中仍面临幻觉、上下文窗口限制、长任务中断、可解释性不足、部署复杂等问题。基于此,LyraNote 以“面向研究场景的 AI 原生第二大脑”为目标,尝试把 LLM 能力转化为可持续、可控、可落地的系统能力。 + +### 1.2 研究意义 + +1. 应用意义:提高个人研究与学习效率,减少“搜集-整理-输出”的重复劳动。 +2. 工程意义:构建可扩展的 AI 系统架构,验证多 Agent、记忆系统、事件驱动链路在真实产品中的可行性。 +3. 学术意义:为“从被动对话到主动协作”的 AI Agent 产品化路径提供可复用方法与实验设计。 + +--- + +## 2. 研究目标与问题定义 + +### 2.1 总体目标 + +构建一个支持“知识摄取—语义检索—深度研究—结构化表达—长期演化”的 AI 研究笔记系统,实现 AI 从工具属性向伙伴属性的演进。 + +### 2.2 核心研究问题 + +1. 如何让 AI 回答建立在用户私有知识之上,而不是泛化互联网知识? +2. 如何在复杂任务中提升质量与稳定性,避免单 Agent 架构的能力拥挤? +3. 如何让 AI 在不打扰用户的前提下实现主动感知与主动辅助? +4. 如何在工程上实现可扩展、可维护、可自托管的系统架构? + +--- + +## 3. 系统总体架构设计 + +### 3.1 分层总体架构 + +LyraNote 采用“前端交互层 + 后端服务层 + AI 能力层 + 基础设施层”的分层设计: + +1. 前端交互层(Next.js + Tiptap + SSE) +用于笔记编辑、对话交互、研究进度可视化、结构化内容展示。 +2. 后端服务层(FastAPI) +负责路由编排、鉴权、业务规则与 API 暴露。 +3. AI 能力层(Agents + Skills + Memory) +负责检索、写作、深度研究、工具调用、记忆更新与主动洞察。 +4. 基础设施层(PostgreSQL/pgvector + Redis + Celery + S3 兼容存储) +负责结构化数据、向量索引、异步任务、对象存储与调度。 + +### 3.2 关键数据闭环 + +系统形成“源→知识→对话→笔记→再入库”的闭环: + +1. 用户导入 PDF/网页/Markdown。 +2. 后端异步完成解析、分块、向量化并入库(RAG 索引)。 +3. 对话阶段基于检索证据生成回答并附引用。 +4. 用户将结果沉淀为笔记、摘要或报告(Artifact)。 +5. 笔记可再次作为来源进入知识库(Note-as-Source),形成持续演化。 + +### 3.3 AI 核心架构 + +#### 3.3.1 多 Agent 协作架构(System A) + +采用“主 Agent(Orchestrator)+ 专家 Agent(RAG/Research/Writing/Memory/Web)”的两层决策: + +1. 主 Agent 负责任务级路由(把问题交给最合适的专家)。 +2. 专家 Agent 负责步骤级执行(检索、搜索、写作、记忆更新等)。 + +该设计缓解了单 ReAct 循环能力拥挤、复杂任务步骤不足的问题。 + +#### 3.3.2 Soul 持续思维与表达机制(System B) + +通过活动感知、后台思维循环和表达门控机制,让 AI 在用户静默期仍可进行低频高价值思考,并在合适时机以可忽略的方式推送洞察。 + +#### 3.3.3 用户画像与记忆体系(System C) + +系统从“碎片记忆”升级到“多层记忆 + 用户画像”: + +1. 记忆层存储偏好、事实、场景与反思信息。 +2. 画像层按周期进行综合,形成对用户研究方向、能力水平、表达偏好的立体表征。 +3. 画像结果回注到路由决策与回答策略,实现长期个性化。 + +--- + +## 4. 核心特点(面向论文阐述) + +### 4.1 私有知识优先的 RAG 管道 + +系统在 Query 改写、多路检索、混合排序、重排与去重环节进行优化,重点解决多轮指代、召回不足和内容冗余问题。根据优化设计预期: + +1. 召回率提升约 25%~35%。 +2. 精确率提升约 20%。 +3. 首次响应延迟下降约 30%。 + +### 4.2 深度研究(Deep Research)能力 + +区别于单轮问答,深度研究支持“规划→检索→递归扩展→综合成文”的多阶段流程,支持 Quick/Deep 两种预算模式,并通过 SSE 反馈研究过程。为提升鲁棒性,研究任务与连接流解耦,支持刷新恢复与断点续传。 + +### 4.3 GenUI 结构化表达能力 + +通过统一 `genui` 协议将模型输出映射为可交互组件(图表、表格、时间轴、矩阵、看板等),提升研究结果可读性与可操作性,使 AI 输出从“纯文本”升级为“可视化知识单元”。 + +### 4.4 主动感知与自动化执行 + +系统提出“微交互渗透→上下文智能→自主行动”的三层主动架构: + +1. 在索引完成、编辑停顿、页面切换等时机提供低打扰提示。 +2. 通过定时任务实现持续任务自动执行(采集、生成、投递)。 +3. 将 AI 从一次性交互扩展为长期运行助手。 + +### 4.5 可自托管与工程可扩展性 + +1. 认证从外部 Clerk 迁移到本地单用户方案(bcrypt + JWT + 初始化向导),降低部署门槛。 +2. 存储层引入 `StorageProvider` 抽象,统一本地与 S3 兼容后端,支持横向扩展与多环境部署。 +3. 后端引入分层重构思路(Router/Service/Modules/Infrastructure),提升可维护性与测试性。 + +--- + +## 5. 关键难点与解决思路 + +### 难点 1:检索质量与多轮语义理解 + +问题:用户问题口语化、上下文省略、语义跨度大,导致检索召回不稳定。 +解决:引入对话感知 Query 改写、多 Query 并行、向量+全文混合检索、MMR 去重与 Cross-Encoder 重排。 + +### 难点 2:深度研究任务长链路稳定性 + +问题:若研究流程与 SSE 连接强耦合,用户刷新页面会导致任务中断。 +解决:任务后台化(独立运行)+ 事件缓冲 + 状态查询,支持断点续传与结果恢复。 + +### 难点 3:上下文窗口与成本控制 + +问题:深度研究在多轮检索后易超出上下文窗口,且联网搜索有调用成本。 +解决:学习结果摘要压缩、结果数量上限、检索阈值触发 Web Search、关键词去重与模式化预算(Quick/Deep)。 + +### 难点 4:主动性与用户体验平衡 + +问题:主动提示过多会造成干扰。 +解决:采用“适时、适量、可忽略”原则,限制触发频率与展示密度,允许用户关闭或忽略。 + +### 难点 5:系统复杂度持续上升 + +问题:功能扩展导致路由臃肿、职责混乱、可维护性下降。 +解决:推进 Service 分层、模块化 Agents、统一 Provider 接口、Schema 规范化,降低耦合度。 + +### 难点 6:自托管部署与多环境兼容 + +问题:文件存储、认证依赖、异步任务在不同部署环境中易出兼容性问题。 +解决:认证本地化、存储抽象化、任务队列标准化(Celery + Redis)、配置集中化管理。 + +--- + +## 6. 论文可主张的创新点 + +1. 提出并实现“多 Agent 协作 + Soul 持续感知 + 用户画像演化”的三系统耦合架构。 +2. 将 AI 交互从“被动问答”扩展到“主动感知与任务执行”的产品形态。 +3. 在研究报告场景中实现 Deep Research 的工程化闭环(多阶段推理、可恢复任务、可复用产物)。 +4. 提出并落地面向生成式应用的统一 GenUI 协议,增强 LLM 输出可视化表达能力。 +5. 结合记忆与技能系统,实现“能力可插拔 + 个性可演化”的长期 Agent 机制。 + +--- + +## 7. 论文实验与评估建议(可直接写入实验章节) + +### 7.1 建议评估维度 + +1. 检索效果:Recall@K、Precision@K、nDCG。 +2. 回答质量:事实一致性、引用覆盖率、结构完整度。 +3. 任务能力:复杂任务完成率、平均完成时长、失败重试率。 +4. 主动交互:建议点击率、忽略率、用户主观满意度。 +5. 个性化效果:开启/关闭记忆后的质量差异、长期 `quality_score` 变化。 +6. 工程性能:首 token 延迟、平均响应时延、任务吞吐量、资源消耗。 + +### 7.2 建议对比实验 + +1. 单 Agent vs 多 Agent(复杂任务完成率对比)。 +2. 无记忆 vs V1 记忆 vs V2 记忆(个性化质量对比)。 +3. 被动模式 vs 主动模式(交互效率与满意度对比)。 +4. 纯文本输出 vs GenUI 输出(信息理解效率与可用性对比)。 + +--- + +## 8. 局限性与后续工作 + +1. 深度研究仍依赖外部搜索服务,成本与稳定性受第三方接口影响。 +2. 多 Agent 路由效果对 Prompt 与结构化输出稳定性敏感。 +3. 主动机制目前主要面向单用户场景,多用户协作机制有待拓展。 +4. 评估体系仍需更大规模用户实验来验证泛化性。 + +后续可重点推进: + +1. 更细粒度的路由评估与自动纠偏机制。 +2. 更强的多模态研究能力(图像/表格/代码执行)。 +3. 研究任务模板化与可复现实验流水线。 +4. 面向团队协作的多租户与权限机制。 + +--- + +## 9. 文档依据(可作为论文内部参考来源) + +1. `architecture.md`(系统总架构、AI 流水线) +2. `lyra-soul-system.md`(多 Agent + Soul + 画像) +3. `memory-system-v2.md`(五层记忆体系) +4. `skills-system.md`(可插拔技能架构) +5. `deep-research.md`(多阶段研究流程与任务解耦) +6. `rag-optimization.md`(检索优化链路) +7. `genui-integration.md`(GenUI 协议) +8. `proactive-ai-system.md`(主动感知体系) +9. `scheduled-tasks.md`(定时任务自动化) +10. `backend-architecture-refactor.md`(后端分层重构) +11. `storage-system.md`(存储抽象) +12. `single-user-auth.md`(单用户自托管认证) + +--- + +## 附:论文写作使用建议 + +1. 可将第 1-3 节作为“绪论 + 总体设计”。 +2. 可将第 4-5 节拆为“关键技术实现”。 +3. 可将第 6-7 节作为“创新点与实验设计”。 +4. 可将第 8 节作为“总结与展望”。 + diff --git a/apps/api/tests/unit/test_celery_routing.py b/apps/api/tests/unit/test_celery_routing.py new file mode 100644 index 0000000..dbeb91e --- /dev/null +++ b/apps/api/tests/unit/test_celery_routing.py @@ -0,0 +1,22 @@ +from app.workers.celery_app import celery_app + + +def test_celery_routes_separate_ingestion_and_maintenance_queues() -> None: + routes = celery_app.conf.task_routes + + assert routes["ingest_source"]["queue"] == "ingestion" + assert routes["extract_knowledge_graph"]["queue"] == "maintenance" + assert routes["rebuild_knowledge_graph"]["queue"] == "maintenance" + assert routes["index_note"]["queue"] == "ingestion" + assert routes["postprocess_indexed_source"]["queue"] == "maintenance" + assert routes["execute_scheduled_task"]["queue"] == "scheduled" + assert routes["check_scheduled_tasks"]["queue"] == "maintenance" + assert routes["precompute_ai_suggestions"]["queue"] == "maintenance" + + +def test_beat_maintenance_jobs_are_routed_off_main_queue() -> None: + beat_schedule = celery_app.conf.beat_schedule + + assert beat_schedule["check-scheduled-tasks"]["options"]["queue"] == "maintenance" + assert beat_schedule["expire-stuck-sources"]["options"]["queue"] == "maintenance" + assert beat_schedule["precompute-ai-suggestions"]["options"]["queue"] == "maintenance" diff --git a/apps/api/tests/unit/test_ingestion_pipeline.py b/apps/api/tests/unit/test_ingestion_pipeline.py new file mode 100644 index 0000000..2b151a3 --- /dev/null +++ b/apps/api/tests/unit/test_ingestion_pipeline.py @@ -0,0 +1,45 @@ +import zipfile +from io import BytesIO + +from app.agents.rag import ingestion + + +def test_auto_split_prefers_recursive_splitter(monkeypatch) -> None: + def _boom(*_args, **_kwargs): + raise AssertionError("auto splitter should not call semantic splitter") + + monkeypatch.setattr(ingestion, "_semantic_split", _boom) + monkeypatch.setattr(ingestion, "_recursive_split", lambda *_args, **_kwargs: ["chunk-a"]) + + chunks = ingestion._split_text("example text", 128, 16, splitter_type="auto") + + assert chunks == ["chunk-a"] + + +def test_build_fallback_summary_condenses_and_truncates() -> None: + text = "第一段内容。\n\n第二段内容。 " * 30 + + summary = ingestion._build_fallback_summary(text, limit=40) + + assert "\n" not in summary + assert len(summary) <= 40 + assert summary.endswith("...") + + +def test_parse_docx_bytes_extracts_paragraph_text() -> None: + xml = """ + + + 第一段内容 + 第二段内容 + + + """ + buf = BytesIO() + with zipfile.ZipFile(buf, "w") as zf: + zf.writestr("word/document.xml", xml) + + text, meta = ingestion._parse_docx_bytes(buf.getvalue()) + + assert text == "第一段内容\n\n第二段内容" + assert meta == [] diff --git a/apps/api/tests/unit/test_ingestion_tasks.py b/apps/api/tests/unit/test_ingestion_tasks.py new file mode 100644 index 0000000..56d3084 --- /dev/null +++ b/apps/api/tests/unit/test_ingestion_tasks.py @@ -0,0 +1,64 @@ +from __future__ import annotations + +from datetime import UTC, datetime, timedelta +from types import SimpleNamespace +from unittest.mock import AsyncMock + +import pytest + +from app.workers.tasks.ingestion import _expire_stuck_sources_impl, _mark_source_failed + + +class _ScalarList: + def __init__(self, values): + self._values = values + + def all(self): + return self._values + + +class _ExecuteResult: + def __init__(self, values): + self._values = values + + def scalars(self): + return _ScalarList(self._values) + + +def test_mark_source_failed_sets_status_without_metadata_field() -> None: + source = SimpleNamespace(status="processing", summary=None) + + _mark_source_failed(source, "indexing_timeout") + + assert source.status == "failed" + assert "索引超时" in source.summary + + +def test_mark_source_failed_sets_missing_storage_message() -> None: + source = SimpleNamespace(status="processing", summary=None) + + _mark_source_failed(source, "storage_missing") + + assert source.status == "failed" + assert "原始文件不存在" in source.summary + + +@pytest.mark.asyncio +async def test_expire_stuck_sources_marks_pending_and_processing_failed() -> None: + old_time = datetime.now(UTC) - timedelta(minutes=30) + source_a = SimpleNamespace(status="pending", summary=None, updated_at=old_time) + source_b = SimpleNamespace(status="processing", summary="existing", updated_at=old_time) + + db = SimpleNamespace( + execute=AsyncMock(return_value=_ExecuteResult([source_a, source_b])), + commit=AsyncMock(return_value=None), + ) + + count = await _expire_stuck_sources_impl(db) + + assert count == 2 + assert source_a.status == "failed" + assert "索引超时" in source_a.summary + assert source_b.status == "failed" + assert source_b.summary == "existing" + db.commit.assert_awaited_once() diff --git a/apps/api/tests/unit/test_source_service_dispatch.py b/apps/api/tests/unit/test_source_service_dispatch.py new file mode 100644 index 0000000..3aec1bf --- /dev/null +++ b/apps/api/tests/unit/test_source_service_dispatch.py @@ -0,0 +1,88 @@ +from __future__ import annotations + +import uuid +from types import SimpleNamespace +from unittest.mock import AsyncMock, Mock + +import pytest + +from app.models import Source +from app.services.source_service import SourceService + + +@pytest.mark.asyncio +async def test_upload_source_dispatches_ingestion_after_commit(monkeypatch) -> None: + added: list[object] = [] + + async def flush() -> None: + for obj in added: + if isinstance(obj, Source) and getattr(obj, "id", None) is None: + setattr(obj, "id", uuid.uuid4()) + + db = SimpleNamespace( + add=Mock(side_effect=added.append), + flush=AsyncMock(side_effect=flush), + refresh=AsyncMock(return_value=None), + commit=AsyncMock(return_value=None), + sync_session=SimpleNamespace(info={}), + ) + service = SourceService(db, uuid.uuid4()) + notebook_id = uuid.uuid4() + monkeypatch.setattr(service, "_assert_notebook_owner", AsyncMock(return_value=None)) + + storage = SimpleNamespace(upload=AsyncMock(return_value=None)) + monkeypatch.setattr("app.providers.storage.storage", lambda: storage) + + delayed: list[str] = [] + monkeypatch.setattr("app.workers.tasks.ingest_source.delay", lambda source_id: delayed.append(source_id)) + + source = await service.upload_source(notebook_id, "demo.pdf", b"pdf-bytes") + + assert source.status == "pending" + assert delayed == [] + + callbacks = db.sync_session.info.get("_after_commit_callbacks", []) + assert len(callbacks) == 1 + callbacks[0]() + + assert delayed == [str(source.id)] + storage.upload.assert_awaited_once() + db.commit.assert_awaited_once() + + +@pytest.mark.asyncio +async def test_import_source_url_dispatches_ingestion_after_commit(monkeypatch) -> None: + added: list[object] = [] + + async def flush() -> None: + for obj in added: + if isinstance(obj, Source) and getattr(obj, "id", None) is None: + setattr(obj, "id", uuid.uuid4()) + + db = SimpleNamespace( + add=Mock(side_effect=added.append), + flush=AsyncMock(side_effect=flush), + refresh=AsyncMock(return_value=None), + commit=AsyncMock(return_value=None), + sync_session=SimpleNamespace(info={}), + ) + service = SourceService(db, uuid.uuid4()) + service._assert_notebook_owner = AsyncMock(return_value=None) # type: ignore[method-assign] + + delayed: list[str] = [] + monkeypatch.setattr("app.workers.tasks.ingest_source.delay", lambda source_id: delayed.append(source_id)) + + source = await service.import_source_url( + uuid.uuid4(), + "https://example.com/post", + "Example Post", + ) + + assert source.status == "pending" + assert delayed == [] + + callbacks = db.sync_session.info.get("_after_commit_callbacks", []) + assert len(callbacks) == 1 + callbacks[0]() + assert delayed == [str(source.id)] + db.commit.assert_awaited_once() diff --git a/apps/api/tests/unit/test_source_service_web_import.py b/apps/api/tests/unit/test_source_service_web_import.py index ce85493..00193a7 100644 --- a/apps/api/tests/unit/test_source_service_web_import.py +++ b/apps/api/tests/unit/test_source_service_web_import.py @@ -34,7 +34,9 @@ async def flush() -> None: add=Mock(side_effect=added.append), flush=AsyncMock(side_effect=flush), refresh=AsyncMock(return_value=None), + commit=AsyncMock(return_value=None), execute=AsyncMock(return_value=_ScalarResult(["https://example.com/page?utm_source=test"])), + sync_session=SimpleNamespace(info={}), ) service = SourceService(db, uuid.uuid4()) notebook_id = uuid.uuid4() @@ -56,7 +58,13 @@ async def flush() -> None: assert result.notebook_id == notebook_id assert result.created_count == 1 assert result.skipped_count == 3 + assert delayed == [] + + callbacks = db.sync_session.info.get("_after_commit_callbacks", []) + assert len(callbacks) == 1 + callbacks[0]() assert len(delayed) == 1 + db.commit.assert_awaited_once() created_source = next(obj for obj in added if isinstance(obj, Source)) assert created_source.url == "https://example.com/new" @@ -75,7 +83,9 @@ async def flush() -> None: add=Mock(side_effect=added.append), flush=AsyncMock(side_effect=flush), refresh=AsyncMock(return_value=None), + commit=AsyncMock(return_value=None), execute=AsyncMock(return_value=_ScalarResult([])), + sync_session=SimpleNamespace(info={}), ) service = SourceService(db, uuid.uuid4()) global_notebook = SimpleNamespace(id=uuid.uuid4()) @@ -91,4 +101,10 @@ async def flush() -> None: assert result.notebook_id == global_notebook.id assert result.created_count == 1 assert result.skipped_count == 0 + assert delayed == [] + + callbacks = db.sync_session.info.get("_after_commit_callbacks", []) + assert len(callbacks) == 1 + callbacks[0]() assert len(delayed) == 1 + db.commit.assert_awaited_once() diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index e7739a2..162fda3 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -934,6 +934,7 @@ "placeholder": "Ask your notebook...", "sendHint": "Enter to send · Shift+Enter for new line", "notebookLabel": "Notebook", + "clearContext": "Clear context", "closePanel": "Close", "dockPanel": "Dock to sidebar", "floatPanel": "Floating window", diff --git a/apps/web/messages/zh.json b/apps/web/messages/zh.json index f3d7b20..863c22a 100644 --- a/apps/web/messages/zh.json +++ b/apps/web/messages/zh.json @@ -934,6 +934,7 @@ "placeholder": "向笔记本提问…", "sendHint": "Enter 发送 · Shift+Enter 换行", "notebookLabel": "笔记本", + "clearContext": "清除上下文", "closePanel": "关闭", "dockPanel": "固定到侧栏", "floatPanel": "悬浮窗口", diff --git a/apps/web/src/features/copilot/copilot-message-bubble.tsx b/apps/web/src/features/copilot/copilot-message-bubble.tsx index 98873a7..939c917 100644 --- a/apps/web/src/features/copilot/copilot-message-bubble.tsx +++ b/apps/web/src/features/copilot/copilot-message-bubble.tsx @@ -1,6 +1,7 @@ import ReactMarkdown from "react-markdown"; import remarkGfm from "remark-gfm"; import { Check, ClipboardPaste, Loader2 } from "lucide-react"; +import { m } from "framer-motion"; import { useTranslations } from "next-intl"; import { memo, useCallback, useMemo, useState } from "react"; @@ -11,13 +12,22 @@ import { MindMapView } from "@/components/message-render/mind-map-view"; import { DiagramView } from "@/components/message-render/diagram-view"; import { ExcalidrawView } from "@/components/message-render/excalidraw-view"; import { ChoiceCards } from "@/components/message-render/choice-cards"; +import { AgentSteps, ThinkingBubble } from "@/components/message-render/agent-steps"; +import { MarkdownContent } from "@/components/message-render/markdown-content"; +import { CodeBlock } from "@/components/message-render/code-block"; import { parseMessageContent } from "@/components/message-render/parse-message-content"; import { buildMarkdownComponents } from "@/components/genui"; +import type { AgentEvent } from "@/services/ai-service"; import type { Message, MindMapData } from "@/types"; import { stripCitationMarkers } from "@/lib/citation-utils"; +import { cn } from "@/lib/utils"; +import { useAuth } from "@/features/auth/auth-provider"; type Props = { message: Message; + isLastAssistant?: boolean; + streaming?: boolean; + liveAgentSteps?: AgentEvent[]; onInsert?: (content: string) => void | Promise; onInsertMindMap?: (data: MindMapData) => void; }; @@ -30,17 +40,54 @@ function buildReferencesBlock(citations: NonNullable): str return `\n\n**Reference Sources**\n\n${lines.join("\n\n")}`; } -export const CopilotMessageBubble = memo(function CopilotMessageBubble({ message, onInsert, onInsertMindMap }: Props) { +function StreamingEllipsis() { + return ( + + ); +} + +export const CopilotMessageBubble = memo(function CopilotMessageBubble({ + message, + isLastAssistant = false, + streaming = false, + liveAgentSteps = [], + onInsert, + onInsertMindMap, +}: Props) { const t = useTranslations("copilot"); + const { user } = useAuth(); + const avatarUrl = user?.avatar_url ?? null; + const initials = (user?.name?.[0] ?? user?.username?.[0] ?? "U").toUpperCase(); const [insertState, setInsertState] = useState<"idle" | "loading" | "done">("idle"); const [insertMindMapState, setInsertMindMapState] = useState<"idle" | "done">("idle"); + const isStreaming = isLastAssistant && streaming; + const isSpinning = isLastAssistant && message.content === ""; + + const stepsToShow = isLastAssistant && liveAgentSteps.length > 0 + ? liveAgentSteps + : message.agentSteps; + const mdComponents = useMemo( - () => buildMarkdownComponents({ citations: message.citations }), - [message.citations], + () => buildMarkdownComponents({ citations: message.citations, isMermaidStreaming: isStreaming, CodeBlock }), + [message.citations, isStreaming], ); - const { textContent, choices } = useMemo( + const { textContent, choices, needsRichMarkdown } = useMemo( () => parseMessageContent(message.content), [message.content], ); @@ -66,120 +113,159 @@ export const CopilotMessageBubble = memo(function CopilotMessageBubble({ message setTimeout(() => setInsertMindMapState("idle"), 2000); }, [onInsertMindMap, message.mindMap, insertMindMapState]); - if (message.role === "user") { - return ( -
-
- {message.quotedText ? ( -
-
-

- {message.quotedText} -

-
- ) : null} -
- {message.content} -
-
-
- ); - } - - const hasRichMedia = !!(message.diagram || message.mindMap || message.mcpResult); - const isLoading = !message.content && !hasRichMedia; - - if (isLoading) { - return ( -
- -
- ); - } - return ( -
- - -
- {textContent && ( -
- - {textContent} - + + {message.role === "assistant" && stepsToShow?.length ? ( + + ) : null} + +
+ {message.role === "assistant" && ( +
+ + {isStreaming && ( +
+ +
+ )}
)} - {choices && onInsert?.(q)} />} - {message.citations && message.citations.length > 0 && ( - - )} +
+ {message.role === "user" ? ( +
+ {message.quotedText ? ( +
+
+

+ {message.quotedText} +

+
+ ) : null} +
+

{message.content}

+
+
+ ) : ( + <> + {!isSpinning && ( +
+ {needsRichMarkdown ? ( +
+ + {textContent} + +
+ ) : ( + + )} + {choices && onInsert?.(q)} />} + {isStreaming && } +
+ )} - {message.mindMap && } - {message.diagram && } - {message.mcpResult && ( - message.mcpResult.html_content - ? - : message.mcpResult.tool.includes("excalidraw") && message.mcpResult.data - ? - : - )} + {message.citations && message.citations.length > 0 && ( + + )} - {(onInsert && message.content) || (onInsertMindMap && message.mindMap) ? ( -
- {onInsert && message.content && ( - - )} - {onInsertMindMap && message.mindMap && ( - - )} + {message.mindMap && } + {message.diagram && } + {message.mcpResult && ( + message.mcpResult.html_content + ? + : message.mcpResult.tool.includes("excalidraw") && message.mcpResult.data + ? + : + )} + + {(onInsert && message.content) || (onInsertMindMap && message.mindMap) ? ( +
+ {onInsert && message.content && ( + + )} + {onInsertMindMap && message.mindMap && ( + + )} +
+ ) : null} + + )} +
+ + {message.role === "user" && ( +
+ {avatarUrl ? ( + // eslint-disable-next-line @next/next/no-img-element + {initials} { (e.target as HTMLElement).style.display = "none"; }} + /> + ) : null} + + {initials} +
- ) : null} + )}
-
+ ); }); diff --git a/apps/web/src/features/copilot/copilot-panel.tsx b/apps/web/src/features/copilot/copilot-panel.tsx index 826fd76..a43c6b3 100644 --- a/apps/web/src/features/copilot/copilot-panel.tsx +++ b/apps/web/src/features/copilot/copilot-panel.tsx @@ -8,7 +8,7 @@ */ import { AnimatePresence, m, MotionConfig } from "framer-motion"; -import { ChevronDown, PanelRight, PictureInPicture2, Sparkles, X } from "lucide-react"; +import { ChevronDown, PanelRight, PictureInPicture2, Sparkles, SquarePen, X } from "lucide-react"; import Image from "next/image"; import { useTranslations } from "next-intl"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; @@ -16,7 +16,6 @@ import { useCopilotResize, DEFAULT_WIDTH } from "@/hooks/use-copilot-resize"; import type { CopilotMode } from "@/features/notebook/notebook-workspace"; import { ChatInput } from "@/components/chat-input"; -import { AgentSteps } from "@/components/message-render/agent-steps"; import { ApprovalCard } from "@/components/message-render/approval-card"; import { CopilotMessageBubble } from "@/features/copilot/copilot-message-bubble"; import { ProactiveCard } from "@/features/copilot/proactive-card"; @@ -89,6 +88,7 @@ export function CopilotPanel({ const [input, setInput] = useState(""); const [quotedText, setQuotedText] = useState(null); const [streaming, setStreaming] = useState(false); + const streamAbortRef = useRef(null); const [showScrollBtn, setShowScrollBtn] = useState(false); // Persist the copilot's conversation ID so history is maintained across messages const [copilotConvId, setCopilotConvId] = useState(undefined); @@ -244,6 +244,8 @@ export function CopilotPanel({ setQuotedText(null); // ChatInput handles auto-resize internally setStreaming(true); + const abortController = new AbortController(); + streamAbortRef.current = abortController; const assistantId = `assistant-${Date.now()}`; setMessages((c) => [...c, { id: assistantId, role: "assistant", content: "" }]); @@ -275,6 +277,7 @@ export function CopilotPanel({ } : m)) ); + streamAbortRef.current = null; setStreaming(false); }, editorContext, @@ -321,7 +324,7 @@ export function CopilotPanel({ }, copilotConvId, // reuse existing conversation for context continuity undefined, // globalSearch - undefined, // signal + abortController.signal, undefined, // toolHint undefined, // attachmentIds undefined, // attachmentsMeta @@ -333,7 +336,13 @@ export function CopilotPanel({ if (newConvId && newConvId !== copilotConvId) { setCopilotConvId(newConvId); } - } catch { + } catch (err) { + streamAbortRef.current = null; + // Aborted by user — keep whatever content was streamed so far + if (err instanceof Error && err.name === "AbortError") { + setStreaming(false); + return; + } setMessages((c) => c.map((m) => m.id === assistantId ? { ...m, content: t("errorRetry") } : m @@ -347,6 +356,24 @@ export function CopilotPanel({ [streaming, quotedText, getEditorContext, notebookId, copilotConvId] ); + const handleCancel = useCallback(() => { + streamAbortRef.current?.abort(); + streamAbortRef.current = null; + setStreaming(false); + }, []); + + const handleClearContext = useCallback(() => { + streamAbortRef.current?.abort(); + streamAbortRef.current = null; + setStreaming(false); + setMessages([]); + setCopilotConvId(undefined); + resetAgentState(); + if (notebookId) { + try { localStorage.removeItem(`chat:${notebookId}`); } catch { /* ignore */ } + } + }, [notebookId, resetAgentState]); + // Auto-submit when parent sends a pending prompt (polish / shorten) const lastPendingKey = useRef(null); useEffect(() => { @@ -451,6 +478,16 @@ export function CopilotPanel({
+ {hasMessages && ( + + )} {!isSheet && onModeChange && ( +
+
+ {t("clearContext")} +
+
+
+
+ )} +
- )} +
+
+ {t("referenceSources")} +
+
+
+
{!isSheet && onModeChange && ( +
+ +
+
+ {isFloating ? t("dockPanel") : t("floatPanel")} +
+
+
+
+ )} +
- )} - +
+
+ {t("closePanel")} +
+
+
+
-
+ {/* 底部分割线 */} +
- void submit(q)} - onInsertCitation={onInsertToEditor} - /> - - {relatedKnowledge.length > 0 && ( - ({ - source_title: `${c.notebook_title} → ${c.source_title}`, - excerpt: c.excerpt, - score: c.score, - chunk_id: c.chunk_id, - }))} - onAskAbout={(q) => void submit(q)} - /> - )} - -
- {!hasMessages ? ( -
-

- {greetingText || t("greeting")} -

- - {unreadSuggestions.length > 0 && ( -
- - {unreadSuggestions.map((s) => - s.type === "insight" ? ( - void submit(text)} - /> - ) : ( - void submit(q)} - /> - ) - )} - +
+ {/* References Internal Drawer Overlay */} + + {showReferences && ( + +
+
+ + {t("referenceSources")} +
+
- )} - - {insights.length > 0 && ( -
- {insights.slice(0, 3).map((insight) => ( - -

{insight.title}

- {insight.content && ( -

{insight.content}

- )} -
- ))} +
+ {loadingRelated && relatedKnowledge.length === 0 ? ( +
+ + +
+ ) : ( + { + setShowReferences(false); + void submit(text); + }} + onInsertCitation={onInsertToEditor} + /> + )} +
+ + )} + + +
+ {!hasMessages ? ( +
+ {/* 问候区:大号图标 + 标题 */} +
+ + {greetingLoading ? ( + + ) : ( +

+ {greetingText || t("greeting")} +

+ )}
- )} -
- {greetingLoading ? ( - <> - {[1, 2, 3].map((i) => ( - + {/* 主动建议卡片(已移至全局 Toaster) */} + + {/* 洞察卡片 */} + {insights.length > 0 && ( +
+ {insights.slice(0, 3).map((insight) => ( + +

{insight.title}

+ {insight.content && ( +

{insight.content}

+ )} +
))} - - ) : dynamicSuggestions && dynamicSuggestions.length > 0 ? ( - dynamicSuggestions.map((s) => ( - - )) - ) : ( - <> - {[ - { label: t("summarize"), prompt: "Summarize the key insights across all sources." }, - { label: t("generateOutline"), prompt: "Turn these notes into a short presentation outline." }, - { label: t("extractArguments"), prompt: "Compare and contrast the main arguments found in sources." }, - ].map((s) => ( +
+ )} + + {/* 快捷操作:Notion 风格 icon 行列表 */} +
+ {greetingLoading ? ( + <> + {[1, 2, 3].map((i) => ( + + ))} + + ) : dynamicSuggestions && dynamicSuggestions.length > 0 ? ( + dynamicSuggestions.map((s) => ( - ))} - - )} -
-
- ) : ( -
- {unreadSuggestions.length > 0 && ( - - {unreadSuggestions.map((s) => - s.type === "insight" ? ( - void submit(text)} - /> - ) : ( - void submit(q)} - /> - ) + )) + ) : ( + <> + {[ + { label: t("summarize"), prompt: "Summarize the key insights across all sources." }, + { label: t("generateOutline"), prompt: "Turn these notes into a short presentation outline." }, + { label: t("extractArguments"), prompt: "Compare and contrast the main arguments found in sources." }, + ].map((s) => ( + + ))} + )} - - )} - {messages.map((message, idx) => { - const isLastAssistant = message.role === "assistant" && idx === messages.length - 1; - - return ( -
- {isLastAssistant && streaming && pendingApproval && ( - { - await approveToolCall(pendingApproval.approvalId, approved); - setPendingApproval(null); - }} +
+
+ ) : ( +
+ {/* unreadSuggestions removed to globally floating ProactiveToaster */} + {messages.map((message, idx) => { + const isLastAssistant = message.role === "assistant" && idx === messages.length - 1; + + return ( +
+ {isLastAssistant && streaming && pendingApproval && ( + { + await approveToolCall(pendingApproval.approvalId, approved); + setPendingApproval(null); + }} + /> + )} + - )} - -
- ); - })} -
-
- )} - - {showScrollBtn && hasMessages && ( - - )} +
+ ); + })} +
+
+ )} + + {showScrollBtn && hasMessages && ( + + )} +
-
- void submit(text)} - onCancel={handleCancel} - placeholder={t("placeholder")} - streaming={streaming} - variant={isSheet ? "default" : "compact"} - accentBorder="border-border/40 focus-within:border-primary/30 focus-within:shadow-[0_0_0_2px_hsl(var(--primary)/0.06)]" - showHint={!isSheet} - hintText={t("sendHint")} - aboveInput={ - quotedText ? ( -
-
-

- {quotedText} -

- -
- ) : undefined - } - toolbarLeft={!isSheet ? ( - - - {t("notebookLabel")} - - ) : undefined} - /> + {/* ── 底部输入区 ── */} +
+
+ void submit(text)} + onCancel={handleCancel} + placeholder={t("placeholder")} + streaming={streaming} + variant={isSheet ? "default" : "compact"} + accentBorder="border-transparent" + showHint={false} + aboveInput={ + quotedText ? ( +
+
+

+ {quotedText} +

+ +
+ ) : undefined + } + toolbarLeft={!isSheet ? ( + + + {t("notebookLabel")} + + ) : undefined} + /> +
); diff --git a/apps/web/src/features/copilot/proactive-card.tsx b/apps/web/src/features/copilot/proactive-card.tsx index 7abfc35..3119c11 100644 --- a/apps/web/src/features/copilot/proactive-card.tsx +++ b/apps/web/src/features/copilot/proactive-card.tsx @@ -23,12 +23,13 @@ export const ProactiveCard = memo(function ProactiveCard({ animate={{ opacity: 1, y: 0, scale: 1 }} exit={{ opacity: 0, y: -8, scale: 0.97 }} transition={{ duration: 0.2 }} - className="relative rounded-xl border border-primary/15 bg-primary/[0.04] p-3" + className="relative rounded-xl border border-primary/15 bg-background/95 p-3 shadow-lg backdrop-blur-xl" > diff --git a/apps/web/src/features/copilot/proactive-surface-policy.ts b/apps/web/src/features/copilot/proactive-surface-policy.ts new file mode 100644 index 0000000..f1a0276 --- /dev/null +++ b/apps/web/src/features/copilot/proactive-surface-policy.ts @@ -0,0 +1,133 @@ +"use client"; + +const THOUGHT_SURFACE_COOLDOWN_MS = 30 * 60 * 1000; +const THOUGHT_FINGERPRINT_WINDOW_MS = 6 * 60 * 60 * 1000; +const RECENT_INTERACTION_WINDOW_MS = 20 * 1000; +const THOUGHT_SURFACE_STORAGE_KEY = "lyra:thought-surface-history"; + +export function createSuggestionFingerprint( + origin: "source_indexed" | "proactive_insight" | "lyra_thought", + payload: { + sourceId?: string; + sourceName?: string; + summary?: string; + message?: string; + questions?: string[]; + }, +): string { + if (origin === "source_indexed") { + return `source:${payload.sourceId ?? normalizeText(payload.sourceName ?? payload.summary ?? "")}`; + } + + const text = payload.message + ?? payload.summary + ?? payload.questions?.join("|") + ?? ""; + + const prefix = origin === "lyra_thought" ? "thought" : "insight"; + return `${prefix}:${normalizeText(text)}`; +} + +export function shouldAutoSurfaceSource(isMobile: boolean): boolean { + return !isMobile; +} + +export function shouldAutoSurfaceThought(input: ThoughtSurfaceInput): boolean { + const { + fingerprint, + isMobile, + copilotOpen, + streaming, + hasActiveSurface, + lastInteractionAt, + now = Date.now(), + } = input; + + if (!fingerprint || isMobile || copilotOpen || streaming || hasActiveSurface) { + return false; + } + + if (now - lastInteractionAt < RECENT_INTERACTION_WINDOW_MS) { + return false; + } + + const history = readThoughtSurfaceHistory(); + if (now - history.lastSurfacedAt < THOUGHT_SURFACE_COOLDOWN_MS) { + return false; + } + + const lastFingerprintAt = history.fingerprints[fingerprint]; + if (lastFingerprintAt && now - lastFingerprintAt < THOUGHT_FINGERPRINT_WINDOW_MS) { + return false; + } + + return true; +} + +export function rememberThoughtSurface(fingerprint: string, now = Date.now()): void { + const history = readThoughtSurfaceHistory(); + history.lastSurfacedAt = now; + history.fingerprints[fingerprint] = now; + + for (const [key, ts] of Object.entries(history.fingerprints)) { + if (now - ts > THOUGHT_FINGERPRINT_WINDOW_MS) { + delete history.fingerprints[key]; + } + } + + writeThoughtSurfaceHistory(history); +} + +export function __resetThoughtSurfaceHistoryForTests(): void { + if (typeof window === "undefined") return; + window.localStorage.removeItem(THOUGHT_SURFACE_STORAGE_KEY); +} + +function normalizeText(value: string): string { + return value.trim().toLowerCase().replace(/\s+/g, " ").slice(0, 160); +} + +function readThoughtSurfaceHistory(): ThoughtSurfaceHistory { + if (typeof window === "undefined") { + return { lastSurfacedAt: 0, fingerprints: {} }; + } + + const raw = window.localStorage.getItem(THOUGHT_SURFACE_STORAGE_KEY); + if (!raw) { + return { lastSurfacedAt: 0, fingerprints: {} }; + } + + try { + const parsed = JSON.parse(raw) as Partial; + return { + lastSurfacedAt: typeof parsed.lastSurfacedAt === "number" ? parsed.lastSurfacedAt : 0, + fingerprints: typeof parsed.fingerprints === "object" && parsed.fingerprints + ? Object.fromEntries( + Object.entries(parsed.fingerprints).filter((entry): entry is [string, number] => typeof entry[1] === "number"), + ) + : {}, + }; + } catch { + return { lastSurfacedAt: 0, fingerprints: {} }; + } +} + +function writeThoughtSurfaceHistory(history: ThoughtSurfaceHistory): void { + if (typeof window === "undefined") return; + window.localStorage.setItem(THOUGHT_SURFACE_STORAGE_KEY, JSON.stringify(history)); +} + +interface ThoughtSurfaceInput { + fingerprint: string; + isMobile: boolean; + copilotOpen: boolean; + streaming: boolean; + hasActiveSurface: boolean; + lastInteractionAt: number; + now?: number; +} + +interface ThoughtSurfaceHistory { + lastSurfacedAt: number; + fingerprints: Record; +} diff --git a/apps/web/src/features/copilot/proactive-toaster.tsx b/apps/web/src/features/copilot/proactive-toaster.tsx new file mode 100644 index 0000000..7875de3 --- /dev/null +++ b/apps/web/src/features/copilot/proactive-toaster.tsx @@ -0,0 +1,62 @@ +"use client"; + +import { AnimatePresence, m } from "framer-motion"; +import { useEffect, useMemo } from "react"; +import { SoulCard } from "@/features/copilot/soul-card"; +import { ProactiveCard } from "@/features/copilot/proactive-card"; +import { useProactiveStore } from "@/store/use-proactive-store"; + +const AUTO_HIDE_MS = 10_000; + +export function ProactiveToaster({ + onAsk, +}: { + onAsk: (text: string) => void; +}) { + const suggestions = useProactiveStore((s) => s.suggestions); + const hideSuggestion = useProactiveStore((s) => s.hideSuggestion); + const visibleSuggestion = useMemo(() => { + const surfaced = suggestions + .filter((suggestion) => suggestion.delivery === "surface" && !suggestion.read && !suggestion.hiddenAt) + .sort((a, b) => (a.surfacedAt ?? a.createdAt) - (b.surfacedAt ?? b.createdAt)); + + return surfaced[0] ?? null; + }, [suggestions]); + + useEffect(() => { + if (!visibleSuggestion) return; + + const timer = window.setTimeout(() => { + hideSuggestion(visibleSuggestion.id); + }, AUTO_HIDE_MS); + + return () => window.clearTimeout(timer); + }, [hideSuggestion, visibleSuggestion]); + + if (!visibleSuggestion) return null; + + return ( +
+ + + {visibleSuggestion.type === "insight" ? ( + onAsk(text)} /> + ) : ( + onAsk(text)} + /> + )} + + +
+ ); +} diff --git a/apps/web/src/features/copilot/relevant-sources-view.tsx b/apps/web/src/features/copilot/relevant-sources-view.tsx new file mode 100644 index 0000000..5b25d02 --- /dev/null +++ b/apps/web/src/features/copilot/relevant-sources-view.tsx @@ -0,0 +1,137 @@ +"use client"; +import { FileText, Globe, MessageCircle, CornerDownRight } from "lucide-react"; +import { useTranslations } from "next-intl"; +import type { WritingContextChunk } from "@/store/use-proactive-store"; +import type { CrossNotebookChunk } from "@/services/ai-service"; + +export function RelevantSourcesView({ + localChunks = [], + globalChunks = [], + onAskAbout, + onInsertCitation, +}: { + localChunks?: WritingContextChunk[]; + globalChunks?: CrossNotebookChunk[]; + onAskAbout?: (excerpt: string) => void; + onInsertCitation?: (text: string) => void; +}) { + const t = useTranslations("copilot"); + const totalCount = localChunks.length + globalChunks.length; + if (totalCount === 0) return null; + + return ( +
+
+ {/* Local Note chunks */} + {localChunks.length > 0 && ( +
+
+ + + {t("relevantSources", { count: localChunks.length })} + +
+ {localChunks.map((chunk) => ( + onInsertCitation?.(chunk.excerpt.slice(0, 200))} + onAsk={() => onAskAbout?.(`关于「${chunk.source_title}」中提到的:${chunk.excerpt.slice(0, 100)}…请帮我分析一下`)} + t={t} + /> + ))} +
+ )} + + {/* Global chunks */} + {globalChunks.length > 0 && ( +
+
+ + + {t("globalKnowledge")} ({globalChunks.length}) + +
+ {globalChunks.map((chunk) => ( + onInsertCitation?.(chunk.excerpt.slice(0, 200))} + onAsk={() => onAskAbout?.(`关于全局资料「${chunk.source_title}」中提到的:${chunk.excerpt.slice(0, 100)}…请帮我结合当前内容分析一下`)} + t={t} + /> + ))} +
+ )} +
+
+ ); +} + +function SourceCard({ + title, + excerpt, + score, + onInsert, + onAsk, + t, +}: { + title: string; + excerpt: string; + score?: number; + onInsert: () => void; + onAsk: () => void; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + t: any; +}) { + return ( +
+ {/* 标题栏 */} +
+

+ {title} +

+ {score !== undefined && ( + + {Math.round(score * 100)}% + + )} +
+ + {/* 摘要正文 */} +

+ {excerpt} +

+ + {/* Hover Action Bar */} +
+ {onInsert && ( + + )} + {onAsk && ( + + )} +
+
+ ); +} diff --git a/apps/web/src/features/copilot/soul-card.tsx b/apps/web/src/features/copilot/soul-card.tsx index dfecea6..414c2f1 100644 --- a/apps/web/src/features/copilot/soul-card.tsx +++ b/apps/web/src/features/copilot/soul-card.tsx @@ -39,7 +39,7 @@ export const SoulCard = memo(function SoulCard({ animate={{ opacity: 1, y: 0, scale: 1 }} exit={{ opacity: 0, y: -10, scale: 0.96 }} transition={{ duration: 0.25, ease: [0.23, 1, 0.32, 1] }} - className="relative overflow-hidden rounded-xl border border-violet-500/20 bg-gradient-to-br from-violet-500/[0.06] to-indigo-500/[0.04] p-3" + className="relative overflow-hidden rounded-xl border border-violet-500/20 bg-background/95 bg-gradient-to-br from-violet-500/[0.08] to-indigo-500/[0.05] p-3 shadow-lg backdrop-blur-xl" > {/* 装饰性渐变光晕 */}
diff --git a/apps/web/src/features/copilot/writing-context-bar.tsx b/apps/web/src/features/copilot/writing-context-bar.tsx deleted file mode 100644 index 9f4f8bc..0000000 --- a/apps/web/src/features/copilot/writing-context-bar.tsx +++ /dev/null @@ -1,91 +0,0 @@ -"use client"; - -import { AnimatePresence, m } from "framer-motion"; -import { BookOpen, ChevronDown, ChevronUp, MessageCircle } from "lucide-react"; -import { useTranslations } from "next-intl"; -import { useState } from "react"; -import type { WritingContextChunk } from "@/store/use-proactive-store"; - -export function WritingContextBar({ - chunks, - onAskAbout, - onInsertCitation, -}: { - chunks: WritingContextChunk[]; - onAskAbout?: (excerpt: string) => void; - onInsertCitation?: (text: string) => void; -}) { - const t = useTranslations("copilot"); - const [collapsed, setCollapsed] = useState(true); - - if (chunks.length === 0) return null; - - return ( -
- - - - {!collapsed && ( - -
- {chunks.map((chunk) => ( -
-

- {chunk.source_title} -

-

- {chunk.excerpt} -

-
- {onInsertCitation && ( - - )} - {onAskAbout && ( - - )} -
-
- ))} -
-
- )} -
-
- ); -} diff --git a/apps/web/src/features/editor/block-handle.tsx b/apps/web/src/features/editor/block-handle.tsx index 9123ef2..7fff5bd 100644 --- a/apps/web/src/features/editor/block-handle.tsx +++ b/apps/web/src/features/editor/block-handle.tsx @@ -2,7 +2,10 @@ import type { Editor } from "@tiptap/react"; import { AnimatePresence, m } from "framer-motion"; +import type { TargetAndTransition, Transition } from "framer-motion"; import { + ArrowRightLeft, + Check, ChevronRight, Code2, Copy, @@ -11,10 +14,15 @@ import { Heading1, Heading2, Heading3, + Highlighter, Link2, List, + ListChecks, ListOrdered, + MessageSquare, Minus, + MoveRight, + Palette, Pen, Pilcrow, Plus, @@ -22,11 +30,15 @@ import { Search, Sparkles, Trash2, + WandSparkles, } from "lucide-react"; -import { useCallback, useEffect, useRef, useState } from "react"; +import { forwardRef, useCallback, useEffect, useMemo, useRef, useState, type ComponentProps, type ReactNode } from "react"; import { createPortal } from "react-dom"; import { useTranslations } from "next-intl"; +import type { EditorActionRequest } from "@/features/editor/editor-actions"; +import { cn } from "@/lib/utils"; + type BlockInfo = { top: number; left: number; @@ -34,28 +46,78 @@ type BlockInfo = { height: number; handleTop: number; pos: number; - node: Node; domEl: HTMLElement; }; +type MenuMode = "actions" | "insert" | null; +type SubmenuMode = "turnInto" | "colors" | null; + type Props = { editor: Editor | null; - onAskAI?: (text: string, action: string) => void; + onEditorAction?: (payload: EditorActionRequest) => void; +}; + +type BaseMenuItem = { + label: string; + icon: typeof Pilcrow; + shortcut?: string; + disabled?: boolean; +}; + +type SubmenuItem = BaseMenuItem & { + type: "submenu"; + submenu: Exclude; +}; + +type ActionItem = BaseMenuItem & { + type: "action"; + onSelect: () => void; + tone?: "default" | "danger" | "ai"; }; +type BlockMenuItem = SubmenuItem | ActionItem; + const TOP_LEVEL_TAGS = new Set([ "P", "H1", "H2", "H3", "H4", "H5", "H6", "UL", "OL", "BLOCKQUOTE", "PRE", "HR", "DIV", ]); +const ACTION_MENU_WIDTH = 260; +const SUBMENU_WIDTH = 240; +const INSERT_MENU_WIDTH = 280; +const HANDLE_SIZE = 30; +const HANDLE_LEFT = -76; +const MENU_GAP_X = 28; +const BLOCK_HIGHLIGHT_PAD_X = 12; +const BLOCK_HIGHLIGHT_PAD_Y = 4; +const LIST_MARKER_PAD_X = 18; + +const TEXT_COLORS = [ + { key: "default-text", labelKey: "blockColorDefaultText", swatch: "bg-transparent ring-1 ring-white/10", selected: true }, + { key: "gray-text", labelKey: "blockColorGrayText", swatch: "bg-zinc-500/70" }, + { key: "amber-text", labelKey: "blockColorAmberText", swatch: "bg-amber-500/80" }, + { key: "green-text", labelKey: "blockColorGreenText", swatch: "bg-emerald-500/80" }, + { key: "blue-text", labelKey: "blockColorBlueText", swatch: "bg-sky-500/80" }, + { key: "purple-text", labelKey: "blockColorPurpleText", swatch: "bg-violet-500/80" }, +]; + +const BACKGROUND_COLORS = [ + { key: "default-bg", labelKey: "blockColorDefaultBackground", swatch: "bg-transparent ring-1 ring-white/10", selected: true }, + { key: "gray-bg", labelKey: "blockColorGrayBackground", swatch: "bg-zinc-600/60" }, + { key: "amber-bg", labelKey: "blockColorAmberBackground", swatch: "bg-amber-600/50" }, + { key: "green-bg", labelKey: "blockColorGreenBackground", swatch: "bg-emerald-600/50" }, + { key: "blue-bg", labelKey: "blockColorBlueBackground", swatch: "bg-sky-600/50" }, + { key: "purple-bg", labelKey: "blockColorPurpleBackground", swatch: "bg-violet-600/50" }, +]; + function findTopLevelBlock(target: HTMLElement, editorDom: HTMLElement): HTMLElement | null { - let el: HTMLElement | null = target; - while (el && el !== editorDom) { - if (el.parentElement === editorDom && TOP_LEVEL_TAGS.has(el.tagName)) { - return el; + let element: HTMLElement | null = target; + while (element && element !== editorDom) { + if (element.parentElement === editorDom && TOP_LEVEL_TAGS.has(element.tagName)) { + return element; } - el = el.parentElement; + element = element.parentElement; } return null; } @@ -83,23 +145,40 @@ function getBlockRect(el: HTMLElement, editorDom: HTMLElement) { }; } -function getMenuPositionFromBlockRect(rect: DOMRect) { +function findScrollParent(el: HTMLElement | null): HTMLElement | null { + let parent = el?.parentElement ?? null; + while (parent) { + const style = window.getComputedStyle(parent); + const canScrollY = /(auto|scroll|overlay)/.test(style.overflowY); + if (canScrollY && parent.scrollHeight > parent.clientHeight) { + return parent; + } + parent = parent.parentElement; + } + return null; +} + +function clampLeft(left: number, width: number) { + if (typeof window === "undefined") return left; + return Math.max(12, Math.min(left, window.innerWidth - width - 12)); +} + +function getMenuPositionFromBlockRect(rect: DOMRect, width: number) { return { - top: rect.top, - left: rect.left - MENU_WIDTH - MENU_BLOCK_GAP_X, + top: Math.max(16, rect.top - 10), + left: clampLeft(rect.left - width - MENU_GAP_X, width), }; } -const MENU_WIDTH = 220; -const HANDLE_SIZE = 28; -const HANDLE_LEFT = -72; -const MENU_BLOCK_GAP_X = 44; -const BLOCK_HIGHLIGHT_PAD_X = 10; -const BLOCK_HIGHLIGHT_PAD_Y = 4; -const LIST_MARKER_PAD_X = 18; +function getInsertMenuPositionBelowBlock(rect: DOMRect) { + // Position below the block, left-aligned with the block content + const top = rect.bottom + 4; + const left = clampLeft(rect.left, INSERT_MENU_WIDTH); + return { top, left }; +} function getHighlightInsets(block: BlockInfo) { - const isListBlock = block.domEl.tagName === "UL" || block.domEl.tagName === "OL"; + const isListBlock = block.domEl?.tagName === "UL" || block.domEl?.tagName === "OL"; return { top: BLOCK_HIGHLIGHT_PAD_Y, right: BLOCK_HIGHLIGHT_PAD_X, @@ -108,39 +187,19 @@ function getHighlightInsets(block: BlockInfo) { }; } -function findScrollParent(el: HTMLElement | null): HTMLElement | null { - let parent = el?.parentElement ?? null; - while (parent) { - const style = window.getComputedStyle(parent); - const canScrollY = /(auto|scroll|overlay)/.test(style.overflowY); - if (canScrollY && parent.scrollHeight > parent.clientHeight) { - return parent; - } - parent = parent.parentElement; - } - return null; -} - -export function BlockHandle({ editor, onAskAI }: Props) { +export function BlockHandle({ editor, onEditorAction }: Props) { const t = useTranslations("editor"); const [hoverBlock, setHoverBlock] = useState(null); const [anchoredBlock, setAnchoredBlock] = useState(null); - const [menuOpen, setMenuOpen] = useState(false); - const [addMenuOpen, setAddMenuOpen] = useState(false); - const [addFilter, setAddFilter] = useState(""); - const [menuFilter, setMenuFilter] = useState(""); - const [turnIntoOpen, setTurnIntoOpen] = useState(false); + const [menuMode, setMenuMode] = useState(null); + const [submenuMode, setSubmenuMode] = useState(null); const [menuPos, setMenuPos] = useState<{ top: number; left: number } | null>(null); + const [search, setSearch] = useState(""); const menuRef = useRef(null); - const turnIntoRef = useRef(null); - const addMenuRef = useRef(null); - const addFilterRef = useRef(null); - const menuFilterRef = useRef(null); - const gripBtnRef = useRef(null); - const containerRef = useRef(null); + const submenuRef = useRef(null); const hideTimerRef = useRef | null>(null); - const anyMenuOpen = menuOpen || addMenuOpen; + const anyMenuOpen = menuMode !== null; const block = anyMenuOpen ? (anchoredBlock ?? hoverBlock) : hoverBlock; const clearHideTimer = useCallback(() => { @@ -150,24 +209,61 @@ export function BlockHandle({ editor, onAskAI }: Props) { } }, []); + const closeMenus = useCallback(() => { + setMenuMode(null); + setSubmenuMode(null); + setSearch(""); + setAnchoredBlock(null); + }, []); + + const resolveBlockDom = useCallback((info: BlockInfo | null): HTMLElement | null => { + if (!info || !editor) return null; + const dom = editor.view.dom as HTMLElement; + if (info.domEl && dom.contains(info.domEl)) return info.domEl; + try { + const domAtPos = editor.view.domAtPos(info.pos); + let el = domAtPos.node as HTMLElement; + while (el && el.parentElement !== dom) { + el = el.parentElement as HTMLElement; + } + if (el && el !== dom && dom.contains(el)) return el; + } catch { + return null; + } + return null; + }, [editor]); + + const anchorBlock = useCallback((nextBlock: BlockInfo | null, nextMode: Exclude) => { + if (!nextBlock) return; + setAnchoredBlock({ ...nextBlock }); + const currentDom = resolveBlockDom(nextBlock); + if (currentDom) { + const width = nextMode === "insert" ? INSERT_MENU_WIDTH : ACTION_MENU_WIDTH; + setMenuPos(getMenuPositionFromBlockRect(currentDom.getBoundingClientRect(), width)); + } + setMenuMode(nextMode); + setSubmenuMode(null); + setSearch(""); + }, [resolveBlockDom]); + useEffect(() => { if (!editor) return; - const dom = editor.view.dom; + const dom = editor.view.dom as HTMLElement; - const handleMouseOver = (e: MouseEvent) => { - if (menuOpen || addMenuOpen) return; - const target = e.target as HTMLElement; - const blockEl = findTopLevelBlock(target, dom as HTMLElement); + const handleMouseOver = (event: MouseEvent) => { + if (anyMenuOpen) return; + const target = event.target as HTMLElement; + const blockEl = findTopLevelBlock(target, dom); if (!blockEl) return; clearHideTimer(); - const { top, left, width, height, handleTop } = getBlockRect(blockEl, dom as HTMLElement); + const { top, left, width, height, handleTop } = getBlockRect(blockEl, dom); const pos = editor.view.posAtDOM(blockEl, 0); - setHoverBlock({ top, left, width, height, handleTop, pos, node: blockEl as unknown as Node, domEl: blockEl }); + setHoverBlock({ top, left, width, height, handleTop, pos, domEl: blockEl }); }; const handleMouseLeave = () => { - if (menuOpen || addMenuOpen) return; - hideTimerRef.current = setTimeout(() => setHoverBlock(null), 200); + if (anyMenuOpen) return; + hideTimerRef.current = setTimeout(() => setHoverBlock(null), 180); }; dom.addEventListener("mouseover", handleMouseOver); @@ -177,76 +273,82 @@ export function BlockHandle({ editor, onAskAI }: Props) { dom.removeEventListener("mouseleave", handleMouseLeave); clearHideTimer(); }; - }, [editor, menuOpen, addMenuOpen, clearHideTimer]); + }, [anyMenuOpen, clearHideTimer, editor]); - // Close menus on click outside. - // Use `click` instead of `mousedown` so menu item onClick handlers run first. useEffect(() => { - if (!menuOpen && !addMenuOpen) return; - const handleClick = (e: MouseEvent) => { - const target = e.target as HTMLElement; - if (menuOpen) { - const inMenu = menuRef.current?.contains(target); - const inSub = turnIntoRef.current?.contains(target); - if (!inMenu && !inSub) { - setMenuOpen(false); - setMenuFilter(""); - setTurnIntoOpen(false); - } - } - if (addMenuOpen && addMenuRef.current && !addMenuRef.current.contains(target)) { - setAddMenuOpen(false); - setAddFilter(""); + if (!anyMenuOpen) return; + const handleClick = (event: MouseEvent) => { + const target = event.target as HTMLElement; + const inMenu = menuRef.current?.contains(target); + const inSubmenu = submenuRef.current?.contains(target); + if (!inMenu && !inSubmenu) { + closeMenus(); } }; document.addEventListener("click", handleClick); return () => document.removeEventListener("click", handleClick); - }, [menuOpen, addMenuOpen]); + }, [anyMenuOpen, closeMenus]); useEffect(() => { - const handleKey = (e: KeyboardEvent) => { - if (e.key === "Escape") { - if (turnIntoOpen) { - setTurnIntoOpen(false); - return; - } - setMenuOpen(false); - setAddMenuOpen(false); - setAddFilter(""); - setMenuFilter(""); - setTurnIntoOpen(false); + const handleKey = (event: KeyboardEvent) => { + if (event.key !== "Escape") return; + if (submenuMode) { + setSubmenuMode(null); + return; } + closeMenus(); }; document.addEventListener("keydown", handleKey); return () => document.removeEventListener("keydown", handleKey); - }, [turnIntoOpen]); + }, [closeMenus, submenuMode]); useEffect(() => { - if (addMenuOpen) { - setTimeout(() => addFilterRef.current?.focus(), 60); - } else { - setAddFilter(""); - } - }, [addMenuOpen]); + if (!anyMenuOpen || !editor) return; - useEffect(() => { - if (menuOpen) { - setTimeout(() => menuFilterRef.current?.focus(), 60); - } else { - setMenuFilter(""); - setTurnIntoOpen(false); - } - }, [menuOpen]); + const updateMenuPosition = () => { + const anchoredDom = resolveBlockDom(anchoredBlock ?? hoverBlock); + const editorDom = editor.view.dom as HTMLElement; + if (!anchoredDom || !editorDom) return; + const nextRect = getBlockRect(anchoredDom, editorDom); + setAnchoredBlock((prev) => { + if (!prev) return prev; + if ( + prev.top === nextRect.top && + prev.left === nextRect.left && + prev.width === nextRect.width && + prev.height === nextRect.height && + prev.domEl === anchoredDom + ) { + return prev; + } + return { ...prev, ...nextRect, domEl: anchoredDom }; + }); + if (menuMode === "insert") { + setMenuPos(getInsertMenuPositionBelowBlock(anchoredDom.getBoundingClientRect())); + } else { + const width = ACTION_MENU_WIDTH; + setMenuPos(getMenuPositionFromBlockRect(anchoredDom.getBoundingClientRect(), width)); + } + }; - useEffect(() => { - if (!menuOpen || !editor) return; + updateMenuPosition(); + window.addEventListener("resize", updateMenuPosition); + document.addEventListener("scroll", updateMenuPosition, true); + + return () => { + window.removeEventListener("resize", updateMenuPosition); + document.removeEventListener("scroll", updateMenuPosition, true); + }; + }, [anchoredBlock, anyMenuOpen, editor, hoverBlock, menuMode, resolveBlockDom]); + useEffect(() => { + if (menuMode !== "actions" || !editor) return; const scrollParent = findScrollParent(editor.view.dom as HTMLElement); if (!scrollParent) return; - const prevOverflowY = scrollParent.style.overflowY; - const prevOverscrollBehavior = scrollParent.style.overscrollBehavior; - const preventScroll = (e: Event) => e.preventDefault(); + const previousOverflowY = scrollParent.style.overflowY; + const previousOverscrollBehavior = scrollParent.style.overscrollBehavior; + const preventScroll = (event: Event) => event.preventDefault(); scrollParent.style.overflowY = "hidden"; scrollParent.style.overscrollBehavior = "contain"; @@ -254,250 +356,213 @@ export function BlockHandle({ editor, onAskAI }: Props) { scrollParent.addEventListener("touchmove", preventScroll, { passive: false }); return () => { - scrollParent.style.overflowY = prevOverflowY; - scrollParent.style.overscrollBehavior = prevOverscrollBehavior; + scrollParent.style.overflowY = previousOverflowY; + scrollParent.style.overscrollBehavior = previousOverscrollBehavior; scrollParent.removeEventListener("wheel", preventScroll); scrollParent.removeEventListener("touchmove", preventScroll); }; - }, [menuOpen, editor]); + }, [editor, menuMode]); - useEffect(() => { - if (!menuOpen && !addMenuOpen) { - setAnchoredBlock(null); - } - }, [menuOpen, addMenuOpen]); + const dispatchBlockAction = useCallback((action: EditorActionRequest["action"], text: string = "") => { + if (!block) return; + onEditorAction?.({ + scope: "block", + action, + text, + blockPos: block.pos, + }); + closeMenus(); + }, [block, closeMenus, onEditorAction]); - const anchorCurrentBlock = useCallback((info: BlockInfo | null) => { - if (info) setAnchoredBlock({ ...info }); - }, []); + const insertBlock = useCallback((type: string, attrs?: Record) => { + if (!editor || !block) return; + const resolvedPos = editor.state.doc.resolve(block.pos); + const after = resolvedPos.after(1); + let content: object; - // ── Insert a new block after the current one ────────────────────────────── - const insertBlock = useCallback( - (type: string, attrs?: Record) => { - if (!editor || !block) return; - const resolvedPos = editor.state.doc.resolve(block.pos); - const after = resolvedPos.after(1); - let content: object; - switch (type) { - case "bulletList": - case "orderedList": - content = { type, content: [{ type: "listItem", content: [{ type: "paragraph" }] }] }; - break; - case "blockquote": - content = { type, content: [{ type: "paragraph" }] }; - break; - case "horizontalRule": - content = { type }; - break; - case "mindMap": - content = { type, attrs: attrs ?? { data: JSON.stringify({ title: t("mindMapDefaultTitle"), branches: [] }) } }; - break; - default: - content = attrs ? { type, attrs } : { type, content: [] }; - } - editor.chain().focus().insertContentAt(after, content).run(); - if (type !== "horizontalRule" && type !== "mindMap") { - editor.commands.setTextSelection(after + 1); - } - setAddMenuOpen(false); - setAddFilter(""); - }, - [editor, block, t], - ); + switch (type) { + case "bulletList": + case "orderedList": + content = { type, content: [{ type: "listItem", content: [{ type: "paragraph" }] }] }; + break; + case "blockquote": + case "codeBlock": + content = { type, content: [{ type: "paragraph" }] }; + break; + case "horizontalRule": + content = { type }; + break; + case "mindMap": + content = { type, attrs: attrs ?? { data: JSON.stringify({ title: t("mindMapDefaultTitle"), branches: [] }) } }; + break; + default: + content = attrs ? { type, attrs, content: [] } : { type, content: [] }; + } - // ── Turn into ───────────────────────────────────────────────────────────── - const handleTurnInto = useCallback( - (type: string, attrs?: Record) => { - if (!editor || !block) return; - editor.chain().focus().setTextSelection(block.pos); - if (type === "paragraph") editor.chain().focus().setParagraph().run(); - else if (type === "heading") editor.chain().focus().toggleHeading(attrs as { level: 1 | 2 | 3 }).run(); - else if (type === "bulletList") editor.chain().focus().toggleBulletList().run(); - else if (type === "orderedList") editor.chain().focus().toggleOrderedList().run(); - else if (type === "blockquote") editor.chain().focus().toggleBlockquote().run(); - setMenuOpen(false); - setMenuFilter(""); - setTurnIntoOpen(false); - }, - [editor, block], - ); + editor.chain().focus().insertContentAt(after, content).run(); + if (type !== "horizontalRule" && type !== "mindMap") { + editor.commands.setTextSelection(after + 1); + } + closeMenus(); + }, [block, closeMenus, editor, t]); - const handleDelete = useCallback(() => { + const transformBlock = useCallback((type: string, attrs?: Record) => { if (!editor || !block) return; - const resolvedPos = editor.state.doc.resolve(block.pos); - const nodeAfter = resolvedPos.nodeAfter; - if (nodeAfter) { - editor.chain().focus().deleteRange({ from: resolvedPos.before(1), to: resolvedPos.before(1) + nodeAfter.nodeSize }).run(); - } - setMenuOpen(false); - setMenuFilter(""); - setTurnIntoOpen(false); - setHoverBlock(null); - setAnchoredBlock(null); - }, [editor, block]); + editor.chain().focus().setTextSelection(block.pos).run(); + if (type === "paragraph") editor.chain().focus().setParagraph().run(); + else if (type === "heading") editor.chain().focus().toggleHeading(attrs as { level: 1 | 2 | 3 }).run(); + else if (type === "bulletList") editor.chain().focus().toggleBulletList().run(); + else if (type === "orderedList") editor.chain().focus().toggleOrderedList().run(); + else if (type === "blockquote") editor.chain().focus().toggleBlockquote().run(); + else if (type === "codeBlock") editor.chain().focus().toggleCodeBlock().run(); + closeMenus(); + }, [block, closeMenus, editor]); - const handleDuplicate = useCallback(() => { + const duplicateBlock = useCallback(() => { if (!editor || !block) return; const resolvedPos = editor.state.doc.resolve(block.pos); const nodeAfter = resolvedPos.nodeAfter; - if (nodeAfter) { - const after = resolvedPos.before(1) + nodeAfter.nodeSize; - editor.chain().focus().insertContentAt(after, nodeAfter.toJSON()).run(); - } - setMenuOpen(false); - setMenuFilter(""); - }, [editor, block]); + if (!nodeAfter) return; + const after = resolvedPos.before(1) + nodeAfter.nodeSize; + editor.chain().focus().insertContentAt(after, nodeAfter.toJSON()).run(); + closeMenus(); + }, [block, closeMenus, editor]); - const handleAskAIBlock = useCallback(() => { + const deleteBlock = useCallback(() => { if (!editor || !block) return; const resolvedPos = editor.state.doc.resolve(block.pos); const nodeAfter = resolvedPos.nodeAfter; - const text = nodeAfter ? nodeAfter.textContent : ""; - onAskAI?.(text, "ask"); - setMenuOpen(false); - setMenuFilter(""); - }, [editor, block, onAskAI]); + if (!nodeAfter) return; + editor.chain().focus().deleteRange({ + from: resolvedPos.before(1), + to: resolvedPos.before(1) + nodeAfter.nodeSize, + }).run(); + setHoverBlock(null); + closeMenus(); + }, [block, closeMenus, editor]); - const handleCopyLink = useCallback(() => { + const copyBlockLink = useCallback(() => { const url = `${window.location.href.split("#")[0]}#block-${block?.pos ?? 0}`; navigator.clipboard.writeText(url).catch(() => {}); - setMenuOpen(false); - setMenuFilter(""); - }, [block]); - - const resolveBlockDom = useCallback((info: BlockInfo | null): HTMLElement | null => { - if (!info || !editor) return null; - const dom = editor.view.dom as HTMLElement; - if (info.domEl && dom.contains(info.domEl)) return info.domEl; - try { - const domAtPos = editor.view.domAtPos(info.pos); - let el = domAtPos.node as HTMLElement; - while (el && el.parentElement !== dom) el = el.parentElement as HTMLElement; - if (el && el !== dom && dom.contains(el)) return el; - } catch { /* pos might be invalid */ } - return null; - }, [editor]); - - useEffect(() => { - if (!menuOpen) return; + closeMenus(); + }, [block?.pos, closeMenus]); - const updateMenuPosition = () => { - const anchoredDom = resolveBlockDom(anchoredBlock ?? hoverBlock); - const editorDom = editor?.view.dom as HTMLElement | undefined; - - if (anchoredDom && editorDom) { - const nextRect = getBlockRect(anchoredDom, editorDom); - setAnchoredBlock((prev) => { - if (!prev) return prev; - if ( - prev.top === nextRect.top && - prev.left === nextRect.left && - prev.width === nextRect.width && - prev.height === nextRect.height && - prev.handleTop === nextRect.handleTop && - prev.domEl === anchoredDom - ) { - return prev; - } - return { ...prev, ...nextRect, domEl: anchoredDom }; - }); - setMenuPos({ - ...getMenuPositionFromBlockRect(anchoredDom.getBoundingClientRect()), - }); - } - }; - - updateMenuPosition(); - window.addEventListener("resize", updateMenuPosition); - document.addEventListener("scroll", updateMenuPosition, true); + const blockText = useMemo(() => { + if (!editor || !block) return ""; + const resolvedPos = editor.state.doc.resolve(block.pos); + return resolvedPos.nodeAfter?.textContent ?? ""; + }, [block, editor]); - return () => { - window.removeEventListener("resize", updateMenuPosition); - document.removeEventListener("scroll", updateMenuPosition, true); - }; - }, [menuOpen, anchoredBlock, hoverBlock, resolveBlockDom, editor]); + const transformItems = [ + { label: t("blockTypeText"), icon: Pilcrow, onSelect: () => transformBlock("paragraph") }, + { label: t("blockTypeHeading1"), icon: Heading1, onSelect: () => transformBlock("heading", { level: 1 }) }, + { label: t("blockTypeHeading2"), icon: Heading2, onSelect: () => transformBlock("heading", { level: 2 }) }, + { label: t("blockTypeHeading3"), icon: Heading3, onSelect: () => transformBlock("heading", { level: 3 }) }, + { label: t("blockTypeBulletList"), icon: List, onSelect: () => transformBlock("bulletList") }, + { label: t("blockTypeNumberedList"), icon: ListOrdered, onSelect: () => transformBlock("orderedList") }, + { label: t("blockTypeQuote"), icon: Quote, onSelect: () => transformBlock("blockquote") }, + { label: t("blockTypeCode"), icon: Code2, onSelect: () => transformBlock("codeBlock") }, + ]; - if (!editor || !editor.isEditable) return null; + const actionGroups = useMemo(() => { + const groups: Array<{ key: string; items: BlockMenuItem[] }> = [ + { + key: "structure", + items: [ + { type: "submenu", label: t("blockTurnInto"), icon: ArrowRightLeft, submenu: "turnInto" }, + { type: "submenu", label: t("blockColor"), icon: Palette, submenu: "colors" }, + ], + }, + { + key: "actions", + items: [ + { type: "action", label: t("blockCopyLink"), icon: Link2, shortcut: "⌘⌃L", onSelect: copyBlockLink }, + { type: "action", label: t("blockDuplicate"), icon: Copy, shortcut: "⌘D", onSelect: duplicateBlock }, + { type: "action", label: t("blockDelete"), icon: Trash2, shortcut: "Del", onSelect: deleteBlock, tone: "danger" }, + ], + }, + { + key: "ai", + items: [ + { type: "action", label: t("blockAskAI"), icon: WandSparkles, shortcut: "⌘J", onSelect: () => dispatchBlockAction("askCopilot", blockText), tone: "ai" }, + ], + }, + ]; + return groups; + }, [blockText, copyBlockLink, deleteBlock, dispatchBlockAction, duplicateBlock, t]); - // ── Turn-into items ───────────────────────────────────────────────────── - const turnIntoItems = [ - { label: t("blockTypeText"), icon: Pilcrow, action: () => handleTurnInto("paragraph") }, - { label: "H1", icon: Heading1, action: () => handleTurnInto("heading", { level: 1 }) }, - { label: "H2", icon: Heading2, action: () => handleTurnInto("heading", { level: 2 }) }, - { label: "H3", icon: Heading3, action: () => handleTurnInto("heading", { level: 3 }) }, - { label: t("blockTypeBulletList"), icon: List, action: () => handleTurnInto("bulletList") }, - { label: t("blockTypeNumberedList"), icon: ListOrdered, action: () => handleTurnInto("orderedList") }, - { label: t("blockTypeQuote"), icon: Quote, action: () => handleTurnInto("blockquote") }, - ]; + const insertGroups = useMemo(() => { + return [ + { + key: "basic", + title: t("blockSectionBasic"), + items: [ + { label: t("blockTypeText"), icon: Pilcrow, onSelect: () => insertBlock("paragraph") }, + { label: t("blockTypeHeading1"), icon: Heading1, shortcut: "#", onSelect: () => insertBlock("heading", { level: 1 }) }, + { label: t("blockTypeHeading2"), icon: Heading2, shortcut: "##", onSelect: () => insertBlock("heading", { level: 2 }) }, + { label: t("blockTypeHeading3"), icon: Heading3, shortcut: "###", onSelect: () => insertBlock("heading", { level: 3 }) }, + { label: t("blockTypeQuote"), icon: Quote, shortcut: ">", onSelect: () => insertBlock("blockquote") }, + { label: t("blockTypeBulletList"), icon: List, shortcut: "-", onSelect: () => insertBlock("bulletList") }, + { label: t("blockTypeNumberedList"), icon: ListOrdered, shortcut: "1.", onSelect: () => insertBlock("orderedList") }, + { label: t("blockTypeTodoList"), icon: ListChecks, shortcut: "[]", onSelect: () => {}, disabled: true }, + { label: t("blockTypeCode"), icon: Code2, shortcut: "```", onSelect: () => insertBlock("codeBlock") }, + { label: t("blockTypeDivider"), icon: Minus, shortcut: "---", onSelect: () => insertBlock("horizontalRule") }, + { label: t("blockTypeMindMap"), icon: GitFork, onSelect: () => insertBlock("mindMap") }, + ], + }, + { + key: "ai", + title: t("blockSectionLyranote"), + items: [ + { label: t("blockAIContinue"), icon: Pen, badge: "新", onSelect: () => dispatchBlockAction("continue", editor?.getText() ?? "") }, + { label: t("blockAISummarize"), icon: Sparkles, badge: "新", onSelect: () => dispatchBlockAction("summarize", editor?.getText() ?? "") }, + ], + }, + ]; + }, [dispatchBlockAction, editor, insertBlock, t]); - // ── Main menu items (filterable) ────────────────────────────────────────── - type MenuItem = - | { type: "action"; label: string; icon: typeof Pilcrow; action: () => void; shortcut?: string; danger?: boolean; ai?: boolean } - | { type: "sub"; label: string; icon: typeof Pilcrow; onHover: () => void } - | { type: "divider" } - | { type: "section"; label: string }; - - const allMenuItems: MenuItem[] = [ - { type: "section", label: t("blockSectionText") }, - { type: "sub", label: t("blockTurnInto"), icon: Pilcrow, onHover: () => setTurnIntoOpen(true) }, - { type: "divider" }, - { type: "action", label: t("blockCopyLink"), icon: Link2, action: handleCopyLink, shortcut: "⌘⌥L" }, - { type: "action", label: t("blockDuplicate"), icon: Copy, action: handleDuplicate, shortcut: "⌘D" }, - { type: "action", label: t("blockDelete"), icon: Trash2, action: handleDelete, danger: true, shortcut: "Del" }, - { type: "divider" }, - { type: "action", label: t("blockAskAI"), icon: Sparkles, action: handleAskAIBlock, ai: true, shortcut: "⌘J" }, - ]; + const filteredActionGroups = useMemo(() => { + if (!search.trim()) return actionGroups; + const term = search.trim().toLowerCase(); + return actionGroups + .map((group) => ({ + ...group, + items: group.items.filter((item) => item.label.toLowerCase().includes(term)), + })) + .filter((group) => group.items.length > 0); + }, [actionGroups, search]); - const mf = menuFilter.toLowerCase(); - const filteredMenuItems = mf - ? allMenuItems.filter((item) => { - if (item.type === "divider" || item.type === "section") return false; - return item.label.toLowerCase().includes(mf); - }) - : allMenuItems; - - // ── Add-block data ───────────────────────────────────────────────────────── - const basicBlocks = [ - { label: t("blockTypeText"), hint: "", icon: Pilcrow, action: () => insertBlock("paragraph") }, - { label: t("blockTypeHeading1"), hint: "#", icon: Heading1, action: () => insertBlock("heading", { level: 1 }) }, - { label: t("blockTypeHeading2"), hint: "##", icon: Heading2, action: () => insertBlock("heading", { level: 2 }) }, - { label: t("blockTypeHeading3"), hint: "###", icon: Heading3, action: () => insertBlock("heading", { level: 3 }) }, - { label: t("blockTypeBulletList"), hint: "-", icon: List, action: () => insertBlock("bulletList") }, - { label: t("blockTypeNumberedList"), hint: "1.", icon: ListOrdered, action: () => insertBlock("orderedList") }, - { label: t("blockTypeQuote"), hint: '"', icon: Quote, action: () => insertBlock("blockquote") }, - { label: t("blockTypeCode"), hint: "```", icon: Code2, action: () => insertBlock("codeBlock") }, - { label: t("blockTypeDivider"), hint: "---", icon: Minus, action: () => insertBlock("horizontalRule") }, - ]; - const lyranoteBlocks = [ - { label: t("blockTypeMindMap"), hint: "", icon: GitFork, action: () => insertBlock("mindMap") }, - { label: t("blockAIContinue"), hint: "", icon: Pen, action: () => { onAskAI?.("", "continue"); setAddMenuOpen(false); } }, - { label: t("blockAISummarize"), hint: "", icon: Sparkles, action: () => { onAskAI?.("", "summarize"); setAddMenuOpen(false); } }, - ]; + const filteredInsertGroups = useMemo(() => { + if (!search.trim()) return insertGroups; + const term = search.trim().toLowerCase(); + return insertGroups + .map((group) => ({ + ...group, + items: group.items.filter((item) => item.label.toLowerCase().includes(term)), + })) + .filter((group) => group.items.length > 0); + }, [insertGroups, search]); - const lc = addFilter.toLowerCase(); - const filteredBasic = basicBlocks.filter((i) => i.label.toLowerCase().includes(lc)); - const filteredLyranote = lyranoteBlocks.filter((i) => i.label.toLowerCase().includes(lc)); - const hasResults = filteredBasic.length > 0 || filteredLyranote.length > 0; + if (!editor || !editor.isEditable) return null; return (
{ - if (!menuOpen && !addMenuOpen) { - hideTimerRef.current = setTimeout(() => setHoverBlock(null), 200); + if (!anyMenuOpen) { + hideTimerRef.current = setTimeout(() => setHoverBlock(null), 180); } }} > - {anyMenuOpen && block && ( + {menuMode === "actions" && block && ( { const insets = getHighlightInsets(block); return { @@ -506,9 +571,8 @@ export function BlockHandle({ editor, onAskAI }: Props) { left: block.left - insets.left, width: block.width + insets.left + insets.right, height: block.height + insets.top + insets.bottom, - backgroundColor: "rgba(124, 90, 240, 0.14)", - outline: "2px solid rgba(124, 90, 240, 0.30)", - outlineOffset: "0px", + backgroundColor: "rgba(255,255,255,0.045)", + outline: "1px solid rgba(255,255,255,0.08)", }, }; })()} @@ -516,250 +580,481 @@ export function BlockHandle({ editor, onAskAI }: Props) { )} - {/* ── Handle buttons ─────────────────────────────────────────── */} {block && ( - - + )} - {/* ── + Add block menu (below handle) ────────────────────────── */} - - {addMenuOpen && block && ( - -
- setAddFilter(e.target.value)} - placeholder={t("blockFilter")} - className="w-full bg-transparent text-[13px] text-foreground outline-none placeholder:text-muted-foreground/35" - /> -
-
- {filteredBasic.length > 0 && ( - <> - {!addFilter && ( -

{t("blockSectionBasic")}

- )} - {filteredBasic.map((item) => ( - + {createPortal( + <> + + {menuMode === "actions" && menuPos && ( + + +
+ {filteredActionGroups.map((group, groupIndex) => ( +
+ {groupIndex > 0 && } +
+ {group.items.map((item) => ( + { + if (item.type === "submenu") setSubmenuMode(item.submenu); + else setSubmenuMode(null); + }} + onClick={() => { + if (item.type === "submenu") setSubmenuMode(item.submenu); + else item.onSelect(); + }} + /> + ))} +
+
))} - - )} - {filteredLyranote.length > 0 && ( - <> - {!addFilter && ( -

{t("blockSectionLyranote")}

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

{t("blockNoResults")}

)} - {filteredLyranote.map((item) => ( - - ))} - - )} - {!hasResults && ( -

{t("blockNoResults")}

- )} -
-
- -
- - )} -
+
+ + )} +
- {/* ── ⋮⋮ Block action menu — portalled to body, fixed position ── */} - {createPortal( - - {menuOpen && menuPos && ( - - {/* Search input */} -
-
- - { setMenuFilter(e.target.value); setTurnIntoOpen(false); }} - placeholder={t("blockSearch")} - className="w-full bg-transparent text-[13px] text-foreground outline-none placeholder:text-muted-foreground/35" - /> + + {menuMode === "insert" && menuPos && ( + + +
+ {filteredInsertGroups.map((group) => ( +
+ {group.title} +
+ {group.items.map((item) => ( + + ))} +
+
+ ))} + {filteredInsertGroups.length === 0 && ( +

{t("blockNoResults")}

+ )}
-
- - {/* Menu items */} -
- {filteredMenuItems.map((item, i) => { - if (item.type === "divider") { - return
; - } - if (item.type === "section") { - return ( -

- {item.label} -

- ); - } - if (item.type === "sub") { - return ( - - ); - } - return ( + {/* 固定底部:渐变遮罩 + 关闭菜单 */} +
+ {/* 渐变模糊遮罩 */} +
+
- ); - })} - {mf && filteredMenuItems.length === 0 && ( -

{t("blockNoResults")}

+
+
+ + )} + + + + {menuMode === "actions" && submenuMode && menuPos && ( + + {submenuMode === "turnInto" ? ( +
+ {t("blockTurnInto")} +
+ {transformItems.map((item) => ( + + ))} +
+
+ ) : ( +
+ {t("blockColorRecent")} + + + {t("blockColorTextLabel")} + {TEXT_COLORS.map((option) => ( + + ))} + + {t("blockColorBackgroundLabel")} + {BACKGROUND_COLORS.map((option) => ( + + ))} +

{t("blockColorComingSoon")}

+
)} -
- - )} - , + + )} + + , document.body, )} +
+ ); +} - {/* ── Turn-into sub-menu — portalled to body ─────────────────── */} - {createPortal( - - {menuOpen && turnIntoOpen && menuPos && ( - setTurnIntoOpen(false)} - className="fixed isolate z-[2147483647] w-44 overflow-hidden rounded-lg border border-border/70 bg-card/98 p-1 shadow-2xl shadow-black/35 backdrop-blur-xl" - style={{ - top: menuPos.top, - left: menuPos.left + MENU_WIDTH + 4, - }} - > -

- {t("blockTurnInto")} -

- {turnIntoItems.map((ti) => ( - - ))} -
- )} -
, - document.body, +type MotionVariant = "fromLeft" | "fromTop" | "fromRight"; + +type MenuVariantConfig = { + initial: TargetAndTransition; + animate: TargetAndTransition; + exit: TargetAndTransition; + transition: Transition; +}; + +const MENU_VARIANTS: Record = { + fromLeft: { + initial: { opacity: 0, x: -6, scale: 0.97 }, + animate: { opacity: 1, x: 0, scale: 1 }, + exit: { opacity: 0, x: -4, scale: 0.97, transition: { duration: 0.1, ease: [0.4, 0, 1, 1] } }, + transition: { type: "spring", stiffness: 380, damping: 28, mass: 0.6 }, + }, + fromTop: { + initial: { opacity: 0, y: -6, scale: 0.97 }, + animate: { opacity: 1, y: 0, scale: 1 }, + exit: { opacity: 0, y: -4, scale: 0.96, transition: { duration: 0.1, ease: [0.4, 0, 1, 1] } }, + transition: { type: "spring", stiffness: 360, damping: 26, mass: 0.55 }, + }, + fromRight: { + initial: { opacity: 0, x: 8 }, + animate: { opacity: 1, x: 0 }, + exit: { opacity: 0, x: 4, transition: { duration: 0.08, ease: [0.4, 0, 1, 1] } }, + transition: { type: "spring", stiffness: 400, damping: 30 }, + }, +}; + +type MenuPanelProps = { + children?: React.ReactNode; + className?: string; + position: { top: number; left: number }; + width: number; + style?: React.CSSProperties; + motionVariant?: MotionVariant; + [key: `data-${string}`]: string | undefined; +}; + +const MenuPanel = forwardRef(function MenuPanel( + { + children, + className, + position, + style, + width, + motionVariant, + ...props + }, + ref, +) { + const mv = motionVariant ? MENU_VARIANTS[motionVariant] : null; + return ( + + {children} + + ); +}); + +function SearchBar({ + onChange, + placeholder, + value, +}: { + onChange: (value: string) => void; + placeholder: string; + value: string; +}) { + return ( +
+
+ + onChange(event.target.value)} + placeholder={placeholder} + data-testid="block-menu-search" + className="w-full bg-transparent text-[13px] text-foreground outline-none placeholder:text-muted-foreground/40" + /> +
+
+ ); +} + +function BlockMenuRow({ + active = false, + item, + onClick, + onMouseEnter, +}: { + active?: boolean; + item: BlockMenuItem; + onClick: () => void; + onMouseEnter: () => void; +}) { + const tone = + item.type === "action" && item.tone === "danger" + ? "text-foreground/80 hover:bg-red-500/10 hover:text-red-400 group-hover:text-red-400" + : item.type === "action" && item.tone === "ai" + ? "text-foreground/80 hover:bg-primary/10 hover:text-primary group-hover:text-primary" + : "text-foreground/80 hover:text-foreground"; + + return ( + + ); +} + +function InsertRow({ + disabled = false, + icon: Icon, + label, + shortcut, + badge, + onClick, +}: { + disabled?: boolean; + icon: any; + label: string; + shortcut?: string; + badge?: string; + onClick: () => void; +}) { + return ( + + ); +} + +function ColorRow({ + label, + selected = false, + swatch, +}: { + label: string; + selected?: boolean; + swatch: string; +}) { + return ( +
+ + {label} + {selected && }
); } + +function HandleButton({ + children, + label, + onClick, + ...props +}: React.ComponentProps<"button"> & { + label: string; + onClick: () => void; +}) { + return ( + + ); +} + +function SectionLabel({ children }: { children: ReactNode }) { + return ( +

+ {children} +

+ ); +} + +function Divider({ className }: { className?: string }) { + return
; +} + diff --git a/apps/web/src/features/editor/editor-actions.ts b/apps/web/src/features/editor/editor-actions.ts new file mode 100644 index 0000000..b3c128f --- /dev/null +++ b/apps/web/src/features/editor/editor-actions.ts @@ -0,0 +1,29 @@ +export type EditorActionScope = "selection" | "cursor" | "block"; + +export type InlineRewriteAction = "polish" | "proofread" | "reformat" | "shorten"; + +export type EditorActionType = + | InlineRewriteAction + | "continue" + | "summarize" + | "askCopilot" + | "explain" + | "customEdit" + | "comment" + | "editSuggestion"; + +export interface EditorActionRequest { + scope: EditorActionScope; + action: EditorActionType; + text: string; + from?: number; + to?: number; + blockPos?: number; + intent?: string; + noteId?: string; + notebookId?: string; +} + +export function isInlineRewriteAction(action: EditorActionType): action is InlineRewriteAction { + return action === "polish" || action === "proofread" || action === "reformat" || action === "shorten"; +} diff --git a/apps/web/src/features/editor/note-editor.tsx b/apps/web/src/features/editor/note-editor.tsx index 6e99310..c8d814b 100644 --- a/apps/web/src/features/editor/note-editor.tsx +++ b/apps/web/src/features/editor/note-editor.tsx @@ -14,6 +14,7 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { AnimatePresence, m } from "framer-motion"; import { Pen, Search } from "lucide-react"; import { SelectionActionMenu } from "@/features/editor/selection-action-menu"; +import type { EditorActionRequest } from "@/features/editor/editor-actions"; import { tiptapExtensions } from "@/lib/tiptap"; import { getInlineSuggestion } from "@/services/ai-service"; import { getNoteForNotebook, getNote, saveNote } from "@/services/note-service"; @@ -29,7 +30,7 @@ type NoteEditorProps = { noteId?: string | null; notebookTitle?: string; onEditorReady?: (editor: Editor) => void; - onAskAI?: (text: string, action: string) => void; + onEditorAction?: (payload: EditorActionRequest) => void; onSaveStatusChange?: (status: SaveStatus) => void; /** 顶栏 / 笔记选择器与编辑器标题同步 */ onActiveNoteTitleChange?: (title: string) => void; @@ -47,7 +48,7 @@ export function NoteEditor({ noteId, notebookTitle, onEditorReady, - onAskAI, + onEditorAction, onSaveStatusChange, onActiveNoteTitleChange, onNoteSaved, @@ -76,7 +77,7 @@ export function NoteEditor({ const editor = useEditor({ editorProps: { attributes: { - class: "tiptap outline-none text-[15px] leading-[1.8] text-foreground/85 min-h-[60vh]" + class: "tiptap outline-none text-[16px] leading-[1.85] text-foreground/90 min-h-[60vh] [&_p]:mb-[0.8em]" } }, extensions: tiptapExtensions, @@ -147,8 +148,10 @@ export function NoteEditor({ if (!editor) return if (saveTimerRef.current) clearTimeout(saveTimerRef.current) if (savedTimerRef.current) clearTimeout(savedTimerRef.current) - updateSaveStatus("saving") - saveTimerRef.current = setTimeout(() => void saveNow(), 1500) + saveTimerRef.current = setTimeout(() => { + updateSaveStatus("saving") + void saveNow() + }, 3000) }, [editor, saveNow, updateSaveStatus]) // Cmd+S / Ctrl+S shortcut @@ -285,8 +288,23 @@ export function NoteEditor({ if (!editor) return; const { from } = editor.state.selection; const context = editor.state.doc.textBetween(Math.max(0, from - 200), from); - onAskAI?.(context, "ask"); - }, [editor, onAskAI]); + onEditorAction?.({ + scope: "cursor", + action: "askCopilot", + text: context, + from, + noteId: noteIdRef.current ?? undefined, + notebookId, + }); + }, [editor, notebookId, onEditorAction]); + + const handleEditorAction = useCallback((payload: EditorActionRequest) => { + onEditorAction?.({ + ...payload, + noteId: noteIdRef.current ?? payload.noteId, + notebookId, + }); + }, [notebookId, onEditorAction]); return (
@@ -303,8 +321,8 @@ export function NoteEditor({ > - +
- + {/* AI Nudge bubble */} @@ -328,26 +346,26 @@ export function NoteEditor({ animate={{ opacity: 1, y: 0, scale: 1 }} exit={{ opacity: 0, y: 6, scale: 0.95 }} transition={{ duration: 0.18 }} - className="absolute z-30 flex items-center gap-1.5 rounded-xl border border-border/40 bg-card px-3 py-2 shadow-lg" + className="absolute z-30 flex items-center gap-2 rounded-[14px] border border-white/5 bg-[#181816]/90 px-3 py-2 shadow-[0_4px_24px_rgba(0,0,0,0.3)] backdrop-blur-xl" style={{ top: nudgePos.top, left: Math.max(0, nudgePos.left) }} > - + {t("needHelp")} diff --git a/apps/web/src/features/editor/selection-action-menu.tsx b/apps/web/src/features/editor/selection-action-menu.tsx index 74146da..00b371b 100644 --- a/apps/web/src/features/editor/selection-action-menu.tsx +++ b/apps/web/src/features/editor/selection-action-menu.tsx @@ -5,251 +5,389 @@ import type { Editor } from "@tiptap/react"; import { NodeSelection } from "@tiptap/pm/state"; import { Bold, - CheckCircle2, Code, + Eraser, Italic, Link2, Loader2, MessageSquare, MoreHorizontal, - PenLine, + PencilLine, Sigma, + SmilePlus, Sparkles, Strikethrough, Underline, - WandSparkles, - X, } from "lucide-react"; import { useTranslations } from "next-intl"; +import { useEffect, useRef, useState } from "react"; -import { useInlinePolish } from "@/hooks/use-inline-polish"; +import type { EditorActionRequest, InlineRewriteAction } from "@/features/editor/editor-actions"; +import { useInlineRewrite } from "@/hooks/use-inline-rewrite"; +import { cn } from "@/lib/utils"; type Props = { editor: Editor | null; - onAskAI?: (text: string, action: string) => void; + onEditorAction?: (payload: EditorActionRequest) => void; }; -function IconBtn({ - active, - onClick, - title, - children, -}: { - active?: boolean; - onClick: () => void; - title?: string; - children: React.ReactNode; -}) { - return ( - - ); -} - -function AiBtn({ - icon, - label, - onClick, - disabled, -}: { - icon: React.ReactNode; - label: string; - onClick: () => void; - disabled?: boolean; -}) { - return ( - - ); -} +const INLINE_ACTIONS: InlineRewriteAction[] = ["polish", "proofread", "reformat", "shorten"]; -export function SelectionActionMenu({ editor, onAskAI }: Props) { +export function SelectionActionMenu({ editor, onEditorAction }: Props) { const t = useTranslations("editor"); - const { polish, cancel, isPolishing } = useInlinePolish(editor); + const [customIntent, setCustomIntent] = useState(""); + const [showMore, setShowMore] = useState(false); + const { isRewriting, preview, runRewrite, applyPreview, retry, cancel } = useInlineRewrite(editor); + const selectionSnapshotRef = useRef<{ from: number; to: number; text: string } | null>(null); + + function getSelectedRange() { + if (!editor) return null; + const { from, to } = editor.state.selection; + const text = editor.state.doc.textBetween(from, to, " "); + return { from, to, text }; + } + + const liveSelection = getSelectedRange(); + + useEffect(() => { + if (liveSelection?.text.trim()) { + selectionSnapshotRef.current = liveSelection; + } + }, [liveSelection]); + + const [showLinkInput, setShowLinkInput] = useState(false); + const [linkUrl, setLinkUrl] = useState(""); + const linkInputRef = useRef(null); if (!editor) return null; - const getSelectedText = () => - editor.state.doc.textBetween( - editor.state.selection.from, - editor.state.selection.to, - " " - ); - - const handleAI = (action: string) => { - const text = getSelectedText(); - if (!text.trim()) return; - onAskAI?.(text, action); - }; - - const handleLink = () => { - const prev = editor.getAttributes("link").href as string | undefined; - const url = window.prompt("URL", prev ?? "https://"); - if (url === null) return; + const activeEditor = editor; + const selectionText = liveSelection?.text ?? selectionSnapshotRef.current?.text ?? ""; + const hasSelection = selectionText.trim().length > 0; + + function dispatchExternalAction(action: EditorActionRequest["action"], intent?: string) { + const selectedRange = getSelectedRange() ?? selectionSnapshotRef.current; + if (!selectedRange || !hasSelection) return; + onEditorAction?.({ + scope: "selection", + action, + text: selectedRange.text, + from: selectedRange.from, + to: selectedRange.to, + intent, + }); + } + + function handleSubmitCustomIntent() { + if (!customIntent.trim()) return; + dispatchExternalAction("customEdit", customIntent.trim()); + setCustomIntent(""); + } + + function openLinkInput() { + const prev = activeEditor.getAttributes("link").href as string | undefined; + setLinkUrl(prev ?? ""); + setShowLinkInput(true); + setTimeout(() => linkInputRef.current?.select(), 30); + } + + function commitLink() { + const url = linkUrl.trim(); if (url === "") { - editor.chain().focus().extendMarkRange("link").unsetLink().run(); + activeEditor.chain().focus().extendMarkRange("link").unsetLink().run(); } else { - editor.chain().focus().extendMarkRange("link").setLink({ href: url }).run(); + const href = url.startsWith("http") ? url : `https://${url}`; + activeEditor.chain().focus().extendMarkRange("link").setLink({ href }).run(); } - }; + setShowLinkInput(false); + setLinkUrl(""); + } return ( { + box.style.transition = + "transform 300ms cubic-bezier(0.34,1.56,0.64,1), opacity 180ms ease"; + box.style.transform = "scale(1) translateY(0)"; + box.style.opacity = "1"; + }); + }, + onHide(instance) { + const box = instance.popper.firstElementChild as HTMLElement | null; + if (!box) return; + box.style.transition = "transform 110ms cubic-bezier(0.4,0,1,1), opacity 90ms ease"; + box.style.transform = "scale(0.95) translateY(-4px)"; + box.style.opacity = "0"; + }, }} - shouldShow={({ editor: e, state }) => { + shouldShow={({ editor: activeEditor, state }) => { const { selection } = state; if (selection instanceof NodeSelection) return false; const nodeType = state.doc.nodeAt(selection.from)?.type; if (nodeType?.name === "mindMap") return false; if (selection.empty) return false; - return e.isEditable; + return activeEditor.isEditable; }} - className="w-[150px] overflow-hidden rounded-xl border border-border/60 bg-card/95 p-1 shadow-xl shadow-black/30 backdrop-blur-sm" + className="overflow-hidden rounded-[12px] border border-white/10 bg-[#252525] p-2 text-foreground shadow-[0_4px_20px_rgba(0,0,0,0.6)]" > - {/* ── Row 1: text style + basic inline marks ──────────────── */} -
- {/* T — plain text indicator, never shown as "active" to avoid visual noise */} - editor.chain().focus().setParagraph().run()} - title={t("blockTypeText")} - > - T - - editor.chain().focus().toggleHighlight().run()} - title="Highlight" - > - - A - - - editor.chain().focus().toggleBold().run()} - title="Bold" - > - - - editor.chain().focus().toggleItalic().run()} - title="Italic" - > - - - editor.chain().focus().toggleUnderline().run()} - title="Underline" - > - - -
+
+ {/* 链接输入面板 */} + {showLinkInput ? ( +
+ {/* 标题行 */} +
+ {t("selectionLink")} + +
- {/* ── Row 2: link, strikethrough, code, math, more ──────────── */} -
- - - - editor.chain().focus().toggleStrike().run()} - title="Strikethrough" - > - - - editor.chain().focus().toggleCode().run()} - title="Inline code" - > - - - {}} title="Math (coming soon)"> - - - {}} title="More"> - - -
+ {/* URL 输入框 */} +
+ + setLinkUrl(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") { e.preventDefault(); commitLink(); } + if (e.key === "Escape") { e.preventDefault(); setShowLinkInput(false); setLinkUrl(""); } + }} + placeholder="https://" + className="min-w-0 flex-1 bg-transparent text-[13px] text-foreground outline-none placeholder:text-muted-foreground/30" + data-testid="selection-link-input" + /> +
- {/* ── Divider ─────────────────────────────────────────────── */} -
- - {/* ── AI actions ──────────────────────────────────────────── */} -
- {isPolishing ? ( - + {/* 操作按钮 */} +
+ + +
+
) : ( - } - label={t("selectionImprove")} - onClick={polish} - /> + <> + {/* 第一行:T A B I U */} +
+ activeEditor.chain().focus().setParagraph().run()} active={false}> + T + + activeEditor.chain().focus().toggleHighlight().run()} active={activeEditor.isActive("highlight")}> + A + + activeEditor.chain().focus().toggleBold().run()} active={activeEditor.isActive("bold")}> + + + activeEditor.chain().focus().toggleItalic().run()} active={activeEditor.isActive("italic")}> + + + activeEditor.chain().focus().toggleUnderline().run()} active={activeEditor.isActive("underline")}> + + +
+ + {/* 第二行:链接 删除线 代码 清除标记 更多 */} +
+ + + + activeEditor.chain().focus().toggleStrike().run()} active={activeEditor.isActive("strike")}> + + + activeEditor.chain().focus().toggleCode().run()} active={activeEditor.isActive("code")}> + + + activeEditor.chain().focus().unsetAllMarks().run()}> + + + setShowMore((v) => !v)} active={showMore}> + + +
+ + {/* 分割线 */} +
+ + {/* AI 技能列表区域 */} +
+
+ {/* 技能标签行 */} +
+ {t("selectionSkillLabel")} +
+ + {/* 技能列表 */} +
+ {INLINE_ACTIONS.map((action) => ( + + ))} + +
+
+ + {/* AI 预览覆盖层 */} + {preview && ( +
+
+ + {t("selectionPreviewTitle", { action: t(`selectionSkill.${preview.action}`) })} +
+
+

{preview.result}

+
+
+ + + +
+
+ )} +
+ + {/* 分割线 */} +
+ + {/* AI 输入框 — 同 Notion 样式 */} +
+ setCustomIntent(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") { + e.preventDefault(); + if (customIntent.trim() && hasSelection) handleSubmitCustomIntent(); + } + }} + placeholder={t("selectionAiInputPlaceholder")} + className="flex-1 bg-transparent text-[13px] text-foreground outline-none placeholder:text-foreground/30" + data-testid="selection-ai-input" + /> + ⌘↵ +
+ )} - } - label={t("selectionProofread")} - onClick={() => handleAI("proofread")} - disabled={isPolishing} - /> - } - label={t("selectionExplain")} - onClick={() => handleAI("explain")} - disabled={isPolishing} - /> - } - label={t("selectionReformat")} - onClick={() => handleAI("reformat")} - disabled={isPolishing} - /> - } - label={t("selectionEditAI")} - onClick={() => handleAI("ask")} - disabled={isPolishing} - />
); } + + +function FormatButton({ + active = false, + children, + disabled = false, + label, + onClick, +}: { + active?: boolean; + children: React.ReactNode; + disabled?: boolean; + label: string; + onClick: () => void; +}) { + return ( +
+ + {/* Notion 风格 tooltip */} +
+
+ {label} +
+
+
+
+ ); +} + + diff --git a/apps/web/src/features/knowledge/knowledge-view.tsx b/apps/web/src/features/knowledge/knowledge-view.tsx index 62bb706..92bb461 100644 --- a/apps/web/src/features/knowledge/knowledge-view.tsx +++ b/apps/web/src/features/knowledge/knowledge-view.tsx @@ -275,7 +275,7 @@ export function KnowledgeView() { const items = data?.pages.flatMap((p) => p.items) ?? [] return dedupeSourcesByLatest(items) }, [data]) - const total = data?.pages[0]?.total ?? 0; + const total = allSources.length; // Infinite scroll via IntersectionObserver useEffect(() => { diff --git a/apps/web/src/features/notebook/notebook-header.tsx b/apps/web/src/features/notebook/notebook-header.tsx index 4c37b38..3bbfb51 100644 --- a/apps/web/src/features/notebook/notebook-header.tsx +++ b/apps/web/src/features/notebook/notebook-header.tsx @@ -2,6 +2,7 @@ import { AlignLeft, + ChevronDown, ChevronLeft, Copy, Expand, @@ -22,6 +23,7 @@ import { AnimatePresence, m } from "framer-motion"; import { deleteNotebook, renameNotebook } from "@/services/notebook-service"; import { NotePickerDropdown } from "@/features/notebook/note-picker-dropdown"; +import { useUiStore } from "@/store/use-ui-store"; import type { MobileWorkspaceSheetKey } from "@/features/notebook/mobile-workspace-sheet"; import type { NoteRecord } from "@/services/note-service"; @@ -52,6 +54,7 @@ export function NotebookTopBar({ isMobile = false, mobileActiveSheet = "none", onMobileSheetChange, + charCount, }: { notebookId: string; title: string; @@ -67,6 +70,7 @@ export function NotebookTopBar({ isMobile?: boolean; mobileActiveSheet?: MobileWorkspaceSheetKey; onMobileSheetChange?: (sheet: MobileWorkspaceSheetKey) => void; + charCount?: number; }) { const t = useTranslations("notebook"); const tc = useTranslations("common"); @@ -141,7 +145,18 @@ export function NotebookTopBar({ setMenuOpen(false); }; + const { setSettingsOpen } = useUiStore(); + const menuItems: MenuItem[] = [ + { + id: "aiSkills", + label: "AI 技能", + icon: Sparkles, + action: () => { + setSettingsOpen(true, "skills"); + setMenuOpen(false); + }, + }, { id: "smallText", label: t("smallText"), @@ -569,8 +584,13 @@ export function NotebookTopBar({ )}
- {/* Right: save status + menu */} -
+ {/* Right: char count + save status + menu */} +
+ {charCount !== undefined && charCount > 0 && ( + + {charCount} 字符 + + )} {saveStatus === "saving" && ( @@ -586,7 +606,6 @@ export function NotebookTopBar({ {saveStatus === "error" && ( {t("saveFailedShort")} )} - {/* ... menu */}
- ); - })} - - - {/* Reading progress circle — right below the list */} -
-
- - - - + + + {h.text} + + + ); + })} + +
+ + {/* Footer: Progress & Back to Top — Stable Left Alignment */} +
+
+
+ + + + +
+ + {progress}% + +
+ + {/* Back to Top - Pushed to right but doesn't affect progress position */} +
+ + {progress > 5 && ( + { + const scrollParent = editor?.view.dom.closest(".overflow-y-auto") as HTMLElement | null; + scrollParent?.scrollTo({ top: 0, behavior: "smooth" }); + }} + className="flex items-center gap-2 text-muted-foreground/40 transition-colors hover:text-violet-400" + > +
+ + + +
+ {t("scrollToTop")} +
+ )} +
- - {progress}% -
); diff --git a/apps/web/src/features/notebook/notebook-workspace.tsx b/apps/web/src/features/notebook/notebook-workspace.tsx index 9629e4b..a46915b 100644 --- a/apps/web/src/features/notebook/notebook-workspace.tsx +++ b/apps/web/src/features/notebook/notebook-workspace.tsx @@ -8,7 +8,7 @@ import type { Editor } from "@tiptap/react"; import { AnimatePresence, m } from "framer-motion"; -import { Library } from "lucide-react"; +import { Library, X } from "lucide-react"; import { useTranslations } from "next-intl"; import { startTransition, useCallback, useEffect, useRef, useState } from "react"; import { useQuery, useQueryClient } from "@tanstack/react-query"; @@ -17,12 +17,15 @@ import { useMediaQuery } from "@/hooks/use-media-query"; import { CopilotPanel, DEFAULT_WIDTH } from "@/features/copilot/copilot-panel"; import { FloatingOrb } from "@/features/copilot/floating-orb"; import { NoteEditor } from "@/features/editor/note-editor"; +import type { EditorActionRequest } from "@/features/editor/editor-actions"; import { NotebookTopBar } from "@/features/notebook/notebook-header"; import type { SaveStatus } from "@/features/notebook/notebook-header"; import { MobileWorkspaceSheet } from "@/features/notebook/mobile-workspace-sheet"; import type { MobileCopilotSnap, MobileWorkspaceSheetKey } from "@/features/notebook/mobile-workspace-sheet"; +import { RelevantSourcesView } from "@/features/copilot/relevant-sources-view"; import { NotebookTOC } from "@/features/notebook/notebook-toc"; import { FloatingTOC } from "@/features/notebook/floating-toc"; +import { ProactiveToaster } from "@/features/copilot/proactive-toaster"; import { ImportSourceDialog } from "@/features/source/import-source-dialog"; import { SourceDetailDrawer } from "@/features/source/source-detail-drawer"; import { SourcesPanel } from "@/features/source/sources-panel"; @@ -31,6 +34,7 @@ import { useProactiveStore } from "@/store/use-proactive-store"; import { useUiStore } from "@/store/use-ui-store"; import { getWritingContext } from "@/services/ai-service"; import { getSources } from "@/services/source-service"; +import { getRelatedKnowledge, type CrossNotebookChunk } from "@/services/ai-service"; import { listNotes } from "@/services/note-service"; import type { NoteRecord } from "@/services/note-service"; import { useMarkdownWorker } from "@/hooks/use-markdown-worker"; @@ -39,14 +43,6 @@ import type { Message, MindMapData } from "@/types"; export type CopilotMode = "docked" | "floating"; -const ACTION_PROMPT_KEYS: Record = { - ask: "selectionExplain", - polish: "selectionRewrite", - shorten: "selectionCondense", - continue: "continueWritingPrompt", - summarize: "summarizeSourcesPrompt", -}; - export function NotebookWorkspace({ notebookId, title, @@ -63,6 +59,7 @@ export function NotebookWorkspace({ const setMobileHeaderMode = useUiStore((state) => state.setMobileHeaderMode); const activeSourceId = useNotebookStore((state) => state.activeSourceId); const setActiveSourceId = useNotebookStore((state) => state.setActiveSourceId); + const setCopilotPanelOpen = useNotebookStore((state) => state.setCopilotPanelOpen); const { matches: isMobile, ready: mediaReady } = useMediaQuery("(max-width: 767px)"); const [copilotOpen, setCopilotOpen] = useState(false); const [sourcesOpen, setSourcesOpen] = useState(false); @@ -101,6 +98,13 @@ export function NotebookWorkspace({ return () => setMobileHeaderMode("default"); }, [isMobile, setMobileHeaderMode]); + useEffect(() => { + const open = isMobile ? mobileActiveSheet === "copilot" : copilotOpen; + setCopilotPanelOpen(open); + }, [copilotOpen, isMobile, mobileActiveSheet, setCopilotPanelOpen]); + + useEffect(() => () => setCopilotPanelOpen(false), [setCopilotPanelOpen]); + useEffect(() => { localStorage.setItem("lyra:copilot-mode", copilotMode); }, [copilotMode]); @@ -133,6 +137,7 @@ export function NotebookWorkspace({ // Bridge: hold a reference to the Tiptap editor instance // Also keep it as state so TOC and other consumers can re-render on change const [editorInstance, setEditorInstance] = useState(null); + const [charCount, setCharCount] = useState(0); const [noteRefreshKey, setNoteRefreshKey] = useState(0); const convertMarkdown = useMarkdownWorker(); @@ -186,20 +191,47 @@ export function NotebookWorkspace({ const handleEditorReady = useCallback((editor: Editor) => { editorRef.current = editor; setEditorInstance(editor); + // Initialize char count + setCharCount(editor.storage.characterCount?.characters?.() ?? 0); + editor.on("update", () => { + setCharCount(editor.storage.characterCount?.characters?.() ?? 0); + }); }, []); - const handleAskAI = useCallback((text: string, action: string) => { + const handleEditorAction = useCallback((payload: EditorActionRequest) => { if (isMobile) { setMobileActiveSheet("copilot"); } else { setCopilotOpen(true); } - if (action === "ask") { - setPendingQuote({ text, key: Date.now() }); - } else { - const promptKey = ACTION_PROMPT_KEYS[action] ?? ACTION_PROMPT_KEYS.ask; - setPendingPrompt({ text: tNotebook(promptKey, { text }), key: Date.now() }); + if (payload.action === "askCopilot") { + setPendingQuote({ text: payload.text, key: Date.now() }); + return; } + + if (payload.action === "customEdit") { + setPendingPrompt({ + text: tNotebook("customEditPrompt", { + text: payload.text, + intent: payload.intent ?? "", + }), + key: Date.now(), + }); + return; + } + + const promptByAction: Partial> = { + explain: tNotebook("selectionExplain", { text: payload.text }), + continue: tNotebook("continueWritingPrompt"), + summarize: tNotebook("summarizeSourcesPrompt"), + comment: tNotebook("selectionExplain", { text: payload.text }), + editSuggestion: tNotebook("selectionExplain", { text: payload.text }), + }; + + setPendingPrompt({ + text: promptByAction[payload.action] ?? tNotebook("selectionExplain", { text: payload.text }), + key: Date.now(), + }); }, [isMobile, tNotebook]); const handleInsertToEditor = useCallback(async (content: string) => { @@ -296,6 +328,13 @@ export function NotebookWorkspace({ data-testid="notebook-workspace" > + + { + setCopilotOpen(true); + setPendingPrompt({ text, key: Date.now() }); + }} + />
@@ -342,7 +382,7 @@ export function NotebookWorkspace({ noteId={activeNoteId} notebookTitle={notebookTitle} onEditorReady={handleEditorReady} - onAskAI={handleAskAI} + onEditorAction={handleEditorAction} onSaveStatusChange={setSaveStatus} onActiveNoteTitleChange={handleEditorNoteTitleChange} onNoteSaved={handleNoteSaved} @@ -352,6 +392,8 @@ export function NotebookWorkspace({ wideLayout={isFullscreen} isMobileLayout={isMobile} /> + + {!isMobile && isFullscreen && }
@@ -422,19 +464,38 @@ export function NotebookWorkspace({ {/* Floating sources toggle */} {!isMobile && !isFullscreen && ( - + + + + + {/* Numeric Badge */} + {sources.length > 0 && ( + + {sources.length > 9 ? "9+" : sources.length} + + )} + )} {isMobile && ( diff --git a/apps/web/src/features/source/source-list.ts b/apps/web/src/features/source/source-list.ts index 7577ddf..d1fbbf2 100644 --- a/apps/web/src/features/source/source-list.ts +++ b/apps/web/src/features/source/source-list.ts @@ -16,6 +16,7 @@ function makeSourceKey(source: Source): string { */ export function dedupeSourcesByLatest(sources: Source[]): Source[] { const winners = new Map(); + const seenWinnerIds = new Set(); for (const source of sources) { const key = makeSourceKey(source); @@ -30,5 +31,15 @@ export function dedupeSourcesByLatest(sources: Source[]): Source[] { } } - return sources.filter((source) => winners.get(makeSourceKey(source))?.id === source.id); + return sources.filter((source) => { + if (winners.get(makeSourceKey(source))?.id !== source.id) { + return false; + } + if (seenWinnerIds.has(source.id)) { + return false; + } + + seenWinnerIds.add(source.id); + return true; + }); } diff --git a/apps/web/src/features/source/sources-panel.tsx b/apps/web/src/features/source/sources-panel.tsx index d4f5a93..fd05bff 100644 --- a/apps/web/src/features/source/sources-panel.tsx +++ b/apps/web/src/features/source/sources-panel.tsx @@ -5,6 +5,7 @@ import { AlertCircle, CheckCircle2, FileAudio, FileText, Globe, Loader2, Notepad import { startTransition, useEffect, useRef } from "react"; +import { createSuggestionFingerprint, shouldAutoSurfaceSource } from "@/features/copilot/proactive-surface-policy"; import { cn } from "@/lib/utils"; import { getSourceSuggestions } from "@/services/ai-service"; import { getSources } from "@/services/source-service"; @@ -153,8 +154,16 @@ export function SourcesPanel({ if (prevSource && (prevSource.status === "processing" || prevSource.status === "pending")) { getSourceSuggestions(source.id) .then((data) => { + const isMobile = typeof window !== "undefined" && window.matchMedia("(max-width: 767px)").matches; addSuggestion({ type: "source_indexed", + origin: "source_indexed", + delivery: shouldAutoSurfaceSource(isMobile) ? "surface" : "inbox", + fingerprint: createSuggestionFingerprint("source_indexed", { + sourceId: source.id, + sourceName: source.title || t("unknownSource"), + summary: data.summary || undefined, + }), sourceId: source.id, sourceName: source.title || t("unknownSource"), summary: data.summary || undefined, @@ -187,7 +196,7 @@ export function SourcesPanel({ {/* Header */}
- {t("sourcesHeader", { count: sources.length })} + {t("sourcesHeader", { count: visibleSources.length })}
+ + {/* Type switcher */} +
+ {(Object.keys(CALLOUT_CONFIG) as CalloutType[]).map((t) => { + const C = CALLOUT_CONFIG[t]; + const CIcon = C.icon; + return ( + + ); + })} +
+
+ + ); +} + +// ── Extension ────────────────────────────────────────────────────────────────── + +export const CalloutExtension = Node.create({ + name: "callout", + group: "block", + content: "block+", + defining: true, + isolating: true, + + addAttributes() { + return { + type: { + default: "info", + parseHTML: (el) => el.getAttribute("data-callout-type") ?? "info", + renderHTML: (attrs) => ({ "data-callout-type": attrs.type }), + }, + }; + }, + + parseHTML() { + return [{ tag: "div[data-callout-type]" }]; + }, + + renderHTML({ HTMLAttributes }) { + return ["div", mergeAttributes(HTMLAttributes, { class: "callout" }), 0]; + }, + + addNodeView() { + return ReactNodeViewRenderer( + CalloutNodeView as unknown as Parameters[0] + ); + }, + + addKeyboardShortcuts() { + return { + // Press Enter at end of empty callout to exit it + Enter: () => { + const { selection, doc } = this.editor.state; + const { $from } = selection; + // Check if we're in a callout and the paragraph is empty + if ($from.parent.type.name === "paragraph" && $from.parent.textContent === "") { + const grandParent = $from.node($from.depth - 1); + if (grandParent?.type.name === "callout") { + // Exit the callout by lifting the node + return this.editor.chain().focus().liftEmptyBlock().run(); + } + } + return false; + }, + }; + }, +}); diff --git a/apps/web/src/lib/tiptap-slash-command.tsx b/apps/web/src/lib/tiptap-slash-command.tsx new file mode 100644 index 0000000..2322d16 --- /dev/null +++ b/apps/web/src/lib/tiptap-slash-command.tsx @@ -0,0 +1,336 @@ +"use client"; + +import { Extension, type Editor } from "@tiptap/core"; +import { ReactRenderer } from "@tiptap/react"; +import Suggestion from "@tiptap/suggestion"; +import { + Code2, + GitFork, + Heading1, + Heading2, + Heading3, + List, + ListChecks, + ListOrdered, + Minus, + Pilcrow, + Quote, + AlertCircle, + Info, + Lightbulb, + TriangleAlert, +} from "lucide-react"; +import { useCallback, useEffect, useRef, useState } from "react"; +import { createPortal } from "react-dom"; +import { AnimatePresence, m } from "framer-motion"; + +// ── Types ──────────────────────────────────────────────────────────────────── + +type SlashItem = { + title: string; + description: string; + icon: React.ElementType; + keywords: string[]; + command: (editor: Editor) => void; +}; + +// ── Commands list ───────────────────────────────────────────────────────────── + +const SLASH_ITEMS: SlashItem[] = [ + { + title: "文本", + description: "普通段落文字", + icon: Pilcrow, + keywords: ["text", "paragraph", "p", "文本", "段落"], + command: (editor) => editor.chain().focus().setParagraph().run(), + }, + { + title: "标题 1", + description: "大号标题", + icon: Heading1, + keywords: ["h1", "heading", "title", "标题", "#"], + command: (editor) => editor.chain().focus().toggleHeading({ level: 1 }).run(), + }, + { + title: "标题 2", + description: "中号标题", + icon: Heading2, + keywords: ["h2", "heading", "标题", "##"], + command: (editor) => editor.chain().focus().toggleHeading({ level: 2 }).run(), + }, + { + title: "标题 3", + description: "小号标题", + icon: Heading3, + keywords: ["h3", "heading", "标题", "###"], + command: (editor) => editor.chain().focus().toggleHeading({ level: 3 }).run(), + }, + { + title: "引用", + description: "引用内容块", + icon: Quote, + keywords: ["quote", "blockquote", "引用", ">"], + command: (editor) => editor.chain().focus().toggleBlockquote().run(), + }, + { + title: "无序列表", + description: "项目符号列表", + icon: List, + keywords: ["bullet", "list", "ul", "无序", "-"], + command: (editor) => editor.chain().focus().toggleBulletList().run(), + }, + { + title: "有序列表", + description: "编号列表", + icon: ListOrdered, + keywords: ["numbered", "ordered", "list", "ol", "有序", "1."], + command: (editor) => editor.chain().focus().toggleOrderedList().run(), + }, + { + title: "任务列表", + description: "可勾选的待办清单", + icon: ListChecks, + keywords: ["todo", "task", "check", "checkbox", "任务", "[]"], + command: (editor) => editor.chain().focus().run(), // disabled – no extension + }, + { + title: "代码块", + description: "多行代码区块", + icon: Code2, + keywords: ["code", "codeblock", "pre", "代码", "```"], + command: (editor) => editor.chain().focus().toggleCodeBlock().run(), + }, + { + title: "分割线", + description: "水平分隔线", + icon: Minus, + keywords: ["divider", "horizontal", "rule", "分割", "---", "hr"], + command: (editor) => editor.chain().focus().setHorizontalRule().run(), + }, + { + title: "思维导图", + description: "插入思维导图节点", + icon: GitFork, + keywords: ["mindmap", "mind", "思维", "导图"], + command: (editor) => editor.chain().focus().insertContent({ type: "mindMap", attrs: { data: null } }).run(), + }, + { + title: "信息提示", + description: "蓝色信息标注块", + icon: Info, + keywords: ["callout", "info", "note", "提示", "信息"], + command: (editor) => editor.chain().focus().insertContent({ type: "callout", attrs: { type: "info" } }).run(), + }, + { + title: "成功提示", + description: "绿色成功标注块", + icon: Lightbulb, + keywords: ["callout", "success", "tip", "成功", "小贴士"], + command: (editor) => editor.chain().focus().insertContent({ type: "callout", attrs: { type: "success" } }).run(), + }, + { + title: "警告提示", + description: "橙色警告标注块", + icon: TriangleAlert, + keywords: ["callout", "warning", "warn", "警告"], + command: (editor) => editor.chain().focus().insertContent({ type: "callout", attrs: { type: "warning" } }).run(), + }, + { + title: "错误提示", + description: "红色错误标注块", + icon: AlertCircle, + keywords: ["callout", "error", "danger", "错误", "危险"], + command: (editor) => editor.chain().focus().insertContent({ type: "callout", attrs: { type: "error" } }).run(), + }, +]; + +// ── Dropdown UI ─────────────────────────────────────────────────────────────── + +type SlashMenuProps = { + items: SlashItem[]; + command: (item: SlashItem) => void; + clientRect: (() => DOMRect | null) | null; +}; + +function SlashMenu({ items, command, clientRect }: SlashMenuProps) { + const [selected, setSelected] = useState(0); + const listRef = useRef(null); + const [pos, setPos] = useState({ top: 0, left: 0 }); + + // Reset selection when items change + useEffect(() => { setSelected(0); }, [items]); + + // Track position from clientRect + useEffect(() => { + if (!clientRect) return; + const rect = clientRect(); + if (!rect) return; + setPos({ + top: rect.bottom + 4 + window.scrollY, + left: Math.min(rect.left + window.scrollX, window.innerWidth - 280 - 12), + }); + }, [clientRect, items]); + + // Keyboard navigation + const handleKey = useCallback((e: KeyboardEvent) => { + if (e.key === "ArrowDown") { + e.preventDefault(); + setSelected((s) => (s + 1) % items.length); + } else if (e.key === "ArrowUp") { + e.preventDefault(); + setSelected((s) => (s - 1 + items.length) % items.length); + } else if (e.key === "Enter") { + e.preventDefault(); + if (items[selected]) command(items[selected]); + } + }, [items, selected, command]); + + useEffect(() => { + window.addEventListener("keydown", handleKey, { capture: true }); + return () => window.removeEventListener("keydown", handleKey, { capture: true }); + }, [handleKey]); + + // Scroll selected into view + useEffect(() => { + const el = listRef.current?.querySelector(`[data-slash-idx="${selected}"]`) as HTMLElement | null; + el?.scrollIntoView({ block: "nearest" }); + }, [selected]); + + const [visible, setVisible] = useState(false); + + useEffect(() => { + // Trigger enter animation after mount + const id = requestAnimationFrame(() => setVisible(true)); + return () => cancelAnimationFrame(id); + }, []); + + return createPortal( + + {visible && items.length > 0 && ( + +
+ {items.map((item, i) => { + const Icon = item.icon; + return ( + + ); + })} +
+
+ )} +
, + document.body + ); +} + +// ── ReactRenderer wrapper ───────────────────────────────────────────────────── + +class SlashMenuRenderer { + private renderer: ReactRenderer; + + constructor(props: SlashMenuProps) { + this.renderer = new ReactRenderer(SlashMenu, { + props, + editor: {} as Editor, + }); + } + + update(props: Partial) { + this.renderer.updateProps(props); + } + + destroy() { + this.renderer.destroy(); + } +} + +// ── Tiptap Extension ────────────────────────────────────────────────────────── + +export const SlashCommand = Extension.create({ + name: "slashCommand", + + addOptions() { + return { suggestion: {} }; + }, + + addProseMirrorPlugins() { + return [ + Suggestion({ + editor: this.editor, + char: "/", + allowSpaces: false, + startOfLine: false, + command: ({ editor, range, props }) => { + const { item } = props as { item: SlashItem }; + // Delete the slash + query text + editor.chain().focus().deleteRange(range).run(); + // Run the selected command + item.command(editor); + }, + items: ({ query }) => { + const q = query.toLowerCase(); + if (!q) return SLASH_ITEMS; + return SLASH_ITEMS.filter((item) => + item.title.toLowerCase().includes(q) || + item.keywords.some((k) => k.includes(q)) + ); + }, + render: () => { + let renderer: SlashMenuRenderer | null = null; + let props: SlashMenuProps | null = null; + + return { + onStart: (p) => { + props = { + items: p.items as SlashItem[], + command: (item: SlashItem) => { + p.command({ item }); + }, + clientRect: p.clientRect ?? null, + }; + renderer = new SlashMenuRenderer(props); + }, + onUpdate(p) { + renderer?.update({ + items: p.items as SlashItem[], + clientRect: p.clientRect ?? null, + }); + }, + onKeyDown(p) { + return p.event.key === "Escape"; + }, + onExit() { + renderer?.destroy(); + renderer = null; + }, + }; + }, + }), + ]; + }, +}); diff --git a/apps/web/src/lib/tiptap.ts b/apps/web/src/lib/tiptap.ts index 60005ed..2df1680 100644 --- a/apps/web/src/lib/tiptap.ts +++ b/apps/web/src/lib/tiptap.ts @@ -3,11 +3,14 @@ import Link from "@tiptap/extension-link"; import Placeholder from "@tiptap/extension-placeholder"; import TextAlign from "@tiptap/extension-text-align"; import Underline from "@tiptap/extension-underline"; +import CharacterCount from "@tiptap/extension-character-count"; import StarterKit from "@tiptap/starter-kit"; import { t } from "@/lib/i18n"; import { GhostText } from "@/lib/tiptap-ghost-text"; import { MindMapExtension } from "@/lib/tiptap-mind-map"; +import { SlashCommand } from "@/lib/tiptap-slash-command"; +import { CalloutExtension } from "@/lib/tiptap-callout"; export const tiptapExtensions = [ StarterKit.configure({ @@ -21,6 +24,9 @@ export const tiptapExtensions = [ placeholder: t("editor.startWriting", "Start writing…"), emptyEditorClass: "is-editor-empty" }), + CharacterCount, GhostText, MindMapExtension, + CalloutExtension, + SlashCommand, ]; diff --git a/apps/web/src/services/ai-service.ts b/apps/web/src/services/ai-service.ts index 991c26a..0343de7 100644 --- a/apps/web/src/services/ai-service.ts +++ b/apps/web/src/services/ai-service.ts @@ -18,6 +18,8 @@ import { } from "@/schemas/chat-api"; import type { Artifact, CitationData, Message } from "@/types"; +type RewriteAction = "polish" | "proofread" | "reformat" | "shorten"; + // ─── Conversation history (stub — messages are managed client-side) ────────── /** @@ -55,6 +57,19 @@ export async function getInlineSuggestion(context: string): Promise { return data.suggestion; } +export async function rewriteSelection( + selectedText: string, + action: RewriteAction, + noteContext: string = "", +): Promise { + const data = await http.post<{ result: string }>(AI.REWRITE, { + selected_text: selectedText, + action, + note_context: noteContext, + }); + return data.result; +} + // ─── Streaming chat ─────────────────────────────────────────────────────────── /** 流式 Agent 事件(SSE 推送的各类事件) */ diff --git a/apps/web/src/store/use-notebook-store.ts b/apps/web/src/store/use-notebook-store.ts index f9944b0..946ff5e 100644 --- a/apps/web/src/store/use-notebook-store.ts +++ b/apps/web/src/store/use-notebook-store.ts @@ -11,13 +11,33 @@ import { create } from "zustand"; type NotebookStore = { activeSourceId: string | null; centerPanelMode: "reader" | "editor"; + copilotPanelOpen: boolean; + copilotStreaming: boolean; + lastInteractionAt: number; + lastTypingAt: number; setActiveSourceId: (id: string | null) => void; setCenterPanelMode: (mode: "reader" | "editor") => void; + setCopilotPanelOpen: (open: boolean) => void; + setCopilotStreaming: (streaming: boolean) => void; + recordInteraction: (timestamp?: number) => void; + recordTyping: (timestamp?: number) => void; }; export const useNotebookStore = create((set) => ({ activeSourceId: null, centerPanelMode: "editor", + copilotPanelOpen: false, + copilotStreaming: false, + lastInteractionAt: 0, + lastTypingAt: 0, setActiveSourceId: (id) => set({ activeSourceId: id }), - setCenterPanelMode: (mode) => set({ centerPanelMode: mode }) + setCenterPanelMode: (mode) => set({ centerPanelMode: mode }), + setCopilotPanelOpen: (open) => set({ copilotPanelOpen: open }), + setCopilotStreaming: (streaming) => set({ copilotStreaming: streaming }), + recordInteraction: (timestamp = Date.now()) => set({ lastInteractionAt: timestamp }), + recordTyping: (timestamp = Date.now()) => + set({ + lastTypingAt: timestamp, + lastInteractionAt: timestamp, + }), })); diff --git a/apps/web/src/store/use-proactive-store.ts b/apps/web/src/store/use-proactive-store.ts index d61d49b..8c1162e 100644 --- a/apps/web/src/store/use-proactive-store.ts +++ b/apps/web/src/store/use-proactive-store.ts @@ -12,6 +12,9 @@ import { create } from "zustand"; export type ProactiveSuggestion = { id: string; type: "source_indexed" | "insight" | "nudge"; + origin: "source_indexed" | "proactive_insight" | "lyra_thought"; + delivery: "inbox" | "surface"; + fingerprint: string; sourceId?: string; sourceName?: string; summary?: string; @@ -19,6 +22,8 @@ export type ProactiveSuggestion = { message?: string; createdAt: number; read: boolean; + surfacedAt?: number; + hiddenAt?: number; }; /** 写作辅助上下文片段 */ @@ -35,9 +40,10 @@ type ProactiveStore = { writingContext: WritingContextChunk[]; unreadCount: number; - addSuggestion: (suggestion: Omit) => void; + addSuggestion: (suggestion: Omit) => string | null; markAllRead: () => void; dismissSuggestion: (id: string) => void; + hideSuggestion: (id: string) => void; clearAll: () => void; setWritingContext: (chunks: WritingContextChunk[]) => void; }; @@ -48,29 +54,61 @@ export const useProactiveStore = create()((set) => ({ unreadCount: 0, addSuggestion: (suggestion) => - set((state) => { - const newSuggestion: ProactiveSuggestion = { - ...suggestion, - id: `proactive-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`, - createdAt: Date.now(), - read: false, - }; - const updated = [newSuggestion, ...state.suggestions].slice(0, 20); - return { - suggestions: updated, - unreadCount: updated.filter((s) => !s.read).length, - }; - }), + { + const now = Date.now(); + let createdId: string | null = null; + set((state) => { + if (state.suggestions.some((item) => item.origin === suggestion.origin && item.fingerprint === suggestion.fingerprint)) { + return state; + } + + const newSuggestion: ProactiveSuggestion = { + ...suggestion, + id: `proactive-${now}-${Math.random().toString(36).slice(2, 6)}`, + createdAt: now, + read: false, + surfacedAt: suggestion.delivery === "surface" ? now : undefined, + }; + createdId = newSuggestion.id; + const updated = [newSuggestion, ...state.suggestions].slice(0, 20); + return { + suggestions: updated, + unreadCount: updated.filter((s) => !s.read).length, + }; + }); + return createdId; + }, markAllRead: () => set((state) => ({ - suggestions: state.suggestions.map((s) => ({ ...s, read: true })), + suggestions: state.suggestions.map((s) => ({ + ...s, + read: true, + hiddenAt: s.hiddenAt ?? Date.now(), + })), unreadCount: 0, })), dismissSuggestion: (id) => set((state) => { - const updated = state.suggestions.filter((s) => s.id !== id); + const updated = state.suggestions.map((s) => + s.id === id + ? { ...s, read: true, hiddenAt: s.hiddenAt ?? Date.now() } + : s, + ); + return { + suggestions: updated, + unreadCount: updated.filter((s) => !s.read).length, + }; + }), + + hideSuggestion: (id) => + set((state) => { + const updated = state.suggestions.map((s) => + s.id === id && !s.hiddenAt + ? { ...s, hiddenAt: Date.now() } + : s, + ); return { suggestions: updated, unreadCount: updated.filter((s) => !s.read).length, diff --git a/apps/web/tests/integration/features/notebook/notebook-workspace.test.tsx b/apps/web/tests/integration/features/notebook/notebook-workspace.test.tsx index e73527e..56d2800 100644 --- a/apps/web/tests/integration/features/notebook/notebook-workspace.test.tsx +++ b/apps/web/tests/integration/features/notebook/notebook-workspace.test.tsx @@ -8,10 +8,11 @@ let mobileMatches = true; const setMobileHeaderMode = vi.fn(); const invalidateQueries = vi.fn(); const setActiveSourceId = vi.fn(); +let proactiveStoreState: Record; vi.mock("next-intl", () => ({ useTranslations: () => (key: string, values?: Record) => - values?.text ? `${key}:${values.text}` : key, + values?.text ? `${key}:${values.text}` : values?.name ? `${key}:${values.name}` : key, })); vi.mock("@tanstack/react-query", () => ({ @@ -25,6 +26,9 @@ vi.mock("framer-motion", () => ({ div: ({ children, ...props }: { children?: ReactNode; [key: string]: unknown }) => (
{children}
), + button: ({ children, ...props }: { children?: ReactNode; [key: string]: unknown }) => ( + + ), }, })); @@ -72,8 +76,28 @@ vi.mock("@/features/notebook/mobile-workspace-sheet", () => ({ })); vi.mock("@/features/editor/note-editor", () => ({ - NoteEditor: ({ isMobileLayout }: { isMobileLayout?: boolean }) => ( -
editor
+ NoteEditor: ({ + isMobileLayout, + onEditorAction, + }: { + isMobileLayout?: boolean; + onEditorAction?: (payload: Record) => void; + }) => ( +
+ editor + +
), })); @@ -94,11 +118,17 @@ vi.mock("@/features/copilot/copilot-panel", () => ({ CopilotPanel: ({ presentation = "fixed", isOpen, + pendingPrompt, }: { presentation?: "fixed" | "sheet"; isOpen: boolean; + pendingPrompt?: { text: string } | null; }) => ( -
+
copilot
), @@ -133,13 +163,12 @@ vi.mock("@/store/use-notebook-store", () => ({ useNotebookStore: (selector: (state: Record) => unknown) => selector({ activeSourceId: null, setActiveSourceId, + setCopilotPanelOpen: vi.fn(), }), })); vi.mock("@/store/use-proactive-store", () => ({ - useProactiveStore: (selector: (state: Record) => unknown) => selector({ - setWritingContext: vi.fn(), - }), + useProactiveStore: (selector: (state: Record) => unknown) => selector(proactiveStoreState), })); vi.mock("@/services/note-service", () => ({ @@ -164,6 +193,12 @@ describe("NotebookWorkspace", () => { setMobileHeaderMode.mockReset(); invalidateQueries.mockReset(); setActiveSourceId.mockReset(); + proactiveStoreState = { + suggestions: [], + setWritingContext: vi.fn(), + hideSuggestion: vi.fn(), + dismissSuggestion: vi.fn(), + }; localStorage.clear(); global.ResizeObserver = class { observe() {} @@ -229,4 +264,66 @@ describe("NotebookWorkspace", () => { expect(screen.getByTestId("mobile-workspace-sheet")).toHaveAttribute("data-active-sheet", "none"); }); }); + + it("routes structured editor actions into the copilot prompt flow on desktop", async () => { + mobileMatches = false; + + render( + + ); + + fireEvent.click(screen.getByTestId("trigger-editor-action-desktop")); + + await waitFor(() => { + expect(screen.getByTestId("copilot-panel-fixed")).toHaveAttribute("data-open", "true"); + expect(screen.getByTestId("copilot-panel-fixed")).toHaveAttribute( + "data-prompt", + expect.stringContaining("customEditPrompt:Selected text"), + ); + }); + }); + + it("renders only surfaced proactive cards inside the workspace toaster", () => { + proactiveStoreState = { + ...proactiveStoreState, + suggestions: [ + { + id: "inbox-1", + type: "insight", + origin: "proactive_insight", + delivery: "inbox", + fingerprint: "insight:inbox", + message: "Inbox only insight", + createdAt: 1, + read: false, + }, + { + id: "surface-1", + type: "source_indexed", + origin: "source_indexed", + delivery: "surface", + fingerprint: "source:1", + sourceName: "Paper A", + createdAt: 2, + surfacedAt: 2, + read: false, + }, + ], + }; + + render( + + ); + + expect(screen.getByText("sourceIndexed:Paper A")).toBeInTheDocument(); + expect(screen.queryByText("Inbox only insight")).not.toBeInTheDocument(); + }); }); diff --git a/apps/web/tests/source/source-list.test.ts b/apps/web/tests/source/source-list.test.ts index e047ac7..bbb57bd 100644 --- a/apps/web/tests/source/source-list.test.ts +++ b/apps/web/tests/source/source-list.test.ts @@ -44,4 +44,17 @@ describe("dedupeSourcesByLatest", () => { expect(dedupeSourcesByLatest(sources)).toHaveLength(2); }); + + it("keeps only one record when the same source id appears multiple times", () => { + const duplicated = makeSource({ + id: "duplicate-id", + title: "重复来源.md", + status: "indexed", + updatedAt: "2026-04-05T09:15:00Z", + }); + + const sources = [duplicated, duplicated]; + + expect(dedupeSourcesByLatest(sources)).toEqual([duplicated]); + }); }); diff --git a/apps/web/tests/unit/features/copilot/copilot-panel.test.tsx b/apps/web/tests/unit/features/copilot/copilot-panel.test.tsx index 1421064..66d7993 100644 --- a/apps/web/tests/unit/features/copilot/copilot-panel.test.tsx +++ b/apps/web/tests/unit/features/copilot/copilot-panel.test.tsx @@ -85,6 +85,12 @@ vi.mock("@/store/use-proactive-store", () => ({ }), })); +vi.mock("@/store/use-notebook-store", () => ({ + useNotebookStore: (selector: (state: Record) => unknown) => selector({ + setCopilotStreaming: vi.fn(), + }), +})); + vi.mock("@/hooks/use-agent-stream-events", () => ({ useAgentStreamEvents: () => ({ agentSteps: [], diff --git a/apps/web/tests/unit/features/copilot/proactive-surface-policy.test.ts b/apps/web/tests/unit/features/copilot/proactive-surface-policy.test.ts new file mode 100644 index 0000000..d809399 --- /dev/null +++ b/apps/web/tests/unit/features/copilot/proactive-surface-policy.test.ts @@ -0,0 +1,80 @@ +import { beforeEach, describe, expect, it } from "vitest"; + +import { + __resetThoughtSurfaceHistoryForTests, + createSuggestionFingerprint, + rememberThoughtSurface, + shouldAutoSurfaceSource, + shouldAutoSurfaceThought, +} from "@/features/copilot/proactive-surface-policy"; + +describe("proactive surface policy", () => { + beforeEach(() => { + localStorage.clear(); + __resetThoughtSurfaceHistoryForTests(); + }); + + it("keeps lyra thoughts in inbox when copilot is already open", () => { + const allow = shouldAutoSurfaceThought({ + fingerprint: "thought:test", + isMobile: false, + copilotOpen: true, + streaming: false, + hasActiveSurface: false, + lastInteractionAt: 0, + now: 100_000, + }); + + expect(allow).toBe(false); + }); + + it("surfaces lyra thoughts only after the user has been idle on desktop", () => { + const allow = shouldAutoSurfaceThought({ + fingerprint: "thought:test", + isMobile: false, + copilotOpen: false, + streaming: false, + hasActiveSurface: false, + lastInteractionAt: 0, + now: 2_000_000, + }); + + expect(allow).toBe(true); + }); + + it("blocks repeated thought fingerprints during the six hour dedupe window", () => { + rememberThoughtSurface("thought:repeat", 100_000); + + const allow = shouldAutoSurfaceThought({ + fingerprint: "thought:repeat", + isMobile: false, + copilotOpen: false, + streaming: false, + hasActiveSurface: false, + lastInteractionAt: 0, + now: 100_000 + 60_000, + }); + + expect(allow).toBe(false); + }); + + it("blocks all source auto-surface on mobile", () => { + expect(shouldAutoSurfaceSource(true)).toBe(false); + expect(shouldAutoSurfaceSource(false)).toBe(true); + }); + + it("builds stable fingerprints from the event origin", () => { + expect( + createSuggestionFingerprint("source_indexed", { + sourceId: "src-1", + sourceName: "Paper A", + }), + ).toBe("source:src-1"); + + expect( + createSuggestionFingerprint("lyra_thought", { + message: " A Fresh Insight About Attention ", + }), + ).toBe("thought:a fresh insight about attention"); + }); +}); diff --git a/apps/web/tests/unit/features/copilot/proactive-toaster.test.tsx b/apps/web/tests/unit/features/copilot/proactive-toaster.test.tsx new file mode 100644 index 0000000..350cc2d --- /dev/null +++ b/apps/web/tests/unit/features/copilot/proactive-toaster.test.tsx @@ -0,0 +1,95 @@ +import { act, fireEvent, render, screen } from "@testing-library/react"; +import type { ReactNode } from "react"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +import { ProactiveToaster } from "@/features/copilot/proactive-toaster"; +import { useProactiveStore } from "@/store/use-proactive-store"; + +vi.mock("next-intl", () => ({ + useTranslations: () => (key: string, values?: Record) => + values?.name ? `${key}:${values.name}` : key, +})); + +vi.mock("framer-motion", () => ({ + AnimatePresence: ({ children }: { children?: ReactNode }) => <>{children}, + m: { + div: ({ children, ...props }: { children?: ReactNode; [key: string]: unknown }) => ( +
{children}
+ ), + }, +})); + +describe("ProactiveToaster", () => { + beforeEach(() => { + useProactiveStore.setState({ + suggestions: [], + writingContext: [], + unreadCount: 0, + }); + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it("renders only the surfaced suggestion and keeps inbox-only items hidden", () => { + useProactiveStore.getState().addSuggestion({ + type: "insight", + origin: "proactive_insight", + delivery: "inbox", + fingerprint: "insight:inbox-only", + message: "Inbox only insight", + }); + useProactiveStore.getState().addSuggestion({ + type: "source_indexed", + origin: "source_indexed", + delivery: "surface", + fingerprint: "source:surface", + sourceName: "Paper A", + summary: "Surface summary", + }); + + render(); + + expect(screen.getByText("sourceIndexed:Paper A")).toBeInTheDocument(); + expect(screen.queryByText("Inbox only insight")).not.toBeInTheDocument(); + }); + + it("auto-hides surfaced cards after ten seconds without marking them read", () => { + const suggestionId = useProactiveStore.getState().addSuggestion({ + type: "insight", + origin: "lyra_thought", + delivery: "surface", + fingerprint: "thought:auto-hide", + message: "A surfaced thought", + }); + + render(); + + act(() => { + vi.advanceTimersByTime(10_000); + }); + + const suggestion = useProactiveStore.getState().suggestions.find((item) => item.id === suggestionId); + expect(suggestion?.hiddenAt).toBeTypeOf("number"); + expect(suggestion?.read).toBe(false); + }); + + it("marks the surfaced card as read when the user closes it", () => { + const suggestionId = useProactiveStore.getState().addSuggestion({ + type: "insight", + origin: "lyra_thought", + delivery: "surface", + fingerprint: "thought:dismiss", + message: "Dismiss me", + }); + + render(); + fireEvent.click(screen.getByRole("button", { name: "close" })); + + const suggestion = useProactiveStore.getState().suggestions.find((item) => item.id === suggestionId); + expect(suggestion?.read).toBe(true); + expect(suggestion?.hiddenAt).toBeTypeOf("number"); + }); +}); diff --git a/apps/web/tests/unit/features/editor/selection-action-menu.test.tsx b/apps/web/tests/unit/features/editor/selection-action-menu.test.tsx new file mode 100644 index 0000000..f93b4a2 --- /dev/null +++ b/apps/web/tests/unit/features/editor/selection-action-menu.test.tsx @@ -0,0 +1,172 @@ +import { fireEvent, screen } from "@testing-library/react"; +import type { ReactNode } from "react"; +import { beforeEach, describe, expect, it, vi } from "vitest"; + +import { SelectionActionMenu } from "@/features/editor/selection-action-menu"; +import { renderWithProviders } from "@test/utils/render-with-providers"; + +const runRewrite = vi.fn(); +const applyPreview = vi.fn(); +const retry = vi.fn(); +const cancel = vi.fn(); +const rewriteState = { + isRewriting: false, + preview: null as null | { + action: "proofread"; + from: number; + to: number; + originalText: string; + result: string; + }, +}; + +vi.mock("@tiptap/react", () => ({ + BubbleMenu: ({ children }: { children?: ReactNode }) =>
{children}
, +})); + +vi.mock("@/hooks/use-inline-rewrite", () => ({ + useInlineRewrite: () => ({ + isRewriting: rewriteState.isRewriting, + preview: rewriteState.preview, + runRewrite, + applyPreview, + retry, + cancel, + }), +})); + +function createEditorMock() { + const chain = { + focus: vi.fn(() => chain), + setParagraph: vi.fn(() => chain), + toggleHighlight: vi.fn(() => chain), + toggleBold: vi.fn(() => chain), + toggleItalic: vi.fn(() => chain), + toggleUnderline: vi.fn(() => chain), + extendMarkRange: vi.fn(() => chain), + unsetLink: vi.fn(() => chain), + setLink: vi.fn(() => chain), + toggleStrike: vi.fn(() => chain), + toggleCode: vi.fn(() => chain), + unsetAllMarks: vi.fn(() => chain), + run: vi.fn(), + }; + + return { + state: { + selection: { from: 3, to: 18 }, + doc: { + textBetween: vi.fn(() => "Selected text"), + nodeAt: vi.fn(() => ({ type: { name: "paragraph" } })), + }, + }, + isEditable: true, + getAttributes: vi.fn(() => ({})), + isActive: vi.fn(() => false), + chain: vi.fn(() => chain), + }; +} + +const messages = { + editor: { + blockTypeText: "Text", + selectionHighlight: "Highlight", + selectionBold: "Bold", + selectionItalic: "Italic", + selectionUnderline: "Underline", + selectionLink: "Link", + selectionStrike: "Strikethrough", + selectionCode: "Code", + selectionFormula: "Formula", + more: "More", + selectionClearMarks: "Clear formatting", + selectionComment: "Comment", + selectionEditSuggestion: "Edit suggestion", + selectionFeedback: "Feedback", + selectionSkillLabel: "Skills", + selectionSkillSettings: "Settings", + selectionAiInputPlaceholder: "Use AI to edit", + selectionAiSubmit: "Send", + selectionAiShortcut: "Shortcut", + selectionPreviewTitle: "{action} result", + selectionApply: "Replace text", + selectionRetry: "Retry", + selectionCancel: "Cancel", + selectionSkill: { + polish: "Improve writing", + proofread: "Proofread", + reformat: "Reformat", + shorten: "Condense", + explain: "Explain", + }, + linkPlaceholder: "Link", + }, +} satisfies Record; + +describe("SelectionActionMenu", () => { + beforeEach(() => { + runRewrite.mockReset(); + applyPreview.mockReset(); + retry.mockReset(); + cancel.mockReset(); + rewriteState.isRewriting = false; + rewriteState.preview = null; + }); + + it("renders grouped actions and routes inline rewrite skills", () => { + renderWithProviders( + , + { messages }, + ); + + expect(screen.getByTestId("selection-action-menu")).toBeInTheDocument(); + + fireEvent.click(screen.getByTestId("selection-ai-skill-proofread")); + expect(runRewrite).toHaveBeenCalledWith("proofread"); + + fireEvent.click(screen.getByRole("button", { name: "More" })); + expect(screen.getByTestId("selection-action-menu-more")).toBeInTheDocument(); + }); + + it("submits custom AI edit as a structured editor action", () => { + const onEditorAction = vi.fn(); + + renderWithProviders( + , + { messages }, + ); + + fireEvent.change(screen.getByTestId("selection-ai-input"), { + target: { value: "Make it more concise" }, + }); + fireEvent.click(screen.getByRole("button", { name: "Send" })); + + expect(onEditorAction).toHaveBeenCalledWith( + expect.objectContaining({ + scope: "selection", + action: "customEdit", + text: "Selected text", + intent: "Make it more concise", + }), + ); + }); + + it("shows the local preview card and applies the rewrite", () => { + rewriteState.preview = { + action: "proofread", + from: 3, + to: 18, + originalText: "Selected text", + result: "Fixed text", + }; + + renderWithProviders( + , + { messages }, + ); + + expect(screen.getByTestId("selection-rewrite-preview")).toBeInTheDocument(); + fireEvent.click(screen.getByRole("button", { name: "Replace text" })); + expect(applyPreview).toHaveBeenCalled(); + }); +}); diff --git a/apps/web/tests/unit/features/knowledge/knowledge-view.test.tsx b/apps/web/tests/unit/features/knowledge/knowledge-view.test.tsx index 5ce7641..5e15de7 100644 --- a/apps/web/tests/unit/features/knowledge/knowledge-view.test.tsx +++ b/apps/web/tests/unit/features/knowledge/knowledge-view.test.tsx @@ -13,7 +13,8 @@ class MockIntersectionObserver { vi.stubGlobal("IntersectionObserver", MockIntersectionObserver); vi.mock("next-intl", () => ({ - useTranslations: () => (key: string) => key, + useTranslations: () => (key: string, values?: Record) => + values?.total != null ? `${key}:${values.total}` : key, })); vi.mock("framer-motion", () => ({ @@ -34,6 +35,15 @@ vi.mock("@tanstack/react-query", () => ({ pages: [ { items: [ + { + id: "source-older", + notebookId: "notebook-1", + title: "AI Agent Research", + summary: "old failure", + type: "web", + status: "failed", + updatedAt: "2026-04-03T10:00:00Z", + }, { id: "source-1", notebookId: "notebook-1", @@ -41,9 +51,10 @@ vi.mock("@tanstack/react-query", () => ({ summary: "summary", type: "web", status: "indexed", + updatedAt: "2026-04-03T11:00:00Z", }, ], - total: 1, + total: 2, offset: 0, limit: 20, hasMore: false, @@ -79,6 +90,8 @@ describe("KnowledgeView", () => { expect(grid.className).toContain("grid-cols-2"); expect(grid.className).toContain("md:grid-cols-3"); expect(screen.getByRole("heading", { name: "title" })).toBeInTheDocument(); + expect(screen.getAllByText("AI Agent Research")).toHaveLength(1); + expect(screen.getByText("loadedAll:1")).toBeInTheDocument(); }); it("can switch to graph view", () => { diff --git a/apps/web/tests/unit/features/source/sources-panel.test.tsx b/apps/web/tests/unit/features/source/sources-panel.test.tsx index 832531a..af212e9 100644 --- a/apps/web/tests/unit/features/source/sources-panel.test.tsx +++ b/apps/web/tests/unit/features/source/sources-panel.test.tsx @@ -3,6 +3,27 @@ import { describe, expect, it, vi } from "vitest"; import { SourcesPanel } from "@/features/source/sources-panel"; +const mockSources = [ + { + id: "failed-older", + notebookId: "nb-1", + title: "Paper", + type: "pdf", + status: "failed", + summary: "Old failure", + updatedAt: "2026-04-03T10:00:00Z", + }, + { + id: "indexed-latest", + notebookId: "nb-1", + title: "Paper", + type: "pdf", + status: "indexed", + summary: "Summary", + updatedAt: "2026-04-03T11:00:00Z", + }, +]; + vi.mock("next-intl", () => ({ useTranslations: () => (key: string, values?: Record) => values?.count != null ? `${key}:${values.count}` : key, @@ -10,9 +31,7 @@ vi.mock("next-intl", () => ({ vi.mock("@tanstack/react-query", () => ({ useQuery: vi.fn(() => ({ - data: [ - { id: "1", title: "Paper", type: "pdf", status: "indexed", summary: "Summary" }, - ], + data: mockSources, isLoading: false, })), })); @@ -55,5 +74,14 @@ describe("SourcesPanel", () => { expect(screen.getByTestId("sources-panel-sheet")).toBeInTheDocument(); expect(screen.queryByTitle("closePanelTitle")).not.toBeInTheDocument(); expect(screen.getByText("Paper")).toBeInTheDocument(); + expect(screen.getByText("sourcesHeader:1")).toBeInTheDocument(); + }); + + it("hides older duplicate records from failed/pending groups", () => { + render(); + + expect(screen.getByText("Paper")).toBeInTheDocument(); + expect(screen.queryByText("Old failure")).not.toBeInTheDocument(); + expect(screen.queryByText("importFailed")).not.toBeInTheDocument(); }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c772988..9405118 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -290,6 +290,9 @@ importers: '@tiptap/extension-bubble-menu': specifier: ^2.11.5 version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-character-count': + specifier: ^3.22.2 + version: 3.22.2(@tiptap/extensions@3.22.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)) '@tiptap/extension-highlight': specifier: ^2.11.5 version: 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) @@ -314,6 +317,9 @@ importers: '@tiptap/starter-kit': specifier: ^2.11.5 version: 2.27.2 + '@tiptap/suggestion': + specifier: ^3.22.2 + version: 3.22.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) axios: specifier: ^1.8.1 version: 1.13.6 @@ -343,7 +349,7 @@ importers: version: 15.5.14(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.51.0) next-intl: specifier: ^4.8.3 - version: 4.8.3(next@15.5.14(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.51.0))(react@19.2.4)(typescript@5.9.3) + version: 4.8.3(next@15.5.14(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.51.0))(react@19.2.4)(typescript@5.9.3) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -419,10 +425,10 @@ importers: version: 10.4.27(postcss@8.5.8) eslint: specifier: ^9.0.0 - version: 9.39.4(jiti@2.6.1) + version: 9.39.4(jiti@1.21.7) eslint-config-next: specifier: ^15.0.0 - version: 15.5.14(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + version: 15.5.14(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) jsdom: specifier: ^26.0.0 version: 26.1.0 @@ -3336,6 +3342,11 @@ packages: peerDependencies: '@tiptap/core': ^2.7.0 + '@tiptap/extension-character-count@3.22.2': + resolution: {integrity: sha512-EBTVHbRkv5IhoO/TAij4ivZ2RD2u6aiZHtWuhHVbsVsHfoxSi7YGjVNFv/DnT/BrEwpNy3u/SI/Xo57120HTOA==} + peerDependencies: + '@tiptap/extensions': ^3.22.2 + '@tiptap/extension-code-block@2.27.2': resolution: {integrity: sha512-KgvdQHS4jXr79aU3wZOGBIZYYl9vCB7uDEuRFV4so2rYrfmiYMw3T8bTnlNEEGe4RUeAms1i4fdwwvQp9nR1Dw==} peerDependencies: @@ -3454,6 +3465,12 @@ packages: peerDependencies: '@tiptap/core': ^2.7.0 + '@tiptap/extensions@3.22.2': + resolution: {integrity: sha512-s7MZmm2Xdq+8feIXgY3v7gVpQ5ClqBZi20KheouS7KSbBlrY4fu2irYR1EGc6r1UUVaHMxEa+cx5knhx+mIPUw==} + peerDependencies: + '@tiptap/core': ^3.22.2 + '@tiptap/pm': ^3.22.2 + '@tiptap/pm@2.27.2': resolution: {integrity: sha512-kaEg7BfiJPDQMKbjVIzEPO3wlcA+pZb2tlcK9gPrdDnEFaec2QTF1sXz2ak2IIb2curvnIrQ4yrfHgLlVA72wA==} @@ -3468,6 +3485,12 @@ packages: '@tiptap/starter-kit@2.27.2': resolution: {integrity: sha512-bb0gJvPoDuyRUQ/iuN52j1//EtWWttw+RXAv1uJxfR0uKf8X7uAqzaOOgwjknoCIDC97+1YHwpGdnRjpDkOBxw==} + '@tiptap/suggestion@3.22.2': + resolution: {integrity: sha512-t2GQSrF4eQyPb+KqXVfcC2cokYIDNfpLLq7B0ELlnWBJURnLOVJ2ssJ6ASI247scu9ZKPG1g5bFP4IXdBhyPgg==} + peerDependencies: + '@tiptap/core': ^3.22.2 + '@tiptap/pm': ^3.22.2 + '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} @@ -11608,9 +11631,9 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@1.21.7))': dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -13636,6 +13659,10 @@ snapshots: dependencies: '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extension-character-count@3.22.2(@tiptap/extensions@3.22.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2))': + dependencies: + '@tiptap/extensions': 3.22.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) + '@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': dependencies: '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) @@ -13734,6 +13761,11 @@ snapshots: dependencies: '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/extensions@3.22.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + '@tiptap/pm@2.27.2': dependencies: prosemirror-changeset: 2.4.0 @@ -13791,6 +13823,11 @@ snapshots: '@tiptap/extension-text-style': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) '@tiptap/pm': 2.27.2 + '@tiptap/suggestion@3.22.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': + dependencies: + '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) + '@tiptap/pm': 2.27.2 + '@tootallnate/quickjs-emscripten@0.23.0': {} '@turbo/darwin-64@2.9.3': @@ -14086,15 +14123,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.57.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.57.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.57.1 - '@typescript-eslint/type-utils': 8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.57.1 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@1.21.7) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -14102,14 +14139,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.57.1 '@typescript-eslint/types': 8.57.1 '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.57.1 debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -14132,13 +14169,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.57.1 '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@1.21.7) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -14161,13 +14198,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) '@typescript-eslint/scope-manager': 8.57.1 '@typescript-eslint/types': 8.57.1 '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -16139,19 +16176,19 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-next@15.5.14(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3): + eslint-config-next@15.5.14(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 15.5.14 '@rushstack/eslint-patch': 1.16.1 - '@typescript-eslint/eslint-plugin': 8.57.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) + '@typescript-eslint/eslint-plugin': 8.57.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.4(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4(jiti@2.6.1)) - eslint-plugin-react: 7.37.5(eslint@9.39.4(jiti@2.6.1)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.39.4(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-react: 7.37.5(eslint@9.39.4(jiti@1.21.7)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.39.4(jiti@1.21.7)) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -16167,33 +16204,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@1.21.7) get-tsconfig: 4.13.6 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) + '@typescript-eslint/parser': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.4(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -16202,9 +16239,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -16216,13 +16253,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.57.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.1(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@1.21.7)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -16232,7 +16269,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@1.21.7) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -16241,11 +16278,11 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-react-hooks@5.2.0(eslint@9.39.4(jiti@1.21.7)): dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@1.21.7) - eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@1.21.7)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -16253,7 +16290,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.3.1 - eslint: 9.39.4(jiti@2.6.1) + eslint: 9.39.4(jiti@1.21.7) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -16278,9 +16315,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.4(jiti@2.6.1): + eslint@9.39.4(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 @@ -16315,7 +16352,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.1 + jiti: 1.21.7 transitivePeerDependencies: - supports-color @@ -18948,7 +18985,7 @@ snapshots: next-intl-swc-plugin-extractor@4.8.3: {} - next-intl@4.8.3(next@15.5.14(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.51.0))(react@19.2.4)(typescript@5.9.3): + next-intl@4.8.3(next@15.5.14(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.51.0))(react@19.2.4)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.8.2 '@parcel/watcher': 2.5.6 From c9f306f15dd98a2d99de1a79c11c44a1fa2e8d52 Mon Sep 17 00:00:00 2001 From: LinMoQC <2896311434@qq.com> Date: Fri, 17 Apr 2026 00:15:59 +0800 Subject: [PATCH 03/21] chore: snapshot current workspace before desktop refactor --- .claude/worktrees/gifted-wiles | 1 - .claude/worktrees/quizzical-albattani | 1 - .claude/worktrees/zen-pascal | 1 - .vscode/settings.json | 17 +- .../044_notebook_appearance_settings.py | 25 + apps/api/app/agents/research/deep_research.py | 189 +- apps/api/app/agents/research/task_manager.py | 7 +- apps/api/app/domains/ai/routers/research.py | 33 + apps/api/app/domains/ai/schemas.py | 14 + apps/api/app/domains/memory/router.py | 36 + apps/api/app/main.py | 43 +- apps/api/app/services/notebook_service.py | 163 + apps/api/tests/unit/test_notebook_settings.py | 103 + .../tests/unit/test_research_task_manager.py | 160 +- apps/desktop/.gitignore | 24 + apps/desktop/.vscode/extensions.json | 3 + apps/desktop/README.md | 7 + apps/desktop/index.html | 10 +- apps/desktop/package.json | 71 +- apps/desktop/postcss.config.js | 2 +- apps/desktop/public/bot_avatar.png | Bin 0 -> 403597 bytes apps/desktop/public/lyra.png | Bin 0 -> 121202 bytes apps/desktop/public/tauri.svg | 6 + apps/desktop/public/vite.svg | 1 + apps/desktop/src-tauri/.gitignore | 7 + apps/desktop/src-tauri/Cargo.lock | 5464 +++++++++++++++++ apps/desktop/src-tauri/Cargo.toml | 29 +- apps/desktop/src-tauri/build.rs | 3 + .../src-tauri/capabilities/default.json | 14 + apps/desktop/src-tauri/icons/128x128.png | Bin 0 -> 3512 bytes apps/desktop/src-tauri/icons/128x128@2x.png | Bin 0 -> 7012 bytes apps/desktop/src-tauri/icons/32x32.png | Bin 0 -> 974 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 0 -> 2863 bytes .../src-tauri/icons/Square142x142Logo.png | Bin 0 -> 3858 bytes .../src-tauri/icons/Square150x150Logo.png | Bin 0 -> 3966 bytes .../src-tauri/icons/Square284x284Logo.png | Bin 0 -> 7737 bytes .../src-tauri/icons/Square30x30Logo.png | Bin 0 -> 903 bytes .../src-tauri/icons/Square310x310Logo.png | Bin 0 -> 8591 bytes .../src-tauri/icons/Square44x44Logo.png | Bin 0 -> 1299 bytes .../src-tauri/icons/Square71x71Logo.png | Bin 0 -> 2011 bytes .../src-tauri/icons/Square89x89Logo.png | Bin 0 -> 2468 bytes apps/desktop/src-tauri/icons/StoreLogo.png | Bin 0 -> 1523 bytes apps/desktop/src-tauri/icons/icon.icns | Bin 0 -> 98451 bytes apps/desktop/src-tauri/icons/icon.ico | Bin 0 -> 86642 bytes apps/desktop/src-tauri/icons/icon.png | Bin 0 -> 14183 bytes apps/desktop/src-tauri/src/lib.rs | 82 +- apps/desktop/src-tauri/tauri.conf.json | 21 +- apps/desktop/src/App.css | 1 + apps/desktop/src/app.tsx | 224 +- apps/desktop/src/assets/react.svg | 1 + .../src/components/ai-panel/ai-panel.tsx | 224 - .../components/chat-input/chat-composer.tsx | 101 + .../chat-input/desktop-chat-input.tsx | 546 ++ .../src/components/editor/copilot-panel.tsx | 285 + .../src/components/genui/artifact-panel.tsx | 146 + .../src/components/genui/card-block.tsx | 95 + .../src/components/genui/chart-block.tsx | 107 + .../src/components/genui/diff-block.tsx | 98 + .../src/components/genui/formula-block.tsx | 41 + .../src/components/genui/graph-block.tsx | 71 + .../src/components/genui/heatmap-block.tsx | 75 + apps/desktop/src/components/genui/index.ts | 27 + .../src/components/genui/kanban-block.tsx | 165 + .../components/genui/markdown-components.tsx | 225 + .../src/components/genui/matrix-block.tsx | 99 + .../src/components/genui/paper-card-block.tsx | 83 + .../src/components/genui/quiz-block.tsx | 125 + .../src/components/genui/steps-block.tsx | 76 + .../src/components/genui/table-block.tsx | 120 + .../src/components/genui/timeline-block.tsx | 109 + apps/desktop/src/components/genui/utils.ts | 47 + .../src/components/genui/wordcloud-block.tsx | 51 + .../components/message-render/agent-steps.tsx | 414 ++ .../message-render/approval-card.tsx | 124 + .../message-render/attachment-image.tsx | 54 + .../message-render/choice-cards.tsx | 127 + .../message-render/citation-footer.tsx | 109 + .../components/message-render/code-block.tsx | 56 + .../message-render/diagram-view.tsx | 79 + .../message-render/excalidraw-view.tsx | 100 + .../message-render/inline-citation.tsx | 155 + .../message-render/markdown-content.tsx | 38 + .../message-render/mcp-result-views.tsx | 70 + .../message-render/mermaid-block.tsx | 121 + .../message-render/mind-map-view.tsx | 213 + .../message-render/parse-message-content.ts | 26 + .../message-render/reasoning-block.tsx | 80 + .../message-render/source-cards.tsx | 54 + .../src/components/sidebar/sidebar.tsx | 270 +- .../src/components/titlebar/title-bar.tsx | 106 - .../src/components/titlebar/titlebar.tsx | 92 + .../src/features/chat/chat-helpers.tsx | 25 + apps/desktop/src/features/chat/chat-types.ts | 5 + apps/desktop/src/global.d.ts | 68 + apps/desktop/src/index.css | 60 - apps/desktop/src/layouts/main-layout.tsx | 34 - apps/desktop/src/lib/animations.ts | 54 + apps/desktop/src/lib/citation-utils.tsx | 65 + apps/desktop/src/lib/cn.ts | 6 + apps/desktop/src/lib/http-client.ts | 47 - apps/desktop/src/lib/http.ts | 23 + apps/desktop/src/lib/mappers.ts | 18 + apps/desktop/src/lib/next-dynamic-stub.tsx | 35 + apps/desktop/src/lib/next-image-stub.tsx | 43 + apps/desktop/src/lib/next-intl-stub.ts | 110 + .../desktop/src/lib/stubs/excalidraw-stub.tsx | 6 + .../src/lib/stubs/nivo-calendar-stub.tsx | 3 + apps/desktop/src/lib/utils.ts | 7 +- apps/desktop/src/main.tsx | 28 +- apps/desktop/src/pages/chat/chat-page.tsx | 614 ++ apps/desktop/src/pages/editor/editor-page.tsx | 221 + apps/desktop/src/pages/home/home-page.tsx | 107 + apps/desktop/src/pages/knowledge.tsx | 11 - .../src/pages/knowledge/knowledge-page.tsx | 878 +++ apps/desktop/src/pages/login.tsx | 119 - apps/desktop/src/pages/login/login-page.tsx | 258 + .../src/pages/notebooks/notebooks-page.tsx | 232 + apps/desktop/src/pages/notes.tsx | 163 - .../src/pages/settings/settings-page.tsx | 1489 +++++ apps/desktop/src/pages/setup/setup-page.tsx | 200 + apps/desktop/src/pages/tasks.tsx | 11 - apps/desktop/src/store/use-auth-store.ts | 42 +- .../desktop/src/store/use-chat-draft-store.ts | 33 + apps/desktop/src/store/use-nav-store.ts | 20 + apps/desktop/src/store/use-server-store.ts | 19 + apps/desktop/src/store/use-tab-store.ts | 74 + apps/desktop/src/store/use-theme-store.ts | 16 + apps/desktop/src/store/use-ui-store.ts | 30 - apps/desktop/src/styles/globals.css | 137 + apps/desktop/src/types/index.ts | 57 + apps/desktop/src/vite-env.d.ts | 1 + apps/desktop/tailwind.config.js | 38 +- apps/desktop/tsconfig.json | 9 +- apps/desktop/tsconfig.node.json | 3 +- apps/desktop/vite.config.ts | 32 +- apps/web/config/locator-build-config.d.ts | 24 + apps/web/config/locator-build-config.mjs | 35 + apps/web/config/solid-js-web-shim.mjs | 1 + apps/web/messages/en.json | 26 +- apps/web/messages/zh.json | 26 +- apps/web/next.config.mjs | 67 +- apps/web/package.json | 3 + .../notebooks/[id]/read-only-note.tsx | 2 +- .../app/notebooks/[id]/loading.tsx | 83 +- .../(workspace)/app/notebooks/[id]/page.tsx | 1 + apps/web/src/app/globals.css | 55 +- apps/web/src/app/layout.tsx | 5 +- apps/web/src/app/providers.tsx | 17 +- .../deep-research/deep-research-progress.tsx | 412 +- .../components/deep-research/dr-plan-card.tsx | 275 + .../deep-research/dr-progress-card.tsx | 108 + .../deep-research/dr-research-drawer.tsx | 293 + .../src/components/deep-research/dr-types.ts | 8 + apps/web/src/components/genui/card-block.tsx | 13 +- apps/web/src/components/genui/chart-block.tsx | 35 +- .../components/genui/markdown-components.tsx | 13 + .../src/components/genui/paper-card-block.tsx | 2 +- .../components/message-render/code-block.tsx | 58 +- .../settings/sections/general-section.tsx | 17 +- .../settings/settings-primitives.tsx | 12 +- apps/web/src/features/chat/chat-view.tsx | 75 +- apps/web/src/features/chat/use-chat-page.tsx | 4 +- .../copilot/copilot-message-bubble.tsx | 4 +- .../src/features/copilot/copilot-panel.tsx | 1 + apps/web/src/features/editor/block-handle.tsx | 42 +- .../editor/inline-rewrite-overlay.tsx | 154 + apps/web/src/features/editor/note-editor.tsx | 42 +- .../editor/original-thinking-loader.tsx | 124 + .../features/editor/selection-action-menu.tsx | 373 +- .../src/features/notebook/floating-toc.tsx | 4 +- .../features/notebook/notebook-appearance.ts | 262 + .../src/features/notebook/notebook-card.tsx | 113 +- .../src/features/notebook/notebook-header.tsx | 592 +- .../src/features/notebook/notebook-icons.tsx | 231 +- .../notebook/notebook-settings-modal.tsx | 399 ++ .../src/features/notebook/notebook-toc.tsx | 45 +- .../features/notebook/notebook-workspace.tsx | 69 +- .../web/src/features/source/sources-panel.tsx | 12 +- apps/web/src/hooks/use-deep-research.ts | 75 +- apps/web/src/hooks/use-inline-rewrite.ts | 108 +- apps/web/src/lib/api-routes.ts | 2 + apps/web/src/lib/locator-devtools.tsx | 18 + apps/web/src/lib/theme-preset.tsx | 21 +- apps/web/src/services/ai-service.ts | 41 +- apps/web/src/services/note-service.ts | 2 + apps/web/src/store/use-custom-skills-store.ts | 68 + apps/web/src/store/use-deep-research-store.ts | 31 +- apps/web/tailwind.config.ts | 14 + .../notebook/notebook-appearance.test.ts | 11 + .../unit/features/editor/note-editor.test.tsx | 107 + .../unit/lib/locator-build-config.test.ts | 41 + .../web/tests/utils/render-with-providers.tsx | 12 +- ...250\350\256\276\350\256\241-template.docx" | Bin 55382 -> 0 bytes ...\350\241\250\350\256\276\350\256\241.docx" | Bin 52234 -> 0 bytes package.json | 5 + packages/ui/package.json | 29 + packages/ui/src/index.ts | 4 + packages/ui/src/message-render/code-block.tsx | 60 + packages/ui/src/message-render/index.ts | 4 + .../src/message-render/markdown-renderer.tsx | 77 + packages/ui/src/notebook-icons.tsx | 226 + packages/ui/tsconfig.json | 14 + patch_home.js | 140 + pnpm-lock.yaml | 1626 ++++- pnpm-workspace.yaml | 1 + 205 files changed, 21349 insertions(+), 2943 deletions(-) delete mode 160000 .claude/worktrees/gifted-wiles delete mode 160000 .claude/worktrees/quizzical-albattani delete mode 160000 .claude/worktrees/zen-pascal create mode 100644 apps/api/alembic/versions/044_notebook_appearance_settings.py create mode 100644 apps/api/app/services/notebook_service.py create mode 100644 apps/api/tests/unit/test_notebook_settings.py create mode 100644 apps/desktop/.gitignore create mode 100644 apps/desktop/.vscode/extensions.json create mode 100644 apps/desktop/README.md create mode 100644 apps/desktop/public/bot_avatar.png create mode 100644 apps/desktop/public/lyra.png create mode 100644 apps/desktop/public/tauri.svg create mode 100644 apps/desktop/public/vite.svg create mode 100644 apps/desktop/src-tauri/.gitignore create mode 100644 apps/desktop/src-tauri/Cargo.lock create mode 100644 apps/desktop/src-tauri/build.rs create mode 100644 apps/desktop/src-tauri/capabilities/default.json create mode 100644 apps/desktop/src-tauri/icons/128x128.png create mode 100644 apps/desktop/src-tauri/icons/128x128@2x.png create mode 100644 apps/desktop/src-tauri/icons/32x32.png create mode 100644 apps/desktop/src-tauri/icons/Square107x107Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square142x142Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square150x150Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square284x284Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square30x30Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square310x310Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square44x44Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square71x71Logo.png create mode 100644 apps/desktop/src-tauri/icons/Square89x89Logo.png create mode 100644 apps/desktop/src-tauri/icons/StoreLogo.png create mode 100644 apps/desktop/src-tauri/icons/icon.icns create mode 100644 apps/desktop/src-tauri/icons/icon.ico create mode 100644 apps/desktop/src-tauri/icons/icon.png create mode 100644 apps/desktop/src/App.css create mode 100644 apps/desktop/src/assets/react.svg delete mode 100644 apps/desktop/src/components/ai-panel/ai-panel.tsx create mode 100644 apps/desktop/src/components/chat-input/chat-composer.tsx create mode 100644 apps/desktop/src/components/chat-input/desktop-chat-input.tsx create mode 100644 apps/desktop/src/components/editor/copilot-panel.tsx create mode 100644 apps/desktop/src/components/genui/artifact-panel.tsx create mode 100644 apps/desktop/src/components/genui/card-block.tsx create mode 100644 apps/desktop/src/components/genui/chart-block.tsx create mode 100644 apps/desktop/src/components/genui/diff-block.tsx create mode 100644 apps/desktop/src/components/genui/formula-block.tsx create mode 100644 apps/desktop/src/components/genui/graph-block.tsx create mode 100644 apps/desktop/src/components/genui/heatmap-block.tsx create mode 100644 apps/desktop/src/components/genui/index.ts create mode 100644 apps/desktop/src/components/genui/kanban-block.tsx create mode 100644 apps/desktop/src/components/genui/markdown-components.tsx create mode 100644 apps/desktop/src/components/genui/matrix-block.tsx create mode 100644 apps/desktop/src/components/genui/paper-card-block.tsx create mode 100644 apps/desktop/src/components/genui/quiz-block.tsx create mode 100644 apps/desktop/src/components/genui/steps-block.tsx create mode 100644 apps/desktop/src/components/genui/table-block.tsx create mode 100644 apps/desktop/src/components/genui/timeline-block.tsx create mode 100644 apps/desktop/src/components/genui/utils.ts create mode 100644 apps/desktop/src/components/genui/wordcloud-block.tsx create mode 100644 apps/desktop/src/components/message-render/agent-steps.tsx create mode 100644 apps/desktop/src/components/message-render/approval-card.tsx create mode 100644 apps/desktop/src/components/message-render/attachment-image.tsx create mode 100644 apps/desktop/src/components/message-render/choice-cards.tsx create mode 100644 apps/desktop/src/components/message-render/citation-footer.tsx create mode 100644 apps/desktop/src/components/message-render/code-block.tsx create mode 100644 apps/desktop/src/components/message-render/diagram-view.tsx create mode 100644 apps/desktop/src/components/message-render/excalidraw-view.tsx create mode 100644 apps/desktop/src/components/message-render/inline-citation.tsx create mode 100644 apps/desktop/src/components/message-render/markdown-content.tsx create mode 100644 apps/desktop/src/components/message-render/mcp-result-views.tsx create mode 100644 apps/desktop/src/components/message-render/mermaid-block.tsx create mode 100644 apps/desktop/src/components/message-render/mind-map-view.tsx create mode 100644 apps/desktop/src/components/message-render/parse-message-content.ts create mode 100644 apps/desktop/src/components/message-render/reasoning-block.tsx create mode 100644 apps/desktop/src/components/message-render/source-cards.tsx delete mode 100644 apps/desktop/src/components/titlebar/title-bar.tsx create mode 100644 apps/desktop/src/components/titlebar/titlebar.tsx create mode 100644 apps/desktop/src/features/chat/chat-helpers.tsx create mode 100644 apps/desktop/src/features/chat/chat-types.ts create mode 100644 apps/desktop/src/global.d.ts delete mode 100644 apps/desktop/src/index.css delete mode 100644 apps/desktop/src/layouts/main-layout.tsx create mode 100644 apps/desktop/src/lib/animations.ts create mode 100644 apps/desktop/src/lib/citation-utils.tsx create mode 100644 apps/desktop/src/lib/cn.ts delete mode 100644 apps/desktop/src/lib/http-client.ts create mode 100644 apps/desktop/src/lib/http.ts create mode 100644 apps/desktop/src/lib/mappers.ts create mode 100644 apps/desktop/src/lib/next-dynamic-stub.tsx create mode 100644 apps/desktop/src/lib/next-image-stub.tsx create mode 100644 apps/desktop/src/lib/next-intl-stub.ts create mode 100644 apps/desktop/src/lib/stubs/excalidraw-stub.tsx create mode 100644 apps/desktop/src/lib/stubs/nivo-calendar-stub.tsx create mode 100644 apps/desktop/src/pages/chat/chat-page.tsx create mode 100644 apps/desktop/src/pages/editor/editor-page.tsx create mode 100644 apps/desktop/src/pages/home/home-page.tsx delete mode 100644 apps/desktop/src/pages/knowledge.tsx create mode 100644 apps/desktop/src/pages/knowledge/knowledge-page.tsx delete mode 100644 apps/desktop/src/pages/login.tsx create mode 100644 apps/desktop/src/pages/login/login-page.tsx create mode 100644 apps/desktop/src/pages/notebooks/notebooks-page.tsx delete mode 100644 apps/desktop/src/pages/notes.tsx create mode 100644 apps/desktop/src/pages/settings/settings-page.tsx create mode 100644 apps/desktop/src/pages/setup/setup-page.tsx delete mode 100644 apps/desktop/src/pages/tasks.tsx create mode 100644 apps/desktop/src/store/use-chat-draft-store.ts create mode 100644 apps/desktop/src/store/use-nav-store.ts create mode 100644 apps/desktop/src/store/use-server-store.ts create mode 100644 apps/desktop/src/store/use-tab-store.ts create mode 100644 apps/desktop/src/store/use-theme-store.ts delete mode 100644 apps/desktop/src/store/use-ui-store.ts create mode 100644 apps/desktop/src/styles/globals.css create mode 100644 apps/desktop/src/types/index.ts create mode 100644 apps/desktop/src/vite-env.d.ts create mode 100644 apps/web/config/locator-build-config.d.ts create mode 100644 apps/web/config/locator-build-config.mjs create mode 100644 apps/web/config/solid-js-web-shim.mjs create mode 100644 apps/web/src/components/deep-research/dr-plan-card.tsx create mode 100644 apps/web/src/components/deep-research/dr-progress-card.tsx create mode 100644 apps/web/src/components/deep-research/dr-research-drawer.tsx create mode 100644 apps/web/src/features/editor/inline-rewrite-overlay.tsx create mode 100644 apps/web/src/features/editor/original-thinking-loader.tsx create mode 100644 apps/web/src/features/notebook/notebook-appearance.ts create mode 100644 apps/web/src/features/notebook/notebook-settings-modal.tsx create mode 100644 apps/web/src/lib/locator-devtools.tsx create mode 100644 apps/web/src/store/use-custom-skills-store.ts create mode 100644 apps/web/tests/features/notebook/notebook-appearance.test.ts create mode 100644 apps/web/tests/unit/features/editor/note-editor.test.tsx create mode 100644 apps/web/tests/unit/lib/locator-build-config.test.ts delete mode 100644 "output/doc/LyraNote\346\225\260\346\215\256\345\272\223\350\241\250\350\256\276\350\256\241-template.docx" delete mode 100644 "output/doc/LyraNote\346\225\260\346\215\256\345\272\223\350\241\250\350\256\276\350\256\241.docx" create mode 100644 packages/ui/package.json create mode 100644 packages/ui/src/index.ts create mode 100644 packages/ui/src/message-render/code-block.tsx create mode 100644 packages/ui/src/message-render/index.ts create mode 100644 packages/ui/src/message-render/markdown-renderer.tsx create mode 100644 packages/ui/src/notebook-icons.tsx create mode 100644 packages/ui/tsconfig.json create mode 100644 patch_home.js diff --git a/.claude/worktrees/gifted-wiles b/.claude/worktrees/gifted-wiles deleted file mode 160000 index 5638dea..0000000 --- a/.claude/worktrees/gifted-wiles +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5638dea7ecee60b72e88594109dc17ad778d68c0 diff --git a/.claude/worktrees/quizzical-albattani b/.claude/worktrees/quizzical-albattani deleted file mode 160000 index 5638dea..0000000 --- a/.claude/worktrees/quizzical-albattani +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5638dea7ecee60b72e88594109dc17ad778d68c0 diff --git a/.claude/worktrees/zen-pascal b/.claude/worktrees/zen-pascal deleted file mode 160000 index 5638dea..0000000 --- a/.claude/worktrees/zen-pascal +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5638dea7ecee60b72e88594109dc17ad778d68c0 diff --git a/.vscode/settings.json b/.vscode/settings.json index 3b66410..e168dc6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,18 @@ { - "git.ignoreLimitWarning": true + "git.ignoreLimitWarning": true, + "terminal.integrated.env.osx": { + "ANTHROPIC_AUTH_TOKEN": "", + "ANTHROPIC_BASE_URL": "", + "ANTHROPIC_API_KEY": "" + }, + "terminal.integrated.env.linux": { + "ANTHROPIC_AUTH_TOKEN": "", + "ANTHROPIC_BASE_URL": "", + "ANTHROPIC_API_KEY": "" + }, + "terminal.integrated.env.windows": { + "ANTHROPIC_AUTH_TOKEN": "", + "ANTHROPIC_BASE_URL": "", + "ANTHROPIC_API_KEY": "" + } } \ No newline at end of file diff --git a/apps/api/alembic/versions/044_notebook_appearance_settings.py b/apps/api/alembic/versions/044_notebook_appearance_settings.py new file mode 100644 index 0000000..5cbaf29 --- /dev/null +++ b/apps/api/alembic/versions/044_notebook_appearance_settings.py @@ -0,0 +1,25 @@ +"""Add notebook appearance settings + +Revision ID: 044 +Revises: 043 +Create Date: 2026-04-06 +""" + +import sqlalchemy as sa +from alembic import op +from sqlalchemy.dialects import postgresql + +revision = "044" +down_revision = "043" +branch_labels = None +depends_on = None + +json_type = sa.JSON().with_variant(postgresql.JSONB(astext_type=sa.Text()), "postgresql") + + +def upgrade() -> None: + op.add_column("notebooks", sa.Column("appearance_settings", json_type, nullable=True)) + + +def downgrade() -> None: + op.drop_column("notebooks", "appearance_settings") diff --git a/apps/api/app/agents/research/deep_research.py b/apps/api/app/agents/research/deep_research.py index 04a0930..605f8ba 100644 --- a/apps/api/app/agents/research/deep_research.py +++ b/apps/api/app/agents/research/deep_research.py @@ -26,7 +26,7 @@ from langgraph.graph import END, START, StateGraph from langgraph.types import Send from openai import AsyncOpenAI -from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker from app.agents.core.genui_protocol import GENUI_PROTOCOL_REPORT as _GENUI_PROTOCOL_REPORT from app.services.monitoring_service import ( @@ -87,6 +87,7 @@ class ResearchState(TypedDict): user_memories: list[dict] mode: str # "quick" | "deep" clarification_context: list[dict] | None # [{question, answer}, ...] + plan_override: dict | None # pre-generated plan from /plan endpoint # ── plan_node output ─────────────────────────────────────────────────────── report_title: str @@ -281,10 +282,17 @@ async def web_search_sync(query: str, tavily_api_key: str, max_results: int = 4) # ── Research primitives ─────────────────────────────────────────────────────── async def generate_clarifying_questions(query: str, client: AsyncOpenAI, model: str) -> list[dict]: - """Generate 4 query-specific clarifying questions with 3 options each.""" + """Generate clarifying questions only when the query is genuinely ambiguous. + + Returns an empty list if the query is already specific enough so the frontend + can skip the questionnaire and proceed directly to plan generation. + """ system_prompt = ( - "你是一位研究助手,需要通过几个简短选择题了解用户的研究偏好,以便生成更精准的深度研究报告。\n\n" - "根据用户的研究主题,生成4个选择题,每题3个选项。问题须涵盖:\n" + "你是一位研究助手,负责判断用户的研究课题是否需要进一步明确研究偏好。\n\n" + "判断标准:\n" + "- 如果课题已经足够具体(明确了研究方向、范围、目标等),则不需要提问,直接返回空列表。\n" + "- 如果课题较宽泛或存在多种合理解读方向,则生成2-4个选择题帮助明确偏好。\n\n" + "当需要提问时,问题须按需从以下维度选取(不必全选):\n" "1. 研究侧重(选项必须与该主题强相关,不可用通用词汇)\n" "2. 目标读者(专业研究者 / 行业从业者 / 普通读者)\n" "3. 时间维度(最新进展为主 / 历史演进 / 不限)\n" @@ -293,7 +301,8 @@ async def generate_clarifying_questions(query: str, client: AsyncOpenAI, model: "- 第1题的选项必须高度贴合研究主题,体现该领域的核心分支或方向\n" "- 选项 value 使用简洁英文关键词,label 使用中文\n" "- 只返回JSON,不含其他文字\n\n" - '输出格式:{"questions": [{"question": "...", "options": [{"label": "...", "value": "..."}, ...]}, ...]}' + '输出格式:{"questions": [{"question": "...", "options": [{"label": "...", "value": "..."}, ...]}, ...]}\n' + '课题清晰无需提问时返回:{"questions": []}' ) try: resp = await client.chat.completions.create( @@ -309,45 +318,13 @@ async def generate_clarifying_questions(query: str, client: AsyncOpenAI, model: raw = _strip_fences((resp.choices[0].message.content or "").strip()) result = json.loads(raw) questions = result.get("questions", []) - if questions and len(questions) >= 2: + if isinstance(questions, list): return questions except Exception: pass - return [ - { - "question": "研究侧重是什么?", - "options": [ - {"label": "理论原理", "value": "theory"}, - {"label": "实践应用", "value": "practice"}, - {"label": "两者兼顾", "value": "both"}, - ], - }, - { - "question": "您的目标读者是?", - "options": [ - {"label": "专业研究者", "value": "researcher"}, - {"label": "行业从业者", "value": "practitioner"}, - {"label": "普通读者", "value": "general"}, - ], - }, - { - "question": "时间维度侧重?", - "options": [ - {"label": "最新进展(近1年)", "value": "recent"}, - {"label": "历史演进与现状", "value": "history"}, - {"label": "不限时间", "value": "all"}, - ], - }, - { - "question": "报告输出风格?", - "options": [ - {"label": "综合综述", "value": "overview"}, - {"label": "技术深度分析", "value": "technical"}, - {"label": "案例驱动", "value": "case_study"}, - ], - }, - ] + # LLM call failed — skip clarification so the user isn't blocked + return [] async def _plan( @@ -384,17 +361,19 @@ async def _plan( { "role": "system", "content": ( - "你是一位资深研究规划师,擅长将模糊问题拆解为精准、深度的研究子问题。\n\n" + "你是一位资深研究规划师,负责为深度研究任务制定具体的研究行动计划。\n\n" "## 核心要求\n" - "1. **深度拆解**:不要简单重复用户的问题,要从不同角度深入挖掘\n" - "2. **具体化**:每个查询必须是精确的、可搜索的、包含明确方向的问题\n" - "3. **多层次**:涵盖基础原理→应用实践→前沿进展→对比评价等不同深度\n\n" - "## 每个维度的查询要求\n" + "1. **任务描述风格**:每条研究任务必须以动词开头(梳理/检索/调查/分析/对比/汇总等)," + "描述'要做什么、覆盖什么范围、关注什么重点',而非写成疑问句\n" + "2. **具体且可执行**:每条任务需包含明确的时间范围、具体对象或技术点," + "让搜索引擎能精确检索,例如:'梳理2022-2023年ReAct、Reflexion等推理框架的提出背景与核心机制'\n" + "3. **叙述完整**:每条任务应是一个完整的研究动作描述,不要只写关键词\n\n" + "## 每个维度的任务要求\n" + dim_desc + "## 输出格式\n" "只返回一个JSON对象,不含任何其他文字:\n" - '{"title": "研究报告标题(学术风格,10-25字,不要直接复述用户问题,而是提炼出研究主题的本质,例如用户问\'什么是ReAct\'应生成\'ReAct框架:推理与行动的协同机制\')",' - '"research_goal": "一句话描述研究目标(需包含具体研究范围和预期产出)",' + '{"title": "研究报告标题(学术风格,10-25字,提炼研究主题本质,如\'ReAct框架:推理与行动的协同机制\')",' + '"research_goal": "一句话描述研究目标(含具体研究范围和预期产出)",' '"evaluation_criteria": ["标准1", "标准2", "标准3"],' '"search_matrix": {' f'"concept": {example_arr},' @@ -846,6 +825,7 @@ def create_research_graph( db: AsyncSession, client: AsyncOpenAI, tavily_api_key: str | None, + db_session_factory: async_sessionmaker[AsyncSession] | None = None, ): """ Build and compile the research StateGraph with injected dependencies. @@ -857,31 +837,59 @@ def create_research_graph( async def plan_node(state: ResearchState) -> dict: cfg = MODES.get(state.get("mode", "quick"), MODES["quick"]) await adispatch_custom_event("plan", {"status": "planning"}) - async with traced_span( - db, - "research.plan", - metadata={"query_snapshot": build_text_snapshot(state["query"])}, - ): - plan_result = await _plan( - state["query"], client, state["model"], - queries_per_dim=cfg.queries_per_dim, - clarification_context=state.get("clarification_context"), - db=db, - ) - all_queries = [q for qs in plan_result["search_matrix"].values() for q in qs] - report_title = plan_result.get("title") or state["query"][:25] + + override = state.get("plan_override") + if override: + # Use pre-generated plan from /ai/deep-research/plan endpoint. + # Prefer the structured search_matrix when present (preserves dimension + # grouping); fall back to rechunking the flat sub_questions list. + if override.get("search_matrix"): + search_matrix = { + dim: queries or [state["query"]] + for dim, queries in override["search_matrix"].items() + } + sub_questions = [q for qs in search_matrix.values() for q in qs] + else: + sub_questions = override.get("sub_questions", []) + dims = ("concept", "latest", "evidence", "controversy") + chunk = max(1, len(sub_questions) // len(dims)) + search_matrix = { + dim: sub_questions[i * chunk: (i + 1) * chunk] or [state["query"]] + for i, dim in enumerate(dims) + } + report_title = override.get("report_title") or state["query"][:25] + research_goal = override.get("research_goal", "") + evaluation_criteria = override.get("evaluation_criteria", []) + else: + async with traced_span( + db, + "research.plan", + metadata={"query_snapshot": build_text_snapshot(state["query"])}, + ): + plan_result = await _plan( + state["query"], client, state["model"], + queries_per_dim=cfg.queries_per_dim, + clarification_context=state.get("clarification_context"), + db=db, + ) + search_matrix = plan_result["search_matrix"] + report_title = plan_result.get("title") or state["query"][:25] + research_goal = plan_result["research_goal"] + evaluation_criteria = plan_result["evaluation_criteria"] + sub_questions = [q for qs in search_matrix.values() for q in qs] + await adispatch_custom_event("plan", { - "research_goal": plan_result["research_goal"], - "sub_questions": all_queries, - "search_matrix": plan_result["search_matrix"], - "evaluation_criteria": plan_result["evaluation_criteria"], + "research_goal": research_goal, + "sub_questions": sub_questions, + "search_matrix": search_matrix, + "evaluation_criteria": evaluation_criteria, "report_title": report_title, }) return { "report_title": report_title, - "research_goal": plan_result["research_goal"], - "evaluation_criteria": plan_result["evaluation_criteria"], - "search_matrix": plan_result["search_matrix"], + "research_goal": research_goal, + "evaluation_criteria": evaluation_criteria, + "search_matrix": search_matrix, } async def search_node(state: dict) -> dict: @@ -890,23 +898,36 @@ async def search_node(state: dict) -> dict: query: str = state["query"] dimension: str = state["dimension"] await adispatch_custom_event("searching", {"query": query, "dimension": dimension}) - async with traced_span( - db, - "research.search", - metadata={"query_snapshot": build_text_snapshot(query), "dimension": dimension}, - ): - learning = await _research_one( - query=query, - dimension=dimension, - notebook_id=state["notebook_id"], - user_id=state["user_id"], - db=db, - client=client, - tavily_api_key=tavily_api_key, - model=state["model"], - max_web_results=cfg.web_results, - learning_max_chars=cfg.learning_max_chars, - ) + if db_session_factory is None: + from app.database import AsyncSessionLocal + + node_session_factory = AsyncSessionLocal + else: + node_session_factory = db_session_factory + + async with node_session_factory() as node_db: + try: + async with traced_span( + node_db, + "research.search", + metadata={"query_snapshot": build_text_snapshot(query), "dimension": dimension}, + ): + learning = await _research_one( + query=query, + dimension=dimension, + notebook_id=state["notebook_id"], + user_id=state["user_id"], + db=node_db, + client=client, + tavily_api_key=tavily_api_key, + model=state["model"], + max_web_results=cfg.web_results, + learning_max_chars=cfg.learning_max_chars, + ) + await node_db.commit() + except Exception: + await node_db.rollback() + raise await adispatch_custom_event("learning", { "question": query, "content": learning.content, diff --git a/apps/api/app/agents/research/task_manager.py b/apps/api/app/agents/research/task_manager.py index 2c1ed52..abb8a15 100644 --- a/apps/api/app/agents/research/task_manager.py +++ b/apps/api/app/agents/research/task_manager.py @@ -16,7 +16,7 @@ from collections.abc import AsyncGenerator from datetime import datetime, timezone -from sqlalchemy import update +from sqlalchemy import select, update from sqlalchemy.ext.asyncio import AsyncSession from app.database import AsyncSessionLocal @@ -116,6 +116,7 @@ async def run_research_task( tavily_api_key: str | None, user_memories: list[dict], clarification_context: list[dict] | None = None, + plan_override: dict | None = None, trace_id: str | None = None, ) -> None: """Background coroutine: run LangGraph, push events to buffer, save to DB.""" @@ -149,11 +150,13 @@ async def run_research_task( "query_snapshot": build_text_snapshot(query), }, ) + await db.commit() trace_token, run_token = bind_trace_and_run(trace_id or task_id, run.id) graph = create_research_graph( db=db, client=client, tavily_api_key=tavily_api_key, + db_session_factory=AsyncSessionLocal, ) input_state = { @@ -165,6 +168,7 @@ async def run_research_task( "user_memories": user_memories, "mode": mode, "clarification_context": clarification_context, + "plan_override": plan_override, "research_goal": "", "evaluation_criteria": [], "search_matrix": {}, @@ -192,6 +196,7 @@ async def run_research_task( "query_snapshot": build_text_snapshot(query), }, ) + await db.commit() async for event in graph.astream_events(input_state, version="v2"): if event["event"] != "on_custom_event": diff --git a/apps/api/app/domains/ai/routers/research.py b/apps/api/app/domains/ai/routers/research.py index c81af0a..4d53242 100644 --- a/apps/api/app/domains/ai/routers/research.py +++ b/apps/api/app/domains/ai/routers/research.py @@ -17,6 +17,7 @@ from app.dependencies import CurrentUser, DbDep from app.domains.ai.schemas import ( ClarifyRequest, + DeepResearchPlanRequest, DeepResearchRequest, SaveDeepResearchSourcesRequest, ) @@ -45,6 +46,37 @@ async def clarify_deep_research( return success({"questions": questions}) +@router.post("/ai/deep-research/plan") +async def plan_deep_research( + body: DeepResearchPlanRequest, + current_user: CurrentUser, +): + """Generate a research plan synchronously (no task creation, no SSE). + Returns sub_questions, research_goal, evaluation_criteria, report_title. + """ + from app.agents.research.deep_research import _plan, MODES + from app.providers.llm import get_client + + client = get_client() + cfg = MODES.get(body.mode, MODES["quick"]) + result = await _plan( + body.query, + client, + settings.llm_model, + queries_per_dim=cfg.queries_per_dim, + clarification_context=body.clarification_context, + ) + matrix = result.get("search_matrix", {}) + sub_questions = [q for qs in matrix.values() for q in qs] + return success({ + "sub_questions": sub_questions, + "search_matrix": matrix, + "research_goal": result.get("research_goal", ""), + "evaluation_criteria": result.get("evaluation_criteria", []), + "report_title": result.get("title", body.query[:25]), + }) + + @router.post("/ai/deep-research") async def create_deep_research( body: DeepResearchRequest, @@ -120,6 +152,7 @@ async def create_deep_research( tavily_api_key=settings.tavily_api_key or None, user_memories=user_memories, clarification_context=body.clarification_context, + plan_override=body.plan_override.model_dump() if body.plan_override else None, trace_id=get_trace_id(), ) ) diff --git a/apps/api/app/domains/ai/schemas.py b/apps/api/app/domains/ai/schemas.py index 59b2fd1..f643967 100644 --- a/apps/api/app/domains/ai/schemas.py +++ b/apps/api/app/domains/ai/schemas.py @@ -47,11 +47,25 @@ class ClarifyResponse(BaseModel): questions: list[ClarifyQuestion] +class DeepResearchPlanRequest(BaseModel): + query: str + mode: Literal["quick", "deep"] = "quick" + clarification_context: list[dict] | None = None + + +class DeepResearchPlanResponse(BaseModel): + sub_questions: list[str] + research_goal: str + evaluation_criteria: list[str] + report_title: str + + class DeepResearchRequest(BaseModel): query: str notebook_id: str | None = None mode: Literal["quick", "deep"] = "quick" clarification_context: list[dict] | None = None + plan_override: DeepResearchPlanResponse | None = None class SaveDeepResearchSourcesRequest(BaseModel): diff --git a/apps/api/app/domains/memory/router.py b/apps/api/app/domains/memory/router.py index 787dd0c..003c3cc 100644 --- a/apps/api/app/domains/memory/router.py +++ b/apps/api/app/domains/memory/router.py @@ -8,6 +8,7 @@ PUT /memory/{id} Correct a memory value DELETE /memory/{id} Delete a memory entry POST /memory/reset Delete all memories (GDPR-friendly) + POST /memory/backfill Re-extract memories from all existing conversations """ from uuid import UUID @@ -232,6 +233,41 @@ async def reset_memories(db: DbDep, current_user: CurrentUser) -> None: await db.delete(memory) +@router.post("/memory/backfill", response_model=ApiResponse[dict]) +async def backfill_memories(db: DbDep, current_user: CurrentUser) -> ApiResponse[dict]: + """Re-run memory extraction over all existing conversations for the current user. + + Useful when a user's conversation history predates the extraction pipeline, + or when extraction silently failed for earlier conversations. + """ + import asyncio + + from app.models import Conversation + + result = await db.execute( + select(Conversation.id).where(Conversation.user_id == current_user.id) + ) + conversation_ids = [row[0] for row in result.all()] + + if not conversation_ids: + return success({"queued": 0, "message": "没有可处理的对话"}) + + async def _run_backfill() -> None: + from app.agents.memory import extract_memories + from app.database import AsyncSessionLocal + + for conv_id in conversation_ids: + try: + async with AsyncSessionLocal() as session: + await extract_memories(conv_id, current_user.id, session) + await session.commit() + except Exception: + pass + + asyncio.create_task(_run_backfill()) + return success({"queued": len(conversation_ids), "message": f"已开始处理 {len(conversation_ids)} 条对话"}) + + # --------------------------------------------------------------------------- # Helper # --------------------------------------------------------------------------- diff --git a/apps/api/app/main.py b/apps/api/app/main.py index f07ed50..b083508 100644 --- a/apps/api/app/main.py +++ b/apps/api/app/main.py @@ -39,9 +39,50 @@ async def lifespan(app: FastAPI): await load_settings_from_db(db) # Bootstrap built-in skills (and optionally load workspace/user skills) - from app.skills.registry import bootstrap_builtin_skills + from app.skills.registry import bootstrap_builtin_skills, skill_registry bootstrap_builtin_skills() + # Sync in-memory skill registry → skill_installs table (upsert metadata, preserve is_enabled/config) + try: + from sqlalchemy import select as _select + from app.models import SkillInstall + import uuid as _uuid + async with AsyncSessionLocal() as _db: + for _skill in skill_registry.all_skills(): + _m = _skill.meta + _existing = ( + await _db.execute( + _select(SkillInstall).where(SkillInstall.name == _m.name) + ) + ).scalar_one_or_none() + if _existing is None: + _db.add(SkillInstall( + id=_uuid.uuid4(), + name=_m.name, + display_name=_m.display_name, + description=_m.description, + category=_m.category, + version=_m.version, + is_builtin=True, + is_enabled=True, + always=_m.always, + requires_env=_m.requires_env or None, + config_schema=_m.config_schema, + )) + else: + # Update metadata only; preserve is_enabled / config set by admin/user + _existing.display_name = _m.display_name + _existing.description = _m.description + _existing.category = _m.category + _existing.version = _m.version + _existing.always = _m.always + _existing.requires_env = _m.requires_env or None + _existing.config_schema = _m.config_schema + await _db.commit() + logger.info("skill_installs synced: %d skills", len(skill_registry.all_skills())) + except Exception: + logger.exception("startup: failed to sync skill_installs (non-fatal)") + # On startup, immediately expire any sources left stuck in 'processing' / 'pending' # from a previous process crash or restart (belt-and-suspenders alongside the beat task). try: diff --git a/apps/api/app/services/notebook_service.py b/apps/api/app/services/notebook_service.py new file mode 100644 index 0000000..33b433a --- /dev/null +++ b/apps/api/app/services/notebook_service.py @@ -0,0 +1,163 @@ +from __future__ import annotations + +from datetime import datetime, timezone +from uuid import UUID + +from sqlalchemy import delete as sql_delete, func, select +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import selectinload + +from app.exceptions import NotFoundError +from app.models import Note, Notebook, Source +from app.services.public_home_service import refresh_public_home_draft + + +def _word_count_subquery(): + return ( + select(func.coalesce(func.sum(Note.word_count), 0)) + .where(Note.notebook_id == Notebook.id) + .correlate(Notebook) + .scalar_subquery() + .label("wc") + ) + + +def _source_count_subquery(): + return ( + select(func.count(Source.id)) + .where(Source.notebook_id == Notebook.id) + .correlate(Notebook) + .scalar_subquery() + .label("src_count") + ) + + +def _note_count_subquery(): + return ( + select(func.count(Note.id)) + .where(Note.notebook_id == Notebook.id) + .correlate(Notebook) + .scalar_subquery() + .label("note_count") + ) + + +def _build_out(nb: Notebook, src_count: int, note_count: int, word_count: int) -> Notebook: + nb.source_count = src_count + nb.note_count = note_count + nb.word_count = word_count + nb.summary_md = nb.summary.summary_md if nb.summary else None + return nb + + +async def _fill_counts(db: AsyncSession, notebook: Notebook) -> Notebook: + src_res = await db.execute( + select(func.count(Source.id)).where(Source.notebook_id == notebook.id) + ) + note_res = await db.execute( + select(func.count(Note.id)).where(Note.notebook_id == notebook.id) + ) + wc_res = await db.execute( + select(func.coalesce(func.sum(Note.word_count), 0)).where(Note.notebook_id == notebook.id) + ) + notebook.source_count = src_res.scalar() or 0 + notebook.note_count = note_res.scalar() or 0 + notebook.word_count = wc_res.scalar() or 0 + notebook.summary_md = notebook.summary.summary_md if notebook.summary else None + return notebook + + +async def get_owned_notebook(db: AsyncSession, notebook_id: UUID, user_id: UUID) -> Notebook: + result = await db.execute( + select(Notebook) + .options(selectinload(Notebook.summary)) + .where(Notebook.id == notebook_id, Notebook.user_id == user_id) + ) + notebook = result.scalar_one_or_none() + if notebook is None: + raise NotFoundError("笔记本不存在") + return notebook + + +async def list_user_notebooks(db: AsyncSession, user_id: UUID) -> list[Notebook]: + result = await db.execute( + select(Notebook, _source_count_subquery(), _note_count_subquery(), _word_count_subquery()) + .options(selectinload(Notebook.summary)) + .where(Notebook.user_id == user_id, Notebook.is_global.is_(False)) + .order_by(Notebook.updated_at.desc()) + ) + return [_build_out(nb, src_cnt, note_cnt, wc) for nb, src_cnt, note_cnt, wc in result.all()] + + +async def create_notebook(db: AsyncSession, user_id: UUID, payload: dict) -> Notebook: + notebook = Notebook(user_id=user_id, **payload) + db.add(notebook) + await db.flush() + await db.refresh(notebook) + await db.refresh(notebook, attribute_names=["summary"]) + return await _fill_counts(db, notebook) + + +async def get_or_create_global_notebook(db: AsyncSession, user_id: UUID) -> Notebook: + result = await db.execute( + select(Notebook) + .options(selectinload(Notebook.summary)) + .where(Notebook.user_id == user_id, Notebook.is_global.is_(True)) + ) + notebook = result.scalar_one_or_none() + if notebook is None: + notebook = Notebook( + user_id=user_id, + title="全局知识库", + description="全局来源,不绑定具体笔记本。", + is_global=True, + is_system=False, + status="active", + ) + db.add(notebook) + await db.flush() + await db.refresh(notebook) + await db.refresh(notebook, attribute_names=["summary"]) + return await _fill_counts(db, notebook) + + +async def get_notebook_detail(db: AsyncSession, notebook_id: UUID, user_id: UUID) -> Notebook: + notebook = await get_owned_notebook(db, notebook_id, user_id) + return await _fill_counts(db, notebook) + + +async def update_notebook(db: AsyncSession, notebook_id: UUID, user_id: UUID, changes: dict) -> Notebook: + notebook = await get_owned_notebook(db, notebook_id, user_id) + for field, value in changes.items(): + setattr(notebook, field, value) + await db.flush() + await db.refresh(notebook) + await db.refresh(notebook, attribute_names=["summary"]) + return await _fill_counts(db, notebook) + + +async def publish_notebook(db: AsyncSession, notebook_id: UUID, user_id: UUID) -> Notebook: + notebook = await get_owned_notebook(db, notebook_id, user_id) + notebook.is_public = True + notebook.published_at = datetime.now(timezone.utc) + await db.flush() + await refresh_public_home_draft(db, user_id) + await db.refresh(notebook) + await db.refresh(notebook, attribute_names=["summary"]) + return await _fill_counts(db, notebook) + + +async def unpublish_notebook(db: AsyncSession, notebook_id: UUID, user_id: UUID) -> Notebook: + notebook = await get_owned_notebook(db, notebook_id, user_id) + notebook.is_public = False + await db.flush() + await refresh_public_home_draft(db, user_id) + await db.refresh(notebook) + await db.refresh(notebook, attribute_names=["summary"]) + return await _fill_counts(db, notebook) + + +async def delete_notebook(db: AsyncSession, notebook_id: UUID, user_id: UUID) -> None: + await get_owned_notebook(db, notebook_id, user_id) + await db.execute(sql_delete(Notebook).where(Notebook.id == notebook_id)) + await db.commit() diff --git a/apps/api/tests/unit/test_notebook_settings.py b/apps/api/tests/unit/test_notebook_settings.py new file mode 100644 index 0000000..a8b6659 --- /dev/null +++ b/apps/api/tests/unit/test_notebook_settings.py @@ -0,0 +1,103 @@ +from __future__ import annotations + +import json + +import pytest +from sqlalchemy import select + +from app.models import AppConfig, Notebook + + +@pytest.mark.asyncio +async def test_notebook_settings_round_trip(client, auth_headers, db_session, test_user) -> None: + user, _ = test_user + notebook = Notebook( + user_id=user.id, + title="Writing Lab", + status="active", + appearance_settings={ + "font_family": "serif", + "theme_id": "paper-serif", + "font_size": "lg", + }, + ) + db_session.add(notebook) + await db_session.commit() + await db_session.refresh(notebook) + + detail_response = await client.get( + f"/api/v1/notebooks/{notebook.id}", + headers=auth_headers, + ) + + assert detail_response.status_code == 200 + assert detail_response.json()["data"]["appearance_settings"] == { + "font_family": "serif", + "theme_id": "paper-serif", + "font_size": "lg", + "content_width": None, + "line_height": None, + "paragraph_spacing": None, + "heading_scale": None, + "emphasize_title": None, + "auto_save": None, + "focus_mode_default": None, + "default_right_panel": None, + } + + update_response = await client.patch( + f"/api/v1/notebooks/{notebook.id}", + headers=auth_headers, + json={ + "appearance_settings": { + "font_family": "mono", + "theme_id": "mono-draft", + "auto_save": False, + } + }, + ) + + assert update_response.status_code == 200 + assert update_response.json()["data"]["appearance_settings"]["font_family"] == "mono" + assert update_response.json()["data"]["appearance_settings"]["auto_save"] is False + + await db_session.refresh(notebook) + refreshed = ( + await db_session.execute(select(Notebook).where(Notebook.id == notebook.id)) + ).scalar_one() + assert refreshed.appearance_settings == { + "font_family": "mono", + "theme_id": "mono-draft", + "auto_save": False, + } + + +@pytest.mark.asyncio +async def test_config_supports_notebook_appearance_defaults(client, auth_headers, db_session) -> None: + payload = json.dumps( + { + "fontFamily": "serif", + "themeId": "paper-serif", + "autoSave": False, + } + ) + + patch_response = await client.patch( + "/api/v1/config", + headers=auth_headers, + json={"data": {"notebook_appearance_defaults": payload}}, + ) + + assert patch_response.status_code == 204 + + stored = ( + await db_session.execute( + select(AppConfig).where(AppConfig.key == "notebook_appearance_defaults") + ) + ).scalar_one() + assert stored.value == payload + + get_response = await client.get("/api/v1/config", headers=auth_headers) + + assert get_response.status_code == 200 + assert get_response.json()["data"]["data"]["notebook_appearance_defaults"] == payload diff --git a/apps/api/tests/unit/test_research_task_manager.py b/apps/api/tests/unit/test_research_task_manager.py index 6685307..28fbdb2 100644 --- a/apps/api/tests/unit/test_research_task_manager.py +++ b/apps/api/tests/unit/test_research_task_manager.py @@ -1,4 +1,15 @@ -from app.agents.research.task_manager import collect_web_sources +from __future__ import annotations + +import asyncio +import uuid + +import pytest +from sqlalchemy import select +from sqlalchemy.ext.asyncio import async_sessionmaker + +from app.agents.research import deep_research +from app.agents.research.task_manager import collect_web_sources, run_research_task +from app.models import ObservabilityRun, ResearchTask, User def test_collect_web_sources_dedupes_web_citations() -> None: @@ -33,3 +44,150 @@ def test_collect_web_sources_dedupes_web_citations() -> None: "query": "问题二", }, ] + + +@pytest.mark.asyncio +async def test_run_research_task_marks_task_and_run_error_when_graph_raises(engine, db_session, monkeypatch: pytest.MonkeyPatch) -> None: + session_factory = async_sessionmaker(engine, expire_on_commit=False) + + user = User( + id=uuid.uuid4(), + username="research-error-user", + email="research-error@example.com", + ) + task = ResearchTask( + id=uuid.uuid4(), + user_id=user.id, + query="为什么会失败?", + mode="quick", + status="running", + ) + db_session.add_all([user, task]) + await db_session.commit() + + class FailingGraph: + async def astream_events(self, _input_state, version: str = "v2"): + if version != "v2": + raise AssertionError("unexpected stream version") + raise RuntimeError("graph exploded") + yield # pragma: no cover + + monkeypatch.setattr("app.agents.research.task_manager.AsyncSessionLocal", session_factory) + monkeypatch.setattr("app.providers.llm.get_client", lambda: object()) + monkeypatch.setattr("app.agents.research.deep_research.create_research_graph", lambda **kwargs: FailingGraph()) + + await run_research_task( + task_id=str(task.id), + query=task.query, + notebook_id=None, + conversation_id=None, + user_id=str(user.id), + mode="quick", + model="gpt-test", + tavily_api_key=None, + user_memories=[], + ) + + async with session_factory() as check_session: + persisted_task = await check_session.get(ResearchTask, task.id) + assert persisted_task is not None + assert persisted_task.status == "error" + assert persisted_task.error_message is not None + assert "graph exploded" in persisted_task.error_message + + persisted_run = await check_session.scalar( + select(ObservabilityRun) + .where(ObservabilityRun.task_id == task.id) + .order_by(ObservabilityRun.started_at.desc()) + ) + assert persisted_run is not None + assert persisted_run.status == "error" + assert persisted_run.error_message is not None + assert "graph exploded" in persisted_run.error_message + + +@pytest.mark.asyncio +async def test_create_research_graph_parallel_search_nodes_use_isolated_sessions(engine, db_session, monkeypatch: pytest.MonkeyPatch) -> None: + session_factory = async_sessionmaker(engine, expire_on_commit=False) + seen_session_ids: list[int] = [] + active_calls = 0 + max_parallelism = 0 + lock = asyncio.Lock() + + async def fake_plan(*args, **kwargs) -> dict: + return { + "title": "并行研究", + "research_goal": "验证 search node 会话隔离", + "evaluation_criteria": [], + "search_matrix": { + "concept": ["问题一", "问题二"], + "latest": [], + "evidence": [], + "controversy": [], + }, + } + + async def fake_research_one(*, query: str, dimension: str, db, **kwargs): + nonlocal active_calls, max_parallelism + async with lock: + active_calls += 1 + max_parallelism = max(max_parallelism, active_calls) + seen_session_ids.append(id(db.sync_session)) + await asyncio.sleep(0.01) + async with lock: + active_calls -= 1 + return deep_research.Learning( + sub_question=query, + content=f"{dimension}:{query}", + dimension=dimension, + ) + + async def fake_synthesize_report(*args, **kwargs): + yield "报告正文" + + async def fake_generate_deliverable(*args, **kwargs) -> dict: + return { + "title": "交付物", + "summary": "摘要", + "next_questions": [], + "citation_table": [], + "citation_count": 0, + } + + monkeypatch.setattr(deep_research, "_plan", fake_plan) + monkeypatch.setattr(deep_research, "_research_one", fake_research_one) + monkeypatch.setattr(deep_research, "_synthesize_report", fake_synthesize_report) + monkeypatch.setattr(deep_research, "_generate_deliverable", fake_generate_deliverable) + + graph = deep_research.create_research_graph( + db=db_session, + client=object(), # type: ignore[arg-type] + tavily_api_key=None, + db_session_factory=session_factory, + ) + + input_state = { + "query": "测试并行 search node", + "notebook_id": None, + "user_id": str(uuid.uuid4()), + "model": "gpt-test", + "tavily_api_key": None, + "user_memories": [], + "mode": "quick", + "clarification_context": None, + "report_title": "", + "research_goal": "", + "evaluation_criteria": [], + "search_matrix": {}, + "learnings": [], + "full_report": "", + "deliverable": None, + } + + events = [event async for event in graph.astream_events(input_state, version="v2")] + + assert any(event["event"] == "on_custom_event" and event["name"] == "learning" for event in events) + assert max_parallelism >= 2 + assert len(seen_session_ids) == 2 + assert len(set(seen_session_ids)) == 2 + assert id(db_session.sync_session) not in seen_session_ids diff --git a/apps/desktop/.gitignore b/apps/desktop/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/apps/desktop/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/apps/desktop/.vscode/extensions.json b/apps/desktop/.vscode/extensions.json new file mode 100644 index 0000000..24d7cc6 --- /dev/null +++ b/apps/desktop/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] +} diff --git a/apps/desktop/README.md b/apps/desktop/README.md new file mode 100644 index 0000000..102e366 --- /dev/null +++ b/apps/desktop/README.md @@ -0,0 +1,7 @@ +# Tauri + React + Typescript + +This template should help get you started developing with Tauri, React and Typescript in Vite. + +## Recommended IDE Setup + +- [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) diff --git a/apps/desktop/index.html b/apps/desktop/index.html index fa1b663..ff93803 100644 --- a/apps/desktop/index.html +++ b/apps/desktop/index.html @@ -1,14 +1,12 @@ - + + - LyraNote - + Tauri + React + Typescript +
diff --git a/apps/desktop/package.json b/apps/desktop/package.json index a91d30d..2e0dc29 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,42 +1,61 @@ { "name": "@lyranote/desktop", - "version": "0.1.0", "private": true, + "version": "0.1.0", "type": "module", "scripts": { "dev": "vite", "build": "tsc && vite build", "preview": "vite preview", - "tauri": "tauri", - "lint": "eslint src --ext ts,tsx", - "typecheck": "tsc --noEmit" + "tauri": "tauri" }, "dependencies": { "@lyranote/api-client": "workspace:*", "@lyranote/types": "workspace:*", - "@tauri-apps/api": "^2.0.0", - "@tauri-apps/plugin-notification": "^2.0.0", - "@tauri-apps/plugin-store": "^2.0.0", - "@tauri-apps/plugin-updater": "^2.0.0", - "@tanstack/react-query": "^5.0.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-router-dom": "^6.0.0", - "zustand": "^5.0.0", - "axios": "^1.6.0", - "clsx": "^2.0.0", - "tailwind-merge": "^2.0.0", - "lucide-react": "^0.400.0" + "@lyranote/ui": "workspace:*", + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-opener": "^2", + "@tiptap/extension-character-count": "^2", + "@tiptap/extension-code-block-lowlight": "^2", + "@tiptap/extension-highlight": "^2.11.5", + "@tiptap/extension-image": "^2", + "@tiptap/extension-link": "^2.11.5", + "@tiptap/extension-placeholder": "^2.11.5", + "@tiptap/extension-task-item": "^2", + "@tiptap/extension-task-list": "^2", + "@tiptap/extension-typography": "^2", + "@tiptap/react": "^2.11.5", + "@tiptap/starter-kit": "^2.11.5", + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "axios": "^1.15.0", + "katex": "^0.16.40", + "react-drawio": "^1.0.7", + "react-force-graph-2d": "^1.29.1", + "react-markdown": "^10.1.0", + "react-wordcloud": "^1.2.7", + "recharts": "^3.8.0", + "remark-gfm": "^4.0.1", + "clsx": "^2.1.1", + "framer-motion": "^12.35.0", + "lowlight": "^3.3.0", + "lucide-react": "^1.8.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-router-dom": "^7.14.0", + "tailwind-merge": "^2.5.5", + "zustand": "^5.0.12" }, "devDependencies": { - "@tauri-apps/cli": "^2.0.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0", - "@vitejs/plugin-react": "^4.0.0", - "autoprefixer": "^10.0.0", - "postcss": "^8.0.0", - "tailwindcss": "^3.4.0", - "typescript": "^5.0.0", - "vite": "^5.0.0" + "@tauri-apps/cli": "^2", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "@vitejs/plugin-react": "^4.6.0", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3", + "typescript": "~5.8.3", + "vite": "^7.0.4" } } diff --git a/apps/desktop/postcss.config.js b/apps/desktop/postcss.config.js index 2aa7205..2e7af2b 100644 --- a/apps/desktop/postcss.config.js +++ b/apps/desktop/postcss.config.js @@ -3,4 +3,4 @@ export default { tailwindcss: {}, autoprefixer: {}, }, -}; +} diff --git a/apps/desktop/public/bot_avatar.png b/apps/desktop/public/bot_avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..6c31c730b1e187c784b7d84a26e2059f313fcc3d GIT binary patch literal 403597 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 TVVo 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 E1F=8uMF0Q* literal 0 HcmV?d00001 diff --git a/apps/desktop/public/lyra.png b/apps/desktop/public/lyra.png new file mode 100644 index 0000000000000000000000000000000000000000..bceba09dd22bee63c742de3cd4816a48d1f8dd44 GIT binary patch literal 121202 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 Ij(Obve`nCQ=Kufz literal 0 HcmV?d00001 diff --git a/apps/desktop/public/tauri.svg b/apps/desktop/public/tauri.svg new file mode 100644 index 0000000..31b62c9 --- /dev/null +++ b/apps/desktop/public/tauri.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/desktop/public/vite.svg b/apps/desktop/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/apps/desktop/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/desktop/src-tauri/.gitignore b/apps/desktop/src-tauri/.gitignore new file mode 100644 index 0000000..b21bd68 --- /dev/null +++ b/apps/desktop/src-tauri/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas diff --git a/apps/desktop/src-tauri/Cargo.lock b/apps/desktop/src-tauri/Cargo.lock new file mode 100644 index 0000000..6add202 --- /dev/null +++ b/apps/desktop/src-tauri/Cargo.lock @@ -0,0 +1,5464 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.11.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.2.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.13.1", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser 0.36.0", + "foldhash 0.2.0", + "html5ever 0.38.0", + "precomputed-hash", + "selectors 0.36.1", + "tendril 0.5.0", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63a1d0de4f2249aa0ff5884d7080814f446bb241a559af6c170a41e878ed2d45" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.12+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.11.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" +dependencies = [ + "log", + "mac", + "markup5ever 0.14.1", + "match_token", +] + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever 0.38.0", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.0", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "iri-string" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "js-sys" +version = "0.3.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.11.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "kuchikiki" +version = "0.8.8-speedreader" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" +dependencies = [ + "cssparser 0.29.6", + "html5ever 0.29.1", + "indexmap 2.14.0", + "selectors 0.24.0", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.184" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "lyranote-desktop" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-opener", + "window-vibrancy", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "markup5ever" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache 0.8.9", + "string_cache_codegen 0.5.4", + "tendril 0.4.3", +] + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril 0.5.0", + "web_atoms", +] + +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c9fec5a4e89860383d778d10563a605838f8f0b2f9303868937e5ff32e86177" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.0", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "num-conv" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "open" +version = "5.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64 0.22.1", + "indexmap 2.14.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.11+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "reqwest" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" +dependencies = [ + "bitflags 1.3.2", + "cssparser 0.29.6", + "derive_more 0.99.20", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc 0.2.0", + "smallvec", +] + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.11.0", + "cssparser 0.36.0", + "derive_more 2.1.1", + "log", + "new_debug_unreachable", + "phf 0.13.1", + "phf_codegen 0.13.1", + "precomputed-hash", + "rustc-hash", + "servo_arc 0.4.3", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "servo_arc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.13.1", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.34.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9103edf55f2da3c82aea4c7fab7c4241032bfeea0e71fa557d98e00e7ce7cc20" +dependencies = [ + "bitflags 2.11.0", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "parking_lot", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da77cc00fb9028caf5b5d4650f75e31f1ef3693459dfca7f7e506d1ecef0ba2d" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bbc990d1dbf57a8e1c7fa2327f2a614d8b757805603c1b9ba5c81bade09fd4d" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a24476afd977c5d5d169f72425868613d82747916dd29e0a357c84c4bd6d29" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.117", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39b349a98dadaffebb73f0a40dcd1f23c999211e5a2e744403db384d0c33de7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddde7d51c907b940fb573006cdda9a642d6a7c8153657e88f8a5c3c9290cd4aa" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc624469b06f59f5a29f874bbc61a2ed737c0f9c23ef09855a292c389c42e83f" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "url", + "windows", + "zbus", +] + +[[package]] +name = "tauri-runtime" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2826d79a3297ed08cd6ea7f412644ef58e32969504bc4fbd8d7dbeabc4445ea2" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11ea2e6f801d275fdd890d6c9603736012742a1c33b96d0db788c9cdebf7f9e" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219a1f983a2af3653f75b5747f76733b0da7ff03069c7a41901a5eb3ace4557d" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever 0.29.1", + "http", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 0.9.12+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" +dependencies = [ + "dunce", + "embed-resource", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "tendril" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" +dependencies = [ + "new_debug_unreachable", + "utf-8", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.14.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.11+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.1", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.1", +] + +[[package]] +name = "toml_writer" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.11.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.14.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap 2.14.0", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576" +dependencies = [ + "phf 0.13.1", + "phf_codegen 0.13.1", + "string_cache 0.9.0", + "string_cache_codegen 0.6.1", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.18", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.14.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap 2.14.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.14.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wry" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a8135d8676225e5744de000d4dff5a082501bf7db6a1c1495034f8c314edbc" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.15", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow 0.7.15", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zvariant" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 0.7.15", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.117", + "winnow 0.7.15", +] diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index a07180e..9ac0e4a 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -1,33 +1,26 @@ [package] name = "lyranote-desktop" version = "0.1.0" -description = "LyraNote Desktop Client" -authors = ["LyraNote Team"] -license = "" -repository = "" -default-run = "lyranote-desktop" +description = "A Tauri App" +authors = ["you"] edition = "2021" -rust-version = "1.77.2" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] +# The `_lib` suffix may seem redundant but it is necessary +# to make the lib name unique and wouldn't conflict with the bin name. +# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 name = "lyranote_desktop_lib" crate-type = ["staticlib", "cdylib", "rlib"] -[[bin]] -name = "lyranote-desktop" -path = "src/main.rs" - [build-dependencies] -tauri-build = { version = "2.0", features = [] } +tauri-build = { version = "2", features = [] } [dependencies] -tauri = { version = "2.0", features = ["tray-icon"] } -tauri-plugin-notification = "2.0" -tauri-plugin-store = "2.0" -tauri-plugin-updater = "2.0" +tauri = { version = "2", features = ["macos-private-api"] } +tauri-plugin-opener = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" +window-vibrancy = "0.6" -[features] -default = ["custom-protocol"] -custom-protocol = ["tauri/custom-protocol"] diff --git a/apps/desktop/src-tauri/build.rs b/apps/desktop/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/apps/desktop/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/apps/desktop/src-tauri/capabilities/default.json b/apps/desktop/src-tauri/capabilities/default.json new file mode 100644 index 0000000..b99f358 --- /dev/null +++ b/apps/desktop/src-tauri/capabilities/default.json @@ -0,0 +1,14 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": [ + "core:default", + "opener:default", + "core:window:allow-start-dragging", + "core:window:allow-toggle-maximize", + "core:window:allow-minimize", + "core:window:allow-close" + ] +} diff --git a/apps/desktop/src-tauri/icons/128x128.png b/apps/desktop/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..6be5e50e9b9ae84d9e2ee433f32ef446495eaf3b GIT binary patch literal 3512 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 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/128x128@2x.png b/apps/desktop/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e81becee571e96f76aa5667f9324c05e5e7a4479 GIT binary patch literal 7012 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 Sh@|Ye~|0>}wMPLT8jm@Y!H33Sz}5aFI6 zM9Lzqz|;A*0sGs=2A1uU!1nk2dGF7knQwr99SAFen)x(eCO;F8y2C~0FD1YxRTPcy zPWVxkUYmeuz}Tv?7&Fe-!UE{)ZW)Mb;H)^#eHDv$`dkZGguJz@^MA!ZNGAUqt{|0H zpZ7Ch9S`q5!>R%}>}62!+(T^evyO+ImSo2wpu)su4^3nw5(%)KD%gbSev^*HZZ&3( z#&c@Z0gH|}Ck)w6fh0&NBJ62ib%R}(3@$VFl*_#l2W$wQ-~4RmZZAt5O*^2Q5}Xr8Hy@c`#pM?kc?hFWxRXr*mUfUCXf4ka5DD~ zat6d85COB05l#(P9*cQZ3EC8fVdS~?&vN#rce(aF9@xp80O2{{FBvU+{X>Hoh;xI` z{$e^Nw1y*VbO8wv`8|-m?NwNaKGTGaF{P^JLB^DbOYWIbn%eT`*!^C1H36=O8Z-M> zkD~88ry`eSo`tEBN4>w7OWZwUzlh{WM1m8R6zepqGcGMaV7vWY9b?K4b6~|HVG)ec wi>I@ws#sZo7or4_*4M>7;p5{nr2pZ?Uu4>Krr0kU)&Kwi07*qoM6N<$f)&@lf&c&j literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square107x107Logo.png b/apps/desktop/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca4f27198838968bd60ed7d371bfa23496b7fe5 GIT binary patch literal 2863 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 Y2S8W#vM)6=T>t<807*qoM6N<$f*y@n<^TWy literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square284x284Logo.png b/apps/desktop/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c021d2ba76619c08969ab688db3b27f29257aa6f GIT binary patch literal 7737 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 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square30x30Logo.png b/apps/desktop/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..621970023096ed9f494ba18ace15421a45cd65fa GIT binary patch literal 903 zcmV;219<$2P)2 z+CUKPMqaqGiH;zb!R4$B-WXS^YzQr=@UH>k4?*L)&R=zYjBrZenKdc9|JlS$SO*RJ zKt8FSTDAdk1g_WPAO!p^V!AuL;Lm;uQyV;zKq)J3i(;q*;k+pD%f3eltU`PYdy9(k0&%` zuWAPcV6|-y?|?7O1W!KSK}pbk8#~!|FA@(VJkt^V@0lio{afoAeo*f&$W2s6${5!1eKvAGD2$GZwSB98L2ZVS- zKn8ENRkZ*sb!@QugOrQNK3(sy1v%J#m|rpB+h|Nkqa3FRT>74xSs{#&saU2Lf!_Iq zKmuKAESh`gs!fneGWn+nf}l?7jE$HW!Af&vE5=G!QU)U2v&HLIBGXKk4nQx{hsHjL zLPMAo5=*uInFbq7(aa`Y2VX5wCmaeqvECOFv)a>0t>ZaEb*cJccER=BB?KFZhV$c^ znL*l8x*UYZv4WK|j?~Jt6~~F%{pk~z5A*>^M`?r5m9@RJ_x|uEtX(6Vk@Y()MVto* z93wr)%3m%|#OZ~srm>zF(JvDuTq*@;d&^>_BJm5hOU`3FjG70L#Vzv9I?`<7$T@

jU?lMi@tgxr7CqX_r3uw^y4tVU3Pm0sw;|1WSUO%?=bG`*Kmz6u4{#ti;T7AWIBAEh!(Y zz>O01&#X?Ds@L)Sb{CkG#Yz4$3o d@96)?#cz^xWoA}>B$xmI002ovPDHLkV1l3&k#zt7 literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square310x310Logo.png b/apps/desktop/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bc04839491e66c07b16ab03743c0c53b4109cc GIT binary patch literal 8591 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 JPDHLkV1lm|RXG3v literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/Square71x71Logo.png b/apps/desktop/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..63440d7984936a9caa89275928d8dce97e4d033b GIT binary patch literal 2011 zcmV<12PF83P) zNQT)H*aaHEvPo@cmXa#lOYSVWlpR1nAeK#0OX|;=*_qi5z??aA=FFLM-4Sq2kUOhO z__7Kf+yUXO;t~3LY3h_?kg^Ly_=vx^#d`M`3g*hiK~ZY3AT~jwFz3ZcM?f3JYN1%a z6(!V_i6eLKHt^>r*a)I0z_0NJhQk($6o5l!E{?JkPrSxoeQ-;Fqc_D`_YF8=rsANr zG)LA_971eEG~9CGYBLi@?p9m)@)Tx607JQ+*Ue@kj-@a(D+T!4#k)I>|5h&OqgB`h z?c4$tE)KfVHvW8WK2f$Y7BwM~AJbeyzOSy~m#(8wbuiN%36#mj3KfSHV@MPU&upJC z26nV0*ffeHL`yvW^BH8IFmcq)d*U$Vl;hFt@(S`@2NOr}7Sd+Fp?rbjZ-XVpiL+ZJ zVf=)*k4NU-1sB(fAHUA1R4M)eyT=i=ZEY{1xRDA;0LLFcXEjsGBO-LlIJ_9C(9GAXuL zTaWXYBX?I{f^r>rHH*sm()GzY;)y_KC4pG$l!1wRaq#9`i86Kr+wt%Lp<83lq@x7B zc+~kD7&vz;-52pYhf9^cUJaN~#g4OG2QA=;{?W`wITJf(pw%Y67s?G_QcOUGi6G6& zes8BV2#>7foT{<4uXDpmrPUS?Y#N*Dc@w_-L=?H*HrkF$d z3#j0$2Sp3K2%hvFtymS9Sa)qEdq;w&zs&Xs0O0ycQ zotoD}7%D-MawgdX3vAu0raMUP)Mv~{MWbR(S_xv|QUu#_sO6A2bqlWvmiXwRRCa(P zrkd;tCrIm!27Jr$U`;uIDWY{FbGBTGA*OV zaq5*ndh8t-G|j7}W|J`FP8pl}HkPBUggH&DxJAlnPY$8scRI#6B;VhC88^|5Yw+Yw zFCZhin_c2;@Q?8%idU?`0AtcEb2~yxj9bROOps?20l^aI_TFE9(tF{z-yMMgA%zc2 z&=P-y{B&LH&tZx4DR**bcD>1&f?pVFQJX093q$1Y1bU|txk2hWkd(uZoI-_?$%A_< zj9#-AT7##pEbqV(?3jbINuVFV+y(4ETyBH8=ZjV&T43g4Od410WtYMbY;mOUw5}mR zm}em*yjgmZBrt*Rwfgs$&57DLxX0`84J8Wpfr?mqW>@9Q`v=b@3@>-;s2ay^AGb|G z<6sHfKvDhCp|(Ve;bzEcvl3O;*J%g4%2fpH=m(LF-ZdyZU1QbHsqFQSE-uy)Xaxb* zSL{BCOVmU2;8(hf{{5BA37-zT*~-HPxP<1#!&DztK74BQf4R+BWyl2;uM4NAH38ll z)?^!My^IQCPqXx!6D!LZt!(O(KGg{Rd}Pcg?FQ!DagHC3ltZvYG*|f@ACA5 z(y$gMwjP<7kBkLc{{3_A^=#U;p=LeX-Jli8g)Q4S zGsR5xg_uRQNQ?m0(5Dd4a{mz+l&#zm6l9G~=l9G~=k}HOSD-3Se z=jhwnuK|Cl<(>yq#FY^_60{B#=L!9<4oE+T!cL+`@6H3nF8HuR!uOycre0(cw+R)s zrXgw)9=+XH;QO7tEq!W5CUINfkhlOY*hZ-ijQkgQi9K~92bSxob%4Nfvqh88H~~nx4}GW7*L4jK^Py8nIo~x?+DryN$BTbk-|idT*N-e1Rex&uYxV8 zs;+vp|9Rr`zilkh+9til7D(?B%R(0-awITYu&enHvQ*rlq~fJXBoGMhV~fOV=|9Sz zk1j^!w~cK|E}ELFSzIe&R%qSO0o{x1yR+jkFgySCIvN*o&;lgREZ5PMw8rCoZ%QaX64C6^AXjaDf@M)O$fvw-Xm4 zt^`?V3UU)UuwtamC!Smc9uo<@k+`s;bllrS^0Va7iZ6r1vL1bPqV(2-93i1s$!T_D z7tto2#+s{;0~f3~jCJXYVqMD{n-L>?PJ6{s>>3BCj-7BZCXma<7nLp7)5N-2qp=YV z=uVqAdF{DaGK9W%ej3I74qbe*Ru1bXZOmb3#=x4dbdQe->(6ixLJ_>E)#QNzWXYcvW6ai{SG;$nFpf0nwv+(Nj!yGQQA zUjKFVWcY)R=mSTSED7eq+Po4|hgBUmOg zkxAe-S?M+cy74QOzJD{YBEl8BjD+U{A(=!MwcUdbDtM-|mVC1Zx*)wlldbxix&h}~ zRB>33<*kdnuy;t-t6PvK<3wNI%9No1-|!#7YMWLcVAWl)1%p7~kc$3Nj$`HYL?M?0 zHxgEOAjF!;?1ND$Ef*2drN7=hd~o}v;4!>O3aweAlzARE_O}LilNFK4f?FK>YAxny zg2e4Vs4e$@uZb#ffkjd|RPYdw(%@GhA!(do1fM}jYLPj~0OjZkyfM7?RV?ngr&#W7 zX>~NBj1Qz>{1lVP2ySYTM{2Z|9H#MIhAaKWJF8x!k$U$IIvSxxdzUT<8vqS)N*xyF z<7b`?NEKahvOxm3lGd@nhY#*Zd~YHoV28eSq9K;?>@rv3-WZouE6y`|u9yYXY%m~Q z2&dzR6|@f*?FxME>BG)S>h6kG4^pWuFu>SduoXjcxYq42)?UC>ppv++c&4o~W06%- zxJK2rAr7q$?q!9R6{DG}V2niO%37i?c3{JM_^St3fp9J_9t7h%(n#c) zI1GAp+(Mf4lE_tjdT?hR1hBxA)FjuQ$)d=r+mM2As#CFx(5bUnnd%h#WNL!Or=6fg zSrK0}ErG))U%UPO@26l$bbO7cO7#j^KK@~2RzxhaN)kiZv!lDBr6utA>3wGtgs`~5 z;JIkJAKSK$3X4VN4Jr2bC=;11U)JbUFc&34T41-n8HlSr*&jTr9Zr1O!FrERIr{b1 zDBgBKiUUj9Yo+yH4%aLS%;Y-+{sXhe$40FlMCA&W3q&RhZuYEasfCVd9na1V$R~po zrGm42x@cZVTpyFZk|kE=HRcDjk$NCS2_`F5;_C^+w2TC1x+ucV%B0sb2s$ib9Bd_un1t9}B+W_q;KcXHeqea5`f}#vwDo;9E(yh-Bp~2o zJ1Nz{OB2MFJe;k@UUh{iN*35uR)R_oo=Nz~RRkam&4m)cMMec9L)|06# z%}rAOmFG@q1~y+tYxV$h!wE+OQ_4x7-z({de9*XF4mQVf1=dWz@46 zg>a{{Gg}lEOcsz*-|DxY^8T0`EjT4#cz?KFJsuq;l?ZHMe4HWCWw13vwc$OS_n<(= z7R%@GcvBwlB_<_VQ;ah{M0~}k_$Mx4Ylb1a6!{cSN^b4;TaLmf6tUFtWatK_6f^cE&b_un2M|G?W_mkF9Cw)GzMsK>bTBr9#h4x_TJ_mxiyvpcx z(mHY#ojg0~sYK?TnQqBW;=&w+W((Hou&^&4;V9REo74rO)9W*EFf?P;`-M{5ebqtk(uz+ljul8XxR$4c;uCf zPh2p%Y@JJ++Klp_Aoy&xO%M?I;pL*n#;l6Wme+33E;?q zyB_qeHy|InYJ`nx5}3)GqQV0000N?3#xh7$lMzK8K=2xV( zktZjJ6YWNPc&1V{V~9QO?wPSoe)&new!5c$`gL_xy=nl)7-I|@5S|!RE;#(*f`XTT z%IP$>fC3K!xWbiM1xA1;A;OEF0;RS9X&Hz~*wF&SQ}Ba5Cgs6^7&#F-f3wB^@9@_t z$O^=xK?#kFNN9x|9p)QaAUVyy&=;T|sk zwhJjSG?B<3unKw-yl^_;g;(&W>UnIOJn!-fHn`t4%wEFf+A*ZS@I>Cf;p0RlP0s;G zB{}b{#5u}^5^sk1l@se~@i8l=@tL8BbQW-^>Dl6){24N!b39M@YXN#!DArs_8n0j& zM7tPYQf3l@aMuHp1$({Ify*S_r11k239S(w1##jdA;7!m4npDq;V}$oy{{vu+pySJ z7!XWki(gQUJMkz$=Y@S<+E!0v+E`2_>}$m~UZ zH-FM*u>cn2AtPR2G@Z6;pKvrONJx2ntwR0z zRj_HCj7Ti`&d}?{ep{75CX38{XcpSwS0fTBLDmIK(TCzoZBGDy#h(QWQWFtNkn+nc z&HE=LXekQxj*eiAG$2mDRQ&_=D~l7fDuh%-goKX<5(vBP$9+U0P%XB-$mzC<2akVu51 zlgo=P^}d5VpZt~UrEfh*fsW{#ruW6=u)(J*o0#lK5~p_(u+}HZ7D4Ej2dH+vxAPuk zL~0d~!_BUM7$E@bSgVhSZvgbx+-!}b>xJ1=HNqeWHC(*PWG$B@<*gR+F<6baDgVwY z3MJd;Z`$GcZY<7KAOo00fqkhzNfPWOjkQ{Ykla{Ht-kb~(Ya?X8wdH@_Mdzl%kqzZ zH=W3;i3t573JATCF@-e*3E{UlQc00xdQv0{%aqOD$H~cY*mkN_V=|LcnYGw~mV|^{ zf^A3vJCRrjL^8*6MBLD}Gnr?%FSLCfE3nEXos98pqB4$55+y*To%Hp^?@m0=^o#># zlQcSOJ&^DqC59_?JGhygkor0+MRoPyBssdv=ttOB9g>F{=5yuOz}46V&w& zb7%Z<1{okpGn%*@BeMw&Uq4`weLC;GC04vZCMN~FHmn!ET^;!t{M z=&o?zkssvFyM5mj+0|(Jpy#B&oYVj^Dir- z2+^5u8u=)#@r}uT;vy4YOh@+p>sMuNwv2% zV`mX&0RVvA!ra6W0KlhHFaTpb9S)*@kxmy`T9_C*N9S!&S!d3=xyV1=_B!lXe$8uc z4wlWdGBTItapnO_-~O!KZO(TF#Q%JBHz8%{(mp%(X-@^}N}rvXgUL=pRL&DHONu#q z=N>0>n3?2~bOw~i);4&Vbbp*ioNJh{Q z^{t-yi7pEDX@5PJcJJx`oBm&qgRyWqHl9?otN8zKrYldLFZ{vuVZqFLDRE$SXzz8+ z@Z4e4E$W;7_(v|EXWtPgpLRY(eIGQCA8W`Y+ZxyO+`n*B=^SS!S3 ze^OWD4-VhhKv(Vu4+$}MnFC)x7$JteaQkTLyX@uv?dYPeY{I$qjAF*c%sFvCSwQ7- z%icb+?_HtyMC3tBvEs#*#zmbCd?WU{M?7|MH|E8rZaO|N=_VhFk-o7~yyd80-)7hnVq7j=Ji?5o%544B;xp(Il zD4w~0H%NP@9N^1~Hmqi>Mkif3$ zN8x|bQoAK`TG~0&clT#-we#K~5@e#%+rGB9eV)-BFXKB(Tz2Io)n3>GnB$F3v5tW` z8sSMz>th~{D=9)1}@ z3g$b{MPBt85o0-CAhXGWnu%96nSq_!!>dM6Z61vr*vR%JO&-ZifMrDoj4;$^+Bk>_ zgtz2FLYQ~tq%)_nGT@`%;&>@pbXLkilx*L(EVPoLIZgxt7ft{8#}2srLc`t><74cj zLYW0qw_fncrc;SJmq*R2t2!8A335z1LZO7=yX%j+p33^l0*fmE)u7mbg~GS9>(^S< zLxwp{4_e4NxopE5 z@qSLnC_{#M=03^OtsiUfLYir2{~(^DZMi@aDJu!+c#I~eAU=I~@eL%%-H$<~>4lQ( zme&uomBhF~MKsd-wLS#(Auidp;L zZ&i91s%QbjT^}~C9u8Xx@D!H!CCET>pi8dQnRuNH1zEHWuOtt!omv8RNJ5bG?sHsr zY{y?=G1&VP>rIEy7h8y7P~R8*ICI7;;Lz@bc(q@{5061B_sr>0K1Y<0W_n<&L~O0o z)*(c9fb^*uh;gVU7X>CT1b`24+s-US6sb}4;u+=);K7Q4rVH-w_du4g%7>y-8A&MQ zK3z11aI|^hGqv>-!zS@=11M7f$D2|2?ECU^KOo0&(9H1+L9}qv%mjeAw3|1_SiVsr zeznoRzDe)c8bHlb=Y2@|=`$myj4cOXnKMGnIA##Z3o6+(l}uKrQkPMEF~r&ehk}UT zP4AzRK6xMl17v+2O0O$23so@@fGBR+LUoX~xGdso5mAmwrx;hpDqB>jSy}-xV+kul zT8e(2u-I;{_=JES^HFqm#KALpKnAbidEYtK<8QHiGcjFpx6aC2_rs)M7ysSc2@uP~ z6q!i6nQEkE0(W$IMi?kOD?OH-?$_XhU>*g>X=|PlBJx%Y-XjIahvVcB!&bsy%uvNm|R z>WU=ew>1fBz9g6IYamY=P&NEiTS>iiUh4eLUHIXv2}dw`dpY9&gQXEd@jy!$Q8UB zWf84B$mI~9iKbWMn~qwWD-gN9p`tRN$&0eSu$|5=E%oD&`wg|fkMe$l2d;#GHJ~{H zW&DJKHxHq|9^}hGo|rQ&9l^abfmLLBvPK=J#fr>Pb{n*`4khuSaETk;WKo7{CN9kd zT}VYZ%lCt#gO`#Ljt@O+;t|gQezuQgiCMOWq&uU#0e&*%?bmILDS$j+dC8Li`L!R&qAAKU}BIAVS$Nx9FlJFikZx>c`}s2 zVK*hspd>D|sVPfK74)Mo)`4I)9EG8v$Ked|HJV)gK(07!n7q9y4VL;hI@4HMVZqr( zUyP!1ICF=ZptFF==07PHPjeiz5e|dmI9_kaj#WM(XQN$s8UGanPoz&jF!Cp;KCWXh z1@_~$_)2|oF1kI)hodgM49#QM4}#n9pB*??r+?)+-TQ+tmoDtFtWu>;w<$UH0FgH;7! zcsVH^X-pprYF-u;6XR+C@t~Kl44D;%tcoi`mS9($r7Ln?iWi~;U8&q2*Ne|!xQ>y5 zx6wag2iz=aD;IdsWdQ2)FbK|wdbb8&m*PZyt2rdmHk05_p?uBMOBm=KMHmOKF^`z7Z5-3p{$M4_ur;(#Ocd}y++ZQ&{JRn zaq#l3a$LwPsbh9brsIMdnHxhumm5CkqT?V6Q?$j&bI!%K5dy>>l=lVgi0h|e1UkVPBMS#ma zEO5mpN%d`TF3_2ZOX|WJb`KFgHh>BE1qNzPj?jV>n_#}Qo|$6dWQbaA&;caCYsfrE zWh$5Vwar2So_P@8;_MenKXKT0DvY9iF-~w+#EHod906>8TaZ zp-XeI4mL>wqsWX7tO+A20KDSAX3RmlFZe@;+46U{aTjVbX?j!}28uKRw`?T(b2Ee` z0qu>s;f0bcy|M|9A%U`Jo&*`*$b;WhGt{;SmijF>;C;166~mQJ!pyk0nLw~E6YcBE zy=`wIozk85vy*lr3X1@dK9)in6GU&)w*)@%{DYxC-H^!Qc=@pKPNR0H0AX8YFB@jG z73q1?a9}%%J3;MyS37Y*!Ru{%owFDk3Xyj zboWC*D&VF%VkV+d{L35=;2>qCck=Bed(x3dYft`xFdj*mhO2fdxLZ1m!55j`Z}Lj5 zQXjow9$N!ap$84O#jBVnZxfg#hdkJps~EKj!!B$GtEw5-28X4^d&!|Dh>t>zMe$Zc zBzIUi0c*p4P$|4pBAC&SIdDHbU`2Ery7EezKq`EIIgTlGA9bmmp7w5WU2M zXtJoL;bTvR^|#hLXb!cR^2buLl4ii8EFhKb>}9b~a+l-m!FcR18=vN%`W^d6wawFz zCVWBL5e}o<^!MarxwfXaX28bTXP2)A?w-3-4{7W%s6)0sBNyZC>mQajDQ-n$UW@8 zGN~^sJM7A0t^~3W)W|wD_$>5T2Tu3wM{OP?!#hQ+$+c~&%oT6ZLzx&;W=Qf|@RoLf zXg})Tg$agG`jUT$YZJZ!Baiu#?7$lF^|yTd*}LlH*rM0*FL;mwTjw_3c*{YiY8LP| z)5Jlz+wEiW=Fvm(+U|lkdwwk;+K(bB+Lt?M&EPglIdNyVz}l{?!SO@ik1aQ=@+7D7 ziTO)8-cLfB@w0cEsz;_$P_0~P^%1szhrb11kfucUYk>-zqXsy{BOVlOwTIZ~A4im_ z8TfnUhpnkaGG@RkS+Bc&6VE2r*8hF^R5BxrdBzha0%ayag_#M^g!_{LI2HOIy+mGE z+Ulv}cZ7F-E^F^#Y13qKExjZ+ABkxEJHB_&8v0Z8#lW=D)nA%t{Ebfp^B-6SB#|O3R^59ZCTO!P&AY>oa?!7 zD$FkQEb%l*t;zz4@S08fBL(^|kzb?^@^|01mzQ@31sJ=Ro0kdK59ibIO8~tp9pxc* zc`StCY-Fg&`L6J6je;4$a~4D}{frxJ7M0EvFRDr~?=D6cTme2Whm8X6W&Y`z&X0e8 zuQs6Nx5lrB21m4AGDy~z9trvSNoA^N`GCTn3Rr`VJ+dW2Hp1t1V!=|{bSd&>P`lk< zK#OCon%R5~zAy4H2lyoTwS~(XEWfrA>2sNqV9jK2YlG0exC@4dcFyTG}CRhl(axm;Lc=h`A4kf(C}TIO5mO0yhI?6kmh zf_ggNIX>)F+-P2W;c$T8{*=FVopYv0tu@pVrZ#iwcrpsvad0W+4V&pz;9ncg04%i8 z%m?tpI7S(sCY@ec+A$JaL=fFyZ$Gv+l(*@XoB0G>Oyh|>LKqAT+sAXWgeqnjI{3sR- zf=!3t4b^R#kaNJUGQIK+`IFZ!7G!D=X@c>#l!+|M-8gC(dom9Vn@&Dx+!o}8Dv6;7 z@4H8Ju*IOSM?!NABD}n4{bFmBaN@vCNdEk$Nvq-ma-?u~4?wz}NCUjMlGvqkU= zjf$N5{O4T0g!1VJtN_!2*D%OHfh&(;C;1(%j0)Om?gz{mKPv*i8BG$IwW3UsllWI? zGq)9NK~M7xDq>5J+D*}6y95O-nPdRKWB?b zNiqCmyZ+q;Mwl401lrb?VM(RTg-Mb#q|TGFT5%B-=oPRA{Maf1&OssO)5SO_6C;)> z5V~mw+SG+fv~~Gn(-i7^t3g?s=qrrPZRMzq z&ZAS{*PcNor9gbgpaZ#`awtL?Ebufah~uM$Y~hoL8I8f!PCC-9Ix2qU$wKc$d0tvV z2On+N6c8}vx%CW8cpi^cL|nw<8E$t&Rhfa)z+)8JRt1(N*!7~=CO^iY^hTFkrtkIH zmp=gCFH3jJS@I;9Bq4{Zk6VAJ9rF$*>RmT45JY<_e^>dnW10BxLa8j!_@@F_uRdK} z5c=)g2@7~W%GZK%kG-&Iha~HW_Wtg|6sr2Ds6Et&=ad!71lVeJ%L(u#=n^7sE&|QR zeB88NX|+(-cwU>l1}BmZJYFP7aflH>-A z_)6R2=HUn~2+P3Xis$wIF0SxGDQ{k6O=`0--P%NQkEswzvIz8@i1izJ)Q5q2#yN)Y zpz-Nmf3oXP&Qtx|S3cR?mgTc$z)Is}0T}Kj2iMN32_sEu((Y($w)K`BI5wy$O0zXo;XiJD|Csl;V34Nw^ElH5_8Nxnd+RjgHFf-P{9(&Phu3T~{r;tU zXBaiuTU-XzeRH<7{&aPCvAg+7yq`AZYm0Z?DaVQxLuf17^-aZzWM-9DJn`}XAPwJkW}`h1>=Y!b3V1NjJFdQM9}kdX?c}CzPA>i% zHY3I|8Tn3y3rJvh%tHBaNsC3JI)Q|#QTdIMQKpYKakLjL0fzl1oe!m!@6=D7Tk`B) z&c4DVBmsG_@S7$xJ^VZFr~Ic7>)1JwaUO7!>$uo5JILO6OXN!qgVEhMSzJ*1xgYwE zVz#>_hL5H&xlKe)@tR*u@Nkp%#S*h$9r>2|;r}@HUOm*|M0!)+G`!E4f2}$q`YZ0z z)EPvPBH}aqvin(B(h9EK_A2>>KXMsa1&{7=t9{+EeW2tu9WygGb%I19^{op9AONea ziKyPZ6L5S^>jbnz|GiD_fWsrbun&owBFq^{n4UKa{h3MANBH*!ButdqLWf$$pw3p8 ztipSA3l1Cf_D0AA%TKG5*~7S+IF;}BGgS)R8QoXnqFbulp8Y95Ti)sIl6)_78r1?oucV`U3Q^C9t|(vKK>J`Ye?JaQpJD<+kmN;!}DP3l-{?v3zS2cZDTS zwwn1~@g1oz@EFFm|5#+=La9j&*F-kGN|)riiO;=5CNXWhsz-lST6^j=@y8N9gJ(sV zt+}9s@9AErw3A-Iy2G&@^E<=gw+u_naLl#4!!L}Gug-Lpof(j{ME=Jj?4swEwyD{ADCg3-iaB5P>Y~;}Vy5zan1F67h_$Qu1 z#R&g`SeTS=58cz->-G?DnZ9ZsWm7!S9id`i+p4Q6!CEZQq@SO?8M(p(MbSznz= zb^;Ch{~irL=x|i7zIO2yS^L*8vS4L@kxQ@j>Lm``<}!N|$n+`QcB!4v5$wcppkLCb zDVCY^)<#?XwRsZ#E+zge1kOP=QzqWH_>W^gp4c?n*E21t>T3bS+WvZ_nWn$rz!~-C zR^Pv-(fL@Byb#~`UH3vk5#XVHJisdM$(k<@W_e%CXN(z&&0|S1xSGWj&~y#Q>CSK+ z#d$k}1&x}~`qwCE`cH4ZhaUX~ql0OG`7(vHR|xfk8mt~?A&2Zx`YR7 zASkZm!UTjis3`|Au;GdkJ0>P-b;|dd@fN2417bhFMj5Xqt)yeTs>c!NAz-NC%*sz=37pn zjpwpSnyVKNJc{|-Z>xasRQYDqrwa!&_O^>BQf9b;FHNtW`LAo50@d^t&xhmjQZL6V z?n}5a7e1DKu5lntaAd$J{U;3>jqxdM*!~RV8X~HFLFG=W>3lUhz^MEb`M9_IH7ai3 zV$BR25jOL@PKLdU`e;TOJIlnK->)L+ClU8axg+ApsU~LQVA73?Ib#NF_o)iatHyx) zOI13iZ+$PItG0?C9Z#5};hfAb`_8Tm$(SDQ<?&)>k?a$RAO}R^keyZq&NYIn>EDLMoa2w2{4A33MoE-4$ z>(7BYyDVjdGQEPQF#WH_1AX)*23nWWTkBN`x%w>suY~>Q5T`V@d!?-00L$0?EZ~~z zX`QiQ5zDSI$M~mHp_z-tMdB9|qNSnd0W^XDU?*9__J8+Sr^5mIyk z>igxoZIxYl5h?JPjR`;2Y**%+&OZ`oX_!25nc5_ zWqf`D`1+3C%@}n7Oa3)rYicKi)%=>`6AL_lJ=ah_-FZ=wfnboHJ}ubdBL{Hon=NNr zgghzMkJp}h)~!1h!=t83rE*1m_PC_|ms zMbMpHTlplB4)Qg-=3RB#ZV+3I^;tkHx8>_of`YQ@)9KOvPb)+)ocdacxQH;Y-U%q1{pT`mF}!^Sm!F{T zMNM{8l&1_o2X3>^duDS9n7+MIvtbuo_Da9QQp9?k=?GUC6Qgl7ERyN1zt?C0B~?otAHaok5)tpAtf1}Y%Wo1ilAv3 zHf6kyQ%m=rXq;3RuBCN#43c>ek+Dq;Tf*MUpkff1Ki5;5hq3n3O5Vt^-r1`e0Wz$C zN|NQ7m0nd>`mVB+CE7weftn|L6z0^imuyY{J-D*_H&$pzD`&>E@1wrFO)O*)?xP~h zR%=Xv2Wb+rFNucBCF1w$X4gt*;~yC>cRC0oCyJ^66niBKAUC+EG=`J756l^kcQqv| zTk>d8dmV>;*f`RwkirK*Y;5rh#sV%Sw87ta0m|Judi-($*^m9gn#ezVTLdnj+*wQ` zsLy2ykxGMa%vvr7WI3JO9XraKXJ)_Gvh8`%NX?dM#El_;KWO-3;%aDqj~piAn$ko6 z*0Xmm$jdt_U4zj}s(`XIA16s5vgQ47vmDi1iXRBXs7+XW^KdA8&8fh4Hc10M`>09A z@lhlwOF(kk=w%BeD+N&u@g0LZC>NRuqkl4+%f*ITZAMKumobbNO`#2-Ql-$2dGC!7 zqwnO>3~TuZjfp=NS25`F+&yFDFbzWx@J(@6h6TFWEyk} zKB%>ULs3`Zhl$HR$Dc!DQ+HLOF9bZqM|B>9hfKj+Q>c2M_2xIMLh-yx+{a?GTNiizz9@eB*%{cWuExBF^$A2$vVZ-)B8pzq3EWb+YNY-VmLMHyUW*Sn7h>N_#uvjenHEF*)iK{`% z$D60Kq4puaM!UghbC(?Odgv#xOyN;0Wc99U&{U47&GX2YHcCSyR>}7IGYbKTW6B&? zig(}LHKm&K=!%3K@JhCDfD^c(WhF0vK@WT#_5MbE`K`aTMzWHYOc|#QHK>hq-Fqmm z5-{iAaR13!CvS*4AU1iu-;leMPp8JpRRW^=b2TNCLq4`^TNAbcgKPM?rd#j`{Ot$b z&ej<>jT&tpFgnWrm~T`~+Jx&F&}dDSJ~SV7wtN4AjMlr`1j8_F|dJz&N{b^-`TVF!9d3T<<(yxAoj>LXOj>bP<{b;q} zUNkk{VPtxI)Lb0kMjgd3a9rLVRe4X_wUjVH*0FCnNub41YL~Gq%6O{Nd;XC6F%{`_ z6pCFQZG)f4`VeaCKK2w2t5N7_msvl!CWeY3R!P?-9j zpT2PDzd$~iNxr2UDi%FAzLRCFtY2<6krVm`B2a?^>6?aYHP@gcsqz7k!xYArVH_VgC>Zx}~MP zCQ|MJtlznXm1abo7r{ct?Qm9FBV~9cptEpnLLPY*!}cmpP8xijUKI=v|NE}s@n>bp zsI_w`*rXj+aoly046r5F&P7sz=%~55u*-I=AJ%&uWGT0tfYh%!59^gO31m6f&XvOS zQ-1_mW3>EJ^oqtnp`}H{HOb5p-Q^Fuh3(tlL5o3G%9mA<*0G!G7p=uX{+i!J-hSg@ zDQX?QCBQ<{n4@4~f9?Bp_{=^iTw|0u@G1_s3Y6F4Bl5uD{2w{eOfWPd+gxBX$J`3wv26J#dmTwghWu+(UZxYz|qWh8SSot&ghzr zz#%NHC&XeJH2uN#Z6|X)8x{hIGTA6Kg!x3{|9N$9i|Bzgn2k*&FAuTlsPun(_8#4{ ze4)Sb^+oPtVZhjl8#XzLq(o&`oVi-*WaZPp40-8S_~V2L8fxtcW1qh5-U8qLOnZ|2 zi@rZlyDJNn8!9RF_9mH(><|-SU<&ODt4-nvd3)AF?`RQ)91T}x1ei05f&b}FM)^r0 zHC9en8O@F9Iy|^%-+r9_NF$wVF11f^5_VibTBr&}Z!@*v3CBvYZY^oA0YcYnu)@%IWk~|X;AkadOz8qKS4$w)O@iey1SS6 z{2;N1_SUv%897yOBcq%jwBw!|b2l)jCzAK0-aRK=;q|3{32!ipXRTZc88;mbj_$g# zg$`XRmbt^)qeGqV^F1ngtht{$yWO!4Ac2q^fy}Wh{0J-mW^;!2tuytq zr%WCjlAr@bS<6amJPd#^`ijIL)?(SdzA*w{o&kG+c}!DM7}2Seq?yitV&JIvmH89x zyKhjHr-{&w;j}mS&1@q5W*45ek{&I ze@rD0Dy>*0A+Ba(=y75(qbl6JUUJ|mwLm^=7bT~6AIKv_D{0}+*yg0p$#XS|ALr*x zp#S!^WTz0S2^Oiobqp_(Fj+hH(W2edojf`R7bs<@q2*-R;D6ymf6IYv7EVR4I!kaN z;60LIC=N65PO~8H>iGFUL^Wk;#&p5ZoH=PCj3ex+5J%%83=na+P#RQrrLn_0mCgIG zep#0X2vdpouBgbCHyC~FwOf4<;PUPa5=6STrSG65iAEJoIqF%ejp1X34C`bG{_&{J zmXm*p8x2f15EQZEm1O5&6;HYlMQ0i3WT%Ebobu7#enTz=H~Lu+8fAb3vjtbW00s5e z&S&q5$hxksEB!q4ig4Z)bXsRD^-cbJb;dX~ik*Up(}cCHe!li~RHZcTxnhw^?vcuE ze^+N08d$lQ*fjk=l2Nh@;`@eSt>NS5UyjyzMfCs3HjW~B! zgn~cQSMC40s9s;0;Abfob5jq=--`#g{mvKPNJ=Ya`W%K{11nZtyK7oB`Bztf-rSe{ zdN#R3m1$|7c$U@mI%h)L#R+ePQ^m&*$zD4K%>3bFyTiK19-*6=ZiZIgV>_sQ>fbn& zc3)9CD3uT4jP|ZhWdbfMbX#^@RJG>?73TE$|74KYZ`8Uiz=zKDcxAR0hY4jnlf11{ z6~AT2*(i&aB5DQI&t$!nT~hZ-UTH}l04AA|5+q^0mB3T6X?{wR7>JNV2WXp1W#9cN zKkA2d{(?9uQAl+A6R5M83d&Y7fZqPkrPjf%lW6=+xpP(7^`mkuk#tpo8x6gqd%Iy5 zX>%*QiG7@-$0UUa2_rO4WXs-|j|0}2Um>RLQD*_!>>Km30OB^l%cWHMWDLA>wS_aE zqH~_R3ixCZ3qd>L*P&rbjQ67pm(3G+DdX|iye^q^{fe=GoBnqyyz6|sa~0gwdSPrn z1}q1jF=*abzDjiy%_uYnoc8+5Zc2w?T&a`gQkJZL`(@-3R<<2?WjW}rnubM-cfV~{ zJ7uA(!S-dKSmb$924jT7XKck`^TjSvMJF3f+|$1!4pMp( z5TqK`p6kE(vXQ4T0U^Q=5Z|KBQa4)-Zj6MYt52G&x2Lf?cj*kZv~wv|4fL@NQRbB@ zj^kFh_9@J%8Urv(bnQPD*m8Srkq2A{d#hNNE``)p!327*^Zz#m1D?3yUh7X1xtVUv zOUOZ^wMVf`56VgEFCS^ln0&)%H&2!kAImd+6mz9S7%dsm?~ADN@+JRbNH1{GGU$vm zL1b?pcko4ixrdCvQ+pMK39cgzqMBTh5EIjv&i)ngL)ke8fA_jZ*F5=mV|~Xaw9NmS zM^F)#pmIe`aNHCG5tYNvxUZ0Pd#CcDqBLSCb1I;jnInV$*2CfElY7%yK^TxHF#e7! z1SG@F7}nXzBg*A4C7mIoEHB%{NKH<~hHVHeH~bT__Id7%cu<~MSy7bc zIf%!Kusf$@1II1(+oJ4*-js?Nl@AVOMFy3u!f_Lh-=W>x*KYS@gSWJnLjJSCg!O4i z^KYtBdXjK~5SH=ckN<8ToF4^Igo<=kNKWsz)RCOAekd6)lbHC9!3#>OA_138hbK%# z-TC4kC%gK*Y}9dJ(PZGBKhrUjUdd&ilqkx*Qyo($^k@eT7?^PO27O&|9#2P$OfUX( zgmP!vU;bnJC83aM@~kv26J5H&nb>Bbug6pEcZ1iOnQI(8`N6;3wiu{`KLg(>H^((f z0SC$RmO8$N>4y1PK=4COvP*#OCO_Io3t1m7zF4grt1BN({?H7HN^?Px#TPC z?*9EhbTTMn>NwWt%q%3xitA>2swz9#s{2x!#t2XQRPR;D21kGXup+;i@k!n;r@&CE z<%11aKZWCyGQj(6P#UBje<*g_uQ=^dXHN=bwITf*aAXO?+f)n`iGviv_wgf~EKX5e8f~ zAA5?N106ul*}n(4+`uN4K=3z?QoDvFpqu^-B3|J8e5S7P>SmsaTa=+($ z!}aD~U-}c^;IZ`5+7^`>I;-e>>oJf=f+mqQhlfwV8DvSWrv?}NZ~iJd$7PFj*eOw= zC&3POKj69%jP`;yjPE=~w%g`$Lo-nvgP4BN3=@X)mFz5}`E^@*q9Vf0gK(b*63hw) zy5T9n$V}&(v*qx$DTefDFw+onfVR^S-O6|F6pi1Is460D+~<+g(8K-bck)#*27~0L zeNQnXs?bOY?@VtXP~x;JVJmiE0ZAgBItP%<5AVQp1sQIDB!}odo2BPR{nVC3GC^;D zUKQB*wr+eZVWZqqV@#7^1=~0rDDWehRNeM*J|D&2t|6d#?sc+-XDi6Q4@C+dZALQg z#G(ym)d%Qqk&@ui$L&@1j4lnSseTdSa zvU~wCPnSwaCw4k`yN2IT zBSnV79VjVFIEbySMCv|k8U9w*vaPhq{~_do*4Ff(o$4itfVAb&RM)7P*^F+Hkm_-o zu0sBDq!Cw=W@4;uB%KlHwh$5<15Yivk@8}=q@YD*8V5{>4v|f}>kE89lx=2sT0Qv1 z)XCVzF75MNN03?&h$q2fME;Nsx7dVQaE_!k$NJfE@lOjvDt>N%MG|*Tx|n$)Z;k&T zBFV|y$25t!(MY$^7hRsM1Q&^*X%OY!DmI6VI{F^J-nZ?EN4mZWYz{21W5MX=u5)f% zm;f(Q?ES*tciL~7Asgk~6G z?CP&|0Q|u)yV?lt%jC^qIHfDb?th4g-x}Y z%?_`t(BtbeX~%QO$%;2`q4Qfkma}2L3tRZmH;z8-C63sZc}04=`JrK}vLNkd>DzQ0 zWI~A?mz*;6K#H2-ovkM8sfs3fTp}@%I$r*g?kVDk`X;>1+gM^iAE#BXFUEpU$+O9bR%+Bqpn?y>SThir1IrSu>+Za#iq}r z<#yAvQ*blz95tQJH$XKK7U9Kky{I*!hqCM--Nx!#%C85wZ;Ehoc-}&_#7* zCSVO8ZO87J04Z;v|LHP>b$|*?pw+&!83|uYEXtSbm;P?&Y%4#o9@gccgq0;)FiRod zGsUq{ykrs5QZxIZ_yE-nM9=rG+?1`}(fx0pf|1629^qJF!X(on%CguA? zI{@b`TtX=6g%Iui4!UO*PzBStp28NJA&-!8YmldoB#nM=aCFI5wv-rojZ%|FI{}}C z(Qn+zTtcE-=`a9!_TitvQUpuUt4+)DsD{sKtVAgtj4Sota|JP!`Xo@o%#JYQ|fhF}`C~i4E?}#Jtozy71v#2_Wj6F(2sSsG|IV`;k20GkH4$r%FPDc2^s*RO*dQ z3)Vd?j?I#PhM$$V1eMSe7q^`h6`h?VZ}s3*Fz_|OLO%RhZq43L`*?CZLrDoH1yRv# z_8QYMiY}VMTtX2FR!>?=Mj;1se9h|;X(cz$JpGE?YNx$i9aMRZots!FH%B*e zuH0vazPhW;ZhuQ!C{-ggjXRa=|?dd5MV@w^TN8(G?gS<7m--hntMV>I0oB-R#Ntnje5q>wZ zW12sW7(_P>LPDQ_HVvlbSn9@v(FR}P=_D+DfBOE$%m)$oXskIP56;n8(gfX)TdSXV z)Q0-e_vYKwVeAKAuN-cr0Hcg&2z7Lf!xeAPCmG3H*U(CEA|A52%z$RC&Y}Xo*+j5+D$SZuXTle}At6Iq0)Hj?P zj@zVPChfb%W^XewKbn1SJ6~q54xU}R9}tgy0XVMva@@(t7|}nXO0bAEUEYGC7@@}5 z5@o#xpm&Z1?(1Q}nCS6z84l#YQEBG%@M|db+cnM&wn|{8IRgeM(F9iS6*|Yotweo+ zb_Ig1Wf=1eD7kN)d}X+&gB{SPq04?6|BoqY9OaUS>S|7p%C2Jn``UfO?dVunXso3Q z!Xfcl{};KZ%+T~3*U?u5XQ;^3>Ukp^7cF_>i*# ztEDvpum(vb%Ohnzqk`v-lU?AK1zd5&PgVoG@nv}bN$0M5iKZTEeI}+e9{(XjKBdKj zbkyFkTYb%b+t1#NU|S8I5@%ABw$ENUeL@p_EgNi}r*~$LRVlF|wm^n+&d^E8`M1Kv z$WJoJq&eJO@SR2mX>VAVJ;Phj5ybgNFzQ?{H2Hz7Mm4RQF8}Za`JrZQP!;5zQ0Qf1 zTSX;fKrcFvEA)AvWjR24ME8OM@{T_{U!YWF4i=9(|4HD-+^JcK-}Ti}$Fw=7-M&4> zW`S!&?Pa>8av2NfA1EI$-ae&Yv{lj1ziYAs1kO2Nl6}PBE6(maNRA*V1354dzmNfX z4PLQixbypzmBnj&{e`d22d%}b&3Wrk-wRzd-FcCIry|`u>MWzhP2Rj5i1KrT7s_C5 zbV^06sMcmf~Ji@3@nbaKD& zF~)V3ll?ItCy7lb1Hd<=yNh`_`2RK(cj&)Zc#tZ#KhQ(||RqzUg(<(23MmKkS1J2|4A zz-Ny+JuS3UsKRCWugL<(sHN%Ozv??9`#w+Md#^h|)#D$%mz^xCX$~%?Eeu>y!9A}} zu#!|b_UobCJXANREwbRo|57RUujCe*;J$9&v)}9uN~Nkd|JKgnbYRL?#AbEsuh&%q zR= zdPR)!Ifl3SKl?~{`VZ8Dzz>bT^+G`W=cd7#AYegyCY|{H%$27So!f~M73y&W$ja5< zNBbt|;psoRuB%7H(y~{Q?~aFqFStZx-ChfPFY=MlD8ehu+{}kGD=Anr_9C9_}mZbDxdyh}o2(oEq$ z`0IR=aW>v(yrdI+#|dSS7;!!Nr|s6Dzrw8KdURNQOq`bgR~(pbr*|)zG$=7uCLT-E zJZd&bpzjL3xS5Z-RatN{nZFiap0oDoT2SP&)XxIP{y&^GQfxb0anI-U2HI63sC}0) z2xu5Q2Il|fpM+<%Wz+ELt+aFElUlF#KPiAOx4AwfzxFnZj)i{OjJMY+q_&;8Cunk3 z(^&HJuyLPYu*+Jj+FXhC@uxvmwUGPxGaala$lC|)Gx*do2Kj>Wa`L-Xk~i5FP9ArQ z-}#sLQxP5LYdmp;|N8Yxb4Q1FtmtcZ&yP*j5jC}*q93dxnQcT14(s82k`3W*JhbE# zK!Blf_?usrChT@!L&!;NM7LJ8Yoc03#g;g>QSry7>zcAF(drpm7^q4Jmu$PV!BovZ z<6$q@_P+KfRMK%?nxQVN{O`qpi!4fjm683BL=c-N2`~lSfdZ^xDSbdCc3BJiX< z@4oJqS4$63s20@stG!JAq~*hmen7nN0BwIUXkmIJkgIx+RaR71y8Er^y*?eai2kQ{ zVn;1s9u4+2g-VP;fFF9HH%WUX_j|V5b36-@>1s5+F?_>TI-T?|_IP_x6PDQd%t<_y zQZbnsB)c?(F%xeH1Zt%s0)a-u5#_fa*EAr)gHGyWh@h2-k)%80ukAheP#T*ElO>eU zk8d^LFOj;sYP&yqZEDm7fqqDj7T7`T-8zNZzW)xJXoZG7GTJdH1mW6go9_qdesxh~ zgev?l@!A`6CVSR;-nKd0;FqGINnbtcjB;C7<=mCeXlHkT9yRg2;QN7OLK~EVH{dX0 zt1ae@EaNAYcqU3`!~l%)-5P4Ez~A?^7s)W9ERF~Fw{j#Y+MwM??jmR{z}H^3U^wIF zmEwy)C(zq5Y`_>*nUf~NH0qi0GhIP0T8R)<1_>Lcl0>#rJJr`x%$*>qW%93U!8otjT*PpcP|Z@)s!8=)!2Ni_dcW`fMp_Ewgv|0@ zNNS`s+Da|rk-0vF>+P|eS?*2HiS#Fgn-mxb&k-6Cen*jYcAlx*?O>le)}biTSzWH~ ztcI~}B``m+(k*H0t-U5C2&OXuzBTi}x8_#g{(LiM|M5?MOrJK3r^N&Q9*~k!yC`v> z@3C1C`Jc4herExy{<>6P2)~1LXE^=eip55=N!U~LvMnS_4@~?fDhv(M)_3B!d$fXw)()N$V^R3@X zl>Gba-_vjwL51$;wm-|IdJ${9f)97Lk^IzzS7su0e44w#AGPOVzCa-hs{pw{Uz0@Uddaj+U4aM-U^XN5iZ9KIqSai`x*bxu8v#*XpxHrK}b9*A*? zn{(@?7}luAtSXoDhn?p_rUSC@@%<@wNn9K95fR1=gZn8P882%A7RtL) z`-gd(*&D{ap|4h;27ZDZbsje82Z7skFCuF)nU)y-1YCsuP_cM6{&<-+a_4J#a@|bI z$E#njrYlJGFn01Ptp9O+y}nQ)olkM6UiPP#cvAOZ$?Jolnj}_`93_7kTDwnPZwD(5qYhz%M__z=3c7p-oDCs9fj_$hpRa(>GPwGiddP#z>uvLuFV0lq`cx~}>kt5oo3Yg_sPhx~{MYyh zcR1N{QUi4LHqlbnA2H{^1Fzqds!1c78vhHx24PO%3)$qb zWz2LjI6dZBB1Z{Ckec4zzK`0GZ`M5)=u;hyKEbmO43CvIh$6G${`J6gO{I#9<9qHA z{ihzXJbp{@d_W^&v2he+_i!Ii|40A6oe(3*Elvq=IV1{8rIl+n7R>IN#skD%V22~1 zj46>Cw`r_(*GZB?Y6Id3_Hk-iT!r`s5);oNX74q3`%-8X1ZB6L&S29uc6EC0GWJre z0tK&+vdLhc18%?+JMv-_x>*W0O3828!lRs#P62^T)yOtQx z(o!T@h-e=X$bR7s+Q=4cdw7!b{^aPannj*RIV@rm^{ViqUtixZF{=_5<u%oFUn&Hh~ zqsk+#0zvj!1svpX^1)a?D&;S8oNhTg%!vn_s#&T=q5QAHoyUIm8P%7-nG$95&mDs% z$(qR0PaaqoS|H{9@09S0a}~My{wx}sNWdOg|KeGY2|R%CVt_Em4EZ`_RWl=2a(u2k zWIx3{E*$Vw7u;ay4r=*m`nCS^}fR<@5yet_-q?Zr{+U9(x&*(3R7*@p^Uf9O<<4&Q3ekMI) z9usDi0q=0ftG?c|_PkiVN23(S@6yeTD_62a7i_-y$U&PKKQ4)uq|Jom zTC7$DbeNea8HscnWPuaP;@5!{fIBYbAz$n4#A+^Io5hv; z(xT7`lUwNKoy(o95Q}30)g{v`GVGqjGyPNQ#f9^~4%sqmb&=_O#IRD!s35Vk>W_H# zX*46AL2V{HEAf2oliNKU9}7~C{Ovu`0AIsj2E6Q_q9d;z7{97t&?CR?!19HRd*ZIr zJ~>tWItaXzLRzr+68rZN$WwT#B-(DlX!mel*@-(|H`{ylDi~37L-$77Jz)cixESn> zs1-m#9Ni0zj$k&o8)zNi?xE<&{5HNTMhm!}U!mTw8bG0bBD)MC{pJSI2&A+1Nk-TQ z#6@;|pTQ1%z9YxP1p+3Wr_{bSBVtd}GTf&U%zHO)UPXHgm`iRMM493Wrxp*2im)zH z81DfE)c((QF`r*+Wh8Ch(2c|i$!6RT(Czq zu8=H{3x8oJ8lV5&{lSZa#t}FddcZfWr&bSxeK~8*<>Kq++eZ}xLSSa0@ z3l}=-gjPoiw}n+qDugEpgI|I*70IT2K=|vn&6RwxMt#9%(BDAZlWbk98IU+y zMUnWNX2IcX)& zc&1%-TS3dXj%80r7`df7Ha22mdfrxc^R_ZTAa;S#VPS0Yzl}h8hJ?DI;6)*$R;6(aMfz3JXc!g?S19$&8ze9y>lZ|2mof=g%}`&tnDg$b<)>M3z0ym_>d%);=fo1((=9()zr8428+H9m zc<$E)X^x&5c)IVul9ZwVML1S?js7^II2b)*35xID`$#>yRb3vCRtHyQ!U^5uleo}X zvTQnZ>dDVIy-m-z%2@o12~g`t{sV%*%6N+ouyN%$A`R+UWol9eA{OC?R@D`e6SNtj z5eyqHjRLJdgAhN`;?E)sJ?YqoAT~b0by~rA+PB%`zB*in#QAn3A?l0R2Kd!CX7QIR zPd)am`|=Z<9EsYU(Ge`(f?TrE8#=f=8J0pB7rIy_yJXOX@*S22*4xNQK!2%xxtg z9E!{SykzLH-}d^R%w+IriY>?yyFzb$gv$F~_zY?T29CzX8w#(+J^NNh7ORQt&eOpa zBSaxW4273ti#@{fHcN1p2^|A=ks)XIkND|=1)}k$W9SopPj*11y0Ylh>MwQBaG4kP zEwX%*QZ12mO!oV673_8(5Zqj>M>t!ortIm|A!0c@8qBSfXm3o+{B_Zi`#EQK!XB;p z>a3;>ShU7DE|_g01PeulY069?E)*Y{;1Bagq2`m|jDEfot`OlGAIt5ab)^p{$v7EQ zn5owf7k11m+W-F5f`iXiOYDQX*B?T0O8~fmS9nYR7|RDDJ%}ng!S=~hQ7i`yf>&`r zq=!zhUdLA)4_%Z9DO)}!fdIS^l&9^RmJa!B7TkranE0|Otpqdcpy)|0U_*W|?JuI5 zeQJ04yY*tVQ!2s;`}FZEr*G~P5~y!FgaLK_=tEKDPn{r}xRl)uWNeAsIf&G*7C#OP zHUt+Gqn^p5BCrfcBO*W>Q;7uWR}n~5HVRqyuL&00AB9NZA7CTgf5w87AX+wGBXd$kaqonyujdwJ68^5Y6nxMI|VibBFA(>?5(ta@PHR$>R&Y zN)I6NS7l$kim$ndZu*gDg#H&3k#=DkmBRQ$O%)a4ZT2%-)Db1fZ+hx>V?=*FYI_Ex zh#3ZMfs=MAE>eQoiuiuoJBB)}HTUnbftI`&A9PC_fE+9!=qte6nG4FGl?#m=s6XDL zl$YCaa10HRrd>d%amfso3ftJddoub_LPBluw%*BLtBn%y?16BWbvbSPczr6Rq`w3k zdC1n&5=#f-7utFa!pj2vGpXPu5MuslW=VaN9vC z-s-8VTR#@f{;Hu%3URwz{SJ%@0WyC$^|qy5&pX2>1(yQc8*-^}e5~z+fc*TgUK+{! zs?3(OMYu;5dh8gna3K03utKV8DcQyKl|a;LEXfD_!DH@|SR#2~LqO-=18E?tu?2;v zPokCa*ea<%dpxG`qlgQ$YA@h$Fn*#c0{-zD`S7wou$Y=5Lh4V8oRW6;XYV@vZG{T$ z;{m@J!8xsTgRt51X#O?#Dc^#cs7^E?Od*`7fGj?XnbMQj#bB(;_baDR9K0 z4){TdX2yjCM;VW`zHAY(hDPMZ?@gcOnU;l4xH#&y@ve2dY@nF=n{l z^%)KDP%G%RcyO_%!yd3!YpB3M!^E$YFMmv-{zR=^%_c^-%^NhqKRJ<(<6LqL1)|i% zK;xj)Rk#T)C{-Z%S(5W{3aLLOmw9BRiW(5mJ`etm|2jITtp&SU%poM;5v>fvsUzVZ{TGUJg4XWXNEKTVfw?lMi``4?MbNSbvo{aGNUJMl{=3= z?LjeU?l0llH!uDOM(h{z(bk~l_nAtoPtC)ae(z{w!CqKap3mttzK0UF|MEc2B$}s~ zCm(EVteE!3zv3(_BY%(jj-96UVeO8(dCmsT{m;Ro{Q$!O_ulNUs)KeWH3M3rz4e!K zu-VBgF_0j~IY=EX>H)>lZy5avB$oEiXj$jCG&;C98<(fJV$H+%lVAS3zI{CMhcLJi z*cW~!C_m%Me(GsRLa3WW&gTiHy$Vu{>B@|Z-R zpeLDv7MMu8_c3?S;V8gx=+j9=|WJ zRbr%c^vSOlVnfm#^ZTy&PAgfd*Q0&vC+Rr7?Tr~l$N*GAQ^QH*w=JPTnlL^&lU5b^ zCHv-u-O9Ucr}miy5cyFIc7Hz$5?)^L9B@~=wI*eF%&yJ&J83D#@OOm^?+srA*X{Rr zvWG3@Mv9nS9kcUnOP}_;Y6=a}Jco|YEF}r3W$uA{(m>|il75&;nt-SWG``-BXH8=8 zM0vI@bZ;a54OY@j?W>~3be)a=GL+gEiwDbg`z!yAvHneE6`l4UkEk!n4yl<8~>7${x8VM{Es)Fv2Nd($msw2>I+OrUnZw z7*t}@lW`SdOszQSjL|nEpUuChj9L_T`^pAngNB^FzgXIWp7Nz}0xXeeu$tiPhD@v| z;q+h^wPybB<);V11C+S?DkEV!AK&Pxzv^Y;uMGRTT6F(?{%B+flUW=8@6AumUi-hw znak@V3V$E;1pFEaM)`+NW`LZ-{SVoVrnlwez()aS%b19Y071C~TLwR*!U!_k*T;kE+cO|4DOxj?|g{P&w}SH+_rcxv!(puZ@wYh06FCJJY`b@P{Zdpr#MhjS!-4(%73a> zqPPGA$ex!4_q5R9B_53sExPw_ra6&T*Y_-7o?x*?aUv9uv?&W)&e*b+z zS<|SRP~F zZ59uJ&H^q1|L<(AWv=XTqzqq^Wf^~SQa<=ll+biw>qnkR2cT!koCLN4VF?7&Zh%b0 zn!vzk9eHq9zp3_W?hB`SOtpPxsqDb+TA}-xWcr5V@oV;mcwAe9)Y9R#V|fh?fUiUd zWGKUZ$u4;9MS`W~7Iu32p@i1Q@^i07gZ(|Fs?!bd z(mMQE`?gXI1Nc-&le`V{Q%$$+_aZB=1S&_}T^<`~ui-U|-|X^FN=swMyjO%#}N}zg2IA$^RDucRT|&b zbzUmwp!XK#!FBv2qoy9YL}s4hY4 z*a^PJ=e2)CD-Lp{aTBsrL5^^-j;LmAKZR z?oTYt*I6;V2<^o~=CbC^-|=Wo1CW(E#((*A6#JKjFi~oj^IhQ@P6uYxQ~uUpl6UxAZ(QpOtDT(`+_;ROwFUWFfsheObHnMXy~PMv|a{G9F4pZdg?p zu0)y1$rj0ArJ)t3%IJnK+Us@S#yaV5z45%09m_ouRQ}6;p&^f6iIE6q109NM6Lzi) zEgyZ^oUD6@?f_H1laJ$1vU$spAb+9jPDPJ}k*(|3FFzAiyd^m1E)|TDVGykss$bVd zc~|piKtuY{fpVUZdHqMF`5}M3gT6JEQ+S=zPs&j>j^}Fve+Do5bmmfO+i0X0*L{)C zY!H}^xnzlN-vT(mfw^N0U9%Bw@n}*nE#&PXZsyvHQd!?6cc3V(_@QUu?z%Gb(iG`Z zWarEr>PqOd)%|5ZIs;4~*oC;H5kCy+>$776xugWCQFN6^3(jp024>jGPLu`))!fnD zc?}{nR}QQICrW#5sRHTau;y;LTV500-v0`3Z)KxDcshdY&MjTRZ@-~);yI1rD;j$= zM1F_}d%*+%pL$S9d9<|XbAJ!J_b+ZF<-ENees+}~U~9$VC*Q1u*z=!f_+Ilex9^VA zq9<#7|1#8erE{upJ6&sLaB)_|U9C9cBxS<^bsR_I`eLq(`O2-D+X}%y3U1mh)jm%B zdj-+{h+Bi+jFeN${q=TW;jrM(eXgdTV^{1!6{89(2HevbFOQCPPXg*wIZ*ddKR(fm zi{c??t&DgFj|wgR*kT435yE2=;_K=^toY__<*EjT0pvc4aT7A0>&5zxLIc5GyQ7<5 z3@cEm98?6%-e0?SP?8*K_KD_s0XRI2Ml_BP?~^;nTfO&A7dc6ayQC@bs4ev0{qu*( z6xHcKgK)}~3#8!18}{A6rjMT}P6R@$IA>(7T}-bwzgL?W5g?L{G$LHAsIf)YPZn&( zoNs@Rq+o^*PkZ*+_D9^CZCjRtj2&Jh#&-`U1!hfwW$y8yYhOlN#KZYv?h|e9D>69z zg%)u@dH6ST1~?B)B63kbjEE`iDMUK)YlQA-!MikC=q-ug!}85yTfHoR+Q2|`drBR= z!4}g`rTVh?asbkD>kt;fWIAZNRc#+mOvC}Swb((nUkGSejLt-tQY2FRf&gW3hxWP% zdfsJQZ3ySK*x_Tyn@GQwr;PjyYO9vRX+RcU({~X>o;@_gs^mBI&e?Bj7q{+?F}-Vh zayWRDDHHS61|Yx0=>X+&JADZ+0))BHgx@cgp6@Z?_orkhPG|##M?a>eK+j(S3>ZtcC8%07 z6ks8J-KRVXIBUKsjE3SjTJwD?m@q>(t?36rF5n&(klb~Wc|`B0Gs_Bul{6^W1QstA z5O^b7Yj4|di5D&wiEd)Idn(0NI0#5W%nP9EGV{wSxyG*cgZV#qQRk|gHk8fWWR2Tx z(4&nfl}A}RNl<7Sp_dQk-^$+l7o2b50(0+Bw-!o#ddb9|#%bPhECJ>{!oh3^OV4-a zdhl{C%Lg@|JeOOg{waMC&jBN^Fuy9?sPoZ=Ke)xn$1jmi7vBrN_9bFU3&96@yUL9o zCM*h`bS;6m&XGI_Y>EUp4~51{GZnDvTgtWW)V=Lv&1sX&SppW>dmh9+Ck`KDZzL^o z;@m|*IT_l9=H|j6wo!p67em$#4EFoe@O$5cwFI)rk8$;BU=k&8$@LpGUk8a`6`)d3TCMTeG8gmmD$uCb9$Gy5DFlA?~l^Kq#A~2UcY*?3MB^I zKHFQ2dGC-uHZT$?Bn1+7=?n!OxzR>gGlRa`5{qFE9>3D=D_5zA-)C7|D`c}75{(D9 zAr6+bC*-1oE?s2k4V%w&!WiAwzJfIFV0>9i+*0I^4}lJ&#)AXZZJ;5?3kVMK~CF{{!p{+R!+M zw*}l}&?3;;<2>i5wJSGY&UdxZd|R&0!gFI>i9~_NR(rTzmRpSm|LYt}zxr&>Q z=8F07pSbbqW?q9A-hKprw)5X3)px+nzt7vf#jYYU5@Fa8!-1G>#t)QVWy+lNq`_h+ z__CzZ%o7^Of8K}XM_J*bV0MRjJ5AzwrMy5qKTHf`iAY3}H}#Di?o~iR+#Ll94U>|@ zuV?_wib>{Y#4&ZC@^(w~h`w@f&Liarf*VvxPCyIntAom(WbXe>2cq=jTPUXQEpWL# zY?lRJy$dMU$deD>A*}PnVH;)EQ)y7o z&0TtKW!}k(1?O%F#aU11kz;?@pqx%0UDYs*aQ0s@U6wRJ)Gz@M9UXDgM3LP%_v2&{ z3*H(tDG-%_-ZA_rOrFd+^7d4kgLWw1RL$GYDcj*IWo-Z`FlWoVKaQgiIKgeHO>+IdXzf1r{QvUb1XzqpoNl8~!h*73Qei|>A1!G2B z&58g-%b4yGE%6^-jWWZt()|ysCxzK9wwLL%4jNKUJ)dn{(z9q~%n%y|rG6U+>99fW z$Ur#F=}Hk+8Bc>p^(ddJsA_-v08RA}18eus8jde$t8)t6IKeMHAS65i>TeYINJyyP=Qz=oMo$RvQmioDWmw>`Iox+iz^D5TI#bJ}2#|@zmEx$0i4L(4{p;PI14_SaJo28kuAP13v2}dVda>khHlqiA?wK7faj#saDOpoXGU)I1yS}7T~66-=pyoy$bZ! zU9xXoFYMtxQj5hjORK7E#;t@5uTJuyRywXIp+IXkCsId{>wt@>iewnxlm8aFy=Zao ztI@d8fCh~?BC`Ua($T=+ng~>MIGrdGuXRZBmFlw-EUET4aL&yCf*i=$^tXEw&pnV8 zAqm?ne=^CASfSi20$g&`Ml2mq)Ku^KWO$-y#CU?+?t_g!s#Gx`QdWOnyE@23m5#^l zi2dPXC%w^R+40X?%EqIvanwlF^5_Q>y-&4;<^8D+U+g5~WMFC@{Ji{;=Lrg_W>*Wn zY|mbzjiPl9(~D%e_}}!~DiR~q1jLSpWtb`%Xlsh_4bp%fIZXiP(S_sxMNG9I{ERNx zWwwXcUVsd>^b@jlTJ5Lnp_{{yt;zluuLnNGeDIlEAbTMDS;0@9@(R2d4Ni060S}Zs zD@fsih=IZp5WpC*$aQXd(QQ3$4>xm%;&%ZTdP3fa%$uGlMi)3^u6+_rVW+r8wwEed zF*39T{HOdel6e+u#2;g>{B~{LraZay0w-qm9o*2n zDZuGw|7zo@ErUjDeuLhxXy0F#<6~V}s8O5c<@69*_7CG}3sqt_Qg0E=e>x+${OP(@ zz;0Wr#;29i^&tlKAQR-c)P+$E4(q>xk-Cpa?7n|4D}VkX_Xu_=@N-fnRN)oyQCK0nc8-+@9mh)HINvEKQ@Dee%n#5X{y7WzU>aOc`+#C=C~#vlPdZ zfGh}I)P1_HM~J;n+PBZ2I9a_9TEcF>X7tdrTkCDR|3#p3ddnrrJfPGPupgS+(Y+vq zxYZt|lX~S*k^7hn*PUO9Gfo2-|b%Jg#n$GZbN6gib5Y@xS<);SBbFTeAc`8(V`BjUGOp1X!-ry zeBmr`?6QzToGMZADai3UgoIb~1XKdCT*N9nppRnPk9|UABp#VZ6!p`>mUWn@gdi`v zy}acVF_7m2bL+=0YL;E?TzqY}vrPhA&9Y1ig*^odnYF^t-ti_k&D{Sj1Fg^<7#3)b zESbEA&?fb-719hQ9z1Jxhtfq8WU@|2_C``4S7a9-QIcUA_WvI!xiP z0TlJ0KlX0_Yi(XC3}s;H73%lL!&ZG00H6}*W1U20u(@!=q;=^AbMCLr$}bUVBfKzCigzOcuz$7 zMbMB9@-cb%{N56U656{%Pq}o2B|H3#-F^3%p5}pzKuEG+yaujSCii6~qaFv|>L*AF zWNc(@CYYxh#2N6hEBd0y%a6rPxT$T^WX*tS({mQ@&vjC4E(?KZB$QQ2vrDOzfs@?gS z|6s3n>t_+Tz#A)i)_)CZ+b$pu%DmJN#k_!0*<*%_>o6jxfS|MKK^Sc)mVUwWpTIeB zT#?%l{-K~<=x11>umN0n#xGYQ&xoerE4nob({OuQ=9s}eP7et6#ZpBudt)iUd6%Ni zC4U&?89?SdQ%AmKldfDY&Um=kFS-Qt{nPf&D=h?vR4`KqqzHX@>t@eUFNl{YGFlqn zbO2!|Z-jhwoZH?zVY3eFrj+FI% z_&4B%)A?UTU786=b^&$7$-_%{E3{jKL;H>oNuyDis2UmMYj@CH1c!TpzPbScOv}K* zyOu&xjEO$Miaho!+^GNkDH{q%<|fKIQHIW6t`aMluH@!j@bR>EJi1q{$I5BA$ ze_i|Cy3HUm#n73O;!aPw@wZ?u5fmG;hl*9SFC7m` z1F*thhd-aRJVgYiMf)dlK@y8@2qL~Ph1qBlo02~omqy}N*@!3RZ={DR;y}NjLjsdS z#AIXq)C(zVTc2C%UgEgg{2H5SbvC8KhLYU2``zAl(WbUCl|UwjP_ODSa7^`8J38)X zxGieK9=Jv0xfZ{B>xwyT2wGKo=7;Q**&q%i3UJnZH-kES;p9 zf&|z4X@Ng8zubOW8id**OumB~5qPQ>@AqH;ay0qjf!?`_O=`v8^+!jh*3yCv5bDG* zd3k%4qzt}Z6HTlpZwJ_M0Yrg^HysWK!?K|!rOlWu&Wy>c%uOlQmdzoLTht$DH`^+=O4at{QJF0 z3QxC1F=hIATO@fzcC|*&$(b{!f~4&$VTKKT5+5tL$b+oH3g{xzOo!3>Ul!aquvs4tLHde{_Y|G14JLMc z`j~fxAj(k40tmte1bbfXa{ky(Z1w7eNfdkHFUpz3)PmLYfE4>YIs{br3zPTnEL8Sp zT({%}q-$+FlH>+jGh{f4E3;^io(4A%Qal_f-!&fC=9l)l+g$ulF!ps&K!R29(=@^g4;$viy=1rREA4L&pQ)_Sz=pRueKf5vKIpzI#G3(+KQoYv+}R zoO^7RQ?C#Qtipt&ShKV%1R;a`OrF>~da0aNhN6-TeRw*15QcClLq@V7S|H{}V`68k zZ)ujOSf8ZG5uFhD8g;t_nkuqLq*D}|oAO_WxM-lkSm4wOUYa)6hCvvtp4^i_dt<*T zE1cjTWZ|fF_Dn!r(wX0?9uN>$wC}Qpv^8~4g7z-+EahSD8-44KAVo4t*(kD{fpcui zO;iW=RR;?nK;Yj$pVTM%d9DoCa&kBbl}_teSMav}W`t?cGDwB&X50-$EsKut2QLk| zeSnCHMIHxO-R^H*QhWET!~I)07<}Z{(N>V!%z3PYSEj%IYZ{cD=d84VhSu2sEtSZl zd2=m={f4US5|vrzqi+x)F2~cwg5TuAvN@IZ-DEmS&5dki)A{TUzXMKHrb1MRbo4e)qDZ-Ujws`^>>h%Li72g?}St zWN}>guD#q1EJ4TDn--#lX@?RgwC}E*CGyM|X9={+)<{mAzR3TKQPfT61fu^R(obhT2T>lb>IVRQx_v35jmP)@*)IjGvLHl5QrPa-=`L;#2)U;c}dX8Msu zJ8{ZMYFq(*{+j~us?rGy3aCTMgeN4fpJ(*I7sZhM+v4{i&)Q$H!9M(I&jVlL+Tp@| zjeV5;c%RbYDBzbAzSYJ0E-5I@F~2inATdiS=q*|@f#%c`+$HB9>7(Ur*8S(M8SqA! z5T#lZUgq>C62qTYUP@}k>am9!fFH19D1YisTe9CPQgd!{AtbqjaRXvv=lS&#szC@c z37cKY@q~yLMHwKyM399I)Ut|QvW*Az4HSnWa@avmDY++P% zQfw;B3y5yl0Y7%FA@o)1`G3`IUWH8-_EiQE`f-6yCj28D+j00Z92lIjT5xSGiyjM7A-zSFiP zs0|!F|MGDHJPBJS5lL0ASE8dxXa ze_Z_Y@a^fWdhjh711DyDQ7e@^}Q6`8SNsFsTy4EAxJQLmg zk^y|4A*dA^;xaNY)}S#Ertbyaq&p>7hf}PBe#dA|m4&_ddYh}NJiFzg>z~JmvGrR& zm8VVj!Gl4TWi;uJ!A0PgWQs=kW>4aHt-*Ls>2&}SE(m*J-)3hM-zI+qfw}_i%!l07 z?%S!RC`4Td9_SQ8O_=? zbK0}hFnT_DwqZY}jHbjmO9#z83}Tx;bX&kv7o>s0=EIXs(cgjGL*KTWvd?E@x*L}1 zApWdQ0jB}?@KY+u3W3kZ|E*D6L?v7EkzkKKA;lZtZw;}>CzaU+tpy9F0bd!ut$^Gp z?w0<^PrfUz-F-Y!q&bq`c2k70dQ!wfpDYgF!BAxKBp!?l7$cU#qe5f3V+~3lvEV^` z8Ndo$(h#inLH}xG!D^aI?pn|!TQ_x|gYOS8dHiqv7&*KE6tOSxiuW}Gi6acLoRN-Z z8lT&(c>We-=(0dlfL`SSWGH=G<>k<=Y8tg*nbTi<@vM4a0H<8Q${7bwO zVR1_(W(wS?^Ua4f1NU?1tX}4{-@pb>%E09 z?4GLBno1x)G#3`m76yEHTke3!1PFm7LN%dGs}d47sZu zXfMHfI;aBOZPk#zfV4CT=cd1B7gj6^xMb|v&j zqt_cMqT?$JhaKG~hd8p`?yXzi^cv@|co4Ow%OHLcOis&^a<#{G)&Jp|C`5eT$zN&J**XgdULX`71&!z_+1lhBDu-jb|$$f8wj*SFGYHy zO5~0*dDY!3O$SD^tK{vasb#nIoF#0Oa=0C(i1sqS5zf19p2hs|V)Tqeli1|ecD|kX zhMh?d#PxT80q!Z>q%*Qr@@&KWC*S-4U^*%S&V)wF#z;xwH5 zm6C*;YFugmee3hrp#ER=Y9FlP7O=`QTm;V@imQi{+?W7y1{BN!RHCaBenhS$!iY*R zL3dt{x)g^KxgXM%$VTxU@4Qpz{-8P$`AL4$d-MGRe z$$YCni`_}Y2DfojabVd&l20aK+$vSR;pSH7V>tpX8OfphK-e zAkYwa&U2Ri8XzIij&Vgdn;*^8Z=Oaghlz_6Io83R&|MoshWIXXOmc`m@@mTv| z{tF&!L4cyq{pe?>pbmR^cYTjg*S`p}5T43eT^1B!>LMlUUcR@T&`Gv~I$^+n_0xwE z{hIpK|9ejUtwnCuQMPt`;{Vs-IH4_y68`3I=WLVr?ud}YH`e?+L((rc?kMQi)eS#u zK!m=%Sp^w{)LXu)BLBxpWK|1z?8gTqx#edLH1^9H0KRj4uJI&9TbR?aehM`#F<^=F zzB6O72yzvsH7&xWo^tJjksN{oKOQkX89hyIJox-w@qxi#P)T;x8y3g!DI$=A&)z+r zd@oaQ7alSX0&f^nli&ljpjLZnQ20qsG0)u#>W_I5(LrgjVMhU_rzoz`FL{tEQ@qG18{N)f7D_kb4w(z#r$S>px^*54H(; zEfV#uH;?6KCCA6=*KgY_HP2^L)eXIcT4zqIw-{+A+p=f^C#P#{cC{dq2h*M6 zk=36LA3Xtl!$Fcf*?~a#Da?R?dW-N?0$(2z3W84&TPW+&(~}f460!?(OSlWLkjU17 zSXxlWQ#U(*JqRPDkU52*3A^rg+3uqCH#9LHPJDRJ?6$)cE`Uy&3T01!>QJnvT0vBOOsA8i3hOPD^FN6TZ_|pT5}BeM zO7?QzYAllc;o(E~Yz5z)#Y=G&E}B-!qqDPWYLkqh{w$D<0zTSb`K7Dx1cKne?}atK6|5;>OhOR`5yS8A+}>} zEBLaXnagQ~vxg@oX4U;}p22^M0cO`1<5{^U#tQmwEPZeW`Dn5blAr^UIM?IF6Y>>s zd(WE`Kwpw&uirEVnukbzU1Ru3!cc2)f0?zrs&_mK`?Y%J>G_09I0phW4S$EL1rrhr zKu3C1r1#b?UW@Rny&-EW%Ho}YM;6D9>+$l7QgJ_CxLt%{xAqo3B=WxvT8VI9O3S#NmIm@zo%jAjvK7UnoJsW#=CqA<+4Q_HM@g zcg>=I8|k`e2{f-fzAR=(qtslxf9WH`(Ug^Xs!VQX>-`#-T&Tk=VLNSAVq?mMQtRWJrLiGh%3pv2tN1x+B^eZo>K}y0nEDrpoD?emVgZ@nZbWudE zYvxSq6_}@N^$}a*-_CSvC^1gg)os9-?m8t-Wpp-P?@gB{jk&OCN!|0HuUGMO#Wd=) zl)D^9+I=al!1!JFAFg@Nxi-CSy3Dt%|60DKs0NT~dp(XAGfDpl>Rd`UwL2JO;6ek1Hk z8z5p^z%4}yO9eh@`Q|>$I(7)71|GT1z$Z*9V9ZafIe!OboXlkzIu68JhzeoNp$ZpkFr%Yu6p~o!y?W@tWEoJ)NV}}3I5|Z@>`MmAiMpI(&N9t;iCTjCpd}v6? zfh>iyv@~05enLrjQRLhN^iccIvn=7`_)i|hKb@yXho=AG1|&<37%S<>Q&|>L&Eb_l z+?mzW1n0?}DqmTho)!A;KOH_r!knIa1kr9^j#Byjo+N*XRmtYJ$Q$<%^HUmyXrOw< zkQA$Euo2{X^;yrU(FQgY=jk-Cu*ZLs4wH;$c5~#w8GwJqSb5w{5LBe3q1zFa*1GIH zS5<71>Xz)DLjr7QF)@*Lb$l^z?#8PO^Z?=}j6zm^(*h>6WvsZ9*{(3$OHf)XX)2m7 zzblq_lNPo4ro zAK*s+Zm@0*f9tHYqKoM8;!3VldojDN^antT#svI6ELeFmq=xXh|K)MCb-+0UjUo(9 zsW>vC4`(%)A{MLpZR8)X8qt#*Bi4scv)rX@Kt;Lk=`~bhrW)82^%NG7eNn+LTKI92 zhk06#xJad7x!^MJ^8$?&N0g&vb1r1OD8POs`rrYbs1bAFiO$d_e&c2Q5VzZ49Q(jx zGc+nZh^w{&`Sk;p&u{_f1=J`Y`>wFLG-OImWL4ew+PB4*P0y#u(Oh9&dp=4XZd2(2foF(XxX3xqs9f@knQs&zKkj z1NK3MsofZXpeIT}(qOS$ARFGJ_quvIQ~i1Qw^z8Ac!rQy?}#dW`{ct}VCA~#OkMYz z22_11H}E=@-0@q|I(rh7WKx)D3;XdMlCl(!9tkq{7sYrq!yWDwG4nDCEfSKzm%bD4 z0pIjdE1&LO=iNq%mF6nxeq>HAF1!dbHP%%CONVU!A4z8!*W~-Z{cAyYBNC%Kr9l`7 zN|yqPASkGGm((^&LK>vMAR!$pO0yA4N|)qBx|Oc&zu$d7-;=#|y*@jy&w0Gx2hy|J zg+YnhtWm!|L28Cy>iFuw0sJ-4a9zrk5Ab=XEnQA<=-z|!-GN!Fy-(-7@CEV;8ysls zaHZ3=p%$WtK~AZOOLYQ2RfEbaBDSc;L42j*YUH#aQ@Se}J8_MFxSkjt*NZ2Ghdd3` zwL9gHq+%MCJ07Cg+w_Agw7$iG%uJR!2<)|ytV|Dgtc5p~b}h(FOlm*;i2 zfqJ*h|9)}obDBBfq1(!rERkQcjow?EK84c;uidMSbBQz9#GC& zGQg~exk#>+xygW9@MbZHU}HL0h=dZ}16gT#q_g7$Nw2NCtNWUg9ba3@y`uj?hs=YK z!-WSP4B*OeAkM9SQybZ93SdUaN% z%r1Ero1h0*CvyC`4-pO91I=YnvWb&}wRw;>pcHe@$0rP*0pff6O)^WM-+{UA^#=_p z%zCEHOm{X4Y^D6ahYp_zeTC2g3qg%WcZdk9VrERqpG)$BuVOuC*be;y5zy1h7O_8F zU*g3~?jy+!tFFbFc8HSY3An2FNqk*J@{XW6$eK^P(zz2+JQ}Ye(asAMReWy+jd?o- z9CL$IK2~+t`eH6A<$7c(4UBv83hU}t3dk!;++W#recUDDG0@SzU-H(?;W^nX1A_2pB!YyQfn5O0HXU?Ai-S>I_tU>p?!?axT7Q+1T2d8-B0>dk= zrRzID{`i504IOO}4J73(0#1v~`c}eSd(hjAKUH*m26GH~!*0(!X`ZxvcAY$Yw`~u1 zW;UGtw;}D_Q`7(a;!b-j9}(gPUQ=xUqbGLUl`A_ubJy|A6HfsT!Sh>b#(d;MbgcVF z0X5UbE)}QIAa&+kO@34!1aJ9REt+c^(XH>w40t>e{ zh3II+i&XwjWr(OB8LJ*(-x*%1pN2kY#iBS3%$Ef6tJ>Ua$l}NmTvCW6*)@T)#WyY z9828`APGn6=Nt!_rxYeHGgJvmcmLfNbLCS@-=kIWA4ZftMMIT03z#zH1CU&n6b)#U zQx1_+ej{6{Fz7OG{RpS)!?7&W#KJwPD*e41+;Q@v9^=)S-2&rhbtvfCZ`GS_=W1bWz2=s20_!`IyN|gPI4@;0-YBtX}hG0IBo*&o0U+geHE` z2gW!h-zwy|oq$|twGjqfy33>T%(zSmo1%IxJM_M#7i+$2<>oO<*($v9=lVGL`0~0y z?gvBEZj{q^R4AL%s3Wkq#RXrc2OTi7YT`?jfgqAez~Y@KtT6%1+nV&1LV{dFi)5iV z(HA(+YGzW~rs$;86r(o?3qV-!I)l`13xEw};YXpM!+?Rc+fKK*V>u&Z^tG5h849da zSxPhh>b8=fH0bM*TpqRj`ZZ(gy>B!F>y>{U^qr}9(!5~V#I{}k?+-k=<_%$iDAr_X0evi?6a-Jf zEnDJNGaR+}I4MpiupgSDnCwot>j`~o{vc9&lZ;Tj`-;OJYL`ppG+vlS#F9F)rXmLx zHN0N*IYrC5jS9ZNpp=OUB(SdqwRET^-HuA`(-c~z6zUTJiWd?N4pWjDqnT`$Ng#dDD|AmF<#-JJctQd&sn);}W&I zzv=r=oQuJuMp<$el_|AfYrD76RjLZye-iY3p_{OBU3?*sA-@8XN(ajPj^H?(Bf z|I#jrSMSg8H0xLMw_#C0*zd0ug^#KD{n05xV% zh4?^mHLUeF*5_(5VC}=#T^D5B$;aSy(#=VmIupOV7PFAvfiL?tlXW=ElDLz#eSb8O z*3$x9-m>~^36XLP{I|V+)8r)G_i|r3wZ?j86oZ$^QwlYKOkAsPiRCJHt)@?n#S0LOQGw5I* z@#7#WfF09efr*EKY+#c4g*LT_z3U|dw%VT_WA7=Dj+X7q5VO3bFJb*pm1O2C(PVgcmfPDdVWJjDV$yc3k9cQV2 zC*fuL3;*gH45`{~5W5f2e?RhW*DW{FMYuDL2=cVG5XgEZ57Ip9deIOVNSH2BJHqTC zY(J=X3)~M5c`^=QNe;7bCk?2O{jA6l{l#}W<%@8?twju`8}-`=5y>e2IO4?ICtSV( ze>Ugt=lJr;ao495Uhimg3=<9?p(tvrNfPsfF~zPL79XU1rMi>U&e-!w=D4%lFBk4O*i5^B50bTGh1s{jlGe#mJtloXQ9tzlh z9Oo&^DcKZ~2@%Ys$H;dghbimrHFD4lLNtbSkv=B0)ZQ&9_QMA$a5G^TnQvw(8x~Z? z^bnl<3za&&a3PpiXLzjpb?)|*1r63r^E8lJEdB>z#0%2h=yvEhDCgXCBvFk6HdqzG zQmcM8rhrP*hWPoJG{ry^cCT_t=$9OoL`WVn&Be~C)< zKz0Gf-Z2&SIyOpnD}P_vI6bC z{fT-Y$Y$joZ&-9|fqq!wkkYe4b&){& zOwn3TMAwkARyJY@tP85P9@mxuBJ8gcrH!F>F(d#b+4WbN8JcXq5(e30WG7XW?6xGf zAD9MtZh=0njvC3B=ijGP2CTOSlRQdekmsCPP$`E(VY+Io-xeB{{}!!)-z2(Ku;`UJlj%!rejaKBvVx;GH#b;=OR6iM$YK~#T>A0hS1&02vT zh`zg~10N#fid;RcO2rLDJ9!QFOn%LLiT~k!&!^;d5k&(tkKHa;bMYIRwEUM+N3&Nu1SGg|B zgAIY|b3!=UGm|iMt5zip0cSNRbLT=BH+j)q$c{|(jSnA|043k7=O%flY5s4HiMIWd z#OCDG*z=HV8x|xqUC@#|GTWS6T1Euy4W)e3^o@O+@cH;3?Qg5c6IYRx*Z~x6g4WEN zpXqhuGOzW(n;xmQ>HUT%A>l0Z^VcWNa46haz0xM-2CWt}Se-1RAP)J>zedVI&(rl2~k(yz(i$+`BGc8!yh>{)Y* z{@1H){16*Ih7S4Z)@UAtx^NX5(`oIEA8ZEejjS0w^JIW2#8&xFB|JSFANJDNv+c=W z$2c?l0<>QBSI^avwM%=U7Pw<2%JsYhb>d5QjY0=*uq0i(=(i8FF;`v7L)Xj|rRBDJ z2hEK+A-!ipN1}C)T-5O|EbGvlri;fOwJgBh*IftuPxD^T_|oFFdyv5%wUNnA#OWac z+tlUbv21m?krvClMEIH!l@Xb0sYC8E-nU$nuoxb1ln7@WElW8s2Yk#&e$@<`eyE?& zTv(CJCve@9Ib_B@?=v!&Ey??FBdg-VN4ia(|Ff%tPJsaC07NI%f~YO#S5RLW(U<_s ziogpz*0;h8QBoEOd&muTPoTMtybNQ_NLD!De#y?X8`S~)Hx+$d7d!aGQyG*-8c35z zj1fg-DIWG43;w6})8GY|>Ft3JH8POjxE~0UU}4f(ZqudXV=(NSdH;MWnQEqJxeJUA z`}bvXj<6aQDZu^FThlvVzeUixrQ@|Xhy`T7K}Xf@(}9DZ%_2_2(swNVR+y3(4n7m@ zPv|3Ezxd(4O}d-+9^90rnPFa6LL6Ix5H)_os6PK8@e=MQWcpXS*pnqhzSwuKuT=Rw zg#r~nUHOr|wd2H=IiQf#E}tN(We990h;1Zo>)YeCk!3BofXbl?UTW#DZ)zv;dg-X^d znFMq4OLmsr{u}!O^E}Qf#L`{&>;>pk5 z?%P|+Fmc|_zr6A30eSQ$6>sdGtW4qTe#O16ZK(_n;H_RflYcV$dmKo;UpV+)L5sen zrS?NC@l#@j_JjE{w?xF=+XD2Ps?b;I1^BFjV*|6=p2dKYks4gCy?DiyQ+8oFSzm%g zJLdSy<4iQcC3^NPtH%`)jt&{o;!xH@X8c_;&J()jfjpl}7LTm(fw^csWE2}q-~kne zpUtZW`?Rl_X5TShds^^1_nlXfI>JF3%cA|D0dT75N;eR%&2Hw+CJCl?CT`$BJ-gl? zy#DQZ?vPT-q|^=&tw_D*fv@iddsV;|*1J%T9w0k8(!!Ieg-C_V9}XHs&R$TUs&XwV zVyUaQeXs?PvLK{sBP39U>}~(tWQr%Pz+wNdjf%?+#Nyg{lHj?@xYtBxAI(5^Ov#2Z z5KuslVFQt$9(&0vBkz^P8RYna^TXbk*|gY~-opnz9?Nliqy>tNuijJeuf#@D z#P(Zi{-j5Je8`o)zFBSKS+Xw}iJ}kBdt=h-b1S1Psvl%L-Vtx}b;H42{YKFIfT1X9V7uF0cz)bX_u(6k7o+LgZ+JyfPv-)qVq?G+(@Gqe$fRj-$Isgdt0($ki* z#+(AnR?>E*anFjf9BzB_7L$#B3|l_$H{HLGjJguu^r3_9=m-t}WW0R)yhSWJ^Y&B0A1UNNA9%^x;`zrNcNtP}`okeYvDTe%AtN9iM8!oFgN1 zOk=^FIUDo~J_{i{Ze<&nuW@^`X6z#mjh->6w+boVComV#56&3j%cv!$g$ox4Ua88^ z?Mh^-YuJ|0B%fnz8Th>#Sc)%1W~>{Xs0EgS>o=x2(!>&LPf7`K6Pw=kWqLr_AVyie z?}I1}!_7RpNRwRfMcHoDgW-7_XUN3)972O3U!nO)nv8}fo0u>Xao8lZZku9_>zfk0 z+F_F?A64NSs<@1kU6zz1E*h!HP^F6*-e`HX!MeTYb!0O*3jjvVo=swD0~=U!UQn9FT+wco`(e*rUU_=XL1wgBz;jX z!cULPArfE{<`fc8`*{)Ca^~8;Hq0vTj-TMD4@UAETXYU$eI=m}^K$vm&g`PmO&RePNoZSytkDB=$G$q|qG^`lKX z_<}Hh8muWqQ4qryXWnP3(zcvZZ1@^e!%3rT<8D0}vTU`l6^CNW)U1+kEXX3e*xR-5 zoPWVXD?x_+EzN=}C|f(w0py<#ITsW1HJ9ahX;MK3CEm%1t3W?4&MOg6&b@9mkdj$S z6)DC}bApV~A z1kFNC3fYsXr)TQBAvzO~O|J^)|AeGQs9uZz+>s33JRP{1_`7-Z%K9$LCsrvz>U4?Q z+fc;{Gf!ij*l=ku{A*(X*RLR0%UOrqX$xgevF5%wYJ=0A6zP*yWZaX-R8n@SX_M2v|}J-z9jtC4i^5b_)NcnZEhXu zqqr34ig21yMuy?u8nPAfc4jh)?d@BqHR|tGX5Kx%6nv8uQ?zP;KyJQiqA`W+3Y(;v z!L7-n8VrSRVQp}V8ZcUDtk6)L?V$4eF!@bq(n)Rbw2n^2Aif|K5F_p44kMpC|1>|+ zL)m=%b!P=<(2K4-olpJ&yUdm7l3JvB7xD2b^CjKJ#Z8Z;o`A5F%h;Ns4ew#CHnuDr zE-XG8@Hh%_vHH5)J6=2N*C+h+t0~)DUvI59_!wH?@DE56zIeJ_R)vdZoa|%(f`}60NB3&}%)o;%NSy36ife_#X3$idmPEtKOX9i;E$e$^#@5BI%IaSguZNe8$l zmNd-D(UuW4B_j%OfW>CxsgLB6cNAjdjn}zJI+*l6JWflw>Arc(pM@_sU{5Vz3xt&x zAZrMMu{bHcu}l+O-v2X{CfY1!;Jj0_;tp?Oq}_pFb+>tRB&7*iLMN0nCv7~z-@e;y z_9vZZqQdy{+D)sP8KkOq;Ie)`xhI0I)h_&pYVwV6aK@5 zw@@z4mY)!sx0;a5Z+p~!z;=F)P&_v7M;#FfnQ;KSy`{{LAv{GCo>)MXwI*<)AkWSD zhjF{f;%UeDw>-J}`Tcu1=l^imy-u6mXMrj&@+VJv!?tRu0fxvX*SK@=rlJ*XDcEEH z{*SniuJ`Q{;wl2oK@*Hk)Jpj;Z)4Z>aZe=Reiz#+q`{%UoVxVhg|&x{h%!gRK=CGE zf<6$0A)zjGHdDcR+6GZS&7KHRKUM0i!GzKvi-a^8;`#ArAE6}PGX9r}Sp3cgl})pw7uuJ}N; z(S1W7pFA+_DwG`Gl5Jxx(L78Lv=|0iGr9$$kz}Uv+z85l-}cc}O34%#lK0-&jy&fD zqF!}f2Ko_D+!&ZvZ}?v#Qf%#Z{Yvj8Kz-i*X(&>N%X9AZ5q`pJU04}B-E1-Gx5EH9 zAi;{_CBH3BtEEjA)p|=A-V^ir&aFw^3X>=irv9W>P?1a?`7=U2kux$b0&Fh8sLkU$ zY{gX7z$8T+woTu+S8xt>kSdoR<1> z=w_>UDxiI(z^;!8;qx{t1*_E$eJO|T$Nub9EP`MX3gUZ`^mK$r%RxLWjZ#5$_Ynmh= z>SFIIoe1A7))(Xq9QZq91IiU`y6G}3ZxicnE<5E(*n>&JI; zL-3_Zwo1rfZ>|i>?`0<%BBeA)8M2HLA{fz#7i>K-BN(nit9;5OFAl+jb*8hu$fbi& zu>X|bU~sG?T#Ga&-&5w7v$xYrEuTR<60tD4-;X~pM-4UCca_bjF8AHeA9H@^X#3$0 z>`bXaS`4X=p~gu1(Yw+Ze>$nT-6#se*x%s=R`SG}0PicOg7_|B(9oj~&$!Ac*keRH zeoCpObUSzGoP8;zj@AfVrWKKxqxjWcn`9--%Sb62YMe#Rw?{QE!ymqX^z^WiD#QY| zJVH$+9+xokGN%d0RkL5L2Z%8CtRb~10PKhpAf)8U=kcQ)A>Zd1i#}^-}Ia1ejZWCbn5)a6gk}q8b0{j0Adjsox zyD+1wG2FKbL5^}ve)viV^jxV7KFk&nv0>G*Bm#%1c{gj! z-U3fa4zGqia-kU7f*e*Z`=(QZx#6X#-)FLJY=y?kg{mkqqXXsY&k3JDW0Jj2D*pOC zYIxrnxF-1?zs5!;&3*WC(xqu6#wuZAQ_m=bTikwo(uP*NdhS^N=STXI(}6Aa z+~`XuM%WBP;UI-wO3jY3BN*8Vl6ZmH=EDE^kstKnOe-bZ!0x4lp>nk)f<^|Y3KpSU zRVJDb6_!R4>MfadG;`$+IFKNYw>KJ;S^88>BS%?+)#>Bt5#W%70}i-q8>A!~BT4@m zkOS%k)mXm;KGFbY*Rc0Z-|IQ_(=3-(pS$_;OBEGi_z=~xY63Z8_TDDFj4(qwhh2qK zv3Yu&thF!?@ssOpL9KUrS88ofxmvV2pcGL-#I#ROVsw%(m`9ptNlBMIaL-yU%T_Q8 ze`=*IKts~e{*Ya^g#mRz%3UAR7t&lCQzQ9UnS$AOHc(17;ue0LX%A(J{7< zwTz%z(!+TkjY7Sj5tGFQo0GWtm#({NzwqwS=Jb$c!F^Jx-zddu`oq~Pj)0elnM$Ni!;$*ilgiz&K?;5gF+|^$WPwqz^a?Fq( zb~@rF8TrYSGI~`>6PXZJe_22dC6XC^tbXJcDeOc_2TTQNta{%xE z<2SXs^OM`|WuV2U=?{n3{FRcB&_kvz&X`Emv0!~80i_Jz&B9kju`~wZy90=Ml)3_4 zlTYCu743;e?+V=hMGEXorE$>%0bY^gA~>Og(ek=h2Dtg5u=qqwJNMU5&H}XggBiC> z<$Rl|(XaGxC%2n;VCi4{Y>nLW8iIGqUIo`qnvax6?>8p!+p}IfIdM(!k(xmo zTwnr_!&!ORfg0SF+)qF7stCl}{v9A@XR_YV7eRi35F_3FM;6nwD7Q^z!bm5KNu%00 zp1InGigK+BJ~w%~jJE0I5@GEc zKvq8scdK@?yh)_>3IhSVgv@=bBsU~QgVtSO)lw$I>4enM7TsP9SlY7O9vRJ(B{|>q z;7L#OI|bjL=Sy(2E)6Tj1G4>XtTs=}#p@k- zA|Dccm?d7r|HVXN92d7}kXJ;m1VYCg$d#6&!^}rh=FIn|C6;WG4BB0D`c6Gd*M1*) zd<*!O%vP8J&MKu(9nl6H|6_ zC?*}pf0ept-7lCZ`$3;2=(dne)=}10-RA10ozh%i!WK-XKkS<0Aa$V1rj9hSGcO-B(aSdo;KV|MT zl-z|^Y1n*VdTT%<1FaPYMr(!@dTSi3Rpy7c{;vQM+LE76XA$Fzv8OmU%|LQ_v;_q} z0G9rKD$d7tEoMd{^E2S9Eu@)r5!ZyvYVyzG@x+BczO|jIIcpCqi3{|8anHY2{OhAN zZNL!^GB;qws_iip21(3`_5DFyw@Ju~+UF3Ra1_&xf`7c4wCLLAS~l|Kte0->`4Faz zA{0qf=6-*r(afz)?fnt~%8OGRqG@~~3-?rthreY2clm2E4~6c}C|-JN|jMknCo=7QW7@4{p*|roO!ULXk;>XxLSdqH$XH(!R zpJH*J5X+h{=avvG4&snDGby&dvsbBGY$rEx!QwUBvVX`h_a)d(cusyf@afLbM$v8g zGxuZ~%_lKO_O-i8#1>3%prgK4TEw0t8agCd%G?l}6TFfo#u|Zq(v2S!gIYgbqgaxE zF&gxZA_}awFt_(0Lk~GuI}X}xPPDWE!woeZYc4+(jt$Iqb&6Tiu`^i`54L`1jr7JFPi~HF(6e&`l`p)0FvfU3$ z`mm#yU346d5hfe`8jKL({GI_uTqkyKr}{K<=>`+R5s#(He&cIj$EngWs@sEjjkX~2L(zWWozIC z5oZp405Rh6NkA-UetD74AERquC`_D@eJJAYs6dZILEaiM*Hrf)X_B1Ix!~yR2^arV zY>Ng1x{P|lUdM{eiUHabo z(N3|4S4rL1kN6a&TB5!Ja45l9m`fZ;0216p4-pe`y_4brA0-er{7CkCePohtuQpXG z`j0NK&%^pHA`P}R?Z%~keq5ve9~K;Qgb!S++YB$SO{lm4y(RAxkCL~zz;6@r}NL-h=zrP4$q|v zwk18!lf9JyG|*C~fVeo3`rFrc2F2As25_CeM6_Hy`zi>UO>C@yI_n>lyh)re^b*cF z{l3Ayc)8phFpW;44^nX6Q{+3!o>-G1&LPmWx1^MUX*;wz%I}^dG}o$ z&^&cd_S0sfFX#d3p-+?SXc-HkiuO$s;(F6zO%%Mljjvm3<*t=z?YeBH_Ri~gn{ckd zm;B^L<*>vnEKp*KywXNx<~@&yeUghJ^~b~koTs@~(Wi1VUd~GuY;!6blwTgrdQLa` zU_SU8@Z&=m8xbZ2U}M_+vZC-K=6UWXj>C8MbnSphTEIEP8-qeKYk6Ax!YrTez6*<+ zUgnBWckLe0kOYL8U`l{@Br-U0KVlH9Ee?`p0FNy{{I9vC2tDs%p0*sCBJ%8VdFpbn zu>?+=5$>ObR5UeX`{&VvY-`QhVX>Q0))9n(RY^|&4l$@dAc~rlc--rb`d=;em;+j` zn|$iOqbrgxSI7LI!zTTooHq2DuT|e|Hn}F=P?E=zmbI$w?_~0dUPV2vbZzyt=FDOr z`7BIVVhY64M!Ho_0d{7z*`&JhO7|&7iLOJV$25HZSc5dG=yOkwwDsD=4ls z2m#|B-QhuGdES+tCdD2WLr!ySPaZVB%ua?bc+oOI^q{*gtw{DdoYNidAY1l{HuTp^ zoA1wSLmqzFMxXxKJ?KMyy>86~{w-{yx2WujXnEQ`y7|pLhYUT&#{~hMLVY*W|3RCU zXQQ6vZgd1bsCah1U260&?hio%=+}j=bxDKd=RIX73K7;r`urZdV$#%qUb`bO_e#O$ z*l*A@`?;w0;l>|~+P{048DpCVDS**o-o)$C&u9ySsv=Si=sCNz-MX(Mc_f*}Fbh1l zNgcBZ4P<{yg#YPG67r~~BHuYxbtXfi&<20_y)XsQ^wCh9&`eDS{Mp&zCZ|2QEi}04 zF^)FP5&?UW&6d`pj+^UgcqBw~&(5mCPA)AkRnb(I-%8qREBE_jz-?G+X3T$&NTB+5 zQ!S9``x}dZ4--hK7oOiCnMI_HzB=}K<`ZE`i1bYHfS9k{HqkWaJ~w}yqTrT)*i8F} zwScbBxi<_E>h$BxLZAI{*@LFwz|~E@5E2En6KYb3=@-$T&`s$w3VtU$Dh-N9eobrt zy{?-dvX+n|?Xu{cly4FxhdrOw0ba4QUbFm$##mkux;ttvTV(-%CJ+3W06d)!+aE51 zYwZIbK}WCZ*@(=5LMj$kBKMZAMksjZhQM10fay>$BP2m%r(oG0Z*#&DWAgjTm&dp} z!>do78#Kz1yt`3EB;p^{tyT2KZKR*Sk&8tRpqIL7h0*s^Ak{|Y=2H4QC+!nbO*dEEU7MHW{ao^S*R)5Gol6aXEaV}4X3*iT4%i)(-V zS$Y67><0tN@^*T9(j@Tg^rPMq_-CsBzEgQJf`%1aWP#}@r_JEGdiBPEku`kt=-p&O zUA-K|iUpBw)lv&l&;tqI*0}(zdV6UPuw?(@GV}%}l2_~fJp}!es@rF>h}r+m08O>U z68=!byd7tpep$6lR)wp*FQo*JDfnY~v*)mO4{unvIV!<=MiVm*77|mxgDqZ`Ss?fC z(%{>Cn?TvNyO&lf2ny{)k9cH3__x^m*(juE5dTySA%(qzsrX(dp!r*$qKHYBmBAOR zBXBmalhhm+ALA=s8?Gb{oPaS^!8#Q1IHWq)u_IB4>H`*^&-dX!C`EsIiXu>Fz66H^ z=3tyCGPI4ikh{IM^Y|?rMU*O{31^UcHG}Ocn~Mw2b4;!RBd-{>7UYNJ2BUG76-x-V ze|5M`MAgdROqBhwp_Gyx;rzCKZU5onbx3ed7VW>J$S6Nofgbue_QNwbDZaMhUnIe( z!uFfR#`&~APgBSJ*2Xe|YyYsH1y3BqheZJbgk|td2T3fqXZ6bqugEEQE4;pW?!w6cLB_H*X(9bp9gZpRbKRBWnwxD*75uS z@aF#tk!DPdLXp>qRStK0PZC3T zI(gqYvF8m)kq1K$4qC7fIzAY<`gno+np>-%_@6TBK|Ix8eF(Ny-?(^@{=-o!bfx zA5+iwn9r|@Ewe#Ms0AoZ+ZS9k+W+lB8!h5z_dlFpik#=6C!M5s%g9f2O3@=FaVnJZ z;d7^I9i>$vgnh!@5hrN07U;epM(M{Zc2$ahFOzhkb;n*!To$MXw_su1k(oJDu6Y%vUg&x6zL#=%xy!rh{ZffstJF$4=-^o7_ zt}l&yyhmu0wAsqDUQ(J75_&+{%;Z#?LOTr_)j=(WZM_*Z#e4KmpEPDqmvN0+KfVxj zDBSRRos=Z?+PgQf2Gb72oqkzgmu3VNW&k#&C`D~4hj%=L?j-#ioVH=2(;8jX@7WRV(G;K~803`U!5VI!CDpnl(; zQNDbVfi7A4n5JL5_(c}guWmF}_c{<3CQwPPBdC{eyO)}nm`?}RCBYVShr^o?6Zuh> zTy=L>ES7s!*z8b!76R9^TN_EFUs@dH$T@`u1 zQfJh%yvXNv@_prT3@tIfJV=wN-3-i#O;ZkQNczg~V`vZ?poOVyT z@B|$I9YlFtv}tSbE@K3>wt7qZbFI9hD_r0V)9nAEBFJHhaiDR&C^+ z#1Co!VZha`dGN02i-NuRk)U_k|A8M-vI>xP&I&5`-(IuRGO?Bn%)ierR8EqLojdzh z*XV$uE6X{f6ym&z%#ga4t_!LVsSA4Bt*`n-KU%_!)0-~g`P|vKtNLG7thBI{YYq|| zFfNgi1Ky$@$M|x(vV-Ssyht?kpt#fS2a{*&l_r_$-o2Xo)2`+C0b{O*9(lNg)*z$I z(9Qw~V@_`La#&4YfuzkAi93Q0quTUL`EKIic={Hhog;9jtHr7N_GGBt%QlO{cAD)R z!SO@R)i)Kf4~sI>dBmaDJ{u&&-fVLlL0}UzWTRve@1712DGj}TTa6>cL4R>s;HP{= zN`9JeI&(e%moTZz-+*{f6Hu!%CEPi*x;UfbMIIpDr*I{E)#3|^BgUq}&HFwe^ufpE z1hL|I6-_&D%j9jQ&!#S=%-t=4GPlSt&BUeLI5j&9z-^Pf$Y3g@oG-%=wXl}1F0coS z5ir#iw6BB2kmmW-IqhG5*xCL}F=GwM<%YeoytK5ntsv}b8VW};{JiETcdZhnNG2Cg zaLs2UYmHaul-M6igY>vYbietG(cHDVj8L3Ax3)?7}s2<8efC(}XKwA+YY zY5yrwKbRM*WAcL@U+3jm5L14oAlT#u61eG*A3oq~Z^RE(OcX>)fL;3si^*9xrLjIe$ne%Qt@F^FAe=lCu!_9PY#mWJC}A7)n+vHP{326XQ1HY~6&m`avZEj5ToawpCN&jh5VXTq8g3HVRJ~b4CTZSyg*%NArf;@Q3FW zwd)h~%(vfNE$dedN-lk3oOvh(h$I&#f>oIy^pcQweR-f4%xz=AgrO5G^hRQIncxJq<+9iGV#xvw|!;mSdXq1Ngs-g4MxY;)jlxu6i`3jzb~%Ux_~3U zFPfY?6r3-ZlSFCYoFEXE_L#)yg~qT@3@U~Ac!qkd=%q7I?Im$!A|p`9@(Q+v7a2^#YJ9>(|5L4)y3 zsK?k1vaOq+8h-wA_p}4M{95Nt=%saS1lC`K$U6HOpt||>CGyLAyx+(J?WbfI)l5L; zD9M5v(_!`m7JzP+DlxIRW+RiWw?t0JPg3b(!Zn_rmbslHVmp_wCtQkjzkV|XRx5?p zynJ}j)>LN(1$VT-IemaDg(*szdM7>uQtk|(13uU7k3EVpvcAK+h4j|V8})2v zVWFcHY^R0@=_XH~uwB-{IPSV|*dAo6J8z7~;9avfSUQ|}q<)AVK`Z_`Kbvxe!P=G- zRJS233u-PeFE{v&i?r#%?&_D=eF87kGB@u>P$%?V^z-ZdQ@B zjHF4XYnUu4J61|~wB$oV=q?YWqW~Zni>}}~#gF$ts~^QyrN7y!%C$%3ge%6|*whcZ zx-NTltAPFeS#xtKVWX1g)b^)man+G`=)$q|<&V?@K3m^-*X|UmFLMaP5oK1B$IsW3 z7JmQtH}x`CAAbz;H(+Z~9@8EJ+r$V9wEna(6B`ViDH9k9`Qs64v{I$8u76u1O$bfmaAc5@HRNM02*m3qK+Z#!jUj-+ph^d3946*9#npeMS zaGiE#Bw0EP-kEo$9tcI#gPe)-00n2h9#q(8!$B=>tKTE#&eXy{?&&|L|J{`JM0_bB zIli8t-D4QhhPJ#zc=LgF^jdPJJsXej%#Nd9ZeEl8xm)l{Cpm3>gL{p>Co_iDB*PZm zLE3D}Z+97Rc|Gl?fSEWe0gUe98%`wUNmg=52@7QgEIZ^3jLieKl4XG-N62pED-8yV z{?lo9pS{4F5`D|-@yY^qQ$Of{CjcW)ptm5 z2h=ll&P~vQmle{26nl(}XUkf1^z6R**gh}_O~srrW6t;`fhIh`Y}YQ^`#l=(cELro zQ~rj#E+%K;Y<8A0c_Ynh^T(WD#9iwi>-DV;92EQgem*PfW^yZB|xYr-!!>*_p zXbpvBBAz%XBiHfVa&TS%Snv-Py08x-#kwVEqM0C{-BIBZ00TINUQ4jHkt+K6JPAqX zZ^rXIpJcr4`V{)jO@UB5UQ}a~SP9XTghJocwtOKHW^zA?1%`-KSwmd>*Cgq{(ZjOiJCSO8UISl?a(#~eG$wd#$0}@eKfA1-eg@l zg+6(aC7Mz@$D|-Yey&@~S5JX)N=Hg_IDC)Rqrxi_gj^|6PgKG8>9FsLt61O?_|HOy zNFsbP?->JI2{Bg9{Axls>4*#yS*Rt#BCidfyxBXO;o(N6BSpEjs;=b>t0O{XF~ayv zy6d`-v`V*Tu9$^uG;pp)4x}KH!J{pAEcHb}pY!L}d4Rtj(`4r&!$%}jt@{L-zAsOx z6=dQcyoDnLNPHYQfczt!aV$p`?u+D3^i&gEZrm>3x$e{gn_)wTbMZHj!LP88!3Xj$ z7`WoPR=qy!el-Vk8=4Fj4ln94MG^H&H4y@UTM=qwAghfek5)FEt3pJfTQLY@M{~wv z%DgG&qx(3`hbS^bg_(q!?rdx57KIxUq$<|8Ap$=1IkXDo@W1-9N=zCa)>E8$0L@yz zad~<$0?-f(3j)WcD67AFL0f#1O6aladUh#F(Dm^_nHxgsHHLjOehgy2a-<0kh$W?5 z0FtHV7+L`m{}ag*BFx#|-r2Ly9kK%m73=fmO#G+5 zCnX=kT7II!G>(~xjCtT#kaBNYWadIAo2No0@4-OnyhSij z>sBC_06#1n+UyeH#0MSuNwgYD7NJiuC2aR$zQZlDR4?U8D{@z#QS13hENCzd#SCJeiMIk8>JeK_rD zSsH5$xOqV!3kvGf9}8#Sw1)-gAqFtF>|w)Fqz5h*QIQ!tBVoO?WwD{YqzIqUU&t1X;&=2art+rx)&vCE2=JJ!zmpYJKF>L>Y#U z1_Ri8egG40%mt~YFo7kFNTyCE1rfczd@Mq<_Xph9UdN$+l&|vM`NX4FMQ!X$Q{0!$ zqj{w?m{lB^5mNWk&P=dSqGm;j1H~wfRokZ3#F!Hg$@~yOD*Z5_0&MpFIAUJ05_zTF zN}$HbCyLb{C{^$PG;0Vy4mzkcbDtbd5giCd@mK-7gujk|??I?wxl#GTmG-xN136HO zyL))A6p)}>1u32cjrjTG#!s?xHh^Z8=IyAl6W==bLZuT%O*hob9ZX2^_pz_tjWXX#qw`a2m>f zsCu3(K`x(1qp8t0-g}DHPP!G#M${~Vd|>;{7u`y6^AOWn6=pzMC<6@OKVr}y=f>ed zxx66Xe+T4rG##^_OJk+W6_~r6&_IZ&IZ@MIGmVfrF@cr;KaS4B5z7C8=X&Yk;w-sAQD zddF8#Ac9svaRQyO93g^qe=y?kYTvn*7~b_StmWKt>1OzC!l}n;T&H>X^V1D`eiizV z>I*biIQTK~V@~JLI+QkD1GiD6PnoqCJgtFYAdXb~8~2Ja@MByDxc?W#i(?9Zp>4M2 zS0Wnd%YCuhM;Cv`yV3TXQQIrVS+*F!(7|-eqTs^0g2>~MT=J8ex$%4CHunR-fwy(Y zONsVAw&qTg<2fdmn}tQcux+U^uk0Z+{avTuO6_&5=!lJa#Y+yulgdh(vAkn{|Beej zgxzDstYg;Bn5Mpa*MqW4;vBxSdIpinVTto~pXTCPB{Lm`KohZF?DoBrxhSXqx|N21 z7ied4!fk>hfs&90_G+(;o|l_c8R_g>MLNie1oV*={`A(Y1Hp@rnC^uLi67TNfXaON z6*749(&TSA;E(4|RJ2gqDMT8xq<|ZtXX$_h8$wnnU;Zh$)d|nEpHgkh)Jkh6x;ABq zx+!R(wbOlfWI!$YM`PMUA8yzH?gcFnDSwCOS`<7~@Qu5a4<(pNOqaFq)TGV8>CSDU z1;csYlTWH&Wq!0wx>q24c+?axm1en$ZA--7dAoSu>qtym)M6OP1_ z1@8Gim}lV_aAn+3R^ZdHOMQ&}y_K^2ppKaRhc3!)^B`=knxT9F8@8X2x6;?FMj744 z!erc9pOnLu0A-?TRk~5>jo^=EZiTQR?w6{&nHSM@uv>FIWuV3@;Y}glxUP#Nh-%AY zm{MQ11AI4?l{hh^$~a-AVfG{ci5QTvY$ihycnBr-$={1ZEW7g*9y|nRhahL*{i*Pc z5Qn|)Tg6!IxzKOQ)b6=2-((2F!f$iii(zvnq#%-IkN=Z1<(EEb#7|S`+fF(s_7hyG#DFNNi75i8b~TXJK=Gk7oTGQJ6|#`01-^TQ|1SJdu~_}yI4jePm# z2wHsqttIC)vXUh$Tn*~7n-4!R5yolK)Io^YYi*3Ievn_s!?Xn#TWOve(;Ztx&iEFd z<5dZJjyRFtUNMZbI>io`JYGp|uEF{p$b!s!5d2m2MY&JU&&{dux-mB&0^zSh1i>=xoc-syAu@(>n0=F-s!ug3u%8$`ws&4~ZJkVgM|sH!{x9E~uh| zt=PJ$z)eagC3M7gpz6<>hradaBAyb(R9-tS<>UHkEvy`nnAb{@rZRYmbv$zCopTfk zRKo%Z?l;$SDZ!%!xQGb-gA0R@nH(7Bg3`GrSAapXn#RtlI*08MxN3TN;jm~qt*hnaQigf{pDoQZ=(($%)p&jzf zNE$Y_eQIWMO6h3bpq<7L$1_N$hcxwAp+fyQdHJBq)2;s&%23S(5m@cjweHIdy&@`1 z8zm7na#a!7r!E*lh&E2!gz>(m)>wgbp!QD+6*2fVWV=C43DC_uvl=Ff@OHYr^Flu1 ztTSGaCIoBp6cHjTwkDnOGH$%2sNn)i#r^ca^ScgOm*k#qAGjeEi-d1$%sg#8f1zvk ztKLQ6J3tHtTKZQC^Ip*UkLz{+LOXj&E=~|~q46Qap>-LC?JLW`))ya$g&X^%_lHdL ziyL+=mo6XHT6{R0w`3vs6HsaraGs_+P7 z^Fa&DK%I0ecRZI zMNS5ew1?P;W-%PBi~t4oxKe%y~e33da&Qq9wcu z5ytax$wLFUD_YGDfosMSaV3A!82&BE0CkQ)xNt(0(huDOXUW%xth_Rj4ZwfbW`_YA{B^_&{eq& zWA;ks$kJ+t)SE#*K>0(P4xNk)f3r8pM_bl}`EBO#0$?bEVbgCct+4s6Csx}%=)-cSe)BXAH(Tg%G$14aH24p7wb|>roZIj?sI{Q_l@nm!`2)>`0ZONBx=~>g87+-IsTS+RnXV zwxWA*gG6Ih`+Ecp#-tZVj*EB6f@%KY7NW!T~?rNKDOi)lnoy$po78TN#~ve1}vSNmXw{eklr z3f1!Bqs;&&RR~t>IES=G4kYakbyht=10MC1ojRc>z=n%ap7gqkYcb%&&6xp%FZbKF zZypVuJ=}87sJo_cvW1KP3jdVRgt55(f~#!VY$7Z}oJUWPTZ#AZRTMtvZTY&5KCCZk3j>O6HrfQ6$%T$lXR0lLGLNPxIf zl@!P`8Eyn3-?9+5BxQwlD%YI06G35Dx@mtvqZ7zQ0KeDfW9r@rHwvKssOG%Xjj(q* zrEOrLKeeUVC}7%1XNx5(}A8VZXb6OwtDVd-n+)4omHbJ2%Ik05WK zvgljoo}p+EOh_X+Jq~f$e-SIRlnrsnj6)}&5ttbpJtBpRa)*Q}%qtcmul@9ZTJ^wt zYWK5Kryc>LbF>&amEQpUNocT}>*MWiCQq>!9J(b^uuW~Va@3pJV~HJHW@eE<(B%9k z!`ZkS^fl9F;7idf01hevsMmW?!*+culdd5Z!sNl~;{()Wj-&ft#$0g>51;hm2Ae0o z&*RgURNwQc!ciaAOPG#+>k^|8wIMpHAkVq`yDQx}3r^udd9}f@O8@0#IEdkdI@{T_ zLfuP8D?xQd5@5BZxxGU&6A89$O=qykf+ivGr&mbKFW+svO{hCwNrf=Jgit-O5XM?C zKM7_^oTohmcRO+@0-E?~3p?`F7oRPQ?Zq9rQ+gg+-6=3ZUp+3F${l{aOsQeH^1CZ| z=Q+DPdR+c68*ulH?cK<9KPSTB^)ir8i1oFWD(9jSZScomXHk{k3wLUlu(%3CG>Wuh zr*qnQe(u<%=^x>n%IfHTuRw!3XY*{mERz`c)({adjHYgv0!U9}HuKH;1LhdC)nT8% zSSi8X0CjLh`*HgiOQvII%UMzgax<>e7#YwlOA{VtwNwVrBhlL8gqQpkPU;gw^`nqS zu7-$y%M1i?$N~=uzyFo>y1;*KpAnz54Q?d`$4SoX2jT>XuBog*WycQc5j`MEbc5P+ z#pz^F=f<$N%Q8RfZ8J3NcYn#EprVK9Cern5eE)Q2T!yqohwvzWq66FfpB$84MI)g- zaOR(OR|>K1YaXOjkHB|bF9p=qFk&nwl(mDgfpy)-01A$+Tfsp;h^q6OJ!J^9hnu=U z8m%h}MYjA}Izj;mmU@1ut6;7Od` zk8T?5sTM{T)E)ZB0A}#Em|@s*Pgja*T#Nu4Say|I@eopx7vB~^PNC}HDEC5g2@63| zuvJ&VqJTGRAD-1*7Glx@u$nM!%hztc;?3IRaRVwaEKh-{*!*=7f-`I>2iMUpK1Xpl zWtkt2(Usf3T)CyyeD%ZLsb>9g+mLM`W4t6rE68dn0G!rCteVjbYB|0;e!v)fLPLVHN8K`rYSCJ)$Bi^wZnLTPMQn1=}&)OEsy}Lmb zs@^c0L#j0=-oD8J6#lin-em*iU>0%K`(PIOiWw9W&pOCtKtLHW2e4dWha!t8EJY7jf%h^%Rb3I?5)1rEfxo;7r!VDv z;2t%$N5v-OT2ua(RW+szJj7D|{0?%zydFSWN1UA9Ho;d~Bp2Z}Zwuv+bb=)cFubJ< zFrl~4Zmg_z2grK9p8vq|eeF8sZ)q71X@R<(iN)?21A!eQ$>XsaV~iT-pW>Qb2%8W# z*Z^bYwdV7g&$zHvT+fyiPv>DT(Mh{dIyyx6D|%h%vtl}4m3ziaA8(*T7#Yb|W`Q5V zXI`F^Da1WTwE|=}U%V_6>%hiY;w68undu$^T`Ad+-IR&IWg}xyKy(JL#`Obd7MJ_; zjqUrR!`{qAf*`h%#wOjB7tVY;OjEVd#PF7%4E8q88YjyY+V=PNM-$ZW&snO>+xvl> z<6ZS&>$rHJ07ZK1>4pfo9)HMfLQ`q~hLaCj$_(x7aQHO#Q;TV&+`z4>WI4uK0Q9(f z)P9^+^y7^!Q8o!z@4q* zwDG>At^n9T&{Z}XK@mE;>O@5w#*c2Er@}2%TIRpExmMo6^nZ&FvJu`pO81KIDU+4K zh(WxcmzXh-WtHUU8oZ6Es`IK>f#^+970G?tPoZwtTEcP}==-!LT(omw)niHL49Ag7 z#zwK}Q)g&7YZ}!0lgRN3qp#{6WVH$j9D-x%gv>GNb_y)i8(Q9^oQzMUe9}{?w?= zL+I}&?rn?JA$tifgz6Y|#I-5a3|1n{Z3OM_jLN%u-M8+vlsXR%<4q!m$QtfvB5JIXY*eo`izE!c^ z-oX`zKfsWtGKS|Np}whxXPXgE4CoOI1%Sg=8N$!w;m@0liGf@M=Px3rH8F=pzfLtp zaXcYt`WYF{0=71#(^@jnc7WdM-D3=l@0MV5V&*&kjjGGA!m_xEe)0kDs^Al}19snj zUk(!_WTxhJs~P=Z1?MR^KarVxN1Z`gK7a0A(RDu01_(&3y7C3~@Z}ySZE0V;61?eq z$At3dTT|o@lrRIPTBji-0!x3g-ReN(7i-dnppk40rW(Qtt+1U?ZFr2C08!UO=}&jTk#&>+ zbvA5`r9qAv_p6+r|I&*>gG>J3B93w0wnz3if1Um~zzD5Nq5LFz<{$VNemcVm-t+=8 z2jr<0&JVatzPOtZc3WgqI5l+Ct%&QclU2FIlX`%I-!&I#IEOqjuRmy&ZxL*MJNWC^ zgEDXB?!4U+K`A1Qe%vXUb}aja2G69VM&)b45Xdr617` zR_mE@LW4h}2fDY^dut;|@hCgsrkBHxo3kc$vyvZEbWqF`uOW}lkXt4QCTK8igxG^I z7oZrGUO{M(2N1NEUKm0$SpBDaFncUK`ki9^kMhXXHDj5$3()pA$+SPXsqs#UL1a6V z8VjAI&n|*9`!R<7neNW>KWCu>d3_2U+9I0j`L|~V4442$uov_9gOU^1fT~XQmjXCf z{!J_iJ6}?G+WK>Ic|whvq7_>!*FIVJdy_#F)j9^u7)X}pRK!>?6Ju_Yi@JnNVOC)4 zmC%AM#h9}mDZkL6_!Ogf&!5!wl~9%6w1F!?;V5+>4UlH}V@8LD6aMb7Xe`j-1k*+U zVA8ycvUuS`?T}_RzCahB>68Tx$tT>rj6Ay)U_j9@!ocG<)hY_Res-4}?Jz}bucpwC ziLhnG#}wZPWX`U=7sc$PQ-3U7A^vN%E()HNHwEkcHyq@>PrC∓t$dRJGIadE?vc zx9WD#yZ&gK=iVbgW=x8$s!dnTwR z$LA6KX5PB94SQsTt@_0w)Wp*>DZooc+yn+wArY_n0v(5fU_{T9ilTv24DWI$xV`nc z3{+|u-7xq9YO*)nq&|JG$+uorM!36j`Y_YDq7b@e;EE`e_kBn+VeD__Tpy`5H};b8 zRl=EXaa0(9Hf_7B3FT5hA>o%w4iFCnvaX(!)Em=eMd*2R;xj*67fnoKFGCuh8wdTk zJU$%WZS+#OOBT>vfumpIf@qCCyAu5Sng<@)D@i~a<+9Fl)S9-Ht1*o<$A3(PJoxe# zwee^q>8J&|+KY>%tnSK1r_9$)rHMkq4qA;{5)nhIz&lAFKGQ-^W4D-MG4%z&s504giKVGtnX*-@y{u^)!Ca)GbmhT#Kgf*P!v zb&~2|&D66J&D&xpn@0t{dVG%uvL4|!at=KB{%h>IFcI7?0XH7?oCWF(8)~*tEt%Iq z3#PbMs{}U~nBbXz?lhKHsp^P@HGZd2;!@Q-^@X}wp`UsZ`Up<9OA0;h14Pme)lJ9CQR9oDm<~vvW!%9C9n;!y{&=Q^l{eXx8X3O{l}Yddf$f!uZMP z8W8CbIatsQ%(2v;T-iWXu?8OGmC+5ULb9L~XBuvrdy@M3hNdwPY2IOfz94+p>WDv` zf;xTR?o5D12Pnh!^T_A7hs~+j5KAUsFqgY|EDwM^ur>SM+J}Vgc9ZIL{VF*2{T;Vk zmb@u{8W7}RPh%16;Ywm0IaVV*OH%r-JvMmLJ4H`;faq{4;oDhz?Xt*0^z76*+6511 zalExG1Q}-Y&H3edzkkSdd+H4!ed(@%M*G@IC{TCM@j3i-2?0vbuwPo`xPrlIY;hwj z<0Z?-S;f(<#mIe*;X-qTA}+lD<&Y~5^A6w4QddrePX69G zTQ^F`TcXefc_cmIt&}01K%4CSzh7H;;U6>;#xt}THDa{I_OE?vASq=H zt8>y%5W_1KEmSu4kLK<)`Gct5EyY3sb%C*|ZGVhlOVbeV~h)3A9lIQkd^lOz$t=Ltmo8ga4=s-)5 zD2Y8$H)=S8#LkY{hNVQ&}g5#RH%qCRR;h%7eG z5)p<%pi5e0{J>IC2&3WPZ0Fc|?GeF4)bUWIT9za3ZH&b~axrIv9J>zg8Vx6NjIch& zmu(?9UX{ z8OQVBu<3MEN5F6#jHzF!qX)rOqdCl)G(|WO3)}vE3Xp-56hvY}_h*gT0X{hI89Hhk zE+jok@GYOb$KPtgoSXKd)G zPTbudXYmXC$itH9Z=2ax2nf!%O`}d>-fwQZZ zas7L2#C@h~dV#@=6={aVZ;K_St~#+xmL{UxdFZ*iZ3exc_rAq2^2EH?k}R1dwM{Ud zxq%bSGG^WOYFrBtgz)y27Sp*`264>AKpEHQDy zqA&r|(Frqr5w+YUF1oJJ>bL&od-Zhp9XCl|fQ^S~`w}jThG;hQ@gcKx2$k)$Ebu9W z6o}3&f$mP4IP`1=_%&;?@~}B^KVKKUC%;E}Bb!Q8)FAzw<<)#g)Ve=ngxEpgmXg&V z?2{}Pc^Z&&c?czfkP$5o!5G0}2x~W1pjTpG`~Tlv#2!c!YN+lbFxNyOHd=UG+=3w_ zublxk+IP9o0<;qCevC!@<9-G}c-m4F8p98JwUMBWh;ttAqP$@Tz~wSi03O+HZAgrC?JJbEDez&8C0 zlAR=R34+-3vTfkIUg)Y++d>(|t_$rwsptG01W~enA*0hPq;bZEA^S0G|6KiH2jSUV zpKRnGC?QT`)=|tKm|^$V3${pOR+_J#Kr-+wBhkw3VdKD=O4h`%((EpQaQS;zJ>k0Y6wqslbamifF zR}G5!BukwvOhLW`4cZyg6RF3rkw(Y^q5L1e#+RsS4K-NvDo~0L2d$GroI?5VmQqTd z0Eo0>9=adrHV(jdieYh(t_>D^0A=klCF3cbtYYMN5l)94yef#xmt1wa_&u5V_EFFU z1+VVtuD}TLcK$HqP|V~G+E$sh`aI($GJpBCz&Y+gSB+aJ3gz(r_v!i6V`6J!YK0X% z`^h$n^h{Y6`v+la8Q;32$H(;9cWyV3Nj1!+d!CED0(gkhe7!?I`AAwx0_HcoaYsP* zGCc6D8lW4=Zom(CZ#%RGVl!NT=J;Mg}#S4E`EpKlo~A7Vm7QbLsW9XDTl1P8X@z; zpACB9JIgW+GfAop*XjW*A@hOTw1=;2Vr;ty@9nf5R2)P(Kup_6y18H)K)L=MkW*{o zqmm^f(^+^!!>n7{>~NhaHhh?c9>M)r!w?{-Kr4%IMU+NWYv_DqH?_N?Tb6=natf`& zh#eZdhsqB4-~N%ubmyhyw~dzPyfDJ~+rBvQlGi5L0YydWbysJb^-0|e7p_!vC;W|p zEFRp}f>jfxd1d@nTUlko=A#rVh+Hhswy+B|nU#LGZ;na`EPUvz5`lc;=qaav(GTRP zzhX;x-PV--K#W;@m%76w`8JdO8r0M%)imA^BD1bKbrAW%5ShomdRYzK1QmqAMF9b} z264Pnb|P$Y-yrQw2@UbCP^+^Z%7>HlzYbJU0v7nX&1=HY54NiNC8INJ@_VVs8HGDr zbV$X`%b}q$&-Ma1{HcMqq!GOt<0ox$y9-fP>C(V)M(FLlSniJJSDxPxfM=6RlawT{ zXYlGL_Nc;`RiS8BD{Y@PG0@S&v8IBu?@3E8e)vc`@NFx5U8?wN{d#PT(GDA=m4%d; zf-7oeyr9U~z`@*U5)DIFOA?5R<@BZFS|*G)Q;Ob@K1?4!V!kU~8&3TXw1I3D?CVz@ z+FxzVCqiCnrSK2##?q~#Xvwn2x&H3nMS8&QJzW?WZ5ZB20~d>B^%G&Gi5$`8Pk#H z$bc~*4<04-u4Nebs~NGP>vGvd?mJM@Cly0Ua-rrzZr#{jUc=9G@~j+SYi2LWc3>XQ znRsWae3v&lM$&#IK%N~&H}vX@@a$tTt~Q@oAZt{ba7P@JH2`RQfX2cOixk=M5+cii z0gEr>5DELrMt4Gf^n0+jIC{k-aCK9jva!pkwwt!fMSMpRhalsk6j|c@t$@Ho?2tJ7 zcqN0Oh#6njN1O5tG&QS75*K->%$0}-2oFjY=Gn9!L#rx6p11U=7W`DuS<9z zq^s+}cm>Z5xsQD_E867gq=m$`@APfN^{DXfw`9t08DI*^KOY{+pYo%HZmHsTy33-v zAAKGiou28R+Z__hZ!`*Y}s{m!|)?FA^>OQp{rS zv=hq(!J<~*X0LRIdwxklFVIn6=qZWw`Q{L4C<=L-_mvV?F4!QzCeDr;<%BOMwRYjqBHLE;aoRW-g8%xXWqI1GtS`(&sF z-+5H~OTtSS3F4`dSfv_CDy-0Lh}Vs#vT4To7J)DU>B=;q>_z}lW-xZN2+`Uc?kyto z+3DWfJyke9e9K2F>Za7QD%h(39Tg=rWEu6wO`KlNd1`#QIphq1z2L&oim(^bnowjh zRa*f(eb0|qeBFKd-}$G0G4q>0HSRSxQ>g2PpQ=v$KNWE_-y789JKZEJ+jfHw~-Xb2bf_x*1*S9&rw7lt-ypnPW`tM@aNbuWJ7`OEMXZ~hqb0a znpg(Z;A^kRTz%{*KpZSFyAC>&TzkS(&V#-L0Q}7cv$+9tkBI?wk$EntXh&}1-{Jv# z1ZS6oY@M?;I*SYFkAKz7*Z`;Cx$@n&yq~{rqK?q4_;noWY_u>}v3NN4VFLawsd22e z0B&fB1iDK=ASrDGS==bieF$!w7~cO=a$)H5C1j^C-BBpp3)(Ci0N>{VxWEaI!0zK@ z(vN=d%I=hVvF(^h$<=qqF(2Y?nc?dkZ?JU+!wB&dya2t_3H1~&7`s@Yqqs+@D8;35 z57C3nt(wF>9q5gVP{O1}=(V$^IL)mEhR^Ej(#j?<(?=?c@W2 zS3M|e=^hSh0O|5tYwCk*bd31?<@Sa1+r}CTx;f14ecwohucvQSA%@PL{C5WFptzld zmU&Mqmb&@*9ajho6+*XJ`esq+azQcDo>nIEvUt2wB+>u1_8HmegxaQtDDG zE^sz+0XMlf9amxC1GJH<@QaWlZdDlMFR{x+m>uu|2INv6(*}#yHi zwRB?0c>ggB=Z%BjUY+$IH9}rO2yNIknDimcX6Mp=sQK3j*sfNdwkS|SgQ>w4g|c&` z#)V!r{lz2ce{9gBQ^7<$fh+akbD<3}LYIr2$7dM?y`OWuB(J2x48z9$vBT|C5=DF! z)4$NnpFZ~If>(M_r24#H7h5K#1g80EaUMes-C+-oyKjeyk9z!i_a<{om1cn~byBZB zQ~ye9etyay4Uy^1@`$>U#{}>p+DO4#x1KPXQSiro*T7I%==i+5+{4x^a)J_yoBpxx zPaqed5`pKT&7Olmfly#ByvbS+e*u+257WnWS*I`uUc*1n|1l5iwie#5cnS#|^fvO90mh5vrN zrlDuSm);YE%b<3bojo%+ZrG9@?BqB#=;2pXope{KEEqHR7{4-F%;COl2nzH|?;Da0CqzE7D0E zrKjE)FupBqDKx{}LrPJm9AmICFlShkEou8yll293_re-0C23G(mA2Wo@w_q6yhse{ z$C`p)dEvOM=<8D}4fln&l0RUn{>=(OfQ^8~&e@{FM)zDPUWJkOYG6)D5B>T7(CO>I z2XgBXt)~wE;g3!;(|qEJe!907dW4;)jlZb9e01@$h!d0X^b;=PL{VGYS%C3GF=qPS z)$Ur;#yBCb&Iu#L@ z|6a$nG7HA`I-bs%RY1PFdX)5^wir^Ej|=0m#s8k-vaG7AO~pSw8N=9OVxW}@NPxx= z(%{K##^(eQ;oi3gRE-@^xDS~o{H>fKjHemq4ulELA;r|ix{iJm5ieOg@Ir@tveq*a>~PD~Vr!doF2m?J64g3`{MeF@FqOcDM%~SP z&6ruH3$7Yk)h7N3k%EvP8{WDHutF*3a}G&dC_s(o4s+{<`g#IKC^!zBGCL}y#0i>0 zGw6xiv9~V~3|T~#GF2_Lav&qG_3Oly*yltV?r~k9Mu5EDKC=D<{1)IX;~1L%nAy8F zZ< zbs_3Jk3}R@Rf;43biBfLyS$OLFIS}e6`&@|Z1zxHcg)HAtRcmfYAmplZ zDt%L7Hp#p*6*Nc1Xn+YY@ZQ0J|NE8K@T;X zkdk_b1vU|bai%u;BF`VgIMdgPv}gugMF6iSB>**LM?(T^s9@!23szn#(e|xkC_`P- z;^}eCYN;JtaY~}nvR4=#kc^9cU2h33I3>Q607kn#HfL+96KGdxeiwUvA_d2QmHtWy z=mzB*s?*p$%F6aXwhvbea2+#3Bdf~k}%?5eM8-FqA-De%-A+M9C zNinC4dX-(#B{D7fKr7qo@2jX6R=;%k=Y=D7^LlDht$D^$r zf7@Qee9Cg?arg_YwPR4wTYd3*7O>4XeU;_|&*js697))y@q3Y5-Bx2{11*|J`^3RT z+X*L&U%K>JdMtKH^fj?R#enM%>8ZoUVZYkL#lamiZ|PrpYM8S2V;?-T9r}psJ9oMv11d~M zX6&b!+k4LLs`J&JzwC1Ws1SZ#z`t5zRezc`{w`~{P!!) z5v+BROI2wl#2P$@SDXMS+7-NObUsq<0fP{|W zP)84se0uI3prYQSqJ;?wqzgvQjYN;}Z(dfbH(MN=NYdQf8?nGK>;8%vD6yR!8aG|> zv@rt9NZi%s+P$bxg&E>+f;7QH;4WmKT5Nt3+hNK>G_UwOe=`y1dFMfT{7|OQpormV z=GN#4VO8v+Ai&2?Fao&C{*!@#{YF;!b;nbb0c7TWQEg%Y4=|g2_we%eN6XmiKuF73 z2&vw93TG?(_`~8H^i3)A*Nql62|rgkSYs^k)5lwSugTRY%j07|?(REjQTD6?kFD4@ zPba_kP$zp1Vp?ulU;|vsFggtP6W`|R=~6ghA@v&uqM}4Nd$H~G1VFGbpQP?gP;gBv zG1RWILIvf>HGK-pGS;)czs0$+m(gu*c*{)uWhL&5 z1rs75L!n@le)em$3}b;;V;i~k)#Vp!wDHt0NZPAFeeqRP#blp+5+6H~jw|Fh?pJ$$ zBeo;~vCHR0kEx+)Srf*p=+X+77JqMz%`{UXe%f-)}jreB~7L6+^*0ekKroQUlBuCu^d zGn@I)5}7<4penxH1fD!=OKv%M&O`X?w-Te6*Npy&qt+%nA%S*;a+sv!m8$-V3zvVJ z3wIw8P?md6;oUn^nbwr(Xx&9uB=|6@==bfTFVy`j<*Yex?m;PF0#CP%$2cBjMhy4R zY(w)~XWVLe5Xc0u>lcbep|^J)^iTeT`x{!O9>~PA+1CFM;4>^~6g|s!t;Zu6%mIWL z;3Ql`QB13yMLmO#L@1Z#Iie}}osRV~{vNEdb_(T-uxojTK07%05ZCn^x4%7ZUn&CfrF?QMA2 z?|Gcosc`4Zvo*kOKCA-y*C<2U_Is%{x#V|J6)ROfaj}tDfBHg>apU6F5JUPT^UMXc z8C}~m)P#o;{ZYc4vB)_Q%F%&vHAhK)sRb*@d&>W9%c*aqa2@;${DlXinFup-!MWx{G51^j+sdW2Q3=Xhq>xq8fI~E;k0r6{n){k zPhgtn^n41(5VPqm8{(2R6g1oc*x0E*DqVS5%MT75?29`6>aY0KyZBAig$#6V6_WOk zyP~Y0S8Ii>*=Uc4HAL-3m(z$2{BW7KTJE#Gg!!w7xb1IFh-C z*4_Q>Nk=qoOt5nln@A#LQqe;{|8^1ls~3^^i-7ae6iForqVolJ?W~PVyL%$jJ(!$~ zj*=_zE9*%D;FW|`(lbq=B^cs;>@e_#Wn2{-?jnRWf&MS^j3(>X<51h?u2}Z-Ls2(O zta#O#G4#C8M40h!msMQT=0d;w=~X-N5c{$zkvT$-7a;_hAuGuN6`~u>4J4msXV)ET zbDBFs0qbI`=LQ`Y)5QDV+E`gh;#l?R@vz&N6MR9zam*tR)>#{qCue*-U3|sPBwo2T4x|lhNnE%jr zd#G!84y0S3CTX*Qg_|u1_AGfI*BD}2U}bu3wpi|adhe#_^q z&44Y=W1)3&H`9;yP_Oc5D0)&|U8muPIE-*jZ1taT-P6I?;Mp!n!l|ei7@zv?16g(YFZsSjgX{s(%4@il{r}5dpoFZ@sztr#yi6 z!bgbBRQv1{In@EUgWo;)ke$~AX|>bEoNN=X;w$6|)!APtLx9zMRt(CK?IP`as*uLU zaw}$I<@_MAOBa` z2Bdl1NaqULrF;))C8Es`(nt6Q$=fTDAMStEoH&(StvG86X|zq5WCQ2nkPeWT5GY<{*3vDg}?ySgop^}$kv4$Tuihu^h&MuSqmaMozb zF0Y*F3<7XGdpOTVohz zT$-zXg#0BWX&pH~m;-BB=u4Txlz5*3?)J22x+eatXD~Wt8G!LQysFJvR?(>FuWcjX ziUdP?K)1BMpLxSA>$LX>%#iUcWlfTKwYOF26_&k~HZ!Tg<5kjq$}MLIKnRcrs^oF- zmkfSKx_1ywVolf3Jd26Eep2ZNAEr=a%!GPXU;Z`5T^h~tI#Cw$usz!IgE}22Z3#$o zwGL;syU}g}oEmF!e1B&rMTd?SYr52sT#eb1S9L6?NaCk_7})ow#BxjrjM<)U86BO1 zwizK@7sMymSW8!)b)jdplZpOd6qNGaIspcKfg{9*9q{R7eVEd9f}G@=V60}rNh9EK z95LeT-J$(H>u;xd!jFCk-#Dwm>Jf13)o`_NH~3G!9s7^>5A*lG@4S`Sai0MvrW>zd zw|?CrxZbB`VqHa%mWi(}a{1HZXf1{3pdv#SWYt38)nJjIq@7aRsRn{|uGeoP*z+a- zyNv{?%}YUmq+nonN)sfX(1Q5%6wqV*{>FDpV0F+8_6R{+#SZ|2@1elWkflfK4t!#C zp{S{U@sGefg_O@%<4FIs{qxhlR}jDEvJ0tD%oT7wu5svI0WVusy`O}+*ak)iNbSR` zO10nHV=mDEaO;qi@hdELet9wVzU~K7W?M7kP#e;Z_AlZ$zre!@nc#EZJzD{Qm4>-- z!&~6&tM>^m;Eg6kdSpIBA?y(SwcUCk(5BpVKNIEsf%6kg>XbfyNe*on+DvjR}3idg^aoxMn{v=b$Rpp$+( zyVO9Rb<%ej4%rZq3edzhqe!Br03Cg)QNl^{SfhQaxYE*jBwT=x;5G0t&gDSOy*=X} zrQY5$6Sj0JA&SoAxZoYe#h#$PAoTOEc6`cJ2&71t!@?m)!kU#;<&PEL55Dqv2&5yJ(qZ~NpKdDfPnNO^~MZQfKoATdvB}+sHeS6_+CGw$`%6Fiy4xP>jI4y0x{~t%! z9Z%K&|Igj_UYVB=k&&5jFB)cKXWo*^%0;r`-b+PfluhOOgzUY=y~;=f*<{=hvSqJ( zfA{E!fy4QpUj`WNvEFfF^fUOXkzVoB8b=RMv?DOm4 zH+j61c#g{PYEJpb~tpANn%782DQ~naray^BQ4GRY6dzRzvInDEgLTOI*sKLU*@B;U?wVzM9(z}Ic;yx+(E6>sD092}_~syrUxU0Wn#2UT zWrDu>?@w6vp11ars@i3R$Zhx7@7U_*?JN0;O{TnbTWe|kW$)8=k{9W%Ty>NR+QrV(0Of`QVaI-S!v@}p;Rp>+k${LDa9 zN(eTx831#VDePv1MtOp@@;H$EqhEw0BIg@}(lAKM4p88O9+zJ4pJ{5x5rJiPZUPV|Fxdc^gU!?B?2Ueract^A!0yO-u-?u`BZpZ;@1i*w~=ct&AO zO%x_B7p>G`75>p(Kx8)Kh3T&edgTSkaHt(eYY?2#sr6oa?>?U`=@vF?f>xh4{7Qo~Kfx zo!V-UJDuT6%>`0|dSq9txGRYXZ>J9iYu+~SuqVBdupj-Y*vp5%B>8x&fIaY*@|1X^ zCLZ%v^gb_O0_@VfYFQoOg_*Bcc#~eMOyTPF<6pjgnVAJtUHp`te<_I;-}T*7YvIiP zQzo?tS3h<_?T{YUu<^9X9=}_8zJH+I#qFwe=s_8E-?)G#9)}-V^(4oWZ-Kt2G+v7= zZrr+dnU>GTzMKkvIGYw#k1?kmmv)(7kdN${!Bgvf!>fxGPWZfL#e{@NkEi&DVpnEd z0ZLXQL7M9+BI_~l2wh0ghT%)oG-zZ#vBzLd9!OvqTYq}vSN90WOYMp+lT%8}Yo^w6CSnK}F7nh3~a93yrPUH4?N@Gi8s{~evoA$s;6ZVo;s-wHz8 zw$Y-8C*CFg5(Qb$nXhqa@~|tJed$<@aJ9N zTBXyD$?~`firlqeO`f8S8-(QqIJdHS|wbR8omZv*`3e<%`;qwYesj};(A~lc`(6yLA8T~r#f z)v9-vV5sUIA+6?&&HH8Qz2XeNqPg%`s|jK0^=eRRPLL zM=)qnq?$N`aYz}-@=J;@I;_lx^Qswb>;jU2l0p#b*{=W_XFHOxvRPb=l-V24OX2X7 zOI*Me%uPuo0@N$()&c@A%>}B8U@PwsRUbTB8jT)8n}YN7_=kA<^}mz9V9*~EvJQ(% z=>F5^pLXe4$&v4!1q#I4{9uJea%8rlm_yowjGg;+z>trN5bZLN?!F0L)*3p>SHSUn zl+s70GIf31(Zo)-g}HFIH4N`(jo4t$J*H|MjvA(-wR^(So0WfWOuDOu26l}buW7lc zb-AmFh+%m(j@Gj&Brcjln3?Jf4kcXZu@0)vsS~xnXhggMRIGep<*RqWZ&+bc5C-5_ zBLQ!Fd%@9xfk^1?)md=ih9thg)%$125xAnl6xEqGogsNt_Dql@Yx$$ahVBEDCorR>l#nnHhG^7nin5mDM!wu6rHbRUqyKHL} zbt*XuvQw}RR;aAsa73&qd3`F)Uh2BX`iRf{aH9I~G+pOc+QgJMcZw|0W;&#%<;FF+ z@-_BNlH4_LVH{eN=*^j%xo{;-lE?WC(Do@o;6X!a?isFs8vzrj=>$f?e0H~uFeKe# zDoBcz5F!6f(r4PqC;>so+SvMw-~;)}0-q5?zW{Ym%zqYAORQCdAtklJu*GLWB}x~} zvzzY;F&cH;-h6UX8+gPcysSp4=n13Uv6}w%?`uxIdt}orx>kV0xd0G@Y}gxN*6rh# zh42uF6gZYqpXbZ%GaA&~j@&bbFFLzB=E33RkEhhdE&3k@1Rkx~tMd___X*0x;Bw@k zcWWaGYe?fA+UMF>)KvMassElMf*pjAbzC!VSi_zRvi;s5`hf`2<<@;*awm|t%Dod< z*y2w%aDSf>}ET* zAj11!_ePUEA;Sj0##o+`!6fj_zY1}`ic_0Seua>mp{o)14Ic+*XD(ccVkTfhqJ}LZnv#GU% z-uckKUpHv%BP7xp*gJM}Wa@e;h-25a5&7jmll({g1!uvUKG^91i8`=kB=QC5i5m$2 z6>rAb48>x_MuiQ(GHm_`lOet@Kp$j0d-%~E-^^_3c=ZF6*3(BZPGR|O3|0^0pcF_0 zRl0zsEM>D`YXZdzo?nKko@H90v=={Hy1!gf?FUt0xMwPY_lugyKUj)*3D|LC1|2{t zafrs%zoMH}QUK{re|HDn1k`9h{b zg$8)KqBzp+m~3Tz8Ixwz*mQ#MS)RU^@@}sp7|b{VhzZ+oUWk4VBXnu=Ulr8jz}YER z3F2BucHuxePzJ%QWNJp@+q2KYHOY#=1FnPaAMb}8VqFp2CryE-j;_=Yr`@~%3#E?0 z$VvzE6mxzTI>GEzbu&?pVMZ}ms|i^xTWywf@SH8FO}N8yM_zni1F26s5--5!E}2MkAQGozuU zo#;CBMi0R#NWmcpUnO9uKoIu=dCM7MZcjbpm8dFm^%U1hex8E{TgF1;r9k6gr4M;d zXa?}h%uPQXpn1l^n3%AWyKrLpNJpB?mLPQ)PmbUY`f76$~|KSv1*2o6ClBnA9O?D0?g^1DD8+bMgg4D@us z09?rnM1_98iY$xj_Ok4nt5^z?ol4Bkxu30a*$%kRT6oPC{2hv6Git(fK)(>Q>;OYg z-Zz$F$a{|m%ygD2W+QJshi{ceT%ae=+w!r*77Vk*?m{9=sd`(}rfq(4`0M&qX%8wD zYOxmn?sa?cY>tK~u+OkW(2Yd^YwsSPxf?*uccAVE13Z;+CwHT zRWpEL$K49>(cNmu(;ZUoCCw4+`M+6AnV<{?mYMWF>+r_>0s5W);Vu|U-)vG3_JYYC zzjM@D%;e?!$Ou$kb-$ABthv2I(F0}SE+&qLjEG6`Tgs)Ykmkje^c1ZIRWlZ!D+ zT2tCb=>f-6LpsxJWHoUHA{$eC$ZHgN7eRLM!=OpSuXI)&T`P(2G;)UsjfU!A>n+`*Z*DO0UoneM%4e=;1Q~c$brTFiB^l`B;^npC!b-X{LymO`;os_}} zv^^32!|oBTlpa8(68lImJ_Xr=rt)~3Vlvw-N7!{&0|gH5yRl+zG-6mAm-|w+=3 zfYn*_zwAL(JtRZi0}jbG_IU}1gL^WpRbtaz98r-TPF^Jpv-W_3n$k6n2j`Le&=^aa zy+1)7;*^grWjuaFG85eLb)OL_KI)&T*^iwz@TA^1N>nW6ZlJT?lA9w$tDZ$Vg#Y0vu2YoaFh)*Rb+=?Du~T8guWathw+6RHq=>s2(UC zeW9XGxJl>J<{UVw$sO@9qI=<&y6 z+ zTNz(No~R0ah?AnMhyRUUFafi_f-Eyt1|GvUyI-c4+_)NUZ5fNH2x=ZuPwfftxpveS zxpB1)MA306N9~A~z%D=-mDYg_rS1_}lJrD~JgoJ>W)=Ir-0@%l2|Mj6Spw__rj;A5 zwp&w<%^9Imu&d(S%*`ava4LO4gMJki)b9EfV#+#yOHd34v?5Ta^pG9o3e@J7c(~Ys z;685uqU}M#{2Uz&JQp9#o+>foiKGlEVoMtAvbk}9sF#hv?Y$fgX$;@VS13|KHV|k; zq7^1wml*_Bco^^79t|aLXXbLe1 zn^rM(r2VxYk(pAV3v`UPAh?V`@Ca?+n?FP}SUnf@d`e)w=eZaK4A}TyxMl*9Uqh8- z1d%f846_SX*3=N1389h{8&ZDk zb=@2CT#`5T%zh3|JSXd@|Lt-@jNN_NSG0H$^995PXW46iM!*ZBzul&Tu9njsH%4#H zprpW$G9#|3*lbW#o`2N+-Qw^A$Bj5S%y}k6RRUgI7Pcfudjl^l9MTO%;4tZioO{gc z-}zhgtpwk@2@q5hSeH1VJo1`X;FueES(jm9HLYcQg{Q8oCkwnk^_2#g{x=shW{Ubx z0bu-YrAPhJn;c5qAjR=8T*Qsg{-~au|NYu{%{)2_{4*L(>eb(7r>j-1#CA!{D5dOh-D$^0!Ihr;1kLLitVYO*JNLSX||kKG309x zPHHH2(g0`XGd&~OaHmdGy=H%TTbh0iSV^1=ijs1>m{JUx^~71C09iL={#Iw<3+Pp! zx$nRV(^$~{Bg>QRKN;j7zKtg#p1%TI=HF8<$pO-^F>n&NH!kB%mHH)VIXZ|dgYk?V zN5^rdyVCCo7Lc7H*%2nGPfleMT}BoLiXE6z56Zc%w_dxB4e?S#?|^B0)3FK>ouk{B zNO1n~m=KENq~P8om?S>z{3S|nPGkhOB)9i7&s_q?!9Q{g$J51|VUb9J_Qyr~c!U$b zJL!kMp>;T4dp}hiVGsx&VJ2M!pNpPo8N z=}odGK@PC!?Qa>9@?W{oQ&7wq&7E9Yjc_^8*kInIzjl&3Q{xc{{8PS|bdkW;`eCK$ zv6MTwqZ*7=2c#hfsbJKqFDmN$k-9BVF?X`>G$+Qg!AKYWM z%q(hlV(Uy~+wSS*GE}fH1L*oR&rJC1=F|sRnXo=a&KMi3m#?mS4v0y-twh02$1=K~ zVq^rxyp{(ZdoS?!5xhSrLk-IDSApaIw&b|+m(ExR&QM#VlEfrHJHDgqh+us86@VM! z%}K=csljH8X?ohAKnTV{%u=^%1+&hGCG#|?mIEC8!kSGxvLHsox083w@OeGi*};E< z3|HPtN2L5VDM2l03 z_=|vFkbecsz~o9@F?(g~i?Qelp!^|FE|zqM)6h&d|4Q;%8K)EGeN%xlG5kymv|z(+ zqBZ^u#}_axC|L^K;MR}e2N)9gi4O^gH&4FG4B{*+G2!ziaa|Rrz=&SnYf^?le=&YD zVzl?gIgs^AHy`MuDCF_y9n=Tsa=d(pF?_Jkk3y394TkzL{&o+50gUz`?dG@A$zRJw zbkRzD+)Ap9387?(a@a%CSdhOTC|HOG{BHtf+V=3Zx)Q_>!XYy@^+W^_UXJ9DWn_`Y zIga8OBTp->H=dYq9Pm5Qnwdtq>HFGG)c&05!t-TB=4_yz23@r1d6r!KnH;Bi)O9$W z9Orn6bIfs&bQT9{ zCJSHO=!{c4&2`6zT_8+BpQ}Z9{_AeTIVmSSMx>mF&%Oi~@k)=1cuji)xQCHleP!L{ zcr#~ddyY9SC5OLXVeBjBnik?%rYwq}{goz)fNau0XJeqjU9<$OGH19~_)?{V!047@ z+P;_^=W1Fuvx0+GGKqA}%F=Q5Fry_#3a9wykaT?ngZtm146ttJLc?E09s9Jull!m| z172jKT;$qp{2j|<^eb{k>2%wn#gWYr-M>Pr`sFPQgmzNo5BJ^3W(|HLkY-UwP;YQQ z1dLhK!}{E-R+6Nr@zL@}vve^MV+Jgms5|Ff1#pyhSLl%a3hcLI2VpIQsdHeb`|VXa zkWbO)+TIQxupY4A0%rx0+_(7|W;>do^{te1;of-8N;rB;L`&I{0vyDgH9JVH;OEFXUdi(VrGY(RKoC0UV?7&C2RHP1(tgMciBo?@Cj6vB3QceLZ+ zF=c9GXpsaq;p*OJEvC&K71ap*J)ob3pwjmHKs4q9__&nbgF&#BdKZYd)k2X~+{Aoe zxuBWAeR~NcFH^M!POIwhkUbT$Pz{nXBLBrJZ|izT_kF%!*=24NWi6P|+N5I7@JK)X zq7}06NQ_kfBv~h^#zfHzwDS5xml#`@q;dKsi*)G+fBOH&Uct=tv>2J(yH<691LhGACMT6hmfbUuR zWA}g0k@$pc=>VJ630lE9U;+Fvg+1R+{b1h8e(l{J16>+K9>!%aRM}v~@D)x0Bksd! zA?`BB&Hf7wh0D&qw;Z^DDv%s%f2K^0-sz}C_gOGel5CJ8|HHREFblbu8?gAttj^RH zokWcuNtA%1nXJ9m6>|ze$_ZiZTl8|vehjd< z*sT{qM?>+Vwp|@odUl#G)CiDpyH&X5?n)fG`Dpjf<%lGi5m?N72qu;e!gdUR?v;4LFNnO*r*T7TBeOy->M-AnNn3LZU}UrI}fE~Gbl1Td!(A7S=Tk=Y5NZh{2Q zRuxk1t&k5<3JhMRA2b}K`hiR3JWF~JOzZcAfL8x2z{nX2A|6+QC;iyR9cPE_Ka0H2 zdLhkF3+c^F$Yt<^?4Wf+YbI>lEi~vc1$rUXW{ihn60AJR<$Nyw()yEpKU4ZpF{5Mo zZy7AFkfV;x0*8~=tVBisT@rra30MH>S!Lrlmf#?5+Lub>6=ln-PS7SuagYV?eR811XtL}#zTY^s9fT?mhZMOmfzKogZ?fSbqOv0k3 z4r@bb32mr^@<=tL2~h!2(;tp!XYm^C7(MD3@e+G|}g9k>Uom zew$(}1w!$Qhz4ASN}^N64<9re*~#VJ>L2R7>Exez-c)erbvKsf>#u3zkl83J-tTky ziU;k{8B&9xQ_oD*$lB=27W+5gq+h{4Hjh&@Xo1cZjWVXF_hvr^5qzgp&**8!=EC`7qm@gMRm%brm1^Ej&q(H(ZDIS|VSw zK=(#QJ!8nd&Q>i;m&yuoTlwE^HQt9SbJC9Jl70IUS+5cF%k~Gm4RoiSP$*y#boMKr z;gQGlXQtW=n{&D#r$Dqf<7OT}ySCrNNN%o8vH>DNYMHb`IaQDKcwTd!7zi6& z`}mCtg5aXvM%*2o6X*=MC~GHmv5rL#Z<0Rtfb2RkBCP9QGTpYeb2U6&+TqpENcw51 zg)9fDyX~}G5xvA!7?X|1A@6P$jDyE`k+(Ry8~{@cGJ#b|64PBi=W{r9L2*#oGRyBy z#7g_A`lpZTHy1Q;ope*Re;ph7NO{IFw|RUUf~?r9{mb+4F}=Fqj$k=4>mczht6?RP zk`6MnQ`*n_k%mpc`8VqJR{w|{$9-uVuo{%Sn*@+^^Av8-9^z<1h;yxk63!*M$pfv6 z&R_VJrui?3Tbz2!^h%xQ-OYXYwAUTksTnBOr%U@JLuYuMa$GWewFY3 zP=ZKz-QU3OSkv}l>rOd8_m4%-h~q)g=U_*a)8e*2*XprxJQ^I#zzznbw)iU}b?QS= z56_a%=CtyEzq`pZDTl+51z$$tV?kd|09Udr=POP&*UOa&na6h$}rM?5bTTB1u_Z(kD zw%wuPm=5B+#k>=Rs$zwY250ORx$I_a0TnQkpG`fi{xlt0^O_+%DWaTt<1igz0^}!(V&*NaZ3LvJX zi?fgO&`1#VLY)Bm8e#C{b4c}>(u=agbZzgc=Whp>oT6urFZJ#SiN}7;dti@e4?iAo z;&?=o1I9~%;{hQ_uVwu2LC!P1hHpX|BdEma~UaCBh31#`h zQ(FglD6I0%BtU`fB)VEzbJL{kBSR*zrfedn2oS|oA+fIry4BBb0SuGMeh<{1O!-6w zgJ>azNP)gx-G4Vyad`N%Q9X(~rhjk!0X445e1yepS!6b@RD+|&J6QUTCJK7sg z*Z-xn^j51sKQh#NpCxn9)Oi7B)+V&1kmA_R%y;Lr7_q1Mpmc$269>lhlup9#KIr zUsf6gye9TOb#Y;&7v*n_2%UJquClFKg=rXe<0DbPItIi*|3`eQ&F~R%L#xW}iYlK2 z-X>V64K$N%<>2jE#^i zD9F+k?+voYQ{oJdTpcvG$QaE=kTdq2j%q(7RqCrFO#{=r^^&H z_w{Z#pHBv~uW=NXid+hI-v1R>=yA>w;FEvNOy;?(B>!C%>X07ysAy8-9mMN}FxD2- zET+JACE$U00GXkdt4l9Z^&hS<4#V`#rB*m%=ulMSA8rbo2`B6R9Aj3VV0@lB_~Ppe0Q2i1=1X2E zz=)_p-kV~#Zn+VG=9zR8)R{^TGk1oh@FFyRupY!t>K2KiqpSMJ zk0%g#b?_%+&w4-}{r&1oXTw1bhRBN#j~4qTFRtuk%?Ma5Q8x2@PtsoBAM$MA*wv)h zHyGI26eOSa0B_&l2?Q*?K-eirw*wpgZ+0VKrQR4i=T&dY-!3mCUr^Pz;+ng|kKzXB zc*e~I>vMn}el%N-M`;o)OTg8F6fzm3!^+fwF?Vee1gVTTt-k>#y14V>;7UN5|5Zzp({z43 zO!LY7$gQ?$FD9NRVhZb@@K0XyU?Wtsq-9{^*k9=5ZX$aXh(pp|ma6v&5MyR|$r%}9 z0yl8Ndm!(sHkyK~UvgUc{ES4Y?zI!`dA>ZIkp$_A(DaNaF)Apo2i*Xbc$NG{rP`kI zN3@@N?cHm!UNxnZKT5VAdqiJB=^KZ{?V->bZsE8!ON zrZa9`1veZuw2Qz3cI{!D^FMU+_f~F?LxSHQgK%nE(t)s!VkWN5^hu;TZ~y7<#hmQq zQj@F6A>Vgk7~Rj2UW0+?)CKW}ZU60ijGg2>WaQ}48$4J*HHzq@y7yDlp9B4IMs+wV z)_(TMGhU#)n6`u0I82F%dtHYi_&F z_ULmuLOnksaIk^N{(=L$%Q^4f3MXA;gu*wYzmR`VJdsVJ91LUGITl*tZ$DT16Y7r3 z#f<0M{^}|#eafUsnUG7zK?ruyiO-4ocT(>RTs)xB7r}!1?yPmqZ!mteVst+x-KpU5 z+M6=`72`Aj7E#WsECr{}6OMlp1-wOKI^h;IZ9Eo@G5B_{nM^z6@o>xVgyO0FW5&CT zorlL}m12O?W){*VE^n7A#Csu84y29B^e+f`%~WVjasdp$p~wVs>*YshN7%_10>XAd z{eDH4#7O#2N%Q}`e=Q<-$jKI{t zJvK|kj)pzUbUaGKr|h8Z5i7nQ|4^s%Bw^5d%;d!mz!(2Ahy@5g}PflQnKppN@7k^Io&Yb)&EX-f^Td8CwD zQd`C6-Y|^F1I8P3GbXU8muloj26;}b0!U_Lj#2MsE&&)tQ>`w zdHG$+6gM+w!adQXDK>8 z+8F4T2MwtrF4d_n@^KTyb9CcjF|etQk^DxcN+AG&h*ZPS{g|pJa$X$u`mY++EPAdm z6_Xmz36R|Ny3X1$R>a&V<-MF^6V8;uDM+KW3~gXjps-XhV=e<25Rt8npjrm`0b^kO zxKnf`(#|vnkJ~)6lbx%oWVTxqU~+S3F{?R;mRM0@XB(R&2@r?@@G}1_f6}|q&i!1k zrcVx_i4b>9QRFqSDI6_Nw~_M%|FP)Nw5Vn<~7KdHF!?3UW+A!66?9`jP_J*8_?$HTjt?1k)=bFU{>=h7&gY zLcn3=k?dyniev{!%=1J-&RNK0$>YDz;uYR@m9P10j6RK3wBFo4JP8!&e`AR?&2qd$ z_{Kij>Zr5xky#?**l!)63OEDE#>^sG&RIH)s4_uc1r$oala5M8Q|N3={`Knny>Gba zXq>5QkkdO`5am0dyLSrRmFy0#OTcTAB8L>BhIld3+!-`HGGh#XO4_k%dPu(bZD`VW zedg8Z$FZX$kv#`Y0|>X?8lK;_UMzQHFm(gN8xybRp|k5}!V7Am)U|IY0lxT|yb&8` z0@52)>7aWTVY=UW1z*R|C=amg(YdznSGrbbaMVEJnw1=gZUyX8WH6`;J%9yRI-k}5 znPXSjnbfOjunoI$8aMjS)krk$^<@AClOyQOAMXE0Q~vU6 zzwnzV+?x)xK(lsZ?~)-A!yKd6xdH74)ApGM$2=zx35q;~^6NuHcqIeH>pJ8#Z@;SP z^8=cB@T^-HS_HA5#E{3wq-Dt)blTvG8~xC7dz7vzZv40U0nOwpkQc|az(2|JV!1AWc8D7@<&XjCmoE@Iwm;Msrn`kQ-qM zA5ViW5a+!KW^5+~&uKflWz=EE6kTkNYofA<7cC;&$RJ=P{zVS6(=$z=<=w$?t0R$8 zhT+=8%+&HgFr&k~Dph+{RO~uR;gmTGw;6JU3E9t%lSV=g_WyfH4@uZ=x`i~rj$xO^ zd0$XkQ9Tmo7eY^gto@P}c-OVq*P=HPtq-m%%(ZZ32F*&M#m4v5-mhh&$O5uJzabrq z6V=fS9?%2=lGP>H$o8PG-*Q^Uj9$MW=C5=!;k7wH4+K+Y-zV1_*+BV!s*nNgVM$=e z2dQfC+|(SDd;xRPlgZ$%Psy21AD)S*E8h56hBzW_nMjU0g7HXuR0ydLmIM)0B*VJ> zq$=_+)(C9MjMwGp3AWC#S;-B|7tv6_Zf+>}ix$U~U2E7!h^Yyu>dnl&p7Gf~FWUJ9j_Z@g5f8gxmg2Vrp{I2IxHM z5xvGCrcg+w#{xI$pInaPh9+?KvO@Skp|oC+L>;K$82ioO3SOP{lTOp$$47W$x>(Hp z`_xlO6~GX06Z|C*1%3}3Ep+O-?1Uq0bs;X7Qme|o8Jm;fhYB+qI8{!@hk=d zWkA^y0}}H%22OMhvCX~I-@uQ*&ctn)t$N-LX{c$g+co%E%f1}7f_*x9UXZpXe38=# zzeW3y2DqrprmsCsyu7X%_QBT9Zmr4O*Yq#-`>&pzx=aV?*T1fQCn|0GrT-4NdtEmI zip_PW_8MH}Ap#MCwM8btv4_ZOP}#3w;A7&i=b&2UqIk18!jQbzgWlZFBzQRMbizy@ ztKhX{G{SSUnq75ZFX)yD;aB;ZVwDUA<+{;gB68RfZPT>)zBtp{j!s0ldu3XNLOOyJ zhmJbhsO@g?2hFg3{sz{N*LYpO=zqEu5fKs^-Kyr=aGVwIKAwQM%rkkgJO7CTJoPAK zb;+;&n^MGEiHuIB3MJE%s}37RF>|Ib#>aA6c0#X)Fb^+54M zD8|{mK!dJ8Zu9QZ*H_N`sO7&a;Wv_}T2iUYyPmrVzed+C14CP3KlLeOF}Ru(>plJ2 z`uOPR+MA~@0z@~vi4|uN)!eba*eYzdeI0T>ynPb;_~Nsf=Er?H z#njagDQ!nN)-~I~Hmh1Uir#j+r?}K+6jJv|jyAZR(7L^%M47-*A048v<-Opt_s1a? zwS?T}UnGx{#*QoX7G}V~BU87^?m59IO>HqWTu@cCsVY&;wdKcylZP*lH1X1_hrZqA zQp^(xzu||5o8^x$Z;Qt01+@vf4geGa1J<&!N$+B z=mN><#;UJId*t#Osl@j2S|#gS+jsw1@~dqyRAqIw?NPCl%fn9lA;ZGj{q+Q!xhT8j z9F-L5m^tujt75z9v;*gA3ETTVH@8|vk;C7_*a(ecT+Ti3ez!BpuYJvTCgP}BrAW52v~1P7#C5Djq5DI@ zlZrnkf+~Tm{iiRx^5V#Xm>*fqDw%w2*myozR^rITezyxo?~N>y1FgM`t3>T<+J=|4 zevth5KyLjdPkWrXb>6!;TkZaEz3C+uLOQ?qq%@HIZV6e_Z=y|hy5^{jR<``h_vZ4K z-{`q*g)`=x{pyeyv(Q?ZMJ@ae+6`9OS@z~oOdd2XMbwJJUorg=;T8DduSo$;$;WM5 zSDG!@Dc~UpMP)VSS7^y+s0)S6?wzK5R6PsvbleV0*8w&h%Ur{P0JUScIDA9O(E6Hw#b?HPkrx%ZJ{h*l`0Yp(?5sudcwp$*_J=0z9XchVmuY~-5vz>A@usF2b z79IzQ07BTL&X7n4A=SMfn9fgi!XB)tz%bxHriH=&pW6l_e+x%xKRr012bY6}nW^9g z{53yNma@X9&?l42(_uDsi^-mAQMiiOY*J~K>?N7UIqI#ieqH>cLY#RrFJ`^l;A`i# zaiC-4d`vGU_TMQ?cf90BtO5rkvqP#8EVut=bxp*mjV8JKihQiY9&i6|~Uf{;ktiA3>WM6pz{e+7# z8G$pPtn{;@_y0yXet3qUm|XBlVaWJ`yACZaNc=(Dxol>O=InxyU2NV*X`VGTq^mlt zmEcU*ChAmxM?D{1$1Zt4lLB-3_1E7XjGcMdwLa16TDO4vV@i8Vo8ba`QM;jJnGf)s zv>sSx3Lmf?TLzTv`Cb5Vb0d_(DNGtYzL#x8%7e7m#%XOoLk)T>nkaW{TuvkEn(L8+ z_m@LdkbRud#6EnD1UeTPtaSSmv`BcRdkY*7Yy#8dg)sD_%H0RQ7r&5%B7rjV;lp#6 zeXMGrz(_!MT^;-(&A|jdO&b+Cqd9T`!m~rd#(VBfb2{W$a7dd{0jfGfDwi&Sn0giE zf_}ecw68*Tb)=sFX!ABmg7^Yfg4T-+7MA06C}rx}NbJGiI~kqkqSPK!eh$i5RC?-> zh5}s&&++4(b1ovT3VX)O6+=gWoKat5pU0`N5k8Rcn0Z%n-fxvLO4+*94zI6!(Sd(>Ewuw%tS2%9}-R0i#38 z@ennrHGF$|r(mXvxtkF!59G1xL)c~iDCYAl>wn>0zQOkfah~nUF(c2}@cy04whF-+ z=M{n*2l%x=QGEiHb;DOiNqgJHSq?Rg7%MH8&Ct!Cg93P$0J)MiTafY&pCo+ehjKpI zZbF+mE#EWEvX!amq;CFSz8fqV;68^&u|tU(5zc^Xe(i>)Ah!dbrVTcbq;7{Q1>te* zc4GLW?QmXnt?2Qo$2cXUAAFSqf-$Ahb^{gJanZ9(io1TJNr0?6k>lbK9y;Vz5~QwKj+;C{=&isT0ZK=|i@-xlEZ%}8`3+43gRF4v zV9GzLcyHre@{{(+iy~H32WEFp^Hhe2rz@KAyF5fsolTx6?q2F;q7*C>O2%~#}XFjHXi63z1+5COjxl&e# z99ZZ7zxK}huc`kJ`)5gaN={NrKt&LQ4e3%8>6(CqNOx|80+I$uhaaR%r4<;8AcBCj zgqxs*w8UV8?cVqP3+_MQ-cS4CJkIub=Q;1!bv>^H4OaaZU=HV#e{vHmSeX~M&0o^$ zuRV@EE=IVS9SW(WY|7i*75-%8-frb=v+3JlUfN+d%@tBwQzLBg+@hnivo$92U8oHa zb$hduP{T&O8SpVB^Ji6%#s{LveD{&3JB-=O^vzk*bf$E0!|kMI-wP!5P$AzNPoBaG zB>@_&zRBmtcjf2r)E4wyf{`{V%iU}K-~<1w znVzHfm9azWOTE5p@qtBDC-PQ3sM?CI!BtB0mMI`%f-{E=**K>mv=Eo{A$%Y)kh%UW z_SCrAeSFiR&zhE@#;v*{mwvMLn)L^{bq9w#da4AE2cX(f6k`bY&G zxo<2%Qw3kwY1w0bSVuNY-(wE!)_c*ae7+vzYSpgoDgaqjCCP-nYl0{gTDD~HN>cO^ zcDyBRV+{9KeRJLQ|?ybnL!X6RX7dB6?ih-8Awd`nbQ=1`# z9xJxqyj<2F;t~tFRG&gU9(IOrM_gX<_w)0Q+ohc!^x})( zmDUrt^(6lItpy!lp33sIZAtVu zs0B46jMzm$dG}U2UsnG*Kd}Jzr-JoMQzISrN^}#wzkp^2OLE@nx5#B8W`u}*cSz91 zb+yJtO(9C#X1paIz;G^s)U9jpPpRkksc%WtEk8S}6)>OBdr%rvX-qL#6$gz6jgtNg zJ6)S(++9l7nmO}3o?^+QGc3xLyo2DNuhATQ-tYgk^u=N4IX-C=1eCD69*c?NKVSM> zB399?)OBVerj*mwY`F24U!A)E*Hs>cH_K1b7p`(_KzgGm^-xA1n0==v&n>M`kJJ^a(YrfR z_0!iAa`Q`K9%>9!^AJ1>H-1Yt+J(;(dXsX!m`n#j#B*2uhXQ?mzBG=CFyV^a)LaE) z5BK2=;58jS?FSsV`o{(wb=Oc%b{>oT{gY4P8yRQPK7Zh?QZ_L}2k+)H?&_8OP`(EW ztA|lrm+V!gc8TxyK+InJnlkH3rEIv8VmSjP!ez=_d&A3M=LY5J+$dp}u@k-zQGs#`Wp-|D+@ZO#$<&6C!c(8JJ<(IE|i;iRb^fkazPpM_okkalCz;NGh zZ1(YCJLvm<$v!s|Wof_AvpMG|pcTtz&;wb3 zO$A4uPpAHyzr$)rkAEJldv9M4oUf-geP8vOgWrl>v7TxuNtUAPOczW0jKQMjwTOtruI z(L`RBrMeZCK(vkZ-($Uxb3L|KG0orVr%prS#(T3muDhJQnNL5u_4TGSm&#)a<2S(1 z`<7KzD%fXW0RvnMv|{ygg_+O8!jEUrJKiW!b>_&dFl7jQc&n2ZW^}oS{vh(hBQWY3 z?bW5~!j zIQS#5T1BWXqn`?FE!MATDCMBN@*&v$&%@1yQgx0IQ>~Mp^#8KGbr^?SU23a#M7<4M z;~YsW2O1Z~tkbv8R?g!x9p!+i{B>Lhz2|$+n%iXMdyIp+rU%MdX|Ts1iFBZ_l^C99 zHm28`U~!!0YP=$t;On1SBmUZ%hdq_7u>AIuZyDaSiguxkUp1#|{F6x6VsjlZ5GYrB zSr(8<^)~|n!96q@W)m-VP?Sv7-dA<$JdGK>+g%bg#AA$6c&de)6i>xPZtjm2Y`-%m=s$q)O`Qirjm2R%hPThlb%uTf=?Rc6S zsLyhY2tW8mX9ZeyS0bi)-)Bk0%0-zC*rkPg)h8(5OZe(ghPYmAY+yX>UFPswYs$-W z*Xh~@iUY`VSLwJ)!cXh1mT&}*-rHQlyS*%^;A0~Yz4J?p+F|>z>ObRA0u2uav0Xe3 z9+10`L=x4*F}$1fMwEIF+09t7K5XAG_$2!%P2BtlLndOXemQH6n5uYcWJ zj-~_)x4_L=STVfbo0DR|&@3mdMwtUef(&X>Z}-$vZwm0keW#>`IZGQC62E#;V_k&K zc|JlKw8(X4?onMud(Pi$<;aLqnfG>lJCo?t7+)Uyz1bj|m7=+~Vd1QyI?`^F8E?kG zGypfi#$Sl8ocd(*+r?p5E4(mpxzMg;H@rNDKGN~O(f^t<>nk!Fls$K@-b8n@7#vR! z!!e}d2c&vQ)6`YBo>5TraEzXU<+G@v=dASq#FyKzGhgr!%oih|D zxje9;Vw~?IcJT|%9er4E^kdX3GJ;wEf4YPWX)qcHwjbr-? z5`L_ZY_N2<>B!mB2h@eWnPKnONY{?dI;69Qf#Xw01mVvz4~U~xL2_lQczamzy1cTF z5B7OzNnJ7dxuRudaZ~LYkJ)nv{ZN`WXO_NKc z^-bj2A=m_^ax`w;O!HM14{jQkt7RkT0|I`Wr0v+NnxHtX+2z6GS5L3i{Q310WG)Bz zv2D|VOG?)=FWMlLpf`J?dXS{(VOby!6ZNg^!(HV?w2n+Jbtrxder(<{KhP@6pf^ZQ`QnmrefF zn#8>dzs?Qa{c&d|1lhzh^3li>W$H(r_ld_m(1waz!O`;r2lKrVZ3=Bsnl-+DO{;c3Tss z_r%LdwMbgY{4GCvOBCF1wrOKZR?Vlr^`>qe+q!^`U~hm)Mj#0L2CPOqtN}-#wa&Bc zv>yykGonN1XrhBw6{Y|Fq$(s9wO~nMF<)Okh(`JWwoF$VCIp(@J_{5|!m2FgJjuTg zz(a9<^~Pu8PJ)%l+g3w3BAYN&d!jafm&beZVAdvz=pNJ`CQvB7jNut#;@TR!nL`6V z&7?aSV7eTsVe6+!r_+xg@9ZT!8+3dy>uJSWMA549SaNAtZd#yvO3Cg^8x1PjjM(ml! zCDBvoZ@fF@Qowj|=1}V^uDXP}zpIB3kmm<|Zh0r%m(3<72_cpea{^lim%8T1R^B;d=Cbo@@~ztG#H3ALv5dsO z-sFhHAgmDW9=!L94skX#BBc)R2TNQBcrJjW8~*1>>PNp?!zNMH46jJ^^7Pcjza{;g zC|>5cQ(Rv+X;Hm&R?S5NKCQ<*r$Dmp;IOgCYtF~81_>m!d-6j~0-UDVX z!HX)8Mh}c^ggKs8ReoA+O_M}OG76JV19n0IWxHNH;{3-?@P*Ef;*c)?Fd5%C!~ z9^~;#x=XI$nEmRNFjgSE{WyfK6k%+C#(Ez%)($)pdBW~6cI`XXxUrtM4B542SUyuz zgcq#?^7pnrv9m1e1UIpz3wjDYy?asW)l}r|P;klt5y!l`Hqz#m-&BdwZq}__oco&M zIlL59;c9)^t7i66U$+4zEOK-!rZs?nOH*+%w`9$#Hi;Q@yr||{s@X`>mE*eH>h7XJ z7dAt@d)V?Zq#*wtK_n_4i<;dZm|qB0%VB|EF`0N1^>6$69dMsosTDhu zfiA2E6$JC2e&aHW*bXR>f_B0UBPiVQZoY zTfG)G720?GwQ|+acW`icXEVxl2rSycL=TO}#c?^VVz`X#H%vRzCs2zg2qh-N=Rrom z7?}RkCxbZQOq$*fYWE(NJeLVlB9ifm4j=`ks~}}hFfoP9YG8BP@oK+sb>6pD6C`KY z(#~^{et}v)rc2v#Ytb13crPHbr&li9i-JD3}GcQB7ooB0R zW+8{Yk$R+}`TEA#RO$U%rN4OZES8eCj25GviRpX5vwFrgDFUmTfL{cC^mkp21B6@W zx{8w5kt>*6OyJ=u0AbWL0Uh!^C#H{gZRq2JltB&-U`uKs@ zKBXlEI9f1oIux>W_BccXBaKAj4`gk+BCi|frQpP@thpL(N_?$nb5U5he8+{;JI*E| z6)QSQzoucnmH!p(4P?a+Xr1i+JwZ}jEE^vxURay)seL2DK`_JyCXTkl)>>^sfs9i+ zIUE%;6-AjaKpuUzFFL~5=>4O-IlWD|WG%;tbzeUdU!WCBL@%$qC3L6bd57+5>Kj-T<1ak)F+BMH;N~y506R z);Iil2FcqC{6%`WP3aEsCOMvs^#Cu*9iy!arAq?+K-pcvYSsO>DU}9lH!O&TGK9-v?+72)-Yi(f7RPr>t=4?es`#+;XY|AgzCgx~K81{M znqT_XTv>iW6i6}9#pz00E`^qa5e!MXgQ|iJNyryNFr8P`Mi#fbSF}EtrlzziK6Tu%P)dfx zT=_Ll=s|-$PU{xSm$5_Sah(#yan8Ae5>ai8n4HGQKt;i zAmJY;4{A4L_mHLAZ&pw$&o5@`gPLB0RK~n6y(Ygkl6?<@C07# zKz*oCjSX4VTH~3zw|y;zOyA&#dix-lHCH#Zp>CS}WLmZ1Dl1N0I?pkhsW;?F1L{;I2!!OUZ3_ZDk}77)x=O<~p#H+SmbGu0zx}QXhtF?~&GxiVg7LY7wG8}(f z;`t{nei^@RI9<6QfHP_zq9T$|G_( z3%&k+qT(c}i^r(;rzqUb*TI~RQz|t)ck%)-`Tq58uEaS2*hC3=DKNgi;S%o(R=UQ* z2&?v82<}?tJkvsL4*1^K=ZK zlNAR3!o(tSp;y4yj;E!aYZ}78vsKd-2H!C+KvmmJQv0*8qYjt>d;D1x=2Y2@gk;vk zxX@~}yeB=c8F1$EfDLE?V!5QRO<+{p9+$SJ2^=95mN16Gi0Q|lVTR{Gbt{=>UB-t} zv;)w|3t|QN)&V#kKK3ebAojFjM0#VtH`Uy=0u=E~s@CX9Zkv?SMW6|KF#PFG0?%vG zI<`DmNo8-M0tKqRU3N68HP*?{z(oV%uRkgD|K`1`@@d6eNavTz&EUp(u{$+#b2>vB z6L4+rHI+cv_l*pY(0d-nsn0TF2fDy*s&F}hO#^-#g=Q~UvT)Jx&JO*Sv>Op;pRiA) z;}yN}*Cj_T+6i?%I-$H`dkJ>e19l+~&~NXTl--25WAJh)89yHL4DN8gEOGkz(1#ZI z*pnWMTM;8clOshM;7fK0c2Tpcvsdd`h!7P27*su5eRMM)SrY@F8 zX|wxH&5;6h-T=8!ZUvU@4)FHLd|2!eX!N+4t{@}s3S!r@4?4S3+zD-U3_a<557i|Y zD1+i8v7V8PW*JV;^?gCtd!snbU;H#S&%)wv5T)hPBRRs`9&KM~x+=+N*)JXgIlZ>T z`SFUhpyds@?|vXv)Fa%Jn_~9d?_u3P1=ro`9OlVPzfP za#(YUd-bC_B%UI*ollaDEB{-pUvV1$d+Jjl+gj?_+42BOSE%px8-2*MIPlbY>|Q(s z;^qDXb6?%`!VRvjE>S`!Uv^|04#KQ}VuTjwy=a-VJ> zq}(rFF5T0;9d*b2ebn6Xagnd1HXzzw_*wgpQtVJ9eik#?axbM;GfJPt4|P17(o-!bm0F-^jb07pn4_-J3t zZpH%jAGg|EVv^h!@Sivto0n?~RY#5NGEMmv1-l?@ujGyS>bJb~i;7aZqivO%jNfO1 zg~wDLjhx#SoCzzD3#l7xDLZ5--^mf%446dLg9w7e;53C~(B4M$B7Cvqo_`;*FY&^i zcTK;-q zC@j{oe=MkPGcTXLCuUFX(#cY2bdG06!#r4Th}uDknl*~15g|rzwTgc;Q;iOsd44hK zIxFM#x!$-Vx0zl6f=V>W7$;1}IF42zv9=lfVw9nq)R7LQ^OEMfz%D;Nk0we7UBW|04+0i5C%OybMKF_8uAv! zaPER*W%TQADG9^g^>suH7chU;zCD$h)GCT)k+^GSeuIAr)SUH`XkK}U{Qb)BJPHrG zS}w&aZiq`fx&I~?tHKknB?&4aCH0U7iKkO^zJobQ2Zs}!LIS{$q=41Ds%nHRi zH97$<=D*nTii`#w>m(;Wnrl0Pp#Gqa;MGTi;PTQ)Z}?Yw23dYEX#B$=$b*#-FaR68 z`n!W+94h>Sx%knmH5aQFti|c@mm_-1Qi#;upLu6q=1%q(+gTgV833M2=!D|^*87U5 zz6i%J3fSng%&1wWw<}Y zeRVAvb7x$LUR>}6)p>n)M}^;5p+^xe-+w@Feg~mPofuTj9fNMMU#SUQVmoW7ss3yj zP5(?bgzknKyLlNub_6p=8z$4fq%(?_6c)ODIb(QUJr}&yPLRjCyUv z=K?GfX+)m1t09?HXcs~~j~++6BDa_+|3P(!C>QMJoX^|tUjgn-tUX^zCl z7a+3>e%;H}qn!?p0e|+VbQIgsV|}8Km`>#3;Xpj>Pw>axmoeKU`=6wIKFYy-#Y~{e z60x!T3C8}%4#t!Nh!#(B09{dOdJWQhLyXz!ns$S4UiS$bQ|E_JzBki07UaJC2Cvc? z)XKLffSZHx0CeyG!cIj>LECR2B-p*0v2k3LSpEZn*1G{OH5MH|2}t3kO!r^$#xc^p9ek&5!tBx)7X%`V#D)L+92cj* z-)K3rep~h4DJWD2^}G!C7svBfd-X@^g7sN0;FZQLF^;!SFuZxaJvMs4Sl8-}V6{Jw zoL587oqI>x#6`3DhL>4Sv4{&(wJE<`Z?P-m1j5k0=kr8RLMo9*{y5QY)nDq(nWJ!e z#{l2b3o>~9_f?obuP7{g5o@s38osW7Jbwi*M!vXXQIGsQim&S4iM^np^jScOV?^*d zc7A6rY)Y<}IF2ugr{0@bzomDFvT#__f$OPfr3sHf*a9ynFDo4C0XiW8Y~~J>(*;(? z9UOY5tV^S7=o>Z{8l=d+X5wImB1pC9Rr&)9Qw=Ktjncd9+&1(wm^UGs6N>BBxGkn1M#C*rf&Dij+Nr29GxAwpJeD^G7HSftSGjO%uCQUwQ`pD_-7M^ zEBHyrJ;4R1PHh$5ctS^mxn-lb$n&Kn1;`VVp}TJ_QO_R&If0iYfP&NX!pn#I7;-kU z{9?@XJNaD*`mQnS5iMEd#b5A)J$_Rb*1jEA-*^ZS-?nN%dnWX*?78<1b|xI^6Kj_5 ztm#Hl4U|8oWXga67kVIr4%YxksWb&c2H-FOspwJs=@ef^)M;D&jdTEVG=KOsCr{+{ zPf(#v8}1RCpdM5LBmGl973i(ywGVm53@nHj2lJI@FOm=yHcKdJ_maPl#9GdXYfZ-) zGXh3@s;uTrOH{=W%-cpsWnMv@QuY1dt;<}w(SBv6Y%I;okxa?Nw--q1Zg*|O0SI3! zKzNWr;4EGBa#gs?G3}IvOP*Fh(2&XJ89BAf-v9#lW6i^EqYMZ40<>lG8OFrR^y98* z2YRO2ie65!Ewz>Xs$%jFE!=Vx^|!m;AcaIyb4J?3Ii5g^%CkwYZt$M`AU1 zRdL9vV?}bA=$%Yj8&0KE7IFf*|o}HuBlmD^9F&B6JY7fYwlN%Y2M2-BaBG`s3a@t(z?m9N+B6Z*uT=v&O zV7bJ8mZnd21>0|9)bp}KEPXI*)YEsO3x~S~ANVukQUD^wbLdwWv1(;*wEAxsri^uy z97!UeRQmT4ja5Xh%Phxq@Pmz^yNP}~I?qFIPCCeisPvJ;4kzCen?-u)uE4*P+MzS` zCS?7Re{-8H4!!jF_UCDg8lE(EBJ~E-uZeAoL!|-H*7YX0gxWW*Y@CddR}$3o-WU#W zFWgdxuZLv!J3ri{)6G3c-PQc5cRr0c8&+A&#|{`Xuf1i{cl**V@$&jQ=OJOhspclN zBIymm^xMweDEX-Qle24MtJ7xiZqY`_uIhR${8V^Xus#WXmJ*9W00Uqt5eq0*98xWT z?)+fZ;*-!ekJWzNYF5(3APE{mK{pfr?PXT|T^7Ad*YN&ogjoM`r>}0j1q*1}3%Gd3 zr>Ag6_Hj94!7Sb+^&c}}Z?v&4j;k)}pNjXK*G(p~vTjDnBtTF|x!phsoEecJiusPR6^2B^h3-Ps$YN|@{N1<<1|*!^Cz(T0s%D((Jx+Jc+UM_ zL=f@iMK-t{D?4C=ywdM#*G(6;f71C^)xl+31BSUdu_Luxv5{!#!m32D*j06>_(k+z zp4v`|c_&*C{4F*a@JD6fGg}0hIk1iRkX1`0MHBgNqkq+J{LH+shmBNlQ53w}MzmBq z6HT=VH>I5e!<8762yD7EmXtrm@59OZ;eRE^C9OMl>j|4u(%{ziZ^86Joh#0hbH%r0 zyH=O~;(A-O*_~eSV9BRhSM|*r7CLSNjAHXNv$f^^j-yHW`oy1`2^T-`pfzz(-{V`N zYYqn%fNHE<7wgkFZVUAm5wz0F?dsoFOLgepw?o|YS_WrF$7*Q|$YYiiC@NBs0|p_n zMSg6nWfIw6OR)Hc@c@RuseN;L(yzEGL6edJ;;OMH@PfY{xRQy}^J{D~Cz)~7H^0fq z6$V@u58@FND@mAq*?s!-eF-_fWM;mt=pu-E$p)4den|;^j{jdr5ZA$V-^3R?IY(vP zON2uHCQ&g4eu9Oe_V5Q$@pH=m&VS}8=Vb78e)w~su_?W{=f}!>W_@|Vjr%Ogwt&mB z+|=B-;4SFd`n7=7M=h}sVEyPE*{z{e^wG zM2SI)2wx+}gPvuVuD7uG2A$oDi6H4rc4U%x55F*t-j*(m>ZXgyrfDmnKS z%={E&l``CX)7hYNG|M23aUmD+Yc=~Yd0vdp?utM?%dL@MAp+) zn9x==l8!U!*&S8q#=qXk#>sAtNs7HMkF$Gj7w3h$&rt z7UT5mN^}Z60K%iB0f0;4M5ciw%e%_FJE0*NMO!@knbi1Ud z>tzZ7BTu4S1{os2uJWK9cF!&rLtM3D%!w*3lBkuF19*pMLFAey_(b{nz9cR#U;KNf zU^M&tlGpTPesS{7UL^ZF;iFF*@9IhlXCIDuto5}7XkG(m*$T%a*+rx0WO4={MiGo) zY-=h^|7s^Z{FxcDfUsmBO%n8G=bRWzTg=H&Kc1Sg?(*m>nIwjMho!z@CglO_xXRn5 zu7ZOZ{OCP~TxmUjpAa5XN=bnhCdsU+1cbS{f6M3)vWuKnrgb^=hEjqg zE_bueo91WE4~Y5Sn)qHiGwNgZ5HCVa(ThM2jV0{G%70<#(}o6Vx~S3e>-3TL1P-~X zJmAr!YsRuy#c_>#msEC-jN*U9T4jmOdGMM=I&mr;wXZB>nvQx1GW|WQ+99-#>Huq$ zeK`DMcUbI6XB%Y{fAYKs^c+b`amq*5@6zE)RH!t7jXr#rocOl)jsxJ$GW$Rm1wQ@G zi&X}?lVkXsel~gcvt!@nfKwzM^17gUf6ALc&+Ee<8)Bi)bV|}~!D>ool0d2yXfLSl z^A6$5u(69|_ap&ls{jg)^=z8?9|LrLnPj9?` zd;D}6-E@od${s(1&A~}#3pDLKFuqe-(y{(Cp(Jv{ zkJ2khj3vah$yOdtENRJdZc5X(4~Jj0u7`n;BD$OmSnG=yQ4AMBmyara<0h`P;jCJi z%~=xSNe&m|^w{IlpD-CpfZyekTz3Zg_=iov!^*9-E!s^3a~N3=fGC{$jckr#PR(lzwaZc@{(#A<+8nbb^6}I?38kB?0p8BL2gq$W-58}Z&(@6^(XdldAO~F$IE^J;h z&W01^2u8Eegl000q}MO`qzjMNTz^FxyJJQavP_v>c;iC*lM}SsVt?JTFLWqp$J+Kr zIGL-WqQlj*2T(=vWO;mC3eLQg@F54wA4iLc#l@4<2cW}&lxiBez&GZODJpN*UMuKZ zPyT~gs;B7s(GOh5nSSKS*|WitcqBVE%^?qvFNER(85x?m8c|UHPQ-Q9ics7jo?OUx zPpoOG4m3%{LuBEEjJT1UN(IgOIzPW2hjZr1&AO$7|#F1$d7X`fq8F4lHY7rDH z=m8@XYtW3s;O%ZAaAnL1DHE*I` zJFF_SME1@KPTw93=vrGob+bYWgn%E%ev0ga5)J_hU1pughm)hO9m=j>*DuAQyb@Tf zsSD?di!oaI7qvt=_(`gBEqNavr>2LGKIYu(@mgUvu$0xX`uezIcj) z=-KQl*r!K$z{l8`{6VNp012mr77OvMy^N#%{(r2L>Wd(o3@Afu(7Y0dc`oy&+D6@g zyenM0E)#(5mop|*p8@WmXx3v3l=@VN5_mU>5%&6GWxP*K)cMed{P`<^8>NxO#TS!fY;ve33IW_#mL)&Yd$3@uQ^|K4C#YVxetWH=_)9pxkMEj^NjyM zvR)L2{O^_&U}6NVQbAuu^iu_;d}_DSrMSm@?swfWB;3q4}XaMRkw|u)!JA@qQt8R~GT$4RNf1a=1MjO&L-xxDVb2cIWBG!qB3iXw^1d zl^9}P2#6w2TkKVKT`yY=E1(9kzeNBstTuiWlfjH@C1`p`u5l&sU*nfxwtegNL&>O~ z%jwZ&4BdhLh1vHV36N;lDN9nA@VKgC-Z6+u+l3dt{|d0&lAx)lj!3eEXuk&zv>8&A;r=kzw5^YOVH+) z#2bDP^zBlVF&uTr2$YAgVfWCI9xk|QU-m>;&Ll@Zg-Zpr`z5F?=lDcr{T(NvZQnqB zP4FoeZ@B%VhoRrH8!D*iaCgJJ5cndWSQ?{5z6d$Ui#O$!L6n$6{|S#iyPsjC&T(o< z_m@i#C>DqFuciB=Z}k*_ueV(+IC<&$@Q+E;i3G1SI`J8HJFedP@w8DnkoXJ|me%V6 z%DvJ)SvsihSp4&MYj273Z{?X~hqn&{;#N(-A^RWh_|ugk@S4kJipOliLGEL!Vlo;h zH$`Fwp=hq5I;*(tvTb|1;RHc(*e{)i=gncJ0>jWxPm?2{QdbaS!Fk)Cy81JQVnn9D z8)eUDj3(HR7D0%%>){J0*WcKm>U)y}dD3=-OP$926{~r5JKAC~k zv#aVE(^0aQ$`!|a>T)>^T`lZRg}VI}n$=LX#ir?o<<^0sg5 zN|-@JdGY{GL;`XeNW08l_wf?EikSl}`;3gBb&#N(&gd_jOIhFp{l~`p?&+8lTDK}l zRR=(1F6Br(ybl7u7*)p4+<$%-TPb#5`hFH({TTy}b4Z?TSuDBNMp^fx=?&C{@;~ya zMF)H_j;;gOr?;1{&&2z#9#xLg$7W0~6W#ogS0%ZyuDXv!w)N~--?|OHz2?TdrO6fN zYVahQA)_b-@h6UkEc`P|p}o4O2m9)9jg5Jfj}D9||9S7)Tahm&) z1wC&y8OS?qtK3u_g%(G~OnZxVet5e2CV6=z@}g@=*NcsplC;J!QAkBFq~>pWtW2ARe Kx8Vjl{{H|h@<;Lj literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/icon.ico b/apps/desktop/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b3636e4b22ba65db9061cd60a77b02c92022dfd6 GIT binary patch literal 86642 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 AKmY&$ literal 0 HcmV?d00001 diff --git a/apps/desktop/src-tauri/icons/icon.png b/apps/desktop/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e1cd2619e0b5ec089cbba5ec7b03ddf2b1dfceb6 GIT binary patch literal 14183 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

5l#v3A#xI3*z~1~fvo9Q(N^(==!|_FZ z*duZ=+M1~)8E|otX8KNZlr?qels#x_1Xq@9IIw~@9uAREJVH)Xw^}UclF6327}E42 zT)E&?U%TK?(+K7%R!`H5oX0i)4Qn5??Iw3p5J~6_u+aWehY{DSn}3V2p$bgjnAu?o)v@iC254fXeMv50$9YrpU`N?u@QIWs)T?SP|fa}(|9 zqAX+!7`cx=4)cCBg5h~pu(?@9`)aCr#oyz$ld=#RFxYCNZCZls@4v2~*e-t6PEVvV z&bbK3b3wt(Coc!ufAbXXC<**#HQ%J9k`New6iG<5RjtO4XVO?dCvwxD{kJ#tfQr(X zg^NTwF-FwAeS_{V4bfel8l`~NbfrTR2s!G>WduFWxH(t~aK4q=6rEE^$+Uox>gJO2 z{L<;6Q6nHa5#ZEM>H58not!)z(6*_=^~8}jWf*IG$AUKVWOZ4?)GfF z+BM#*wKKmLFD7E~W3U!$IVm$k_k1f&Kz6WV8@55P?r~bcg-Za-!rvW?ns&)KOGT2~ zlkAyqhQj=P$Eg3w#K~}zH@J5bo-BfHjInKSz$@?+Z)NPD4pHj^_Qxmi`UqoTy=`sV zLVxrXGuBr=QRm|}wg75yetQQK4fY3#P_~J}zEfPnb2C4Wo!E(d*(cA;b?7$g2in<( zPn)ghX}nzJPmb6(3Dpeg_GW~Hc}Lt=lgsSZz z!5QXyz7KaR;D`3Ee}d`af{H>WWZ|Io1QI3~4Ll_`g1(cRnhLK73Ro)7zPCd={1W2x zRp%Xlvv4>!<2@}$hz|!V{T}_eHx2xkLl^hQoZTCnsjCl|W_@5Fx2(+j0ogy&Y+;L- z<)G$*CiN7hOm^s!{U>1F7U=iNk{+u~dAC!eDz%=|glFW0jEZU1&o(G_c#wTxUjnG} z#cg3>jEpUi#Mlq@t?Msg_#geK^Lx@DyHWf7=AS5vVyM7YOjvUVCfcpVR<(+5!H?9- zySI6s>o3m&*zr||=wcPGyBkQV`EWJl@bH8qobjOp+sXL*)=&yX)8aAbf~tGv?a2SN zu^Ddo-z?DWk9h9Yz#5p^NU#x~wYSd?H@w@!2Gb4G)6-utEMV~~M85Br5ff(v5O1|T z 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: &tauri::App) -> tauri::Result<()> { - let show = MenuItemBuilder::with_id("show", "Open LyraNote").build(app)?; - let quit = MenuItemBuilder::with_id("quit", "Quit").build(app)?; - let menu = MenuBuilder::new(app).items(&[&show, &quit]).build()?; - - let _tray = TrayIconBuilder::new() - .menu(&menu) - .show_menu_on_left_click(false) - .on_menu_event(|app, event| match event.id().as_ref() { - "show" => { - if let Some(window) = app.get_webview_window("main") { - let _ = window.show(); - let _ = window.set_focus(); - } - } - "quit" => app.exit(0), - _ => {} - }) - .on_tray_icon_event(|tray, event| { - if let TrayIconEvent::Click { - button: MouseButton::Left, - button_state: MouseButtonState::Up, - .. - } = event - { - let app = tray.app_handle(); - if let Some(window) = app.get_webview_window("main") { - if window.is_visible().unwrap_or(false) { - let _ = window.hide(); - } else { - let _ = window.show(); - let _ = window.set_focus(); - } - } - } - }) - .build(app)?; - - Ok(()) -} - -#[tauri::command] -fn greet(name: &str) -> String { - format!("Hello, {}! Welcome to LyraNote.", name) -} - -#[tauri::command] -async fn show_window(window: tauri::WebviewWindow) -> Result<(), String> { - window.show().map_err(|e| e.to_string())?; - window.set_focus().map_err(|e| e.to_string()) -} - -#[tauri::command] -async fn hide_window(window: tauri::WebviewWindow) -> Result<(), String> { - window.hide().map_err(|e| e.to_string()) -} diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json index 33b2dbd..a88fbc6 100644 --- a/apps/desktop/src-tauri/tauri.conf.json +++ b/apps/desktop/src-tauri/tauri.conf.json @@ -1,5 +1,5 @@ { - "$schema": "../node_modules/@tauri-apps/cli/schema.json", + "$schema": "https://schema.tauri.app/config/2", "productName": "LyraNote", "version": "0.1.0", "identifier": "com.lyranote.desktop", @@ -10,7 +10,6 @@ "frontendDist": "../dist" }, "app": { - "withGlobalTauri": true, "windows": [ { "title": "LyraNote", @@ -19,19 +18,15 @@ "minWidth": 900, "minHeight": 600, "decorations": false, - "transparent": false, - "titleBarStyle": "Overlay", - "hiddenTitle": true + "transparent": true, + "center": true, + "dragDropEnabled": true } ], "security": { "csp": null }, - "trayIcon": { - "iconPath": "icons/icon.png", - "iconAsTemplate": true, - "menuOnLeftClick": false - } + "macOSPrivateApi": true }, "bundle": { "active": true, @@ -43,11 +38,5 @@ "icons/icon.icns", "icons/icon.ico" ] - }, - "plugins": { - "notification": {}, - "store": { - "filename": "lyranote-store.json" - } } } diff --git a/apps/desktop/src/App.css b/apps/desktop/src/App.css new file mode 100644 index 0000000..577128a --- /dev/null +++ b/apps/desktop/src/App.css @@ -0,0 +1 @@ +/* Moved to src/styles/globals.css */ diff --git a/apps/desktop/src/app.tsx b/apps/desktop/src/app.tsx index 8b57cde..17e9112 100644 --- a/apps/desktop/src/app.tsx +++ b/apps/desktop/src/app.tsx @@ -1,44 +1,188 @@ -import { useEffect, useState } from "react"; -import { useAuthStore } from "@/store/use-auth-store"; -import { MainLayout } from "@/layouts/main-layout"; -import { LoginPage } from "@/pages/login"; -import { getHttpClient } from "@/lib/http-client"; -import { createAuthService } from "@lyranote/api-client"; - -export default function App() { - const { isAuthenticated, setAuth, clearAuth } = useAuthStore(); - const [isChecking, setIsChecking] = useState(true); - - useEffect(() => { - // 验证本地存储的 token 是否仍有效 - if (!isAuthenticated) { - setIsChecking(false); - return; - } - const authService = createAuthService(getHttpClient()); - authService - .getMe() - .then((me) => { - setAuth( - { id: me.id, username: me.username, name: me.name, email: me.email, avatar_url: me.avatar_url }, - localStorage.getItem("lyranote_token") ?? "" - ); - }) - .catch(() => clearAuth()) - .finally(() => setIsChecking(false)); - }, []); - - if (isChecking) { - return ( -

-
-
- ); - } +import { createPortal } from "react-dom" +import { getCurrentWindow } from "@tauri-apps/api/window" +import { AnimatePresence, motion } from "framer-motion" +import { Titlebar } from "@/components/titlebar/titlebar" +import { Sidebar } from "@/components/sidebar/sidebar" +import { useTabStore } from "@/store/use-tab-store" +import { useNavStore } from "@/store/use-nav-store" +import { useServerStore } from "@/store/use-server-store" +import { useAuthStore } from "@/store/use-auth-store" +import { SetupPage } from "@/pages/setup/setup-page" +import { LoginPage } from "@/pages/login/login-page" +import { HomePage } from "@/pages/home/home-page" +import { NotebooksPage } from "@/pages/notebooks/notebooks-page" +import { EditorPage } from "@/pages/editor/editor-page" +import { KnowledgePage } from "@/pages/knowledge/knowledge-page" +import { ChatPage } from "@/pages/chat/chat-page" +import { SettingsPage } from "@/pages/settings/settings-page" +import { pageVariants, pageTransition } from "@/lib/animations" +import { Clock, User } from "lucide-react" + +const appWindow = getCurrentWindow() + +function PlaceholderPage({ + icon: Icon, + title, +}: { + icon: React.ComponentType<{ size?: number; className?: string }> + title: string +}) { + return ( + + +

{title}

+

即将推出

+
+ ) +} + +function TabContent() { + const { tabs, activeTabId } = useTabStore() + const activeTab = tabs.find((t) => t.id === activeTabId) + + if (!activeTab) return null + + return ( + + + {activeTab.type === "home" && } + {activeTab.type === "notebooks" && } + {activeTab.type === "editor" && ( + + )} + {activeTab.type === "knowledge" && } + {activeTab.type === "chat" && ( + + )} + {activeTab.type === "settings" && } + {(activeTab.type as string) === "scheduled" && ( + + )} + {(activeTab.type as string) === "profile" && ( + + )} + + + ) +} + +function TrafficLights({ showToggle = false, onToggle }: { showToggle?: boolean; onToggle?: () => void }) { + return createPortal( +
+ + + + {showToggle && onToggle && ( + + + + + + )} +
, + document.body + ) +} + +export function App() { + const { baseUrl } = useServerStore() + const { token } = useAuthStore() + const { sidebarExpanded, toggleSidebar } = useNavStore() + + if (!baseUrl) return ( +
{ if (e.button === 0) appWindow.startDragging() }}> + + +
+ ) - if (!isAuthenticated) { - return window.location.reload()} />; + if (!token) return ( +
{ if (e.button === 0 && !(e.target as HTMLElement).closest("button,input,a,[role=button]")) appWindow.startDragging() }}> + + +
+ ) + + function handleDragStart(e: React.MouseEvent) { + if (e.button !== 0) return + const target = e.target as HTMLElement + if (target.closest("button, input, textarea, a, [role=button]")) return + appWindow.startDragging() } - return ; + return ( +
+ + + {/* ── Sidebar column: frosted glass layer ── */} +
+ +
+ + {/* ── Right content block ── */} +
+
+ +
+
+ +
+
+ +
+ ) } + +export default App diff --git a/apps/desktop/src/assets/react.svg b/apps/desktop/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/apps/desktop/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/desktop/src/components/ai-panel/ai-panel.tsx b/apps/desktop/src/components/ai-panel/ai-panel.tsx deleted file mode 100644 index 191ccfa..0000000 --- a/apps/desktop/src/components/ai-panel/ai-panel.tsx +++ /dev/null @@ -1,224 +0,0 @@ -import { useCallback, useRef, useState } from "react"; -import { Bot, ChevronRight, Send, Square, X } from "lucide-react"; -import { useUiStore } from "@/store/use-ui-store"; -import { getHttpClient } from "@/lib/http-client"; -import { - createConversationService, - readSseStream, - type SseChunk, -} from "@lyranote/api-client"; -import { cn } from "@/lib/utils"; - -interface ChatMessage { - id: string; - role: "user" | "assistant"; - content: string; - isStreaming?: boolean; -} - -export function AiPanel() { - const { isAiPanelOpen, toggleAiPanel, selectedNotebookId } = useUiStore(); - const [messages, setMessages] = useState([]); - const [input, setInput] = useState(""); - const [isLoading, setIsLoading] = useState(false); - const abortRef = useRef(null); - const messagesEndRef = useRef(null); - const convIdRef = useRef(null); - - const scrollToBottom = () => { - messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); - }; - - const sendMessage = useCallback(async () => { - if (!input.trim() || isLoading || !selectedNotebookId) return; - - const userMsg: ChatMessage = { - id: Date.now().toString(), - role: "user", - content: input.trim(), - }; - const assistantMsgId = (Date.now() + 1).toString(); - - setMessages((prev) => [ - ...prev, - userMsg, - { id: assistantMsgId, role: "assistant", content: "", isStreaming: true }, - ]); - setInput(""); - setIsLoading(true); - - const abort = new AbortController(); - abortRef.current = abort; - - try { - const conversationService = createConversationService(getHttpClient()); - - if (!convIdRef.current) { - const conv = await conversationService.createConversation( - selectedNotebookId, - userMsg.content.slice(0, 60), - "chat" - ); - convIdRef.current = conv.id; - } - - const response = await conversationService.streamMessage( - convIdRef.current, - { content: userMsg.content }, - abort.signal - ); - - let fullContent = ""; - await readSseStream(response, (chunk: SseChunk) => { - if (chunk.type === "token") { - fullContent += chunk.content; - setMessages((prev) => - prev.map((m) => - m.id === assistantMsgId ? { ...m, content: fullContent } : m - ) - ); - scrollToBottom(); - } else if (chunk.type === "done") { - setMessages((prev) => - prev.map((m) => - m.id === assistantMsgId ? { ...m, isStreaming: false } : m - ) - ); - } - }); - } catch (err) { - if ((err as Error).name !== "AbortError") { - setMessages((prev) => - prev.map((m) => - m.id === assistantMsgId - ? { ...m, content: "Error: Failed to get response.", isStreaming: false } - : m - ) - ); - } - } finally { - setIsLoading(false); - abortRef.current = null; - } - }, [input, isLoading, selectedNotebookId]); - - const stopStreaming = () => { - abortRef.current?.abort(); - setIsLoading(false); - setMessages((prev) => - prev.map((m) => (m.isStreaming ? { ...m, isStreaming: false } : m)) - ); - }; - - if (!isAiPanelOpen) { - return ( - - ); - } - - return ( -
- {/* 头部 */} -
-
- - AI Assistant -
- -
- - {/* 消息列表 */} -
- {messages.length === 0 && ( -
- -

- Ask anything about your notebooks -

-
- )} - {messages.map((msg) => ( - - ))} -
-
- - {/* 输入框 */} -
- {!selectedNotebookId && ( -

- Select a notebook to start chatting -

- )} -
-