diff --git a/.env.example b/.env.example index 8c71100..aba6334 100644 --- a/.env.example +++ b/.env.example @@ -29,15 +29,15 @@ IIB_DB_FILE_BACKUP_MAX=8 # The default value is 'auto', which will be determined based on the command-line parameters used to start sd-webui (such as --server-name, --share, --listen). IIB_ACCESS_CONTROL=auto -# This variable is used to define a list of allowed paths for the application to access when access control mode is enabled. +# This variable is used to define a list of allowed paths for the application to access when access control mode is enabled. # It can be set to a comma-separated string of file paths or directory paths, representing the resources that are allowed to be accessed by the application. -# In addition, if sd_webui_config or sd_webui_dir has been configured, or if you're running this repository as an extension of sd-webui, +# In addition, if sd_webui_config or sd_webui_dir has been configured, or if you're running this repository as an extension of sd-webui, # you can use the following shortcuts (txt2img, img2img, extra, save) as values for the ALLOWED_PATHS variable. # IIB_ACCESS_CONTROL_ALLOWED_PATHS=save,extra,/output ...etc -# This variable is used to control fine-grained access control for different types of requests, but only if access control mode is enabled. -# It can be set to a string value that represents a specific permission or set of permissions, such as "read-only", "write-only", "read-write", or "no-access". -# This variable can be used to restrict access to certain API endpoints or data sources based on the permissions required by the user. +# This variable is used to control fine-grained access control for different types of requests, but only if access control mode is enabled. +# It can be set to a string value that represents a specific permission or set of permissions, such as "read-only", "write-only", "read-write", or "no-access". +# This variable can be used to restrict access to certain API endpoints or data sources based on the permissions required by the user. # IIB_ACCESS_CONTROL_PERMISSION=read-write @@ -47,3 +47,41 @@ IIB_ACCESS_CONTROL=auto # Due to the high performance cost of parsing this type of file, it is disabled by default. # Set to 'true' to enable it. IIB_ENABLE_SD_WEBUI_STEALTH_PARSER=false + + +# ---------------------------- AI / EMBEDDINGS ---------------------------- +# OpenAI-compatible API base url. +# - Keep it generic here (do NOT write any provider-specific or personal info into this example file). +# - Typical format: https://your-openai-compatible-host/v1 +# - This project uses it for BOTH embeddings (/embeddings) and topic-title chat (/chat/completions). +OPENAI_BASE_URL= + +# OpenAI-compatible API key (Bearer token). +# - Put your real key in x.env (or .env) only, never commit it. +OPENAI_API_KEY= + +# Embedding model id (OpenAI-compatible). +# - Used for clustering images by prompt semantics. +# - Recommended: start with a small/cheap embedding model; switch to a larger one only if clustering quality is insufficient. +EMBEDDING_MODEL=text-embedding-3-small + +# Default chat model id (OpenAI-compatible). +# - Used by the generic /ai_chat endpoint (if you use it) and as a fallback default. +# - If your provider applies content filtering that sometimes returns empty output, try switching to another chat model here. +AI_MODEL=gpt-4o-mini + +# Topic title model id (OpenAI-compatible). +# - Used ONLY for generating short cluster titles/keywords (topic naming). +# - If not set, it falls back to AI_MODEL. +# - Tip: if a model frequently violates "JSON only" or gets truncated, switch this model first. +TOPIC_TITLE_MODEL=gpt-4o-mini + +# Prompt normalization before embedding/clustering (remove boilerplate but keep distinctiveness). +# - Removes common "quality / camera / resolution" boilerplate from prompts before embedding. +# - Keep enabled for better clustering; disable only for debugging. +IIB_PROMPT_NORMALIZE=1 + +# Prompt normalization mode: +# - 'balanced' (recommended): remove generic boilerplate but keep some discriminative style words. +# - 'theme_only' (aggressive): focus more on subject/theme nouns; may lose some stylistic distinctiveness. +IIB_PROMPT_NORMALIZE_MODE=balanced diff --git a/.gitignore b/.gitignore index d937dcb..8af43f7 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,6 @@ plugins/* !plugins/.gitkeep test_data/* .DS_Store +iib_output +iib.db-shm +iib.db-wal diff --git a/README-zh.md b/README-zh.md index 930e2fa..5c4c551 100644 --- a/README-zh.md +++ b/README-zh.md @@ -159,4 +159,83 @@ https://user-images.githubusercontent.com/25872019/230768207-daab786b-d4ab-489f- image +## 自然语言分类&搜索(实验性) + +这个功能用于把图片按**提示词语义相似度**自动分组(主题),并支持用一句自然语言做**语义检索**(类似 RAG 的召回阶段)。 +它是实验性功能:效果强依赖模型与提示词质量,适合快速找回/整理生成图片。 + +### 使用方式(面向使用者) + +1. 打开首页「**自然语言分类&搜索(实验性)**」 +2. 点击「范围」选择要处理的文件夹(可多选,来源于 QuickMovePaths) +3. **归类**:点「刷新」会在所选范围内生成主题列表(标题会按前端语言输出) +4. **搜索**:输入一句话点「搜索」,会自动打开结果页(TopK 相似图片) + +> 选择的范围会持久化到后端 KV(`app_fe_setting["topic_search_scope"]`),下次打开会自动恢复并自动刷新一次结果。 + +### 接口(给高级用户/二次开发) + +- **构建/刷新向量**:`POST /infinite_image_browsing/db/build_iib_output_embeddings` + - 入参:`folder`, `model`, `force`, `batch_size`, `max_chars` +- **归类(聚类)**:`POST /infinite_image_browsing/db/cluster_iib_output_job_start`,然后轮询 `GET /infinite_image_browsing/db/cluster_iib_output_job_status?job_id=...` + - 入参:`folder_paths`(必填,数组)、`threshold`, `min_cluster_size`, `force_embed`, `title_model`, `force_title`, `use_title_cache`, `assign_noise_threshold`, `lang` +- **语义检索(RAG 召回)**:`POST /infinite_image_browsing/db/search_iib_output_by_prompt` + - 入参:`query`, `folder_paths`(必填,数组)、`top_k`, `min_score`, `ensure_embed`, `model`, `max_chars` + +### 原理(简单版) + +- **1)提示词抽取与清洗** + - 从 `image.exif` 中抽取提示词文本(只取 `Negative prompt:` 之前) + - 可选做“语义清洗”:去掉无意义的高频模板词(画质/摄影参数等),更聚焦主题语义(见 `IIB_PROMPT_NORMALIZE*`) +- **2)向量化(Embedding)** + - 调用 OpenAI 兼容的 `/embeddings` 得到向量 + - 写入 SQLite 表 `image_embedding`(增量更新,避免重复花费) +- **3)主题聚类** + - 用“簇向量求和方向”的增量聚类(近似在线聚类),再把高相似簇做一次合并(减少同主题被切碎) + - 可选把小簇成员重新分配到最相近的大簇,降低噪声 +- **4)主题命名(LLM)** + - 对每个簇取代表提示词样本,调用 `/chat/completions` 生成短标题与关键词 + - 通过 tool/function calling 强制结构化输出(JSON),并写入 `topic_title_cache` +- **5)语义检索** + - 把用户 query 向量化,然后和范围内所有图片向量做余弦相似度排序,返回 TopK + +### 缓存与增量更新 + +#### 1)向量缓存(`image_embedding`) + +- **存储位置**:SQLite 表 `image_embedding`(以 `image_id` 为主键) +- **增量跳过条件**:满足以下条件则跳过重新向量化: + - `model` 相同 + - `text_hash` 相同 + - 已存在 `vec` +- **“重新向量化”的缓存键**:`text_hash = sha256(f"{normalize_version}:{prompt_text}")` + - `prompt_text`:用于 embedding 的最终文本(抽取 + 可选清洗) + - `normalize_version`:由代码对清洗规则/模式计算出的**指纹**(不允许用户用环境变量手动覆盖) +- **强制刷新**:在 `build_iib_output_embeddings` 传 `force=true`,或在 `cluster_iib_output_job_start` 传 `force_embed=true` + +#### 2)标题缓存(`topic_title_cache`) + +- **存储位置**:SQLite 表 `topic_title_cache`(主键 `cluster_hash`) +- **命中条件**:`use_title_cache=true` 且 `force_title=false` 时复用历史标题/关键词 +- **缓存键 `cluster_hash` 包含**: + - 成员图片 id(排序后) + - embedding `model`、`threshold`、`min_cluster_size` + - `title_model`、输出语言 `lang` + - 语义清洗指纹(`normalize_version`)与清洗模式 +- **强制重新生成标题**:`force_title=true` + +### 配置(环境变量) + +所有 AI 调用都基于 **OpenAI 兼容** 的服务: + +- **`OPENAI_BASE_URL`**:例如 `https://your-host/v1` +- **`OPENAI_API_KEY`**:你的 Key +- **`EMBEDDING_MODEL`**:用于聚类的 embedding 模型 +- **`AI_MODEL`**:默认 chat 模型(兜底默认) +- **`TOPIC_TITLE_MODEL`**:用于主题标题的 chat 模型(不配则回退到 `AI_MODEL`) +- **`IIB_PROMPT_NORMALIZE`**:`1/0` 是否开启提示词清洗 +- **`IIB_PROMPT_NORMALIZE_MODE`**:`balanced`(推荐)/ `theme_only`(更激进) + +> 注意:AI 调用**没有 mock 兜底**。只要服务端/模型返回异常或不符合约束,就会直接报错,避免产生“看似能跑但其实不可信”的结果。 + diff --git a/README.md b/README.md index b154eae..23367b9 100644 --- a/README.md +++ b/README.md @@ -176,3 +176,82 @@ https://user-images.githubusercontent.com/25872019/230768207-daab786b-d4ab-489f- ### Dark mode image + +## Natural Language Categorization & Search (Experimental) + +This feature groups images by **semantic similarity of prompts** and supports **natural-language retrieval** (similar to the retrieval stage in RAG). +It’s experimental: results depend on the embedding/chat models and the quality of prompt metadata. + +### How to Use (for end users) + +1. Open **“Natural Language Categorization & Search (Experimental)”** from the startup page +2. Click **Scope** and select one or more folders (from QuickMovePaths) +3. **Categorize**: click **Refresh** to generate topic cards for the selected scope +4. **Search**: type a natural-language query and click **Search** (auto-opens the result grid) + +> The selected scope is persisted in backend KV: `app_fe_setting["topic_search_scope"]`. Next time it will auto-restore and auto-refresh once. + +### API Endpoints + +- **Build/refresh embeddings**: `POST /infinite_image_browsing/db/build_iib_output_embeddings` + - Request: `folder`, `model`, `force`, `batch_size`, `max_chars` +- **Cluster (categorize)**: `POST /infinite_image_browsing/db/cluster_iib_output_job_start` then poll `GET /infinite_image_browsing/db/cluster_iib_output_job_status?job_id=...` + - Request: `folder_paths` (required, array), `threshold`, `min_cluster_size`, `force_embed`, `title_model`, `force_title`, `use_title_cache`, `assign_noise_threshold`, `lang` +- **Prompt retrieval (RAG-like)**: `POST /infinite_image_browsing/db/search_iib_output_by_prompt` + - Request: `query`, `folder_paths` (required, array), `top_k`, `min_score`, `ensure_embed`, `model`, `max_chars` + +### How it Works (simple explanation) + +- **1) Prompt extraction & normalization** + - Reads `image.exif` and keeps content before `Negative prompt:` + - Optionally removes “boilerplate” terms (quality/photography parameters, etc.) to focus on topic semantics (`IIB_PROMPT_NORMALIZE*`) +- **2) Embeddings** + - Calls OpenAI-compatible `/embeddings` + - Stores vectors in SQLite table `image_embedding` (incremental, to avoid repeated costs) +- **3) Clustering** + - Online centroid-sum clustering, plus a post-merge step for highly similar clusters + - Optionally reassigns members of small clusters into the closest large cluster to reduce noise +- **4) Title generation (LLM)** + - Calls `/chat/completions` with tool/function calling to force structured JSON output + - Stores titles/keywords in SQLite table `topic_title_cache` +- **5) Retrieval** + - Embeds the query and ranks images in the selected scope by cosine similarity, returning TopK + +### Caching & Incremental Updates + +#### 1) Embedding cache (`image_embedding`) + +- **Where**: table `image_embedding` (keyed by `image_id`) +- **Skip rule (incremental update)**: an image is skipped if: + - same `model` + - same `text_hash` + - existing `vec` is present +- **Re-vectorization cache key**: `text_hash = sha256(f"{normalize_version}:{prompt_text}")` + - `prompt_text` is the extracted + (optionally) normalized text used for embeddings + - `normalize_version` is a **code-derived fingerprint** of normalization rules/mode (not user-configurable) +- **Force rebuild**: pass `force=true` to `build_iib_output_embeddings` or `force_embed=true` to `cluster_iib_output_job_start` + +#### 2) Title cache (`topic_title_cache`) + +- **Where**: table `topic_title_cache` keyed by `cluster_hash` +- **Hit rule**: when `use_title_cache=true` and `force_title=false`, titles/keywords are reused +- **Cache key (`cluster_hash`) includes**: + - member image IDs (sorted) + - embedding `model`, `threshold`, `min_cluster_size` + - `title_model`, output `lang` + - normalization fingerprint (`normalize_version`) and mode +- **Force title regeneration**: `force_title=true` + +### Configuration (Environment Variables) + +All calls use an **OpenAI-compatible** provider: + +- **`OPENAI_BASE_URL`**: e.g. `https://your-host/v1` +- **`OPENAI_API_KEY`**: your API key +- **`EMBEDDING_MODEL`**: embeddings model used for clustering +- **`AI_MODEL`**: default chat model (fallback) +- **`TOPIC_TITLE_MODEL`**: chat model used for cluster titles (falls back to `AI_MODEL`) +- **`IIB_PROMPT_NORMALIZE`**: `1/0` enable prompt normalization +- **`IIB_PROMPT_NORMALIZE_MODE`**: `balanced` (recommended) / `theme_only` + +> Note: There is **no mock fallback** for AI calls. If the provider/model fails or returns invalid output, the API will return an error directly. diff --git a/javascript/index.js b/javascript/index.js index cae3cb5..6589ce3 100644 --- a/javascript/index.js +++ b/javascript/index.js @@ -13,8 +13,8 @@ Promise.resolve().then(async () => { Infinite Image Browsing - - + + diff --git a/requirements.txt b/requirements.txt index 80232e7..e3bb8c9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,7 @@ pillow-avif-plugin imageio av>=14,<15 lxml -filetype \ No newline at end of file +filetype +requests +numpy +hnswlib \ No newline at end of file diff --git a/scripts/iib/api.py b/scripts/iib/api.py index 2f1d43e..088f5c2 100644 --- a/scripts/iib/api.py +++ b/scripts/iib/api.py @@ -6,7 +6,6 @@ from pathlib import Path import shutil import sqlite3 - from scripts.iib.dir_cover_cache import get_top_4_media_info from scripts.iib.tool import ( get_created_date_by_stat, @@ -48,6 +47,7 @@ from PIL import Image from fastapi import Depends, FastAPI, HTTPException, Request from fastapi.middleware.cors import CORSMiddleware import hashlib +from contextlib import closing from scripts.iib.db.datamodel import ( DataBase, ExtraPathType, @@ -58,9 +58,10 @@ from scripts.iib.db.datamodel import ( ExtraPath, FileInfoDict, Cursor, - GlobalSetting + GlobalSetting, ) from scripts.iib.db.update_image_data import update_image_data, rebuild_image_index, add_image_data_single +from scripts.iib.topic_cluster import mount_topic_cluster_routes from scripts.iib.logger import logger from scripts.iib.seq import seq import urllib.parse @@ -73,6 +74,13 @@ try: except Exception as e: logger.error(e) +import requests +import dotenv + + + +# 加载环境变量 +dotenv.load_dotenv() index_html_path = get_data_file_path("vue/dist/index.html") if is_exe_ver else os.path.join(cwd, "vue/dist/index.html") # 在app.py也被使用 @@ -83,6 +91,17 @@ secret_key = os.getenv("IIB_SECRET_KEY") if secret_key: print("Secret key loaded successfully. ") +# AI 配置 +OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "") +OPENAI_BASE_URL = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1") +AI_MODEL = os.getenv("AI_MODEL", "gpt-4o-mini") +EMBEDDING_MODEL = os.getenv("EMBEDDING_MODEL", "text-embedding-3-small") + +print(f"AI Model: {AI_MODEL or 'Not configured'}") +print(f"OpenAI Base URL: {OPENAI_BASE_URL}") +print(f"OpenAI API Key: {'Configured' if OPENAI_API_KEY else 'Not configured'}") +print(f"Embedding Model: {EMBEDDING_MODEL or 'Not configured'}") + WRITEABLE_PERMISSIONS = ["read-write", "write-only"] is_api_writeable = not (os.getenv("IIB_ACCESS_CONTROL_PERMISSION")) or ( @@ -376,6 +395,7 @@ def infinite_image_browsing_api(app: FastAPI, **kwargs): ) async def delete_files(req: DeleteFilesReq): conn = DataBase.get_conn() + for path in req.file_paths: check_path_trust(path) try: @@ -390,10 +410,12 @@ def infinite_image_browsing_api(app: FastAPI, **kwargs): shutil.rmtree(path) else: close_video_file_reader(path) - os.remove(path) txt_path = get_img_geninfo_txt_path(path) + + os.remove(path) if txt_path: os.remove(txt_path) + img = DbImg.get(conn, os.path.normpath(path)) if img: logger.info("delete file: %s", path) @@ -409,6 +431,8 @@ def infinite_image_browsing_api(app: FastAPI, **kwargs): ) raise HTTPException(400, detail=error_msg) + return {"ok": True} + class CreateFoldersReq(BaseModel): dest_folder: str @@ -606,6 +630,7 @@ def infinite_image_browsing_api(app: FastAPI, **kwargs): img.thumbnail((int(w), int(h))) os.makedirs(cache_dir, exist_ok=True) img.save(cache_path, "webp") + # print(f"Image cache generated: {path}") # 返回缓存文件 return FileResponse( @@ -1216,6 +1241,17 @@ def infinite_image_browsing_api(app: FastAPI, **kwargs): ImageTag.remove(conn, image_id=req.img_id, tag_id=req.tag_id) + # ===== 主题聚类 / Embedding(拆分到独立模块,减少 api.py 体积)===== + mount_topic_cluster_routes( + app=app, + db_api_base=db_api_base, + verify_secret=verify_secret, + write_permission_required=write_permission_required, + openai_base_url=OPENAI_BASE_URL, + openai_api_key=OPENAI_API_KEY, + embedding_model=EMBEDDING_MODEL, + ai_model=AI_MODEL, + ) class ExtraPathModel(BaseModel): @@ -1293,3 +1329,48 @@ def infinite_image_browsing_api(app: FastAPI, **kwargs): update_extra_paths(conn = DataBase.get_conn()) rebuild_image_index(search_dirs = get_img_search_dirs() + mem["extra_paths"]) + + # AI 相关路由 + class AIChatRequest(BaseModel): + messages: List[dict] + temperature: Optional[float] = 0.7 + max_tokens: Optional[int] = None + stream: Optional[bool] = False + + @app.post(f"{api_base}/ai-chat", dependencies=[Depends(verify_secret), Depends(write_permission_required)]) + async def ai_chat(req: AIChatRequest): + """通用AI聊天接口,转发到OpenAI兼容API""" + if not OPENAI_API_KEY: + raise HTTPException(status_code=500, detail="OpenAI API Key not configured") + + try: + payload = { + "model": AI_MODEL, + "messages": req.messages, + "temperature": req.temperature, + "stream": req.stream + } + if req.max_tokens: + payload["max_tokens"] = req.max_tokens + + headers = { + "Authorization": f"Bearer {OPENAI_API_KEY}", + "Content-Type": "application/json" + } + + response = requests.post( + f"{OPENAI_BASE_URL}/chat/completions", + json=payload, + headers=headers, + timeout=60 + ) + + if response.status_code != 200: + raise HTTPException(status_code=response.status_code, detail=response.text) + + return response.json() + + except requests.RequestException as e: + logger.error(f"AI API request failed: {e}") + raise HTTPException(status_code=500, detail=f"AI API request failed: {str(e)}") + diff --git a/scripts/iib/db/datamodel.py b/scripts/iib/db/datamodel.py index 2e1194e..7f5aacc 100644 --- a/scripts/iib/db/datamodel.py +++ b/scripts/iib/db/datamodel.py @@ -18,6 +18,7 @@ from contextlib import closing import os import threading import re +import hashlib class FileInfoDict(TypedDict): @@ -80,6 +81,10 @@ class DataBase: ExtraPath.create_table(conn) DirCoverCache.create_table(conn) GlobalSetting.create_table(conn) + ImageEmbedding.create_table(conn) + ImageEmbeddingFail.create_table(conn) + TopicTitleCache.create_table(conn) + TopicClusterCache.create_table(conn) finally: conn.commit() clz.num += 1 @@ -187,6 +192,13 @@ class Image: @classmethod def remove(cls, conn: Connection, image_id: int) -> None: with closing(conn.cursor()) as cur: + # Manual cascade delete to avoid leaving orphan rows in related tables. + # NOTE: SQLite foreign key constraints are often disabled by default unless + # PRAGMA foreign_keys=ON is set. We still delete related rows explicitly + # so deletion works regardless of FK settings and keeps DB clean. + cur.execute("DELETE FROM image_embedding WHERE image_id = ?", (int(image_id),)) + cur.execute("DELETE FROM image_embedding_fail WHERE image_id = ?", (int(image_id),)) + cur.execute("DELETE FROM image_tag WHERE image_id = ?", (int(image_id),)) cur.execute("DELETE FROM image WHERE id = ?", (image_id,)) conn.commit() @@ -197,6 +209,16 @@ class Image: with closing(conn.cursor()) as cur: try: placeholders = ",".join("?" * len(image_ids)) + # Manual cascade delete for related tables. + # Keep this in sync with tables referencing image.id. + cur.execute( + f"DELETE FROM image_embedding WHERE image_id IN ({placeholders})", + image_ids, + ) + cur.execute( + f"DELETE FROM image_embedding_fail WHERE image_id IN ({placeholders})", + image_ids, + ) cur.execute( f"DELETE FROM image_tag WHERE image_id IN ({placeholders})", image_ids, @@ -301,6 +323,328 @@ class Image: return images +class ImageEmbedding: + """ + Store embeddings for image prompt text. + + Notes: + - vec is stored as float32 bytes (little-endian), compatible with Python's array('f'). + - text_hash is used to skip recomputation when prompt text doesn't change. + """ + + @classmethod + def create_table(cls, conn: Connection): + with closing(conn.cursor()) as cur: + cur.execute( + """CREATE TABLE IF NOT EXISTS image_embedding ( + image_id INTEGER PRIMARY KEY, + model TEXT NOT NULL, + dim INTEGER NOT NULL, + text_hash TEXT NOT NULL, + vec BLOB NOT NULL, + updated_at TEXT NOT NULL, + FOREIGN KEY (image_id) REFERENCES image(id) + )""" + ) + cur.execute( + "CREATE INDEX IF NOT EXISTS image_embedding_idx_model_hash ON image_embedding(model, text_hash)" + ) + + @staticmethod + def compute_text_hash(text: str) -> str: + return hashlib.sha256(text.encode("utf-8")).hexdigest() + + @classmethod + def get_by_image_ids(cls, conn: Connection, image_ids: List[int]): + if not image_ids: + return {} + placeholders = ",".join("?" * len(image_ids)) + query = f"SELECT image_id, model, dim, text_hash, vec, updated_at FROM image_embedding WHERE image_id IN ({placeholders})" + with closing(conn.cursor()) as cur: + cur.execute(query, image_ids) + rows = cur.fetchall() + res = {} + for row in rows: + res[row[0]] = { + "image_id": row[0], + "model": row[1], + "dim": row[2], + "text_hash": row[3], + "vec": row[4], + "updated_at": row[5], + } + return res + + @classmethod + def upsert( + cls, + conn: Connection, + image_id: int, + model: str, + dim: int, + text_hash: str, + vec_blob: bytes, + updated_at: Optional[str] = None, + ): + updated_at = updated_at or datetime.now().isoformat() + with closing(conn.cursor()) as cur: + cur.execute( + """INSERT INTO image_embedding (image_id, model, dim, text_hash, vec, updated_at) + VALUES (?, ?, ?, ?, ?, ?) + ON CONFLICT(image_id) DO UPDATE SET + model = excluded.model, + dim = excluded.dim, + text_hash = excluded.text_hash, + vec = excluded.vec, + updated_at = excluded.updated_at + """, + (image_id, model, dim, text_hash, vec_blob, updated_at), + ) + + +class ImageEmbeddingFail: + """ + Cache embedding failures per image+model+text_hash to avoid repeatedly hitting the API + for known-failing inputs. This helps keep clustering/search usable by skipping bad items. + """ + + @classmethod + def create_table(cls, conn: Connection): + with closing(conn.cursor()) as cur: + cur.execute( + """CREATE TABLE IF NOT EXISTS image_embedding_fail ( + image_id INTEGER NOT NULL, + model TEXT NOT NULL, + text_hash TEXT NOT NULL, + error TEXT NOT NULL, + updated_at TEXT NOT NULL, + PRIMARY KEY(image_id, model, text_hash) + )""" + ) + cur.execute("CREATE INDEX IF NOT EXISTS image_embedding_fail_idx_model ON image_embedding_fail(model)") + + @classmethod + def get_by_image_ids(cls, conn: Connection, image_ids: List[int], model: str) -> Dict[int, Dict]: + if not image_ids: + return {} + ids = [int(x) for x in image_ids] + placeholders = ",".join(["?"] * len(ids)) + with closing(conn.cursor()) as cur: + cur.execute( + f"SELECT image_id, text_hash, error, updated_at FROM image_embedding_fail WHERE model = ? AND image_id IN ({placeholders})", + (str(model), *ids), + ) + rows = cur.fetchall() + out: Dict[int, Dict] = {} + for image_id, text_hash, error, updated_at in rows or []: + out[int(image_id)] = { + "text_hash": str(text_hash or ""), + "error": str(error or ""), + "updated_at": str(updated_at or ""), + } + return out + + @classmethod + def upsert( + cls, + conn: Connection, + *, + image_id: int, + model: str, + text_hash: str, + error: str, + updated_at: Optional[str] = None, + ): + updated_at = updated_at or datetime.now().isoformat() + with closing(conn.cursor()) as cur: + cur.execute( + """INSERT INTO image_embedding_fail (image_id, model, text_hash, error, updated_at) + VALUES (?, ?, ?, ?, ?) + ON CONFLICT(image_id, model, text_hash) DO UPDATE SET + error = excluded.error, + updated_at = excluded.updated_at + """, + (int(image_id), str(model), str(text_hash), str(error or "")[:600], str(updated_at)), + ) + + @classmethod + def delete(cls, conn: Connection, *, image_id: int, model: str): + with closing(conn.cursor()) as cur: + cur.execute("DELETE FROM image_embedding_fail WHERE image_id = ? AND model = ?", (int(image_id), str(model))) + + +class TopicTitleCache: + """ + Cache cluster titles/keywords to avoid repeated LLM calls. + """ + + @classmethod + def create_table(cls, conn: Connection): + with closing(conn.cursor()) as cur: + cur.execute( + """CREATE TABLE IF NOT EXISTS topic_title_cache ( + cluster_hash TEXT PRIMARY KEY, + title TEXT NOT NULL, + keywords TEXT NOT NULL, + model TEXT NOT NULL, + updated_at TEXT NOT NULL + )""" + ) + cur.execute( + "CREATE INDEX IF NOT EXISTS topic_title_cache_idx_model ON topic_title_cache(model)" + ) + + @classmethod + def get(cls, conn: Connection, cluster_hash: str): + with closing(conn.cursor()) as cur: + cur.execute( + "SELECT title, keywords, model, updated_at FROM topic_title_cache WHERE cluster_hash = ?", + (cluster_hash,), + ) + row = cur.fetchone() + if not row: + return None + title, keywords, model, updated_at = row + try: + kw = json.loads(keywords) if isinstance(keywords, str) else [] + except Exception: + kw = [] + if not isinstance(kw, list): + kw = [] + return {"title": title, "keywords": kw, "model": model, "updated_at": updated_at} + + @classmethod + def upsert( + cls, + conn: Connection, + cluster_hash: str, + title: str, + keywords: List[str], + model: str, + updated_at: Optional[str] = None, + ): + updated_at = updated_at or datetime.now().isoformat() + kw = json.dumps([str(x) for x in (keywords or [])], ensure_ascii=False) + with closing(conn.cursor()) as cur: + cur.execute( + """INSERT INTO topic_title_cache (cluster_hash, title, keywords, model, updated_at) + VALUES (?, ?, ?, ?, ?) + ON CONFLICT(cluster_hash) DO UPDATE SET + title = excluded.title, + keywords = excluded.keywords, + model = excluded.model, + updated_at = excluded.updated_at + """, + (cluster_hash, title, kw, model, updated_at), + ) + + +class TopicClusterCache: + """ + Persist the final clustering result (clusters/noise) to avoid re-clustering when: + - embeddings haven't changed (by max(updated_at) & count), and + - clustering parameters are unchanged. + + This is intentionally lightweight: + - result is stored as JSON text + - caller defines cache_key (sha1 over params + folders + normalize version + lang, etc.) + """ + + @classmethod + def create_table(cls, conn: Connection): + with closing(conn.cursor()) as cur: + cur.execute( + """CREATE TABLE IF NOT EXISTS topic_cluster_cache ( + cache_key TEXT PRIMARY KEY, + folders TEXT NOT NULL, + model TEXT NOT NULL, + params TEXT NOT NULL, + embeddings_count INTEGER NOT NULL, + embeddings_max_updated_at TEXT NOT NULL, + result TEXT NOT NULL, + updated_at TEXT NOT NULL + )""" + ) + cur.execute("CREATE INDEX IF NOT EXISTS topic_cluster_cache_idx_model ON topic_cluster_cache(model)") + + @classmethod + def get(cls, conn: Connection, cache_key: str): + with closing(conn.cursor()) as cur: + cur.execute( + "SELECT folders, model, params, embeddings_count, embeddings_max_updated_at, result, updated_at FROM topic_cluster_cache WHERE cache_key = ?", + (cache_key,), + ) + row = cur.fetchone() + if not row: + return None + folders, model, params, embeddings_count, embeddings_max_updated_at, result, updated_at = row + try: + folders_obj = json.loads(folders) if isinstance(folders, str) else [] + except Exception: + folders_obj = [] + try: + params_obj = json.loads(params) if isinstance(params, str) else {} + except Exception: + params_obj = {} + try: + result_obj = json.loads(result) if isinstance(result, str) else None + except Exception: + result_obj = None + return { + "cache_key": cache_key, + "folders": folders_obj if isinstance(folders_obj, list) else [], + "model": str(model), + "params": params_obj if isinstance(params_obj, dict) else {}, + "embeddings_count": int(embeddings_count or 0), + "embeddings_max_updated_at": str(embeddings_max_updated_at or ""), + "result": result_obj, + "updated_at": str(updated_at or ""), + } + + @classmethod + def upsert( + cls, + conn: Connection, + *, + cache_key: str, + folders: List[str], + model: str, + params: Dict, + embeddings_count: int, + embeddings_max_updated_at: str, + result: Dict, + updated_at: Optional[str] = None, + ): + updated_at = updated_at or datetime.now().isoformat() + folders_s = json.dumps([str(x) for x in (folders or [])], ensure_ascii=False) + params_s = json.dumps(params or {}, ensure_ascii=False, sort_keys=True) + result_s = json.dumps(result or {}, ensure_ascii=False) + with closing(conn.cursor()) as cur: + cur.execute( + """INSERT INTO topic_cluster_cache + (cache_key, folders, model, params, embeddings_count, embeddings_max_updated_at, result, updated_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(cache_key) DO UPDATE SET + folders = excluded.folders, + model = excluded.model, + params = excluded.params, + embeddings_count = excluded.embeddings_count, + embeddings_max_updated_at = excluded.embeddings_max_updated_at, + result = excluded.result, + updated_at = excluded.updated_at + """, + ( + cache_key, + folders_s, + str(model), + params_s, + int(embeddings_count or 0), + str(embeddings_max_updated_at or ""), + result_s, + updated_at, + ), + ) + class Tag: def __init__(self, name: str, score: int, type: str, count=0, color = ""): self.name = name diff --git a/scripts/iib/img_cache_gen.py b/scripts/iib/img_cache_gen.py index be8d5e6..94c584e 100644 --- a/scripts/iib/img_cache_gen.py +++ b/scripts/iib/img_cache_gen.py @@ -6,11 +6,14 @@ from concurrent.futures import ThreadPoolExecutor import time from PIL import Image -def generate_image_cache(dirs, size:str, verbose=False): +def generate_image_cache(dirs: List[str], size:str, verbose=True): + dirs = [r"C:\Users\zanllp\Desktop\repo\Z-Image-Turbo\client"] start_time = time.time() cache_base_dir = get_cache_dir() - + verbose=True def process_image(item): + if '\\node_modules\\' in item.path: + return if item.is_dir(): verbose and print(f"Processing directory: {item.path}") for sub_item in os.scandir(item.path): diff --git a/scripts/iib/topic_cluster.py b/scripts/iib/topic_cluster.py new file mode 100644 index 0000000..de79350 --- /dev/null +++ b/scripts/iib/topic_cluster.py @@ -0,0 +1,1664 @@ +import hashlib +import asyncio +import json +import math +import os +import re +import time +import uuid +import threading +from array import array +from contextlib import closing +from typing import Callable, Dict, List, Optional, Tuple +from sqlite3 import Connection, connect +import requests +from fastapi import Depends, FastAPI, HTTPException +from pydantic import BaseModel + +from scripts.iib.db.datamodel import DataBase, ImageEmbedding, ImageEmbeddingFail, TopicClusterCache, TopicTitleCache +from scripts.iib.tool import cwd + +# Perf deps (required for this feature) +_np = None +_hnswlib = None +_PERF_DEPS_READY = False + + +def _ensure_perf_deps() -> None: + """ + We do NOT allow users to use TopicSearch/TopicClustering feature without these deps. + But we also do NOT want the whole server to crash on import, so we lazy-load and fail at API layer. + """ + global _np, _hnswlib, _PERF_DEPS_READY + if _PERF_DEPS_READY: + return + try: + import numpy as np # type: ignore + import hnswlib as hnswlib # type: ignore + except Exception as e: + raise HTTPException( + status_code=500, + detail=f"Topic clustering requires numpy+hnswlib. Please install them. import_error={type(e).__name__}: {e}", + ) + _np = np + _hnswlib = hnswlib + _PERF_DEPS_READY = True + + +_TOPIC_CLUSTER_JOBS: Dict[str, Dict] = {} +_TOPIC_CLUSTER_JOBS_LOCK = threading.Lock() +_TOPIC_CLUSTER_JOBS_MAX = 16 + + +_EMBEDDING_MAX_TOKENS_SOFT = 7800 +# Some providers enforce a max token budget per *request* (sum of all inputs), not only per input. +# Keep a conservative per-request budget to avoid "context length exceeded" across batched inputs. +_EMBEDDING_REQUEST_MAX_TOKENS_SOFT = 7600 +_EMBEDDING_DEBUG = os.getenv("IIB_EMBEDDING_DEBUG", "0").strip().lower() in ["1", "true", "yes", "on"] + + +def _estimate_tokens_soft(s: str) -> int: + """ + Lightweight, dependency-free token estimator. + - ASCII-ish chars: ~4 chars per token (roughly OpenAI/BPE average for English) + - Non-ASCII chars (CJK etc): ~1 char per token (conservative) + This is intentionally conservative to avoid provider-side "max tokens exceeded" errors. + """ + if not s: + return 0 + ascii_chars = 0 + non_ascii = 0 + for ch in s: + if ord(ch) < 128: + ascii_chars += 1 + else: + non_ascii += 1 + return (ascii_chars + 3) // 4 + non_ascii + + +def _truncate_for_embedding_tokens(s: str, max_tokens: int = _EMBEDDING_MAX_TOKENS_SOFT) -> str: + """ + Truncate text to a conservative token budget. + We do not rely on provider tokenizers to keep the system lightweight. + """ + s = (s or "").strip() + if not s: + return "" + if _estimate_tokens_soft(s) <= max_tokens: + return s + + # Walk from start, stop when budget is reached. + out = [] + tokens = 0 + ascii_bucket = 0 # count ascii chars; every 4 ascii chars ~= +1 token + for ch in s: + if ord(ch) < 128: + ascii_bucket += 1 + if ascii_bucket >= 4: + tokens += 1 + ascii_bucket = 0 + else: + tokens += 1 + if tokens > max_tokens: + break + out.append(ch) + return ("".join(out)).strip() + + +def _batched_by_token_budget( + items: List[Dict], + *, + max_items: int, + max_tokens_sum: int, +) -> List[List[Dict]]: + """ + Split a list of items (each contains 'text') into batches constrained by: + - max_items + - sum(estimated_tokens(text)) <= max_tokens_sum + """ + batches: List[List[Dict]] = [] + cur: List[Dict] = [] + cur_tokens = 0 + for it in items: + txt = str(it.get("text") or "") + t = _estimate_tokens_soft(txt) + # ensure progress even if one item is huge (should already be truncated per-input) + if cur and (len(cur) >= max_items or (cur_tokens + t) > max_tokens_sum): + batches.append(cur) + cur = [] + cur_tokens = 0 + cur.append(it) + cur_tokens += t + if cur: + batches.append(cur) + return batches + + +def _job_now() -> float: + return time.time() + + +def _job_trim() -> None: + # Keep only the most recent jobs in memory. + with _TOPIC_CLUSTER_JOBS_LOCK: + if len(_TOPIC_CLUSTER_JOBS) <= _TOPIC_CLUSTER_JOBS_MAX: + return + # sort by updated_at desc + items = sorted(_TOPIC_CLUSTER_JOBS.items(), key=lambda kv: (kv[1].get("updated_at") or 0), reverse=True) + keep = dict(items[: _TOPIC_CLUSTER_JOBS_MAX]) + _TOPIC_CLUSTER_JOBS.clear() + _TOPIC_CLUSTER_JOBS.update(keep) + + +def _job_get(job_id: str) -> Optional[Dict]: + with _TOPIC_CLUSTER_JOBS_LOCK: + j = _TOPIC_CLUSTER_JOBS.get(job_id) + return dict(j) if isinstance(j, dict) else None + + +def _job_upsert(job_id: str, patch: Dict) -> None: + with _TOPIC_CLUSTER_JOBS_LOCK: + cur = _TOPIC_CLUSTER_JOBS.get(job_id) + if not isinstance(cur, dict): + cur = {"job_id": job_id} + cur.update(patch or {}) + cur["updated_at"] = _job_now() + _TOPIC_CLUSTER_JOBS[job_id] = cur + _job_trim() + + +def _normalize_base_url(base_url: str) -> str: + return base_url[:-1] if base_url.endswith("/") else base_url + + +_PROMPT_NORMALIZE_ENABLED = os.getenv("IIB_PROMPT_NORMALIZE", "1").strip().lower() not in ["0", "false", "no", "off"] +# balanced: keep some discriminative style words (e.g. "科学插图/纪实/胶片") while dropping boilerplate quality/camera terms +# theme_only: more aggressive removal, closer to "only subject/theme nouns" +_PROMPT_NORMALIZE_MODE = (os.getenv("IIB_PROMPT_NORMALIZE_MODE", "balanced") or "balanced").strip().lower() + +# Remove common SD boilerplate / quality descriptors. +_DROP_PATTERNS_COMMON = [ + # SD / A1111 tags + r"]+>", + r"]+>", + # quality / resolution / generic + r"\b(masterpiece|best\s*quality|high\s*quality|best\s*rating|(?:highly|ultra|hyper)[-\s\u2010\u2011\u2012\u2013\u2212]*detailed|absurdres|absurd\s*res|hires|hdr|uhd|8k|4k|2k|raw\s*photo|photorealistic|realistic|cinematic)\b", + # photography / camera / lens + r"\b(film\s+photography|photography|dslr|camera|canon|nikon|sony|sigma|leica|lens|bokeh|depth\s+of\s+field|dof|sharp\s+focus|wide\s+angle|fisheye)\b", + r"\b(iso\s*\d{2,5}|f\/\d+(?:\.\d+)?|\d{2,4}mm)\b", +] +# chinese quality descriptors (common) +_DROP_PATTERNS_ZH_COMMON = [ + r"(超高分辨率|高分辨率|高清|超清|8K|4K|2K|照片级|高质量|最佳质量|大师作品|杰作|超细节|细节丰富|极致细节|极致|完美)", +] +# chinese "style/photography" words: keep in balanced mode (discriminative), drop in theme_only mode +_DROP_PATTERNS_ZH_STYLE = [ + r"(电影质感|写真|写实|真实感|摄影|摄影作品|摄影图像|摄影图|镜头|景深|胶片|光圈|光影|构图|色彩|渲染|纪实|插图|科学插图)", +] + +def _build_drop_re() -> re.Pattern: + pats = list(_DROP_PATTERNS_COMMON) + list(_DROP_PATTERNS_ZH_COMMON) + if _PROMPT_NORMALIZE_MODE in ["theme", "theme_only", "strict"]: + pats += list(_DROP_PATTERNS_ZH_STYLE) + return re.compile("|".join(f"(?:{p})" for p in pats), flags=re.IGNORECASE) + +_DROP_RE = _build_drop_re() + + +def _compute_prompt_normalize_version() -> str: + """ + IMPORTANT: + - Do NOT allow users to override normalize-version via environment variables. + - Version should be deterministic from the normalization rules themselves, so cache invalidation + happens automatically when we change rules in code (or switch mode). + """ + payload = { + "enabled": bool(_PROMPT_NORMALIZE_ENABLED), + "mode": str(_PROMPT_NORMALIZE_MODE), + "drop_common": list(_DROP_PATTERNS_COMMON), + "drop_zh_common": list(_DROP_PATTERNS_ZH_COMMON), + "drop_zh_style": list(_DROP_PATTERNS_ZH_STYLE), + } + s = json.dumps(payload, ensure_ascii=False, sort_keys=True) + return "nv_" + hashlib.sha1(s.encode("utf-8")).hexdigest()[:12] + + +# Derived normalize version fingerprint (for embedding/title cache invalidation) +_PROMPT_NORMALIZE_VERSION = _compute_prompt_normalize_version() + + +def _extract_prompt_text(raw_exif: str, max_chars: int = 4000) -> str: + """ + Extract the natural-language prompt part from stored exif text. + Keep text before 'Negative prompt:' to preserve semantics. + """ + if not isinstance(raw_exif, str): + return "" + s = raw_exif.strip() + if not s: + return "" + idx = s.lower().find("negative prompt:") + if idx != -1: + s = s[:idx].strip() + if len(s) > max_chars: + s = s[:max_chars] + return s.strip() + + +def _clean_prompt_for_semantic(text: str) -> str: + """ + Light, dependency-free prompt normalization: + - remove lora tags / SD boilerplate / quality & photography descriptors + - keep remaining text as 'theme' semantic signal for embeddings/clustering + """ + if not isinstance(text, str): + return "" + s = text + # remove negative prompt tail early (safety if caller passes raw exif) + s = re.sub(r"(negative prompt:).*", " ", s, flags=re.IGNORECASE | re.DOTALL) + # remove weights like (foo:1.2) + s = re.sub(r"\(([^()]{1,80}):\s*\d+(?:\.\d+)?\)", r"\1", s) + # drop boilerplate patterns + s = _DROP_RE.sub(" ", s) + # normalize separators + s = s.replace("**", " ") + s = re.sub(r"[\[\]{}()]", " ", s) + s = re.sub(r"\s+", " ", s).strip() + # If it's a comma-tag style prompt, remove empty / tiny segments. + parts = re.split(r"[,\n,;;]+", s) + kept: List[str] = [] + for p in parts: + t = p.strip() + if not t: + continue + # drop segments that are basically leftover boilerplate (too short or all punctuation) + if len(t) <= 2: + continue + kept.append(t) + s2 = ",".join(kept) if kept else s + return s2.strip() + + +def _clean_for_title(text: str) -> str: + if not isinstance(text, str): + return "" + s = text + s = s.replace("**", " ") + s = re.sub(r"]+>", " ", s, flags=re.IGNORECASE) + s = re.sub(r"]+>", " ", s, flags=re.IGNORECASE) + s = re.sub(r"(negative prompt:).*", " ", s, flags=re.IGNORECASE | re.DOTALL) + s = re.sub(r"(prompt:|提示词[::]|提示[::]|输出[::])", " ", s, flags=re.IGNORECASE) + s = re.sub(r"\s+", " ", s).strip() + return s + + +def _title_from_representative_prompt(text: str, max_len: int = 18) -> str: + """ + Local fallback title: take the first sentence/clause and truncate. + This is much more readable than token n-grams without Chinese word segmentation. + """ + # Use the same semantic cleaner as embeddings to avoid boilerplate titles like + # "masterpiece, best quality" / "A highly detailed ..." + base = _clean_for_title(text) + s = _clean_prompt_for_semantic(base) if _PROMPT_NORMALIZE_ENABLED else base + if not s: + s = base + if not s: + return "主题" + # Split by common sentence punctuations, keep the first segment. + seg = re.split(r"[。!?!?\n\r;;]+", s)[0].strip() + # Remove leading punctuation / separators + seg = re.sub(r"^[,,;;::\s-]+", "", seg).strip() + # Remove leading english articles for nicer titles + seg = re.sub(r"^(a|an|the)\s+", "", seg, flags=re.IGNORECASE).strip() + # Strip common boilerplate templates in titles while keeping discriminative words. + # English: "highly detailed scientific rendering/illustration of ..." + seg = re.sub( + r"^(?:(?:highly|ultra|hyper)[-\s\u2010\u2011\u2012\u2013\u2212]*detailed\s+)?(?:scientific\s+)?(?:rendering|illustration|image|depiction|scene)\s+of\s+", + "", + seg, + flags=re.IGNORECASE, + ).strip() + # Chinese: "一张...图像/插图/照片..." template + seg = re.sub(r"^一[张幅]\s*[^,,。]{0,20}(?:图像|插图|照片|摄影图像|摄影作品)\s*[,, ]*", "", seg).strip() + # Remove trailing commas/colons + seg = re.sub(r"[,:,:]\s*$", "", seg).strip() + # If still too long, hard truncate. + if len(seg) > max_len: + seg = seg[:max_len].rstrip() + return seg or "主题" + + +def _vec_to_blob_f32(vec: List[float]) -> bytes: + arr = array("f", vec) + return arr.tobytes() + + +def _blob_to_vec_f32(blob: bytes) -> array: + arr = array("f") + arr.frombytes(blob) + return arr + + +def _l2_norm_sq(vec: array) -> float: + return sum((x * x for x in vec)) + + +def _dot(a: array, b: array) -> float: + return sum((x * y for x, y in zip(a, b))) + + +def _centroid_vec_np(sum_vec: array, norm_sq: float): + """ + Convert centroid sum-vector to a normalized numpy float32 vector. + Cosine between unit v and centroid is dot(v, sum)/sqrt(norm_sq). + So centroid direction is sum / ||sum||. + """ + _ensure_perf_deps() + if norm_sq <= 0: + return None + inv = 1.0 / math.sqrt(norm_sq) + # array('f') -> numpy without extra python loops + v = _np.frombuffer(sum_vec.tobytes(), dtype=_np.float32).copy() + v *= _np.float32(inv) + return v + + +def _build_hnsw_index(centroids_np, *, ef: int = 64, M: int = 32): + """ + Build a cosine HNSW index over centroid vectors. + Returns index or None. + """ + _ensure_perf_deps() + if centroids_np is None: + return None + if len(centroids_np) == 0: + return None + dim = int(centroids_np.shape[1]) + idx = _hnswlib.Index(space="cosine", dim=dim) + idx.init_index(max_elements=int(centroids_np.shape[0]) + 8, ef_construction=ef, M=M) + labels = _np.arange(centroids_np.shape[0], dtype=_np.int32) + idx.add_items(centroids_np, labels) + idx.set_ef(max(ef, 32)) + return idx + +def _cos_sum(a_sum: array, a_norm_sq: float, b_sum: array, b_norm_sq: float) -> float: + if a_norm_sq <= 0 or b_norm_sq <= 0: + return 0.0 + dotv = sum((x * y for x, y in zip(a_sum, b_sum))) + return dotv / (math.sqrt(a_norm_sq) * math.sqrt(b_norm_sq)) + + +def _call_embeddings_sync( + *, + inputs: List[str], + model: str, + base_url: str, + api_key: str, +) -> List[List[float]]: + if not api_key: + raise HTTPException(status_code=500, detail="OpenAI API Key not configured") + + url = f"{_normalize_base_url(base_url)}/embeddings" + headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"} + payload = {"model": model, "input": inputs} + try: + resp = requests.post(url, json=payload, headers=headers, timeout=120) + except requests.RequestException as e: + raise HTTPException(status_code=502, detail=f"Embedding API request failed: {e}") + if resp.status_code != 200: + # Do not leak upstream 401 to frontend (treat as bad request/config to avoid confusing auth state). + status = 400 if resp.status_code == 401 else resp.status_code + body = (resp.text or "")[:600] + raise HTTPException(status_code=status, detail=body) + data = resp.json() + items = data.get("data") or [] + items.sort(key=lambda x: x.get("index", 0)) + embeddings = [x.get("embedding") for x in items] + if any((not isinstance(v, list) for v in embeddings)): + raise HTTPException(status_code=500, detail="Invalid embeddings response format") + return embeddings + + +async def _call_embeddings( + *, + inputs: List[str], + model: str, + base_url: str, + api_key: str, +) -> List[List[float]]: + """ + IMPORTANT: + - We must NOT block FastAPI's event loop thread with a long-running synchronous HTTP request. + - Use a thread offload for requests.post to keep the server responsive while waiting the embedding API. + """ + return await asyncio.to_thread( + _call_embeddings_sync, + inputs=inputs, + model=model, + base_url=base_url, + api_key=api_key, + ) + + +def _call_chat_title_sync( + *, + base_url: str, + api_key: str, + model: str, + prompt_samples: List[str], + output_lang: str, +) -> Optional[Dict]: + """ + Ask LLM to generate a short topic title and a few keywords. Returns dict or None. + """ + if not api_key: + raise HTTPException(status_code=500, detail="OpenAI API Key not configured") + url = f"{_normalize_base_url(base_url)}/chat/completions" + headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"} + + samples = [(_clean_prompt_for_semantic(_clean_for_title(s) or s) or s).strip() for s in prompt_samples if (s or "").strip()] + samples = [s[:400] for s in samples][:6] + if not samples: + raise HTTPException(status_code=400, detail="No prompt samples for title generation") + + json_example = '{"title":"...","keywords":["...","..."]}' + sys = ( + "You are a topic naming assistant for image-generation prompts.\n" + "Given several prompt snippets that belong to the SAME theme, output:\n" + "- a short topic title\n" + "- 3–6 keywords.\n" + "\n" + "Rules:\n" + f"- Output language MUST be: {output_lang}\n" + "- Prefer 4–12 characters for Chinese (Simplified/Traditional), otherwise 2–6 English/German words.\n" + "- Avoid generic boilerplate like: masterpiece, best quality, highly detailed, cinematic, etc.\n" + "- Keep distinctive terms if they help differentiate themes (e.g., Warhammer 40K, Lolita, scientific illustration).\n" + "- Do NOT output explanations. Do NOT output markdown/code fences.\n" + "- The output MUST start with '{' and end with '}' (no leading/trailing characters).\n" + "\n" + "Output STRICT JSON only:\n" + + json_example + ) + user = "Prompt snippets:\n" + "\n".join([f"- {s}" for s in samples]) + + payload = { + "model": model, + "messages": [{"role": "system", "content": sys}, {"role": "user", "content": user}], + # Prefer deterministic, JSON-only output + "temperature": 0.0, + "top_p": 1.0, + # Give enough room for JSON across providers. + "max_tokens": 2048, + } + # Some OpenAI-compatible providers may use different token limit fields / casing. + # Set them all (still a single request; no retry/fallback). + payload["max_output_tokens"] = payload["max_tokens"] + payload["max_completion_tokens"] = payload["max_tokens"] + payload["maxOutputTokens"] = payload["max_tokens"] + payload["maxCompletionTokens"] = payload["max_tokens"] + + # Parse JSON from message.content only (regex extraction). + # Retry up to 5 times for: network errors, API errors (non 4xx client errors), parsing failures. + attempt_debug: List[Dict] = [] + last_err = "" + for attempt in range(1, 6): + try: + resp = requests.post(url, json=payload, headers=headers, timeout=60) + except requests.RequestException as e: + last_err = f"network_error: {type(e).__name__}: {e}" + attempt_debug.append({"attempt": attempt, "reason": "network_error", "error": str(e)[:400]}) + continue + + # Retry on server-side errors (5xx) and rate limits (429), but not client errors (4xx except 429). + if resp.status_code != 200: + body = (resp.text or "")[:600] + # 401 -> 400 as per your requirement + status = 400 if resp.status_code == 401 else resp.status_code + # Retry on 429 (rate limit) or 5xx (server error) + if resp.status_code == 429 or resp.status_code >= 500: + last_err = f"api_error_retriable: status={status}; body={body}" + attempt_debug.append({"attempt": attempt, "reason": "api_error_retriable", "status": status, "body": body[:200]}) + continue + # 4xx (except 429): fail immediately (client error, not retriable) + raise HTTPException(status_code=status, detail=body) + + try: + data = resp.json() + except Exception as e: + txt = (resp.text or "")[:600] + last_err = f"response_not_json: {type(e).__name__}: {e}; body={txt}" + attempt_debug.append({"attempt": attempt, "reason": "response_not_json", "error": str(e)[:200], "body": txt[:200]}) + continue + + choice0 = (data.get("choices") or [{}])[0] if isinstance(data.get("choices"), list) else {} + msg = (choice0 or {}).get("message") or {} + finish_reason = (choice0.get("finish_reason") if isinstance(choice0, dict) else None) or "" + content = (msg.get("content") if isinstance(msg, dict) else "") or "" + raw = content.strip() if isinstance(content, str) else "" + if not raw and isinstance(choice0, dict): + txt = (choice0.get("text") or "") # legacy + raw = txt.strip() if isinstance(txt, str) else "" + + m = re.search(r"\{[\s\S]*\}", raw) + if not m: + snippet = (raw or "")[:400].replace("\n", "\\n") + choice_dump = json.dumps(choice0, ensure_ascii=False)[:600] if isinstance(choice0, dict) else str(choice0)[:600] + last_err = f"no_json_object; finish_reason={finish_reason}; content_snippet={snippet}; choice0={choice_dump}" + attempt_debug.append({"attempt": attempt, "reason": "no_json_object", "finish_reason": finish_reason, "snippet": snippet}) + continue + + json_str = m.group(0) + try: + obj = json.loads(json_str) + except Exception as e: + snippet = (json_str or "")[:400].replace("\n", "\\n") + last_err = f"json_parse_failed: {type(e).__name__}: {e}; finish_reason={finish_reason}; json_snippet={snippet}" + attempt_debug.append({"attempt": attempt, "reason": "json_parse_failed", "finish_reason": finish_reason, "snippet": snippet}) + continue + + if not isinstance(obj, dict): + snippet = (json_str or "")[:200].replace("\n", "\\n") + last_err = f"json_not_object; finish_reason={finish_reason}; json_snippet={snippet}" + attempt_debug.append({"attempt": attempt, "reason": "json_not_object", "finish_reason": finish_reason, "snippet": snippet}) + continue + + title = str(obj.get("title") or "").strip() + keywords = obj.get("keywords") or [] + if not title: + snippet = (json_str or "")[:200].replace("\n", "\\n") + last_err = f"missing_title; finish_reason={finish_reason}; json_snippet={snippet}" + attempt_debug.append({"attempt": attempt, "reason": "missing_title", "finish_reason": finish_reason, "snippet": snippet}) + continue + if not isinstance(keywords, list): + keywords = [] + keywords = [str(x).strip() for x in keywords if str(x).strip()][:6] + return {"title": title[:24], "keywords": keywords} + + # Exhausted retries + dbg = json.dumps(attempt_debug, ensure_ascii=False)[:1200] + raise HTTPException( + status_code=502, + detail=f"Chat API JSON extraction failed after 5 attempts; last_error={last_err}; attempts={dbg}", + ) + + +async def _call_chat_title( + *, + base_url: str, + api_key: str, + model: str, + prompt_samples: List[str], + output_lang: str, +) -> Dict: + """ + Same rationale as embeddings: + - requests.post() is synchronous and would block the event loop thread for tens of seconds. + - Offload to a worker thread to keep other API requests responsive. + """ + ret = await asyncio.to_thread( + _call_chat_title_sync, + base_url=base_url, + api_key=api_key, + model=model, + prompt_samples=prompt_samples, + output_lang=output_lang, + ) + if not isinstance(ret, dict): + raise HTTPException(status_code=502, detail="Chat API returned empty title payload") + return ret + + +def mount_topic_cluster_routes( + app: FastAPI, + db_api_base: str, + verify_secret, + write_permission_required, + *, + openai_base_url: str, + openai_api_key: str, + embedding_model: str, + ai_model: str, +): + """ + Mount embedding + topic clustering endpoints (MVP: manual, iib_output only). + """ + # IMPORTANT: + # Do NOT call _ensure_perf_deps() here. + # We only fail at specific API endpoints so users without deps can still use other features. + + async def _run_cluster_job(job_id: str, req) -> None: + try: + _job_upsert( + job_id, + { + "status": "running", + "stage": "init", + "created_at": _job_now(), + "req": req.model_dump() if hasattr(req, "model_dump") else req.dict(), + }, + ) + + folders = _extract_and_validate_folders(req) + _job_upsert(job_id, {"folders": folders, "stage": "embedding"}) + + # Aggregate per-folder embedding progress into totals + per_folder: Dict[str, Dict] = {} + + def _embed_cb(p: Dict) -> None: + if not isinstance(p, dict): + return + if p.get("stage") != "embedding": + return + f = str(p.get("folder") or "") + if f: + per_folder[f] = dict(p) + scanned = sum(int(x.get("scanned") or 0) for x in per_folder.values()) + to_embed = sum(int(x.get("to_embed") or 0) for x in per_folder.values()) + embedded_done = sum(int(x.get("embedded_done") or 0) for x in per_folder.values()) + updated = sum(int(x.get("updated") or 0) for x in per_folder.values()) + skipped = sum(int(x.get("skipped") or 0) for x in per_folder.values()) + _job_upsert( + job_id, + { + "stage": "embedding", + "progress": { + "scanned": scanned, + "to_embed": to_embed, + "embedded_done": embedded_done, + "updated": updated, + "skipped": skipped, + "folder": f, + "batch_n": int((p or {}).get("batch_n") or 0), + }, + }, + ) + + # Ensure embeddings exist (incremental per folder) + model = req.model or embedding_model + batch_size = max(1, min(int(req.batch_size or 64), 256)) + max_chars = max(256, min(int(req.max_chars or 4000), 8000)) + force = bool(req.force_embed) + for f in folders: + await _build_embeddings_one_folder( + folder=f, + model=model, + force=force, + batch_size=batch_size, + max_chars=max_chars, + progress_cb=_embed_cb, + ) + + # If embeddings didn't change and we have a cached clustering result, return it directly. + conn = DataBase.get_conn() + like_prefixes = [os.path.join(f, "%") for f in folders] + with closing(conn.cursor()) as cur: + where = " OR ".join(["image.path LIKE ?"] * len(like_prefixes)) + cur.execute( + f"""SELECT COUNT(*), MAX(image_embedding.updated_at) + FROM image + INNER JOIN image_embedding ON image_embedding.image_id = image.id + WHERE ({where}) AND image_embedding.model = ?""", + (*like_prefixes, model), + ) + row = cur.fetchone() or (0, "") + embeddings_count = int(row[0] or 0) + embeddings_max_updated_at = str(row[1] or "") + + cache_params = { + "model": model, + "threshold": float(req.threshold or 0.90), + "min_cluster_size": int(req.min_cluster_size or 2), + "assign_noise_threshold": req.assign_noise_threshold, + "title_model": req.title_model, + "lang": str(req.lang or ""), + "nv": _PROMPT_NORMALIZE_VERSION, + "nm": _PROMPT_NORMALIZE_MODE, + } + h = hashlib.sha1() + h.update(json.dumps({"folders": folders, "params": cache_params}, ensure_ascii=False, sort_keys=True).encode("utf-8")) + cache_key = h.hexdigest() + cached = TopicClusterCache.get(conn, cache_key) + if ( + cached + and int(cached.get("embeddings_count") or 0) == embeddings_count + and str(cached.get("embeddings_max_updated_at") or "") == embeddings_max_updated_at + and isinstance(cached.get("result"), dict) + ): + _job_upsert(job_id, {"status": "done", "stage": "done", "result": cached["result"], "cache_hit": True}) + return + + # Clustering + titling progress + def _cluster_cb(p: Dict) -> None: + if not isinstance(p, dict): + return + st = str(p.get("stage") or "") + if st: + patch = {"stage": st, "status": "running"} + # keep small progress fields only + prog = {} + for k in [ + "items_total", + "items_done", + "clusters_total", + "clusters_done", + "folder", + ]: + if k in p: + prog[k] = p.get(k) + if prog: + patch["progress"] = {**(_job_get(job_id) or {}).get("progress", {}), **prog} + _job_upsert(job_id, patch) + + res = await _cluster_after_embeddings(req, folders, progress_cb=_cluster_cb) + try: + TopicClusterCache.upsert( + conn, + cache_key=cache_key, + folders=folders, + model=model, + params=cache_params, + embeddings_count=embeddings_count, + embeddings_max_updated_at=embeddings_max_updated_at, + result=res, + ) + conn.commit() + except Exception: + pass + _job_upsert(job_id, {"status": "done", "stage": "done", "result": res}) + except HTTPException as e: + _job_upsert(job_id, {"status": "error", "stage": "error", "error": str(e.detail)}) + except Exception as e: + _job_upsert(job_id, {"status": "error", "stage": "error", "error": f"{type(e).__name__}: {e}"}) + + async def _build_embeddings_one_folder( + *, + folder: str, + model: str, + force: bool, + batch_size: int, + max_chars: int, + progress_cb: Optional[Callable[[Dict], None]] = None, + ) -> Dict: + """ + Build embeddings for a single folder with optional progress callback. + Progress payload (best-effort): + - stage: "embedding" + - folder, scanned, to_embed, embedded_done, updated, skipped + """ + if not openai_api_key: + raise HTTPException(status_code=500, detail="OpenAI API Key not configured") + if not openai_base_url: + raise HTTPException(status_code=500, detail="OpenAI Base URL not configured") + + folder = os.path.normpath(folder) + if not os.path.exists(folder) or not os.path.isdir(folder): + raise HTTPException(status_code=400, detail=f"Folder not found: {folder}") + + conn = DataBase.get_conn() + like_prefix = os.path.join(folder, "%") + with closing(conn.cursor()) as cur: + cur.execute("SELECT id, path, exif FROM image WHERE path LIKE ?", (like_prefix,)) + rows = cur.fetchall() + + images = [] + for image_id, path, exif in rows: + if not isinstance(path, str) or not os.path.exists(path): + continue + text_raw = _extract_prompt_text(exif, max_chars=max_chars) + if _PROMPT_NORMALIZE_ENABLED: + text = _clean_prompt_for_semantic(text_raw) + if not text: + text = text_raw + else: + text = text_raw + # Some embedding models/providers have strict context limits (often 8192 tokens). + # Apply a conservative truncation before sending to embedding API. + text = _truncate_for_embedding_tokens(text, _EMBEDDING_MAX_TOKENS_SOFT) + if not text: + continue + images.append({"id": int(image_id), "path": path, "text": text}) + + if not images: + if progress_cb: + progress_cb( + { + "stage": "embedding", + "folder": folder, + "scanned": 0, + "to_embed": 0, + "embedded_done": 0, + "updated": 0, + "skipped": 0, + } + ) + return {"folder": folder, "count": 0, "updated": 0, "skipped": 0, "model": model} + + id_list = [x["id"] for x in images] + existing = ImageEmbedding.get_by_image_ids(conn, id_list) + existing_fail = ImageEmbeddingFail.get_by_image_ids(conn, id_list, model) + + to_embed = [] + skipped = 0 + skipped_failed = 0 + for item in images: + # include normalize version to force refresh when rules change + text_hash = ImageEmbedding.compute_text_hash(f"{_PROMPT_NORMALIZE_VERSION}:{item['text']}") + old = existing.get(item["id"]) + old_fail = existing_fail.get(item["id"]) + if ( + (not force) + and old + and old.get("model") == model + and old.get("text_hash") == text_hash + and old.get("vec") + ): + skipped += 1 + continue + # Skip known failures for the same model+text_hash (unless force is enabled). + if (not force) and old_fail and str(old_fail.get("text_hash") or "") == text_hash: + skipped_failed += 1 + continue + to_embed.append({**item, "text_hash": text_hash}) + + if progress_cb: + progress_cb( + { + "stage": "embedding", + "folder": folder, + "scanned": len(images), + "to_embed": len(to_embed), + "embedded_done": 0, + "updated": 0, + "skipped": skipped, + "skipped_failed": skipped_failed, + "failed": 0, + } + ) + + updated = 0 + embedded_done = 0 + failed = 0 + batches = _batched_by_token_budget( + to_embed, + max_items=batch_size, + max_tokens_sum=_EMBEDDING_REQUEST_MAX_TOKENS_SOFT, + ) + for bi, batch in enumerate(batches): + inputs = [x["text"] for x in batch] + if _EMBEDDING_DEBUG: + token_sum = sum(_estimate_tokens_soft(s) for s in inputs) + token_max = max((_estimate_tokens_soft(s) for s in inputs), default=0) + print( + f"[iib][embed] folder={folder} batch={bi+1}/{len(batches)} n={len(inputs)} token_sum~={token_sum} token_max~={token_max}" + ) + try: + vectors = await _call_embeddings( + inputs=inputs, + model=model, + base_url=openai_base_url, + api_key=openai_api_key, + ) + except HTTPException as e: + # Cache failures for this batch and continue (skip these images for now). + err = str(e.detail) + for it in batch: + try: + ImageEmbeddingFail.upsert( + conn, + image_id=int(it["id"]), + model=str(model), + text_hash=str(it.get("text_hash") or ""), + error=err, + ) + except Exception: + pass + try: + conn.commit() + except Exception: + pass + failed += len(batch) + if progress_cb: + progress_cb( + { + "stage": "embedding", + "folder": folder, + "scanned": len(images), + "to_embed": len(to_embed), + "embedded_done": embedded_done, + "updated": updated, + "skipped": skipped, + "skipped_failed": skipped_failed, + "failed": failed, + "batch_n": len(inputs), + } + ) + await asyncio.sleep(0) + continue + if len(vectors) != len(batch): + raise HTTPException(status_code=500, detail="Embeddings count mismatch") + for item, vec in zip(batch, vectors): + ImageEmbedding.upsert( + conn=conn, + image_id=item["id"], + model=model, + dim=len(vec), + text_hash=item["text_hash"], + vec_blob=_vec_to_blob_f32(vec), + ) + # Success -> clear fail cache for this image+model (any old failure becomes irrelevant). + try: + ImageEmbeddingFail.delete(conn, image_id=int(item["id"]), model=str(model)) + except Exception: + pass + updated += 1 + embedded_done += 1 + conn.commit() + if progress_cb: + progress_cb( + { + "stage": "embedding", + "folder": folder, + "scanned": len(images), + "to_embed": len(to_embed), + "embedded_done": embedded_done, + "updated": updated, + "skipped": skipped, + "skipped_failed": skipped_failed, + "failed": failed, + "batch_n": len(inputs), + } + ) + # yield between batches + await asyncio.sleep(0) + + return { + "folder": folder, + "count": len(images), + "updated": updated, + "skipped": skipped, + "skipped_failed": skipped_failed, + "failed": failed, + "model": model, + } + + class BuildIibOutputEmbeddingReq(BaseModel): + folder: Optional[str] = None # default: {cwd}/iib_output + model: Optional[str] = None + force: Optional[bool] = False + batch_size: Optional[int] = 64 + max_chars: Optional[int] = 4000 + + @app.post( + f"{db_api_base}/build_iib_output_embeddings", + dependencies=[Depends(verify_secret), Depends(write_permission_required)], + ) + async def build_iib_output_embeddings(req: BuildIibOutputEmbeddingReq): + # TopicSearch feature requires perf deps; fail at API layer, not at server start. + _ensure_perf_deps() + if not openai_api_key: + raise HTTPException(status_code=500, detail="OpenAI API Key not configured") + if not openai_base_url: + raise HTTPException(status_code=500, detail="OpenAI Base URL not configured") + folder = req.folder or os.path.join(cwd, "iib_output") + model = req.model or embedding_model + batch_size = max(1, min(int(req.batch_size or 64), 256)) + max_chars = max(256, min(int(req.max_chars or 4000), 8000)) + force = bool(req.force) + return await _build_embeddings_one_folder( + folder=folder, + model=model, + force=force, + batch_size=batch_size, + max_chars=max_chars, + progress_cb=None, + ) + + class ClusterIibOutputReq(BaseModel): + folder: Optional[str] = None + folder_paths: Optional[List[str]] = None + model: Optional[str] = None + force_embed: Optional[bool] = False + # Default a bit stricter to avoid over-merged broad topics for natural-language prompts. + threshold: Optional[float] = 0.90 + batch_size: Optional[int] = 64 + max_chars: Optional[int] = 4000 + min_cluster_size: Optional[int] = 2 + # B: LLM title generation + title_model: Optional[str] = None + # Reduce noise by reassigning small-cluster members to best large cluster if similarity is high enough + assign_noise_threshold: Optional[float] = None + # Cache titles in sqlite to avoid repeated LLM calls + use_title_cache: Optional[bool] = True + force_title: Optional[bool] = False + # Output language for titles/keywords (from frontend globalStore.lang) + lang: Optional[str] = None + + def _scope_cache_stale_by_folders(conn: Connection, folders: List[str]) -> Dict: + """ + Determine whether selected folders (and their subfolders) appear to have changed + since last /db/update_image_data run. + + We use the existing `folders` table (Folder) which stores last observed modified_date. + If any tracked folder's current modified_date differs, we treat cache as stale. + If a selected root folder is missing from the table, treat as stale (not indexed yet). + """ + try: + from scripts.iib.db.datamodel import Folder + from scripts.iib.tool import get_modified_date + except Exception: + # If imports fail for any reason, be conservative. + return {"folders_changed": True, "reason": "folder_state_check_import_failed"} + + changed_path = "" + # root folder missing in table => stale + with closing(conn.cursor()) as cur: + for f in folders: + cur.execute("SELECT id, path, modified_date FROM folders WHERE path = ?", (str(f),)) + row = cur.fetchone() + if not row: + return {"folders_changed": True, "reason": "folder_not_indexed", "path": str(f)} + # check all known subfolders under each selected folder + for f in folders: + like_prefix = os.path.join(str(f), "%") + with closing(conn.cursor()) as cur: + cur.execute( + "SELECT path, modified_date FROM folders WHERE path = ? OR path LIKE ?", + (str(f), like_prefix), + ) + rows = cur.fetchall() or [] + for p, stored in rows: + p = str(p or "") + if not p: + continue + if not os.path.exists(p) or not os.path.isdir(p): + # path removed: treat as changed + changed_path = p + return {"folders_changed": True, "reason": "folder_missing", "path": changed_path} + cur_md = str(get_modified_date(p)) + if cur_md != str(stored or ""): + changed_path = p + return { + "folders_changed": True, + "reason": "folder_modified_date_changed", + "path": changed_path, + "stored": str(stored or ""), + "current": cur_md, + } + return {"folders_changed": False} + + def _embeddings_state(conn: Connection, folders: List[str], model: str) -> Dict: + like_prefixes = [os.path.join(f, "%") for f in folders] + with closing(conn.cursor()) as cur: + where = " OR ".join(["image.path LIKE ?"] * len(like_prefixes)) + cur.execute( + f"""SELECT COUNT(*), MAX(image_embedding.updated_at) + FROM image + INNER JOIN image_embedding ON image_embedding.image_id = image.id + WHERE ({where}) AND image_embedding.model = ?""", + (*like_prefixes, str(model)), + ) + row = cur.fetchone() or (0, "") + return {"embeddings_count": int(row[0] or 0), "embeddings_max_updated_at": str(row[1] or "")} + + @app.post( + f"{db_api_base}/cluster_iib_output_cached", + # Read-only: do NOT require write permission; only reads sqlite cache and folder mtimes. + dependencies=[Depends(verify_secret)], + ) + async def cluster_iib_output_cached(req: ClusterIibOutputReq): + """ + Return cached clustering result if exists, WITHOUT triggering embedding/clustering. + Also returns a lightweight "stale" signal based on: + - folders table modified_date changes (requires user to run refresh/index update) + - embedding state changes (count / max(updated_at)) compared to cache metadata + """ + folders = _extract_and_validate_folders(req) + model = req.model or embedding_model + conn = DataBase.get_conn() + + cache_params = { + "model": str(model), + "threshold": float(req.threshold or 0.90), + "min_cluster_size": int(req.min_cluster_size or 2), + "assign_noise_threshold": req.assign_noise_threshold, + "title_model": req.title_model, + "lang": str(req.lang or ""), + "nv": _PROMPT_NORMALIZE_VERSION, + "nm": _PROMPT_NORMALIZE_MODE, + } + h = hashlib.sha1() + h.update(json.dumps({"folders": folders, "params": cache_params}, ensure_ascii=False, sort_keys=True).encode("utf-8")) + cache_key = h.hexdigest() + + cached = TopicClusterCache.get(conn, cache_key) + folder_state = _scope_cache_stale_by_folders(conn, folders) + emb_state = _embeddings_state(conn, folders, model) + + embeddings_changed = False + if cached: + embeddings_changed = ( + int(cached.get("embeddings_count") or 0) != int(emb_state["embeddings_count"]) + or str(cached.get("embeddings_max_updated_at") or "") != str(emb_state["embeddings_max_updated_at"]) + ) + + stale = bool(folder_state.get("folders_changed")) or bool(embeddings_changed) or (not cached) + return { + "cache_key": cache_key, + "cache_hit": bool(cached and isinstance(cached.get("result"), dict)), + "cached_at": (cached or {}).get("updated_at") if cached else "", + "result": (cached or {}).get("result") if cached else None, + "stale": stale, + "stale_reason": { + **folder_state, + "embeddings_changed": bool(embeddings_changed), + "embeddings_count": int(emb_state["embeddings_count"]), + "embeddings_max_updated_at": str(emb_state["embeddings_max_updated_at"]), + }, + } + + @app.post( + f"{db_api_base}/cluster_iib_output_job_start", + dependencies=[Depends(verify_secret), Depends(write_permission_required)], + ) + async def cluster_iib_output_job_start(req: ClusterIibOutputReq): + # TopicSearch feature requires perf deps; fail at API layer, not at server start. + _ensure_perf_deps() + """ + Start a background job for embedding + clustering + LLM titling. + Returns job_id immediately; frontend should poll job_status to show progress. + """ + job_id = uuid.uuid4().hex + _job_upsert(job_id, {"status": "queued", "stage": "queued", "created_at": _job_now()}) + asyncio.create_task(_run_cluster_job(job_id, req)) + return {"job_id": job_id} + + @app.get( + f"{db_api_base}/cluster_iib_output_job_status", + dependencies=[Depends(verify_secret), Depends(write_permission_required)], + ) + async def cluster_iib_output_job_status(job_id: str): + j = _job_get(job_id) + if not j: + raise HTTPException(status_code=404, detail="job not found") + return j + + def _extract_and_validate_folders(req: ClusterIibOutputReq) -> List[str]: + folders: List[str] = [] + if req.folder_paths: + for p in req.folder_paths: + if isinstance(p, str) and p.strip(): + folders.append(os.path.normpath(p.strip())) + if req.folder and isinstance(req.folder, str) and req.folder.strip(): + folders.append(os.path.normpath(req.folder.strip())) + # 用户不会用默认 iib_output:未指定范围则直接报错 + if not folders: + raise HTTPException(status_code=400, detail="folder_paths is required (select folders to cluster)") + folders = list(dict.fromkeys(folders)) + for f in folders: + if not os.path.exists(f) or not os.path.isdir(f): + raise HTTPException(status_code=400, detail=f"Folder not found: {f}") + return folders + + async def _cluster_after_embeddings( + req: ClusterIibOutputReq, + folders: List[str], + progress_cb: Optional[Callable[[Dict], None]] = None, + ) -> Dict: + folder = folders[0] + model = req.model or embedding_model + threshold = float(req.threshold or 0.90) + threshold = max(0.0, min(threshold, 0.999)) + min_cluster_size = max(1, int(req.min_cluster_size or 2)) + title_model = req.title_model or os.getenv("TOPIC_TITLE_MODEL") or ai_model + output_lang = _normalize_output_lang(req.lang) + assign_noise_threshold = req.assign_noise_threshold + if assign_noise_threshold is None: + # More conservative: noise reassignment is helpful to reduce noise, + # but if too permissive it can "glue" loosely-related themes into one big topic. + # Keep it >= threshold (or slightly higher) so we only reassign when very confident. + assign_noise_threshold = max(0.88, min(threshold + 0.02, 0.97)) + else: + assign_noise_threshold = max(0.0, min(float(assign_noise_threshold), 0.999)) + use_title_cache = bool(True if req.use_title_cache is None else req.use_title_cache) + force_title = bool(req.force_title) + + if progress_cb: + progress_cb({"stage": "clustering", "folder": folder, "folders": folders}) + + conn = DataBase.get_conn() + like_prefixes = [os.path.join(f, "%") for f in folders] + with closing(conn.cursor()) as cur: + where = " OR ".join(["image.path LIKE ?"] * len(like_prefixes)) + cur.execute( + f"""SELECT image.id, image.path, image.exif, image_embedding.vec + FROM image + INNER JOIN image_embedding ON image_embedding.image_id = image.id + WHERE ({where}) AND image_embedding.model = ?""", + (*like_prefixes, model), + ) + rows = cur.fetchall() + + items = [] + for n, (image_id, path, exif, vec_blob) in enumerate(rows): + if not isinstance(path, str) or not os.path.exists(path): + continue + if not vec_blob: + continue + vec = _blob_to_vec_f32(vec_blob) + n2 = _l2_norm_sq(vec) + if n2 <= 0: + continue + inv = 1.0 / math.sqrt(n2) + for i in range(len(vec)): + vec[i] *= inv + text_raw = _extract_prompt_text(exif, max_chars=int(req.max_chars or 4000)) + if _PROMPT_NORMALIZE_ENABLED: + text = _clean_prompt_for_semantic(text_raw) + if not text: + text = text_raw + else: + text = text_raw + items.append({"id": int(image_id), "path": path, "text": text, "vec": vec}) + if (n + 1) % 800 == 0: + await asyncio.sleep(0) + + if not items: + return {"folder": folder, "folders": folders, "model": model, "threshold": threshold, "clusters": [], "noise": []} + + # Incremental clustering by centroid-direction (sum vector) + clusters = [] # {sum, norm_sq, members:[idx], sample_text} + ann_idx = None + ann_centroids = None + ann_rebuild_every = 256 # rebuild index periodically to reflect centroid updates + ann_topk = 8 + for idx, it in enumerate(items): + v = it["vec"] + best_ci = -1 + best_sim = -1.0 + best_dot = 0.0 + # Build / rebuild ANN index when helpful (many clusters) + if len(clusters) >= 64: + if ann_idx is None or (idx % ann_rebuild_every == 0): + # rebuild from current centroids + cents = [] + for c in clusters: + cv = _centroid_vec_np(c["sum"], c["norm_sq"]) + if cv is None: + # fallback to zeros; will never be nearest + cv = _np.zeros((len(v),), dtype=_np.float32) # type: ignore + cents.append(cv) + ann_centroids = _np.stack(cents, axis=0).astype(_np.float32) # type: ignore + ann_idx = _build_hnsw_index(ann_centroids) + # Query candidates + if ann_idx is not None: + q = _np.frombuffer(v.tobytes(), dtype=_np.float32).reshape(1, -1).copy() # type: ignore + labels, _dists = ann_idx.knn_query(q, k=min(ann_topk, len(clusters))) + cand = [int(x) for x in (labels[0].tolist() if labels is not None else [])] + else: + cand = list(range(len(clusters))) + else: + cand = list(range(len(clusters))) + + for ci in cand: + c = clusters[ci] + dotv = _dot(v, c["sum"]) + denom = math.sqrt(c["norm_sq"]) if c["norm_sq"] > 0 else 1.0 + sim = dotv / denom + if sim > best_sim: + best_sim = sim + best_ci = ci + best_dot = dotv + if best_ci != -1 and best_sim >= threshold: + c = clusters[best_ci] + for i in range(len(v)): + c["sum"][i] += v[i] + c["norm_sq"] = c["norm_sq"] + 2.0 * best_dot + 1.0 + c["members"].append(idx) + else: + clusters.append({"sum": array("f", v), "norm_sq": 1.0, "members": [idx], "sample_text": it.get("text") or ""}) + ann_idx = None # force rebuild after new cluster + if (idx + 1) % 800 == 0: + if progress_cb: + progress_cb({"stage": "clustering", "items_total": len(items), "items_done": idx + 1}) + await asyncio.sleep(0) + + # Merge highly similar clusters (fix: same theme split into multiple clusters) + # IMPORTANT: keep this VERY strict; otherwise unrelated clusters can be merged. + merge_threshold = min(0.999, max(threshold + 0.08, 0.965)) + merged = True + while merged and len(clusters) > 1: + merged = False + best_i = best_j = -1 + best_sim = merge_threshold + for i in range(len(clusters)): + ci = clusters[i] + for j in range(i + 1, len(clusters)): + cj = clusters[j] + sim = _cos_sum(ci["sum"], ci["norm_sq"], cj["sum"], cj["norm_sq"]) + if sim >= best_sim: + best_sim = sim + best_i, best_j = i, j + if best_i != -1: + a = clusters[best_i] + b = clusters[best_j] + for k in range(len(a["sum"])): + a["sum"][k] += b["sum"][k] + a["norm_sq"] = _l2_norm_sq(a["sum"]) + a["members"].extend(b["members"]) + if not a.get("sample_text"): + a["sample_text"] = b.get("sample_text", "") + clusters.pop(best_j) + merged = True + await asyncio.sleep(0) + + # Reassign members from small clusters into best large cluster to reduce noise + if min_cluster_size > 1 and assign_noise_threshold > 0 and clusters: + large = [c for c in clusters if len(c["members"]) >= min_cluster_size] + if large: + new_large = [] + # copy large clusters first + for c in clusters: + if len(c["members"]) >= min_cluster_size: + new_large.append(c) + # Build ANN over large centroids once (optional) + ann_large = None + if len(new_large) >= 64: + cents = [] + for c in new_large: + cv = _centroid_vec_np(c["sum"], c["norm_sq"]) + if cv is None: + cv = _np.zeros((len(items[0]["vec"]),), dtype=_np.float32) # type: ignore + cents.append(cv) + cent_mat = _np.stack(cents, axis=0).astype(_np.float32) # type: ignore + ann_large = _build_hnsw_index(cent_mat, ef=64, M=32) + # reassign items from small clusters + for c in clusters: + if len(c["members"]) >= min_cluster_size: + continue + for mi in c["members"]: + v = items[mi]["vec"] + best_ci = -1 + best_sim = -1.0 + best_dot = 0.0 + if ann_large is not None: + q = _np.frombuffer(v.tobytes(), dtype=_np.float32).reshape(1, -1).copy() # type: ignore + labels, _dists = ann_large.knn_query(q, k=min(8, len(new_large))) + cand = [int(x) for x in (labels[0].tolist() if labels is not None else [])] + else: + cand = range(len(new_large)) + for ci in cand: + bigc = new_large[ci] + dotv = _dot(v, bigc["sum"]) + denom = math.sqrt(bigc["norm_sq"]) if bigc["norm_sq"] > 0 else 1.0 + sim = dotv / denom + if sim > best_sim: + best_sim = sim + best_ci = ci + best_dot = dotv + if best_ci != -1 and best_sim >= assign_noise_threshold: + bigc = new_large[best_ci] + for k in range(len(v)): + bigc["sum"][k] += v[k] + bigc["norm_sq"] = bigc["norm_sq"] + 2.0 * best_dot + 1.0 + bigc["members"].append(mi) + # else: keep in small cluster -> will become noise below + await asyncio.sleep(0) + clusters = new_large + + # Split small clusters to noise, generate titles + out_clusters = [] + noise = [] + if progress_cb: + progress_cb({"stage": "titling", "clusters_total": len(clusters)}) + + for cidx, c in enumerate(clusters): + if len(c["members"]) < min_cluster_size: + for mi in c["members"]: + noise.append(items[mi]["path"]) + continue + + member_items = [items[mi] for mi in c["members"]] + paths = [x["path"] for x in member_items] + texts = [x.get("text") or "" for x in member_items] + member_ids = [x["id"] for x in member_items] + + # Representative prompt for LLM title generation + rep = (c.get("sample_text") or (texts[0] if texts else "")).strip() + + cached = None + cluster_hash = _cluster_sig( + member_ids=member_ids, + model=model, + threshold=threshold, + min_cluster_size=min_cluster_size, + title_model=title_model, + lang=output_lang, + ) + if use_title_cache and (not force_title): + cached = TopicTitleCache.get(conn, cluster_hash) + if cached and isinstance(cached, dict) and cached.get("title"): + title = str(cached.get("title")) + keywords = cached.get("keywords") or [] + else: + llm = await _call_chat_title( + base_url=openai_base_url, + api_key=openai_api_key, + model=title_model, + prompt_samples=[rep] + texts[:5], + output_lang=output_lang, + ) + title = (llm or {}).get("title") + keywords = (llm or {}).get("keywords", []) + if not title: + raise HTTPException(status_code=502, detail="Chat API returned empty title") + if use_title_cache and title: + try: + TopicTitleCache.upsert(conn, cluster_hash, str(title), list(keywords or []), str(title_model)) + conn.commit() + except Exception: + pass + + out_clusters.append( + { + "id": f"topic_{cidx}", + "title": title, + "keywords": keywords, + "size": len(paths), + "paths": paths, + "sample_prompt": _clean_for_title(rep)[:200], + } + ) + if (cidx + 1) % 6 == 0: + if progress_cb: + progress_cb({"stage": "titling", "clusters_total": len(clusters), "clusters_done": cidx + 1}) + await asyncio.sleep(0) + + out_clusters.sort(key=lambda x: x["size"], reverse=True) + return { + "folder": folder, + "folders": folders, + "count": len(items), + "threshold": threshold, + "min_cluster_size": min_cluster_size, + "model": model, + "assign_noise_threshold": assign_noise_threshold, + "clusters": out_clusters, + "noise": noise, + } + + class PromptSearchReq(BaseModel): + query: str + folder: Optional[str] = None + folder_paths: Optional[List[str]] = None + model: Optional[str] = None + top_k: Optional[int] = 50 + min_score: Optional[float] = 0.0 + # Ensure embeddings exist/updated before searching + ensure_embed: Optional[bool] = True + # Use the same normalization as clustering + max_chars: Optional[int] = 4000 + + @app.post( + f"{db_api_base}/search_iib_output_by_prompt", + dependencies=[Depends(verify_secret), Depends(write_permission_required)], + ) + async def search_iib_output_by_prompt(req: PromptSearchReq): + # TopicSearch feature requires perf deps; fail at API layer, not at server start. + _ensure_perf_deps() + if not openai_api_key: + raise HTTPException(status_code=500, detail="OpenAI API Key not configured") + if not openai_base_url: + raise HTTPException(status_code=500, detail="OpenAI Base URL not configured") + + q = (req.query or "").strip() + if not q: + raise HTTPException(status_code=400, detail="query is required") + + folders: List[str] = [] + if req.folder_paths: + for p in req.folder_paths: + if isinstance(p, str) and p.strip(): + folders.append(os.path.normpath(p.strip())) + if req.folder and isinstance(req.folder, str) and req.folder.strip(): + folders.append(os.path.normpath(req.folder.strip())) + # 用户不会用默认 iib_output:未指定范围则直接报错 + if not folders: + raise HTTPException(status_code=400, detail="folder_paths is required (select folders to search)") + + # validate folders + folders = list(dict.fromkeys(folders)) # de-dup keep order + for f in folders: + if not os.path.exists(f) or not os.path.isdir(f): + raise HTTPException(status_code=400, detail=f"Folder not found: {f}") + + folder = folders[0] + model = req.model or embedding_model + top_k = max(1, min(int(req.top_k or 50), 500)) + min_score = float(req.min_score or 0.0) + min_score = max(-1.0, min(min_score, 1.0)) + max_chars = max(256, min(int(req.max_chars or 4000), 8000)) + + if bool(req.ensure_embed): + for f in folders: + await build_iib_output_embeddings( + BuildIibOutputEmbeddingReq(folder=f, model=model, force=False, batch_size=64, max_chars=max_chars) + ) + + # Build query embedding + q_text = _extract_prompt_text(q, max_chars=max_chars) + if _PROMPT_NORMALIZE_ENABLED: + q_text2 = _clean_prompt_for_semantic(q_text) + if q_text2: + q_text = q_text2 + q_text = _truncate_for_embedding_tokens(q_text, _EMBEDDING_MAX_TOKENS_SOFT) + vecs = await _call_embeddings(inputs=[q_text], model=model, base_url=openai_base_url, api_key=openai_api_key) + if not vecs or not isinstance(vecs[0], list) or not vecs[0]: + raise HTTPException(status_code=502, detail="Embedding API returned empty vector") + qv = array("f", [float(x) for x in vecs[0]]) + qn2 = _l2_norm_sq(qv) + if qn2 <= 0: + raise HTTPException(status_code=502, detail="Query embedding has zero norm") + qinv = 1.0 / math.sqrt(qn2) + for i in range(len(qv)): + qv[i] *= qinv + + conn = DataBase.get_conn() + like_prefixes = [os.path.join(f, "%") for f in folders] + with closing(conn.cursor()) as cur: + where = " OR ".join(["image.path LIKE ?"] * len(like_prefixes)) + cur.execute( + f"""SELECT image.id, image.path, image.exif, image_embedding.vec + FROM image + INNER JOIN image_embedding ON image_embedding.image_id = image.id + WHERE ({where}) AND image_embedding.model = ?""", + (*like_prefixes, model), + ) + rows = cur.fetchall() + + # TopK by cosine similarity (brute force; MVP only) + import heapq + + heap: List[Tuple[float, Dict]] = [] + total = 0 + for image_id, path, exif, vec_blob in rows: + if not isinstance(path, str) or not os.path.exists(path): + continue + if not vec_blob: + continue + v = _blob_to_vec_f32(vec_blob) + n2 = _l2_norm_sq(v) + if n2 <= 0: + continue + inv = 1.0 / math.sqrt(n2) + for i in range(len(v)): + v[i] *= inv + score = _dot(qv, v) + total += 1 + if score < min_score: + continue + item = { + "id": int(image_id), + "path": path, + "score": float(score), + "sample_prompt": _clean_for_title(_extract_prompt_text(exif, max_chars=max_chars))[:200], + } + if len(heap) < top_k: + heapq.heappush(heap, (score, item)) + else: + if score > heap[0][0]: + heapq.heapreplace(heap, (score, item)) + + heap.sort(key=lambda x: x[0], reverse=True) + results = [x[1] for x in heap] + return { + "query": q, + "folder": folder, + "folders": folders, + "model": model, + "count": total, + "top_k": top_k, + "results": results, + } + + def _cluster_sig( + *, + member_ids: List[int], + model: str, + threshold: float, + min_cluster_size: int, + title_model: str, + lang: str, + ) -> str: + h = hashlib.sha1() + h.update(f"m={model}|t={threshold:.6f}|min={min_cluster_size}|tm={title_model}|lang={lang}|nv={_PROMPT_NORMALIZE_VERSION}|nm={_PROMPT_NORMALIZE_MODE}".encode("utf-8")) + for iid in sorted(member_ids): + h.update(b"|") + h.update(str(int(iid)).encode("utf-8")) + return h.hexdigest() + + def _normalize_output_lang(lang: Optional[str]) -> str: + """ + Map frontend language keys to a human-readable instruction for LLM output language. + Frontend uses: en / zhHans / zhHant / de + """ + if not lang: + return "English" + l = str(lang).strip() + ll = l.lower() + if ll in ["zh", "zhhans", "zh-hans", "zh_cn", "zh-cn", "cn", "zh-hans-cns", "zhs"]: + return "Chinese (Simplified)" + if ll in ["zhhant", "zh-hant", "zh_tw", "zh-tw", "zh_hk", "zh-hk", "tw", "hk", "zht"]: + return "Chinese (Traditional)" + if ll.startswith("de"): + return "German" + if ll.startswith("en"): + return "English" + # fallback + return "English" + + # NOTE: + # We intentionally do NOT keep the legacy synchronous `/cluster_iib_output` endpoint. + # The UI should use `/cluster_iib_output_job_start` + `/cluster_iib_output_job_status` only. + + diff --git a/vue/components.d.ts b/vue/components.d.ts index 7792a2a..cbf4598 100644 --- a/vue/components.d.ts +++ b/vue/components.d.ts @@ -31,6 +31,7 @@ declare module '@vue/runtime-core' { AMenuDivider: typeof import('ant-design-vue/es')['MenuDivider'] AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] AModal: typeof import('ant-design-vue/es')['Modal'] + AProgress: typeof import('ant-design-vue/es')['Progress'] ARadioButton: typeof import('ant-design-vue/es')['RadioButton'] ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup'] ARow: typeof import('ant-design-vue/es')['Row'] diff --git a/vue/dist/assets/Checkbox-bbe5a1a5.js b/vue/dist/assets/Checkbox-8b8e8d31.js similarity index 97% rename from vue/dist/assets/Checkbox-bbe5a1a5.js rename to vue/dist/assets/Checkbox-8b8e8d31.js index 1ce5004..fc24ec1 100644 --- a/vue/dist/assets/Checkbox-bbe5a1a5.js +++ b/vue/dist/assets/Checkbox-8b8e8d31.js @@ -1 +1 @@ -import{d as E,bC as $,r as f,m as M,_ as T,a as c,an as W,h as m,c as v,P as z}from"./index-5ed9cd5a.js";var G=["prefixCls","name","id","type","disabled","readonly","tabindex","autofocus","value","required"],H={prefixCls:String,name:String,id:String,type:String,defaultChecked:{type:[Boolean,Number],default:void 0},checked:{type:[Boolean,Number],default:void 0},disabled:Boolean,tabindex:{type:[Number,String]},readonly:Boolean,autofocus:Boolean,value:z.any,required:Boolean};const L=E({compatConfig:{MODE:3},name:"Checkbox",inheritAttrs:!1,props:$(H,{prefixCls:"rc-checkbox",type:"checkbox",defaultChecked:!1}),emits:["click","change"],setup:function(a,d){var t=d.attrs,h=d.emit,g=d.expose,o=f(a.checked===void 0?a.defaultChecked:a.checked),i=f();M(function(){return a.checked},function(){o.value=a.checked}),g({focus:function(){var e;(e=i.value)===null||e===void 0||e.focus()},blur:function(){var e;(e=i.value)===null||e===void 0||e.blur()}});var l=f(),x=function(e){if(!a.disabled){a.checked===void 0&&(o.value=e.target.checked),e.shiftKey=l.value;var r={target:c(c({},a),{},{checked:e.target.checked}),stopPropagation:function(){e.stopPropagation()},preventDefault:function(){e.preventDefault()},nativeEvent:e};a.checked!==void 0&&(i.value.checked=!!a.checked),h("change",r),l.value=!1}},C=function(e){h("click",e),l.value=e.shiftKey};return function(){var n,e=a.prefixCls,r=a.name,s=a.id,p=a.type,b=a.disabled,K=a.readonly,P=a.tabindex,B=a.autofocus,S=a.value,N=a.required,_=T(a,G),q=t.class,D=t.onFocus,j=t.onBlur,w=t.onKeydown,A=t.onKeypress,F=t.onKeyup,y=c(c({},_),t),O=Object.keys(y).reduce(function(k,u){return(u.substr(0,5)==="aria-"||u.substr(0,5)==="data-"||u==="role")&&(k[u]=y[u]),k},{}),R=W(e,q,(n={},m(n,"".concat(e,"-checked"),o.value),m(n,"".concat(e,"-disabled"),b),n)),V=c(c({name:r,id:s,type:p,readonly:K,disabled:b,tabindex:P,class:"".concat(e,"-input"),checked:!!o.value,autofocus:B,value:S},O),{},{onChange:x,onClick:C,onFocus:D,onBlur:j,onKeydown:w,onKeypress:A,onKeyup:F,required:N});return v("span",{class:R},[v("input",c({ref:i},V),null),v("span",{class:"".concat(e,"-inner")},null)])}}});export{L as V}; +import{d as E,bC as $,r as f,m as M,_ as T,a as c,an as W,h as m,c as v,P as z}from"./index-8b1d4076.js";var G=["prefixCls","name","id","type","disabled","readonly","tabindex","autofocus","value","required"],H={prefixCls:String,name:String,id:String,type:String,defaultChecked:{type:[Boolean,Number],default:void 0},checked:{type:[Boolean,Number],default:void 0},disabled:Boolean,tabindex:{type:[Number,String]},readonly:Boolean,autofocus:Boolean,value:z.any,required:Boolean};const L=E({compatConfig:{MODE:3},name:"Checkbox",inheritAttrs:!1,props:$(H,{prefixCls:"rc-checkbox",type:"checkbox",defaultChecked:!1}),emits:["click","change"],setup:function(a,d){var t=d.attrs,h=d.emit,g=d.expose,o=f(a.checked===void 0?a.defaultChecked:a.checked),i=f();M(function(){return a.checked},function(){o.value=a.checked}),g({focus:function(){var e;(e=i.value)===null||e===void 0||e.focus()},blur:function(){var e;(e=i.value)===null||e===void 0||e.blur()}});var l=f(),x=function(e){if(!a.disabled){a.checked===void 0&&(o.value=e.target.checked),e.shiftKey=l.value;var r={target:c(c({},a),{},{checked:e.target.checked}),stopPropagation:function(){e.stopPropagation()},preventDefault:function(){e.preventDefault()},nativeEvent:e};a.checked!==void 0&&(i.value.checked=!!a.checked),h("change",r),l.value=!1}},C=function(e){h("click",e),l.value=e.shiftKey};return function(){var n,e=a.prefixCls,r=a.name,s=a.id,p=a.type,b=a.disabled,K=a.readonly,P=a.tabindex,B=a.autofocus,S=a.value,N=a.required,_=T(a,G),q=t.class,D=t.onFocus,j=t.onBlur,w=t.onKeydown,A=t.onKeypress,F=t.onKeyup,y=c(c({},_),t),O=Object.keys(y).reduce(function(k,u){return(u.substr(0,5)==="aria-"||u.substr(0,5)==="data-"||u==="role")&&(k[u]=y[u]),k},{}),R=W(e,q,(n={},m(n,"".concat(e,"-checked"),o.value),m(n,"".concat(e,"-disabled"),b),n)),V=c(c({name:r,id:s,type:p,readonly:K,disabled:b,tabindex:P,class:"".concat(e,"-input"),checked:!!o.value,autofocus:B,value:S},O),{},{onChange:x,onClick:C,onFocus:D,onBlur:j,onKeydown:w,onKeypress:A,onKeyup:F,required:N});return v("span",{class:R},[v("input",c({ref:i},V),null),v("span",{class:"".concat(e,"-inner")},null)])}}});export{L as V}; diff --git a/vue/dist/assets/FileItem-2ecfe4d5.js b/vue/dist/assets/FileItem-2ecfe4d5.js deleted file mode 100644 index e07b849..0000000 --- a/vue/dist/assets/FileItem-2ecfe4d5.js +++ /dev/null @@ -1,3 +0,0 @@ -var pt=Object.defineProperty;var vt=(i,n,e)=>n in i?pt(i,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[n]=e;var ee=(i,n,e)=>(vt(i,typeof n!="symbol"?n+"":n,e),e);import{d as Z,u as Ke,G as x,an as Ge,h as K,c as k,aq as mt,dl as yt,r as V,bh as bt,Z as j,dj as At,P as $e,ca as kt,A as X,dm as de,O as he,am as Se,bk as St,d7 as _t,b$ as It,dn as Ct,cH as wt,dp as Me,dq as Tt,p as Et,dr as Ye,bB as Pt,ds as _e,dt as Ot,aH as Dt,du as Nt,C as zt,dv as $t,n as ge,m as oe,aU as Mt,t as qe,a1 as Ie,c8 as Ze,aJ as Qt,dw as Xe,dx as Bt,Q as Ft,x as Rt,cs as pe,cS as et,cT as tt,aP as Ce,aQ as we,az as nt,U as l,a2 as R,dy as Lt,dz as Vt,dA as jt,c4 as xt,dB as Ht,at as Ut,V as f,aG as te,$ as A,a3 as _,a8 as H,c5 as Qe,c6 as Jt,dC as Wt,a7 as it,ag as W,X as I,Y as g,a4 as F,al as st,de as Kt,dd as Gt,M as rt,W as u,a0 as ot,d8 as Yt,dD as Be,af as qt,dE as Zt,db as Xt,dF as en,dG as tn,dH as ce,cM as nn,dI as sn,dJ as rn,dK as on}from"./index-5ed9cd5a.js";import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-47577760.js";import{i as ln}from"./_isIterateeCall-cd370691.js";import{D as Y,a as ve}from"./index-7cbf21fe.js";/* empty css */var an=function(){return{prefixCls:String,checked:{type:Boolean,default:void 0},onChange:{type:Function},onClick:{type:Function},"onUpdate:checked":Function}},un=Z({compatConfig:{MODE:3},name:"ACheckableTag",props:an(),setup:function(n,e){var t=e.slots,s=e.emit,o=Ke("tag",n),p=o.prefixCls,c=function(O){var w=n.checked;s("update:checked",!w),s("change",!w),s("click",O)},h=x(function(){var y;return Ge(p.value,(y={},K(y,"".concat(p.value,"-checkable"),!0),K(y,"".concat(p.value,"-checkable-checked"),n.checked),y))});return function(){var y;return k("span",{class:h.value,onClick:c},[(y=t.default)===null||y===void 0?void 0:y.call(t)])}}});const me=un;var dn=new RegExp("^(".concat(mt.join("|"),")(-inverse)?$")),cn=new RegExp("^(".concat(yt.join("|"),")$")),fn=function(){return{prefixCls:String,color:{type:String},closable:{type:Boolean,default:!1},closeIcon:$e.any,visible:{type:Boolean,default:void 0},onClose:{type:Function},"onUpdate:visible":Function,icon:$e.any}},q=Z({compatConfig:{MODE:3},name:"ATag",props:fn(),slots:["closeIcon","icon"],setup:function(n,e){var t=e.slots,s=e.emit,o=e.attrs,p=Ke("tag",n),c=p.prefixCls,h=p.direction,y=V(!0);bt(function(){n.visible!==void 0&&(y.value=n.visible)});var O=function(a){a.stopPropagation(),s("update:visible",!1),s("close",a),!a.defaultPrevented&&n.visible===void 0&&(y.value=!1)},w=x(function(){var Q=n.color;return Q?dn.test(Q)||cn.test(Q):!1}),D=x(function(){var Q;return Ge(c.value,(Q={},K(Q,"".concat(c.value,"-").concat(n.color),w.value),K(Q,"".concat(c.value,"-has-color"),n.color&&!w.value),K(Q,"".concat(c.value,"-hidden"),!y.value),K(Q,"".concat(c.value,"-rtl"),h.value==="rtl"),Q))});return function(){var Q,a,d,r=n.icon,b=r===void 0?(Q=t.icon)===null||Q===void 0?void 0:Q.call(t):r,C=n.color,M=n.closeIcon,v=M===void 0?(a=t.closeIcon)===null||a===void 0?void 0:a.call(t):M,T=n.closable,E=T===void 0?!1:T,$=function(){return E?v?k("span",{class:"".concat(c.value,"-close-icon"),onClick:O},[v]):k(kt,{class:"".concat(c.value,"-close-icon"),onClick:O},null):null},m={backgroundColor:C&&!w.value?C:void 0},P=b||null,S=(d=t.default)===null||d===void 0?void 0:d.call(t),L=P?k(j,null,[P,k("span",null,[S])]):S,N="onClick"in o,B=k("span",{class:D.value,style:m},[L,$()]);return N?k(At,null,{default:function(){return[B]}}):B}}});q.CheckableTag=me;q.install=function(i){return i.component(q.name,q),i.component(me.name,me),i};const hn=q;Y.Button=ve;Y.install=function(i){return i.component(Y.name,Y),i.component(ve.name,ve),i};var gn={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3a32.05 32.05 0 00.6 45.3l183.7 179.1-43.4 252.9a31.95 31.95 0 0046.4 33.7L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3z"}}]},name:"star",theme:"filled"};const pn=gn;function Fe(i){for(var n=1;n{const s=It();he(s),ne.has(s)||(ne.set(s,Se(i(s,t??(n==null?void 0:n())))),St(()=>{ne.delete(s)}));const o=ne.get(s);return he(o),{state:o,toRefs(){return _t(o)}}}}}var $n={icon:{tag:"svg",attrs:{viewBox:"0 0 1024 1024",focusable:"false"},children:[{tag:"path",attrs:{d:"M715.8 493.5L335 165.1c-14.2-12.2-35-1.2-35 18.5v656.8c0 19.7 20.8 30.7 35 18.5l380.8-328.4c10.9-9.4 10.9-27.6 0-37z"}}]},name:"caret-right",theme:"outlined"};const Mn=$n;function Ve(i){for(var n=1;n{const i=V([]);return{selectdFiles:i,addFiles:e=>{i.value=wt([...i.value,...e])}}});class le{constructor(n,e=Tt.CREATED_TIME_DESC){ee(this,"root");ee(this,"execQueue",[]);ee(this,"walkerInitPromsie");this.entryPath=n,this.sortMethod=e,this.root={children:[],info:{name:this.entryPath,size:"-",bytes:0,created_time:"",is_under_scanned_path:!0,date:"",type:"dir",fullpath:this.entryPath}},this.walkerInitPromsie=new Promise(t=>{Me([this.entryPath]).then(async s=>{this.root.info=s[this.entryPath],await this.fetchChildren(this.root),t()})})}reset(){return this.root.children=[],this.fetchChildren(this.root)}get images(){const n=e=>e.children.map(t=>{if(t.info.type==="dir")return n(t);if(_e(t.info.name))return t.info}).filter(t=>t).flat(1);return n(this.root)}get isCompleted(){return this.execQueue.length===0}async fetchChildren(n){const{files:e}=await Et(n.info.fullpath);return n.children=Ye(e,this.sortMethod).map(t=>({info:t,children:[]})),this.execQueue.shift(),this.execQueue.unshift(...n.children.filter(t=>t.info.type==="dir").map(t=>({fn:()=>this.fetchChildren(t),...t}))),n}async next(){await this.walkerInitPromsie;const n=Cn(this.execQueue);if(!n)return null;const e=await n.fn();return this.execQueue=this.execQueue.slice(),this.root={...this.root},e}async isExpired(){const n=[this.root.info],e=s=>{for(const o of s.children)o.info.type==="dir"&&(n.push(o.info),e(o))};e(this.root);const t=await Me(n.map(s=>s.fullpath));for(const s of n)if(!Pt(s,t[s.fullpath]))return!0;return!1}async seamlessRefresh(n,e=V(!1)){const t=performance.now(),s=new le(this.entryPath,this.sortMethod);for(await s.walkerInitPromsie;!s.isCompleted&&s.images.length
'};e.configure=function(a){var d,r;for(d in a)r=a[d],r!==void 0&&a.hasOwnProperty(d)&&(t[d]=r);return this},e.status=null,e.set=function(a){var d=e.isStarted();a=s(a,t.minimum,1),e.status=a===1?null:a;var r=e.render(!d),b=r.querySelector(t.barSelector),C=t.speed,M=t.easing;return r.offsetWidth,c(function(v){t.positionUsing===""&&(t.positionUsing=e.getPositioningCSS()),h(b,p(a,C,M)),a===1?(h(r,{transition:"none",opacity:1}),r.offsetWidth,setTimeout(function(){h(r,{transition:"all "+C+"ms linear",opacity:0}),setTimeout(function(){e.remove(),v()},C)},C)):setTimeout(v,C)}),this},e.isStarted=function(){return typeof e.status=="number"},e.start=function(){e.status||e.set(0);var a=function(){setTimeout(function(){e.status&&(e.trickle(),a())},t.trickleSpeed)};return t.trickle&&a(),this},e.done=function(a){return!a&&!e.status?this:e.inc(.3+.5*Math.random()).set(1)},e.inc=function(a){var d=e.status;return d?d>1?void 0:(typeof a!="number"&&(d>=0&&d<.2?a=.1:d>=.2&&d<.5?a=.04:d>=.5&&d<.8?a=.02:d>=.8&&d<.99?a=.005:a=0),d=s(d+a,0,.994),e.set(d)):e.start()},e.trickle=function(){return e.inc()},function(){var a=0,d=0;e.promise=function(r){return!r||r.state()==="resolved"?this:(d===0&&e.start(),a++,d++,r.always(function(){d--,d===0?(a=0,e.done()):e.set((a-d)/a)}),this)}}(),e.getElement=function(){var a=e.getParent();if(a){var d=Array.prototype.slice.call(a.querySelectorAll(".nprogress")).filter(function(r){return r.parentElement===a});if(d.length>0)return d[0]}return null},e.getParent=function(){if(t.parent instanceof HTMLElement)return t.parent;if(typeof t.parent=="string")return document.querySelector(t.parent)},e.render=function(a){if(e.isRendered())return e.getElement();O(document.documentElement,"nprogress-busy");var d=document.createElement("div");d.id="nprogress",d.className="nprogress",d.innerHTML=t.template;var r=d.querySelector(t.barSelector),b=a?"-100":o(e.status||0),C=e.getParent(),M;return h(r,{transition:"all 0 linear",transform:"translate3d("+b+"%,0,0)"}),t.showSpinner||(M=d.querySelector(t.spinnerSelector),M&&Q(M)),C!=document.body&&O(C,"nprogress-custom-parent"),C.appendChild(d),d},e.remove=function(){e.status=null,w(document.documentElement,"nprogress-busy"),w(e.getParent(),"nprogress-custom-parent");var a=e.getElement();a&&Q(a)},e.isRendered=function(){return!!e.getElement()},e.getPositioningCSS=function(){var a=document.body.style,d="WebkitTransform"in a?"Webkit":"MozTransform"in a?"Moz":"msTransform"in a?"ms":"OTransform"in a?"O":"";return d+"Perspective"in a?"translate3d":d+"Transform"in a?"translate":"margin"};function s(a,d,r){return ar?r:a}function o(a){return(-1+a)*100}function p(a,d,r){var b;return t.positionUsing==="translate3d"?b={transform:"translate3d("+o(a)+"%,0,0)"}:t.positionUsing==="translate"?b={transform:"translate("+o(a)+"%,0)"}:b={"margin-left":o(a)+"%"},b.transition="all "+d+"ms "+r,b}var c=function(){var a=[];function d(){var r=a.shift();r&&r(d)}return function(r){a.push(r),a.length==1&&d()}}(),h=function(){var a=["Webkit","O","Moz","ms"],d={};function r(v){return v.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(T,E){return E.toUpperCase()})}function b(v){var T=document.body.style;if(v in T)return v;for(var E=a.length,$=v.charAt(0).toUpperCase()+v.slice(1),m;E--;)if(m=a[E]+$,m in T)return m;return v}function C(v){return v=r(v),d[v]||(d[v]=b(v))}function M(v,T,E){T=C(T),v.style[T]=E}return function(v,T){var E=arguments,$,m;if(E.length==2)for($ in T)m=T[$],m!==void 0&&T.hasOwnProperty($)&&M(v,$,m);else M(v,E[1],E[2])}}();function y(a,d){var r=typeof a=="string"?a:D(a);return r.indexOf(" "+d+" ")>=0}function O(a,d){var r=D(a),b=r+d;y(r,d)||(a.className=b.substring(1))}function w(a,d){var r=D(a),b;y(a,d)&&(b=r.replace(" "+d+" "," "),a.className=b.substring(1,b.length-1))}function D(a){return(" "+(a&&a.className||"")+" ").replace(/\s+/gi," ")}function Q(a){a&&a.parentNode&&a.parentNode.removeChild(a)}return e})})(ut);var jn=ut.exports;const dr=Dt(jn);function cr({fetchNext:i}={}){const{scroller:n,sortedFiles:e,sortMethod:t,currLocation:s,stackViewEl:o,canLoadNext:p,previewIdx:c,props:h,walker:y,getViewableAreaFiles:O}=ae().toRefs(),{state:w}=ae(),D=V(!1),Q=V(G.defaultGridCellWidth),a=x(()=>Q.value+16),d=44,{width:r}=Nt(o),b=x(()=>~~(r.value/a.value)),C=Se(new Map),M=x(()=>{const P=a.value;return{first:P+(Q.value<=160?0:d),second:P}}),v=V(!1),T=async()=>{var P;if(!(v.value||h.value.mode!=="walk"||!p.value))try{v.value=!0,await((P=y.value)==null?void 0:P.next())}finally{v.value=!1}},E=async(P=!1)=>{const S=n.value,L=()=>P?c.value:(S==null?void 0:S.$_endIndex)??0,N=()=>{const B=e.value.length,U=50;return B?i?L()>B-U:L()>B-U&&p.value:!0};for(;N();){await qe(30);const B=await(i??T)();if(typeof B=="boolean"&&!B)return}};w.useEventListen("loadNextDir",zt(async(P=!1)=>{await E(P),h.value.mode==="walk"&&$()})),w.useEventListen("viewableAreaFilesChange",()=>{const P=O.value(),S=P.filter(N=>N.is_under_scanned_path&&_e(N.name)).map(N=>N.fullpath);xn.fetchImageTags(S);const L=P.filter(N=>N.is_under_scanned_path&&N.type==="dir"&&!C.has(N.fullpath)).map(N=>N.fullpath);L.length&&$t(L).then(N=>{for(const B in N)if(Object.prototype.hasOwnProperty.call(N,B)){const U=N[B];C.set(B,U)}})}),w.useEventListen("refresh",async()=>{w.eventEmitter.emit("viewableAreaFilesChange")});const $=ge(()=>w.eventEmitter.emit("viewableAreaFilesChange"),300);oe(s,$);const m=ge(async()=>{await E(),$()},150);return{gridItems:b,sortedFiles:e,sortMethodConv:Mt,moreActionsDropdownShow:D,gridSize:a,sortMethod:t,onScroll:m,loadNextDir:T,loadNextDirLoading:v,canLoadNext:p,itemSize:M,cellWidth:Q,dirCoverCache:C}}const fr=new Map,G=Ie(),hr=Vn(),xn=Ze(),gr=Qt(),pr=new BroadcastChannel("iib-image-transfer-bus"),{eventEmitter:vr,useEventListen:mr}=Xe(),{useHookShareState:ae}=zn((i,{images:n})=>{const e=V({tabIdx:-1,paneIdx:-1}),t=x(()=>Ft(s.value)),s=V([]),o=x(()=>{var T;return s.value.map(E=>E.curr).slice((T=G.conf)!=null&&T.is_win&&e.value.mode!=="scanned-fixed"?1:0)}),p=x(()=>Rt(...o.value)),c=x(()=>{var T,E;return e.value.mode==="scanned-fixed"?((E=(T=s.value)==null?void 0:T[0])==null?void 0:E.curr)??"":e.value.mode==="walk"?e.value.path??"":s.value.length===1?"/":p.value}),h=V(G.defaultSortingMethod),y=V(e.value.mode=="walk"?new le(e.value.path,h.value):void 0);oe([()=>e.value.mode,()=>e.value.path,h],async([T,E,$])=>{var m;T==="walk"?(y.value=new le(E,$),s.value=[{files:[],curr:E}],await qe(),await((m=y.value)==null?void 0:m.reset()),M.eventEmitter.emit("loadNextDir")):y.value=void 0});const O=Se(new Set);oe(t,()=>O.clear());const w=x(()=>{var m;if(n.value)return n.value;if(y.value)return y.value.images.filter(P=>!O.has(P.fullpath));if(!t.value)return[];const T=((m=t.value)==null?void 0:m.files)??[],E=h.value;return Ye((P=>{const S=G.fileTypeFilter;return S.includes("all")||S.length===0?P:P.filter(L=>!!(L.type==="dir"||S.includes("image")&&pe(L.name)||S.includes("video")&&et(L.name)||S.includes("audio")&&tt(L.name)))})(T),E).filter(P=>!O.has(P.fullpath))}),D=V([]),Q=V(-1),a=x(()=>y.value?!y.value.isCompleted:!1),d=V(!1),r=V(!1),b=V(),C=()=>{var T,E,$;return($=(E=(T=G.tabList)==null?void 0:T[e.value.tabIdx])==null?void 0:E.panes)==null?void 0:$[e.value.paneIdx]},M=Xe();M.useEventListen("selectAll",()=>{console.log(`select all 0 -> ${w.value.length}`),D.value=Dn(0,w.value.length)});const v=()=>{const T=b.value;if(T){const E=Math.max(T.$_startIndex-10,0);return w.value.slice(E,T.$_endIndex+10)}return[]};return{previewing:r,spinning:d,canLoadNext:a,multiSelectedIdxs:D,previewIdx:Q,basePath:o,currLocation:c,currPage:t,stack:s,sortMethod:h,sortedFiles:w,scroller:b,stackViewEl:V(),props:e,getPane:C,walker:y,deletedFiles:O,getViewableAreaFiles:v,...M}},()=>({images:V()}));function yr(){const{eventEmitter:i,multiSelectedIdxs:n,sortedFiles:e}=ae().toRefs();return{onSelectAll:()=>i.value.emit("selectAll"),onReverseSelect:()=>{n.value=e.value.map((p,c)=>c).filter(p=>!n.value.includes(p))},onClearAllSelected:()=>{n.value=[]}}}const br=()=>{const{stackViewEl:i}=ae().toRefs(),n=V(-1);return Bt(i,e=>{var s;let t=e.target;for(;t.parentElement;)if(t=t.parentElement,t.tagName.toLowerCase()==="li"&&t.classList.contains("file-item-trigger")){const o=(s=t.dataset)==null?void 0:s.idx;o&&Number.isSafeInteger(+o)&&(n.value=+o);return}}),{showMenuIdx:n}};function Hn(){var i=window.navigator.userAgent,n=i.indexOf("MSIE ");if(n>0)return parseInt(i.substring(n+5,i.indexOf(".",n)),10);var e=i.indexOf("Trident/");if(e>0){var t=i.indexOf("rv:");return parseInt(i.substring(t+3,i.indexOf(".",t)),10)}var s=i.indexOf("Edge/");return s>0?parseInt(i.substring(s+5,i.indexOf(".",s)),10):-1}let se;function ye(){ye.init||(ye.init=!0,se=Hn()!==-1)}var ue={name:"ResizeObserver",props:{emitOnMount:{type:Boolean,default:!1},ignoreWidth:{type:Boolean,default:!1},ignoreHeight:{type:Boolean,default:!1}},emits:["notify"],mounted(){ye(),nt(()=>{this._w=this.$el.offsetWidth,this._h=this.$el.offsetHeight,this.emitOnMount&&this.emitSize()});const i=document.createElement("object");this._resizeObject=i,i.setAttribute("aria-hidden","true"),i.setAttribute("tabindex",-1),i.onload=this.addResizeHandlers,i.type="text/html",se&&this.$el.appendChild(i),i.data="about:blank",se||this.$el.appendChild(i)},beforeUnmount(){this.removeResizeHandlers()},methods:{compareAndNotify(){(!this.ignoreWidth&&this._w!==this.$el.offsetWidth||!this.ignoreHeight&&this._h!==this.$el.offsetHeight)&&(this._w=this.$el.offsetWidth,this._h=this.$el.offsetHeight,this.emitSize())},emitSize(){this.$emit("notify",{width:this._w,height:this._h})},addResizeHandlers(){this._resizeObject.contentDocument.defaultView.addEventListener("resize",this.compareAndNotify),this.compareAndNotify()},removeResizeHandlers(){this._resizeObject&&this._resizeObject.onload&&(!se&&this._resizeObject.contentDocument&&this._resizeObject.contentDocument.defaultView.removeEventListener("resize",this.compareAndNotify),this.$el.removeChild(this._resizeObject),this._resizeObject.onload=null,this._resizeObject=null)}}};const Un=Lt();Ce("data-v-b329ee4c");const Jn={class:"resize-observer",tabindex:"-1"};we();const Wn=Un((i,n,e,t,s,o)=>(l(),R("div",Jn)));ue.render=Wn;ue.__scopeId="data-v-b329ee4c";ue.__file="src/components/ResizeObserver.vue";function re(i){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?re=function(n){return typeof n}:re=function(n){return n&&typeof Symbol=="function"&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},re(i)}function Kn(i,n){if(!(i instanceof n))throw new TypeError("Cannot call a class as a function")}function He(i,n){for(var e=0;ei.length)&&(n=i.length);for(var e=0,t=new Array(n);e2&&arguments[2]!==void 0?arguments[2]:{},t,s,o,p=function(h){for(var y=arguments.length,O=new Array(y>1?y-1:0),w=1;w1){var y=c.find(function(w){return w.isIntersecting});y&&(h=y)}if(s.callback){var O=h.isIntersecting&&h.intersectionRatio>=s.threshold;if(O===s.oldResult)return;s.oldResult=O,s.callback(O,h)}},this.options.intersection),nt(function(){s.observer&&s.observer.observe(s.el)})}}},{key:"destroyObserver",value:function(){this.observer&&(this.observer.disconnect(),this.observer=null),this.callback&&this.callback._clear&&(this.callback._clear(),this.callback=null)}},{key:"threshold",get:function(){return this.options.intersection&&typeof this.options.intersection.threshold=="number"?this.options.intersection.threshold:0}}]),i}();function ct(i,n,e){var t=n.value;if(t)if(typeof IntersectionObserver>"u")console.warn("[vue-observe-visibility] IntersectionObserver API is not available in your browser. Please install this polyfill: https://github.com/w3c/IntersectionObserver/tree/master/polyfill");else{var s=new ni(i,t,e);i._vue_visibilityState=s}}function ii(i,n,e){var t=n.value,s=n.oldValue;if(!dt(t,s)){var o=i._vue_visibilityState;if(!t){ft(i);return}o?o.createObserver(t,e):ct(i,{value:t},e)}}function ft(i){var n=i._vue_visibilityState;n&&(n.destroyObserver(),delete i._vue_visibilityState)}var si={beforeMount:ct,updated:ii,unmounted:ft},ri={itemsLimit:1e3},oi=/(auto|scroll)/;function ht(i,n){return i.parentNode===null?n:ht(i.parentNode,n.concat([i]))}var fe=function(n,e){return getComputedStyle(n,null).getPropertyValue(e)},li=function(n){return fe(n,"overflow")+fe(n,"overflow-y")+fe(n,"overflow-x")},ai=function(n){return oi.test(li(n))};function Je(i){if(i instanceof HTMLElement||i instanceof SVGElement){for(var n=ht(i.parentNode,[]),e=0;e{this.$_prerender=!1,this.updateVisibleItems(!0),this.ready=!0})},activated(){const i=this.$_lastUpdateScrollPosition;typeof i=="number"&&this.$nextTick(()=>{this.scrollToPosition(i)})},beforeUnmount(){this.removeListeners()},methods:{addView(i,n,e,t,s){const o=Vt({id:fi++,index:n,used:!0,key:t,type:s}),p=jt({item:e,position:0,nr:o});return i.push(p),p},unuseView(i,n=!1){const e=this.$_unusedViews,t=i.nr.type;let s=e.get(t);s||(s=[],e.set(t,s)),s.push(i),n||(i.nr.used=!1,i.position=-9999)},handleResize(){this.$emit("resize"),this.ready&&this.updateVisibleItems(!1)},handleScroll(i){if(!this.$_scrollDirty){if(this.$_scrollDirty=!0,this.$_updateTimeout)return;const n=()=>requestAnimationFrame(()=>{this.$_scrollDirty=!1;const{continuous:e}=this.updateVisibleItems(!1,!0);e||(clearTimeout(this.$_refreshTimout),this.$_refreshTimout=setTimeout(this.handleScroll,this.updateInterval+100))});n(),this.updateInterval&&(this.$_updateTimeout=setTimeout(()=>{this.$_updateTimeout=0,this.$_scrollDirty&&n()},this.updateInterval))}},handleVisibilityChange(i,n){this.ready&&(i||n.boundingClientRect.width!==0||n.boundingClientRect.height!==0?(this.$emit("visible"),requestAnimationFrame(()=>{this.updateVisibleItems(!1)})):this.$emit("hidden"))},updateVisibleItems(i,n=!1){const e=this.itemSize,t=this.gridItems||1,s=this.itemSecondarySize||e,o=this.$_computedMinItemSize,p=this.typeField,c=this.simpleArray?null:this.keyField,h=this.items,y=h.length,O=this.sizes,w=this.$_views,D=this.$_unusedViews,Q=this.pool,a=this.itemIndexByKey;let d,r,b,C,M;if(!y)d=r=C=M=b=0;else if(this.$_prerender)d=C=0,r=M=Math.min(this.prerender,h.length),b=null;else{const S=this.getScroll();if(n){let B=S.start-this.$_lastUpdateScrollPosition;if(B<0&&(B=-B),e===null&&BS.start&&(Ne=J),J=~~((U+Ne)/2);while(J!==ze);for(J<0&&(J=0),d=J,b=O[y-1].accumulator,r=J;ry&&(r=y)),C=d;Cy&&(r=y),C<0&&(C=0),M>y&&(M=y),b=Math.ceil(y/t)*e}}r-d>ri.itemsLimit&&this.itemsLimitError(),this.totalSize=b;let v;const T=d<=this.$_endIndex&&r>=this.$_startIndex;if(T)for(let S=0,L=Q.length;S=r)&&this.unuseView(v));const E=T?null:new Map;let $,m,P;for(let S=d;S=N.length)&&(v=this.addView(Q,S,$,L,m),this.unuseView(v,!0),N=D.get(m)),v=N[P],E.set(m,P+1)),w.delete(v.nr.key),v.nr.used=!0,v.nr.index=S,v.nr.key=L,v.nr.type=m,w.set(L,v),B=!0;else if(!v.nr.used&&(v.nr.used=!0,v.nr.index=S,B=!0,N)){const U=N.indexOf(v);U!==-1&&N.splice(U,1)}v.item=$,B&&(S===h.length-1&&this.$emit("scroll-end"),S===0&&this.$emit("scroll-start")),e===null?(v.position=O[S-1].accumulator,v.offset=0):(v.position=Math.floor(S/t)*e,v.offset=S%t*s)}return this.$_startIndex=d,this.$_endIndex=r,this.emitUpdate&&this.$emit("update",d,r,C,M),clearTimeout(this.$_sortTimer),this.$_sortTimer=setTimeout(this.sortViews,this.updateInterval+300),{continuous:T}},getListenerTarget(){let i=Je(this.$el);return window.document&&(i===window.document.documentElement||i===window.document.body)&&(i=window),i},getScroll(){const{$el:i,direction:n}=this,e=n==="vertical";let t;if(this.pageMode){const s=i.getBoundingClientRect(),o=e?s.height:s.width;let p=-(e?s.top:s.left),c=e?window.innerHeight:window.innerWidth;p<0&&(c+=p,p=0),p+c>o&&(c=o-p),t={start:p,end:p+c}}else e?t={start:i.scrollTop,end:i.scrollTop+i.clientHeight}:t={start:i.scrollLeft,end:i.scrollLeft+i.clientWidth};return t},applyPageMode(){this.pageMode?this.addListeners():this.removeListeners()},addListeners(){this.listenerTarget=this.getListenerTarget(),this.listenerTarget.addEventListener("scroll",this.handleScroll,ke?{passive:!0}:!1),this.listenerTarget.addEventListener("resize",this.handleResize)},removeListeners(){this.listenerTarget&&(this.listenerTarget.removeEventListener("scroll",this.handleScroll),this.listenerTarget.removeEventListener("resize",this.handleResize),this.listenerTarget=null)},scrollToItem(i){let n;const e=this.gridItems||1;this.itemSize===null?n=i>0?this.sizes[i-1].accumulator:0:n=Math.floor(i/e)*this.itemSize,this.scrollToPosition(n)},scrollToPosition(i){const n=this.direction==="vertical"?{scroll:"scrollTop",start:"top"}:{scroll:"scrollLeft",start:"left"};let e,t,s;if(this.pageMode){const o=Je(this.$el),p=o.tagName==="HTML"?0:o[n.scroll],c=o.getBoundingClientRect(),y=this.$el.getBoundingClientRect()[n.start]-c[n.start];e=o,t=n.scroll,s=i+p+y}else e=this.$el,t=n.scroll,s=i;e[t]=s},itemsLimitError(){throw setTimeout(()=>{console.log("It seems the scroller element isn't scrolling, so it tries to render all the items at once.","Scroller:",this.$el),console.log("Make sure the scroller has a fixed height (or width) and 'overflow-y' (or 'overflow-x') set to 'auto' so it can scroll correctly and only render the items visible in the scroll viewport.")}),new Error("Rendered items limit reached")},sortViews(){this.pool.sort((i,n)=>i.nr.index-n.nr.index)}}};const hi={key:0,ref:"before",class:"vue-recycle-scroller__slot"},gi={key:1,ref:"after",class:"vue-recycle-scroller__slot"};function pi(i,n,e,t,s,o){const p=xt("ResizeObserver"),c=Ht("observe-visibility");return Ut((l(),f("div",{class:W(["vue-recycle-scroller",{ready:s.ready,"page-mode":e.pageMode,[`direction-${i.direction}`]:!0}]),onScrollPassive:n[0]||(n[0]=(...h)=>o.handleScroll&&o.handleScroll(...h))},[i.$slots.before?(l(),f("div",hi,[te(i.$slots,"before")],512)):A("v-if",!0),(l(),R(Qe(e.listTag),{ref:"wrapper",style:it({[i.direction==="vertical"?"minHeight":"minWidth"]:s.totalSize+"px"}),class:W(["vue-recycle-scroller__item-wrapper",e.listClass])},{default:_(()=>[(l(!0),f(j,null,H(s.pool,h=>(l(),R(Qe(e.itemTag),Jt({key:h.nr.id,style:s.ready?{transform:`translate${i.direction==="vertical"?"Y":"X"}(${h.position}px) translate${i.direction==="vertical"?"X":"Y"}(${h.offset}px)`,width:e.gridItems?`${i.direction==="vertical"&&e.itemSecondarySize||e.itemSize}px`:void 0,height:e.gridItems?`${i.direction==="horizontal"&&e.itemSecondarySize||e.itemSize}px`:void 0}:null,class:["vue-recycle-scroller__item-view",[e.itemClass,{hover:!e.skipHover&&s.hoverKey===h.nr.key}]]},Wt(e.skipHover?{}:{mouseenter:()=>{s.hoverKey=h.nr.key},mouseleave:()=>{s.hoverKey=null}})),{default:_(()=>[te(i.$slots,"default",{item:h.item,index:h.nr.index,active:h.nr.used})]),_:2},1040,["style","class"]))),128)),te(i.$slots,"empty")]),_:3},8,["style","class"])),i.$slots.after?(l(),f("div",gi,[te(i.$slots,"after")],512)):A("v-if",!0),k(p,{onNotify:o.handleResize},null,8,["onNotify"])],34)),[[c,o.handleVisibilityChange]])}gt.render=pi;gt.__file="src/components/RecycleScroller.vue";const We=Z({__name:"ContextMenu",props:{file:{},idx:{},selectedTag:{},isSelectedMutilFiles:{type:Boolean}},emits:["contextMenuClick"],setup(i,{emit:n}){const e=i,t=Ie(),s=x(()=>{var o;return(((o=t.conf)==null?void 0:o.all_custom_tags)??[]).reduce((p,c)=>[...p,{...c,selected:!!e.selectedTag.find(h=>h.id===c.id)}],[])});return(o,p)=>{const c=st,h=Kt,y=Gt,O=rt;return l(),R(O,{onClick:p[0]||(p[0]=w=>n("contextMenuClick",w,o.file,o.idx))},{default:_(()=>{var w;return[k(c,{key:"deleteFiles"},{default:_(()=>[I(g(o.$t("deleteSelected")),1)]),_:1}),k(c,{key:"openWithDefaultApp"},{default:_(()=>[I(g(o.$t("openWithDefaultApp")),1)]),_:1}),k(c,{key:"saveSelectedAsJson"},{default:_(()=>[I(g(o.$t("saveSelectedAsJson")),1)]),_:1}),o.file.type==="dir"?(l(),f(j,{key:0},[k(c,{key:"openInNewTab"},{default:_(()=>[I(g(o.$t("openInNewTab")),1)]),_:1}),k(c,{key:"openOnTheRight"},{default:_(()=>[I(g(o.$t("openOnTheRight")),1)]),_:1}),k(c,{key:"openWithWalkMode"},{default:_(()=>[I(g(o.$t("openWithWalkMode")),1)]),_:1})],64)):A("",!0),o.file.type==="file"?(l(),f(j,{key:1},[F(_e)(o.file.name)?(l(),f(j,{key:0},[k(c,{key:"viewGenInfo"},{default:_(()=>[I(g(o.$t("viewGenerationInfo")),1)]),_:1}),k(c,{key:"tiktokView"},{default:_(()=>[I(g(o.$t("tiktokView")),1)]),_:1}),k(h),((w=F(t).conf)==null?void 0:w.launch_mode)!=="server"?(l(),f(j,{key:0},[k(c,{key:"send2txt2img"},{default:_(()=>[I(g(o.$t("sendToTxt2img")),1)]),_:1}),k(c,{key:"send2img2img"},{default:_(()=>[I(g(o.$t("sendToImg2img")),1)]),_:1}),k(c,{key:"send2inpaint"},{default:_(()=>[I(g(o.$t("sendToInpaint")),1)]),_:1}),k(c,{key:"send2extras"},{default:_(()=>[I(g(o.$t("sendToExtraFeatures")),1)]),_:1}),k(y,{key:"sendToThirdPartyExtension",title:o.$t("sendToThirdPartyExtension")},{default:_(()=>[k(c,{key:"send2controlnet-txt2img"},{default:_(()=>[I("ControlNet - "+g(o.$t("t2i")),1)]),_:1}),k(c,{key:"send2controlnet-img2img"},{default:_(()=>[I("ControlNet - "+g(o.$t("i2i")),1)]),_:1}),k(c,{key:"send2outpaint"},{default:_(()=>[I("openOutpaint")]),_:1})]),_:1},8,["title"])],64)):A("",!0),k(c,{key:"send2BatchDownload"},{default:_(()=>[I(g(o.$t("sendToBatchDownload")),1)]),_:1}),k(y,{key:"copy2target",title:o.$t("copyTo")},{default:_(()=>[(l(!0),f(j,null,H(F(t).quickMovePaths,D=>(l(),R(c,{key:`copy-to-${D.dir}`},{default:_(()=>[I(g(D.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),k(y,{key:"move2target",title:o.$t("moveTo")},{default:_(()=>[(l(!0),f(j,null,H(F(t).quickMovePaths,D=>(l(),R(c,{key:`move-to-${D.dir}`},{default:_(()=>[I(g(D.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),k(h),o.isSelectedMutilFiles?(l(),f(j,{key:1},[k(y,{key:"batch-add-tag",title:o.$t("batchAddTag")},{default:_(()=>[k(c,{key:"add-custom-tag"},{default:_(()=>[I("+ "+g(o.$t("addNewCustomTag")),1)]),_:1}),(l(!0),f(j,null,H(s.value,D=>(l(),R(c,{key:`batch-add-tag-${D.id}`},{default:_(()=>[I(g(D.name),1)]),_:2},1024))),128))]),_:1},8,["title"]),k(y,{key:"batch-remove-tag",title:o.$t("batchRemoveTag")},{default:_(()=>[(l(!0),f(j,null,H(s.value,D=>(l(),R(c,{key:`batch-remove-tag-${D.id}`},{default:_(()=>[I(g(D.name),1)]),_:2},1024))),128))]),_:1},8,["title"])],64)):(l(),R(y,{key:"toggle-tag",title:o.$t("toggleTag")},{default:_(()=>[k(c,{key:"add-custom-tag"},{default:_(()=>[I("+ "+g(o.$t("addNewCustomTag")),1)]),_:1}),(l(!0),f(j,null,H(s.value,D=>(l(),R(c,{key:`toggle-tag-${D.id}`},{default:_(()=>[I(g(D.name)+" ",1),D.selected?(l(),R(F(lt),{key:0})):(l(),R(F(at),{key:1}))]),_:2},1024))),128))]),_:1},8,["title"])),k(h),k(c,{key:"openFileLocationInNewTab"},{default:_(()=>[I(g(o.$t("openFileLocationInNewTab")),1)]),_:1}),k(c,{key:"openWithLocalFileBrowser"},{default:_(()=>[I(g(o.$t("openWithLocalFileBrowser")),1)]),_:1})],64)):A("",!0),k(h),k(c,{key:"rename"},{default:_(()=>[I(g(o.$t("rename")),1)]),_:1}),k(c,{key:"previewInNewWindow"},{default:_(()=>[I(g(o.$t("previewInNewWindow")),1)]),_:1}),k(c,{key:"download"},{default:_(()=>[I(g(o.$t("download")),1)]),_:1}),k(c,{key:"copyPreviewUrl"},{default:_(()=>[I(g(o.$t("copySourceFilePreviewLink")),1)]),_:1}),k(c,{key:"copyFilePath"},{default:_(()=>[I(g(o.$t("copyFilePath")),1)]),_:1})],64)):A("",!0)]}),_:1})}}}),z=i=>(Ce("data-v-78cd67a3"),i=i(),we(),i),vi={class:"changeIndicatorWrapper"},mi={key:0,class:"changeIndicatorsLeft changeIndicators"},yi={key:0,class:"promptChangeIndicator changeIndicator"},bi={key:1,class:"negpromptChangeIndicator changeIndicator"},Ai={key:2,class:"seedChangeIndicator changeIndicator"},ki={key:3,class:"stepsChangeIndicator changeIndicator"},Si={key:4,class:"cfgChangeIndicator changeIndicator"},_i={key:5,class:"sizeChangeIndicator changeIndicator"},Ii={key:6,class:"modelChangeIndicator changeIndicator"},Ci={key:7,class:"samplerChangeIndicator changeIndicator"},wi={key:8,class:"otherChangeIndicator changeIndicator"},Ti={class:"hoverOverlay"},Ei=z(()=>u("strong",null,"This file",-1)),Pi=z(()=>u("br",null,null,-1)),Oi=z(()=>u("br",null,null,-1)),Di={key:0},Ni=z(()=>u("td",null,[u("span",{class:"promptChangeIndicator"},"+ Prompt")],-1)),zi={key:1},$i=z(()=>u("td",null,[u("span",{class:"negpromptChangeIndicator"},"- Prompt")],-1)),Mi={key:2},Qi=z(()=>u("td",null,[u("span",{class:"seedChangeIndicator"},"Seed")],-1)),Bi={key:3},Fi=z(()=>u("td",null,[u("span",{class:"stepsChangeIndicator"},"Steps")],-1)),Ri={key:4},Li=z(()=>u("td",null,[u("span",{class:"cfgChangeIndicator"},"Cfg Scale")],-1)),Vi={key:5},ji=z(()=>u("td",null,[u("span",{class:"sizeChangeIndicator"},"Size")],-1)),xi={key:6},Hi=z(()=>u("td",null,[u("span",{class:"modelChangeIndicator"},"Model")],-1)),Ui=z(()=>u("br",null,null,-1)),Ji={key:7},Wi=z(()=>u("td",null,[u("span",{class:"samplerChangeIndicator"},"Sampler")],-1)),Ki=z(()=>u("br",null,null,-1)),Gi=z(()=>u("br",null,null,-1)),Yi={key:0},qi=z(()=>u("span",{class:"otherChangeIndicator"},"Other",-1)),Zi=z(()=>u("br",null,null,-1)),Xi=z(()=>u("br",null,null,-1)),es={key:1,class:"changeIndicatorsRight changeIndicators"},ts={key:0,class:"promptChangeIndicator changeIndicator"},ns={key:1,class:"negpromptChangeIndicator changeIndicator"},is={key:2,class:"seedChangeIndicator changeIndicator"},ss={key:3,class:"stepsChangeIndicator changeIndicator"},rs={key:4,class:"cfgChangeIndicator changeIndicator"},os={key:5,class:"sizeChangeIndicator changeIndicator"},ls={key:6,class:"modelChangeIndicator changeIndicator"},as={key:7,class:"samplerChangeIndicator changeIndicator"},us={key:8,class:"otherChangeIndicator changeIndicator"},ds={class:"hoverOverlay"},cs=z(()=>u("strong",null,"This file",-1)),fs=z(()=>u("br",null,null,-1)),hs=z(()=>u("br",null,null,-1)),gs={key:0},ps=z(()=>u("td",null,[u("span",{class:"promptChangeIndicator"},"+ Prompt")],-1)),vs={key:1},ms=z(()=>u("td",null,[u("span",{class:"negpromptChangeIndicator"},"- Prompt")],-1)),ys={key:2},bs=z(()=>u("td",null,[u("span",{class:"seedChangeIndicator"},"Seed")],-1)),As={key:3},ks=z(()=>u("td",null,[u("span",{class:"stepsChangeIndicator"},"Steps")],-1)),Ss={key:4},_s=z(()=>u("td",null,[u("span",{class:"cfgChangeIndicator"},"Cfg Scale")],-1)),Is={key:5},Cs=z(()=>u("td",null,[u("span",{class:"sizeChangeIndicator"},"Size")],-1)),ws={key:6},Ts=z(()=>u("td",null,[u("span",{class:"modelChangeIndicator"},"Model")],-1)),Es=z(()=>u("br",null,null,-1)),Ps={key:7},Os=z(()=>u("td",null,[u("span",{class:"samplerChangeIndicator"},"Sampler")],-1)),Ds=z(()=>u("br",null,null,-1)),Ns=z(()=>u("br",null,null,-1)),zs={key:0},$s=z(()=>u("span",{class:"otherChangeIndicator"},"Other",-1)),Ms=z(()=>u("br",null,null,-1)),Qs=z(()=>u("br",null,null,-1)),Bs=Z({__name:"ChangeIndicator",props:{genDiffToPrevious:{},genDiffToNext:{},genInfo:{}},setup(i){function n(t){const s=["prompt","negativePrompt","seed","steps","cfgScale","size","Model","others"],o=Object.keys(t).filter(p=>!s.includes(p));return Object.fromEntries(o.map(p=>[p,t[p]]))}function e(t){return Object.keys(n(t)).length>0}return(t,s)=>(l(),f("div",vi,[t.genDiffToPrevious.empty?A("",!0):(l(),f("div",mi,["prompt"in t.genDiffToPrevious.diff?(l(),f("div",yi,"P+")):A("",!0),"negativePrompt"in t.genDiffToPrevious.diff?(l(),f("div",bi,"P-")):A("",!0),"seed"in t.genDiffToPrevious.diff?(l(),f("div",Ai,"Se")):A("",!0),"steps"in t.genDiffToPrevious.diff?(l(),f("div",ki,"St")):A("",!0),"cfgScale"in t.genDiffToPrevious.diff?(l(),f("div",Si,"Cf")):A("",!0),"size"in t.genDiffToPrevious.diff?(l(),f("div",_i,"Si")):A("",!0),"Model"in t.genDiffToPrevious.diff?(l(),f("div",Ii,"Mo")):A("",!0),"Sampler"in t.genDiffToPrevious.diff?(l(),f("div",Ci,"Sa")):A("",!0),e(t.genDiffToPrevious.diff)?(l(),f("div",wi,"Ot")):A("",!0)])),u("div",Ti,[u("small",null,[k(F(je)),Ei,I(" vs "+g(t.genDiffToPrevious.otherFile)+" ",1),Pi,Oi,u("table",null,["prompt"in t.genDiffToPrevious.diff?(l(),f("tr",Di,[Ni,u("td",null,g(t.genDiffToPrevious.diff.prompt)+" tokens changed",1)])):A("",!0),"negativePrompt"in t.genDiffToPrevious.diff?(l(),f("tr",zi,[$i,u("td",null,g(t.genDiffToPrevious.diff.negativePrompt)+" tokens changed",1)])):A("",!0),"seed"in t.genDiffToPrevious.diff?(l(),f("tr",Mi,[Qi,u("td",null,[u("strong",null,g(t.genDiffToPrevious.diff.seed[0]),1),I(" vs "+g(t.genDiffToPrevious.diff.seed[1]),1)])])):A("",!0),"steps"in t.genDiffToPrevious.diff?(l(),f("tr",Bi,[Fi,u("td",null,[u("strong",null,g(t.genDiffToPrevious.diff.steps[0]),1),I(" vs "+g(t.genDiffToPrevious.diff.steps[1]),1)])])):A("",!0),"cfgScale"in t.genDiffToPrevious.diff?(l(),f("tr",Ri,[Li,u("td",null,[u("strong",null,g(t.genDiffToPrevious.diff.cfgScale[0]),1),I(" vs "+g(t.genDiffToPrevious.diff.cfgScale[1]),1)])])):A("",!0),"size"in t.genDiffToPrevious.diff?(l(),f("tr",Vi,[ji,u("td",null,[u("strong",null,g(t.genDiffToPrevious.diff.size[0]),1),I(" vs "+g(t.genDiffToPrevious.diff.size[1]),1)])])):A("",!0),"Model"in t.genDiffToPrevious.diff?(l(),f("tr",xi,[Hi,u("td",null,[u("strong",null,g(t.genDiffToPrevious.diff.Model[0]),1),Ui,I(" vs "+g(t.genDiffToPrevious.diff.Model[1]),1)])])):A("",!0),"Sampler"in t.genDiffToPrevious.diff?(l(),f("tr",Ji,[Wi,u("td",null,[u("strong",null,g(t.genDiffToPrevious.diff.Sampler[0]),1),Ki,I(" vs "+g(t.genDiffToPrevious.diff.Sampler[1]),1)])])):A("",!0)]),Gi,e(t.genDiffToPrevious.diff)?(l(),f("div",Yi,[qi,I(" props that changed:"),Zi,Xi,u("ul",null,[(l(!0),f(j,null,H(n(t.genDiffToPrevious.diff),(o,p)=>(l(),f("li",null,g(p),1))),256))])])):A("",!0)])]),t.genDiffToNext.empty?A("",!0):(l(),f("div",es,["prompt"in t.genDiffToNext.diff?(l(),f("div",ts,"P+")):A("",!0),"negativePrompt"in t.genDiffToNext.diff?(l(),f("div",ns,"P-")):A("",!0),"seed"in t.genDiffToNext.diff?(l(),f("div",is,"Se")):A("",!0),"steps"in t.genDiffToNext.diff?(l(),f("div",ss,"St")):A("",!0),"cfgScale"in t.genDiffToNext.diff?(l(),f("div",rs,"Cf")):A("",!0),"size"in t.genDiffToNext.diff?(l(),f("div",os,"Si")):A("",!0),"Model"in t.genDiffToNext.diff?(l(),f("div",ls,"Mo")):A("",!0),"Sampler"in t.genDiffToNext.diff?(l(),f("div",as,"Sa")):A("",!0),e(t.genDiffToNext.diff)?(l(),f("div",us,"Ot")):A("",!0)])),u("div",ds,[u("small",null,[k(F(je)),cs,I(" vs "+g(t.genDiffToNext.otherFile)+" ",1),fs,hs,u("table",null,["prompt"in t.genDiffToNext.diff?(l(),f("tr",gs,[ps,u("td",null,g(t.genDiffToNext.diff.prompt)+" tokens changed",1)])):A("",!0),"negativePrompt"in t.genDiffToNext.diff?(l(),f("tr",vs,[ms,u("td",null,g(t.genDiffToNext.diff.negativePrompt)+" tokens changed",1)])):A("",!0),"seed"in t.genDiffToNext.diff?(l(),f("tr",ys,[bs,u("td",null,[u("strong",null,g(t.genDiffToNext.diff.seed[0]),1),I(" vs "+g(t.genDiffToNext.diff.seed[1]),1)])])):A("",!0),"steps"in t.genDiffToNext.diff?(l(),f("tr",As,[ks,u("td",null,[u("strong",null,g(t.genDiffToNext.diff.steps[0]),1),I(" vs "+g(t.genDiffToNext.diff.steps[1]),1)])])):A("",!0),"cfgScale"in t.genDiffToNext.diff?(l(),f("tr",Ss,[_s,u("td",null,[u("strong",null,g(t.genDiffToNext.diff.cfgScale[0]),1),I(" vs "+g(t.genDiffToNext.diff.cfgScale[1]),1)])])):A("",!0),"size"in t.genDiffToNext.diff?(l(),f("tr",Is,[Cs,u("td",null,[u("strong",null,g(t.genDiffToNext.diff.size[0]),1),I(" vs "+g(t.genDiffToNext.diff.size[1]),1)])])):A("",!0),"Model"in t.genDiffToNext.diff?(l(),f("tr",ws,[Ts,u("td",null,[u("strong",null,g(t.genDiffToNext.diff.Model[0]),1),Es,I(" vs "+g(t.genDiffToNext.diff.Model[1]),1)])])):A("",!0),"Sampler"in t.genDiffToNext.diff?(l(),f("tr",Ps,[Os,u("td",null,[u("strong",null,g(t.genDiffToNext.diff.Sampler[0]),1),Ds,I(" vs "+g(t.genDiffToNext.diff.Sampler[1]),1)])])):A("",!0)]),Ns,e(t.genDiffToNext.diff)?(l(),f("div",zs,[$s,I(" props that changed:"),Ms,Qs,u("ul",null,[(l(!0),f(j,null,H(n(t.genDiffToNext.diff),(o,p)=>(l(),f("li",null,g(p),1))),256))])])):A("",!0)])])]))}});const Fs=ot(Bs,[["__scopeId","data-v-78cd67a3"]]),Rs=i=>(Ce("data-v-0f74bba6"),i=i(),we(),i),Ls=["data-idx"],Vs={key:1,class:"more"},js={class:"float-btn-wrap"},xs={key:1,class:"tags-container"},Hs=["url"],Us={class:"play-icon"},Js=["src"],Ws={key:0,class:"tags-container"},Ks=Rs(()=>u("div",{class:"audio-icon"},"🎵",-1)),Gs={key:0,class:"tags-container"},Ys={key:5,class:"preview-icon-wrap"},qs={key:1,class:"dir-cover-container"},Zs=["src"],Xs={key:6,class:"profile"},er=["title"],tr={class:"basic-info"},nr={style:{"margin-right":"4px"}},ie=160,ir=Z({__name:"FileItem",props:{file:{},idx:{},selected:{type:Boolean,default:!1},showMenuIdx:{},cellWidth:{},fullScreenPreviewImageUrl:{},enableRightClickMenu:{type:Boolean,default:!0},enableCloseIcon:{type:Boolean,default:!1},isSelectedMutilFiles:{type:Boolean},genInfo:{},enableChangeIndicator:{type:Boolean},extraTags:{},coverFiles:{},getGenDiff:{},getGenDiffWatchDep:{}},emits:["update:showMenuIdx","fileItemClick","dragstart","dragend","previewVisibleChange","contextMenuClick","close-icon-click","tiktokView"],setup(i,{emit:n}){const e=i;Yt(r=>({"5a16e08d":r.$props.cellWidth+"px"}));const t=Ie(),s=Ze(),o=V(),p=V(),c=ge(()=>{const{getGenDiff:r,file:b,idx:C}=e;r&&(p.value=r(b.gen_info_obj,C,1,b),o.value=r(b.gen_info_obj,C,-1,b))},200+100*Math.random());oe(()=>{var r;return(r=e.getGenDiffWatchDep)==null?void 0:r.call(e,e.idx)},()=>{c()},{immediate:!0,deep:!0});const h=x(()=>s.tagMap.get(e.file.fullpath)??[]),y=x(()=>{const r=t.gridThumbnailResolution;return t.enableThumbnail?Be(e.file,[r,r].join("x")):qt(e.file)}),O=x(()=>{var r;return(((r=t.conf)==null?void 0:r.all_custom_tags)??[]).reduce((b,C)=>[...b,{...C,selected:!!h.value.find(M=>M.id===C.id)}],[])}),w=x(()=>O.value.find(r=>r.type==="custom"&&r.name==="like")),D=()=>{he(w.value),n("contextMenuClick",{key:`toggle-tag-${w.value.id}`},e.file,e.idx)},Q=r=>{t.magicSwitchTiktokView&&e.file.type==="file"&&pe(e.file.name)?(r.stopPropagation(),r.preventDefault(),n("tiktokView",e.file,e.idx),setTimeout(()=>{nn()},500)):n("fileItemClick",r,e.file,e.idx)},a=()=>{t.magicSwitchTiktokView?n("tiktokView",e.file,e.idx):sn(e.file,r=>n("contextMenuClick",{key:`toggle-tag-${r}`},e.file,e.idx),()=>n("tiktokView",e.file,e.idx))},d=()=>{t.magicSwitchTiktokView?n("tiktokView",e.file,e.idx):rn(e.file,r=>n("contextMenuClick",{key:`toggle-tag-${r}`},e.file,e.idx),()=>n("tiktokView",e.file,e.idx))};return(r,b)=>{const C=Y,M=st,v=rt,T=on,E=hn;return l(),R(C,{trigger:["contextmenu"],visible:F(t).longPressOpenContextMenu?typeof r.idx=="number"&&r.showMenuIdx===r.idx:void 0,"onUpdate:visible":b[7]||(b[7]=$=>typeof r.idx=="number"&&n("update:showMenuIdx",$?r.idx:-1))},{overlay:_(()=>[r.enableRightClickMenu?(l(),R(We,{key:0,file:r.file,idx:r.idx,"selected-tag":h.value,onContextMenuClick:b[6]||(b[6]=($,m,P)=>n("contextMenuClick",$,m,P)),"is-selected-mutil-files":r.isSelectedMutilFiles},null,8,["file","idx","selected-tag","is-selected-mutil-files"])):A("",!0)]),default:_(()=>{var $;return[(l(),f("li",{class:W(["file file-item-trigger grid",{clickable:r.file.type==="dir",selected:r.selected}]),"data-idx":r.idx,key:r.file.name,draggable:"true",onDragstart:b[3]||(b[3]=m=>n("dragstart",m,r.idx)),onDragend:b[4]||(b[4]=m=>n("dragend",m,r.idx)),onClickCapture:b[5]||(b[5]=m=>Q(m))},[u("div",null,[r.enableCloseIcon?(l(),f("div",{key:0,class:"close-icon",onClick:b[0]||(b[0]=m=>n("close-icon-click"))},[k(F(Zt))])):A("",!0),r.enableRightClickMenu?(l(),f("div",Vs,[k(C,null,{overlay:_(()=>[k(We,{file:r.file,idx:r.idx,"selected-tag":h.value,onContextMenuClick:b[1]||(b[1]=(m,P,S)=>n("contextMenuClick",m,P,S)),"is-selected-mutil-files":r.isSelectedMutilFiles},null,8,["file","idx","selected-tag","is-selected-mutil-files"])]),default:_(()=>[u("div",js,[k(F(Xt))])]),_:1}),r.file.type==="file"?(l(),R(C,{key:0},{overlay:_(()=>[O.value.length>1?(l(),R(v,{key:0,onClick:b[2]||(b[2]=m=>n("contextMenuClick",m,r.file,r.idx))},{default:_(()=>[(l(!0),f(j,null,H(O.value,m=>(l(),R(M,{key:`toggle-tag-${m.id}`},{default:_(()=>[I(g(m.name)+" ",1),m.selected?(l(),R(F(lt),{key:0})):(l(),R(F(at),{key:1}))]),_:2},1024))),128))]),_:1})):A("",!0)]),default:_(()=>{var m,P;return[u("div",{class:W(["float-btn-wrap",{"like-selected":(m=w.value)==null?void 0:m.selected}]),onClick:D},[(P=w.value)!=null&&P.selected?(l(),R(F(en),{key:0})):(l(),R(F(tn),{key:1}))],2)]}),_:1})):A("",!0)])):A("",!0),F(pe)(r.file.name)?(l(),f("div",{key:r.file.fullpath,class:W(`idx-${r.idx} item-content`)},[r.enableChangeIndicator&&p.value&&o.value?(l(),R(Fs,{key:0,"gen-diff-to-next":p.value,"gen-diff-to-previous":o.value},null,8,["gen-diff-to-next","gen-diff-to-previous"])):A("",!0),k(T,{src:y.value,fallback:F(Nn),preview:{src:r.fullScreenPreviewImageUrl,onVisibleChange:(m,P)=>n("previewVisibleChange",m,P)}},null,8,["src","fallback","preview"]),h.value&&r.cellWidth>ie?(l(),f("div",xs,[(l(!0),f(j,null,H(r.extraTags??h.value,m=>(l(),R(E,{key:m.id,color:F(s).getColor(m)},{default:_(()=>[I(g(m.name),1)]),_:2},1032,["color"]))),128))])):A("",!0)],2)):F(et)(r.file.name)?(l(),f("div",{key:3,class:W(`idx-${r.idx} item-content video`),url:F(ce)(r.file),style:it({"background-image":`url('${r.file.cover_url??F(ce)(r.file)}')`}),onClick:a},[u("div",Us,[u("img",{src:F(Ln),style:{width:"40px",height:"40px"}},null,8,Js)]),h.value&&r.cellWidth>ie?(l(),f("div",Ws,[(l(!0),f(j,null,H(h.value,m=>(l(),R(E,{key:m.id,color:F(s).getColor(m)},{default:_(()=>[I(g(m.name),1)]),_:2},1032,["color"]))),128))])):A("",!0)],14,Hs)):F(tt)(r.file.name)?(l(),f("div",{key:4,class:W(`idx-${r.idx} item-content audio`),onClick:d},[Ks,h.value&&r.cellWidth>ie?(l(),f("div",Gs,[(l(!0),f(j,null,H(h.value,m=>(l(),R(E,{key:m.id,color:F(s).getColor(m)},{default:_(()=>[I(g(m.name),1)]),_:2},1032,["color"]))),128))])):A("",!0)],2)):(l(),f("div",Ys,[r.file.type==="file"?(l(),R(F(An),{key:0,class:"icon center"})):($=r.coverFiles)!=null&&$.length&&r.cellWidth>160?(l(),f("div",qs,[(l(!0),f(j,null,H(r.coverFiles,m=>(l(),f("img",{class:"dir-cover-item",src:m.media_type==="image"?F(Be)(m):F(ce)(m),key:m.fullpath},null,8,Zs))),128))])):(l(),R(F(In),{key:2,class:"icon center"}))])),r.cellWidth>ie?(l(),f("div",Xs,[u("div",{class:"name line-clamp-1",title:r.file.name},g(r.file.name),9,er),u("div",tr,[u("div",nr,g(r.file.type)+" "+g(r.file.size),1),u("div",null,g(r.file.date),1)])])):A("",!0)])],42,Ls))]}),_:1},8,["visible"])}}});const Ar=ot(ir,[["__scopeId","data-v-0f74bba6"]]);export{Ar as F,dr as N,We as _,cr as a,br as b,yr as c,gt as d,mr as e,Vn as f,G as g,gr as h,vr as i,hr as j,pr as k,Dn as r,fr as s,xn as t,ae as u}; diff --git a/vue/dist/assets/FileItem-5c27aa5d.js b/vue/dist/assets/FileItem-5c27aa5d.js new file mode 100644 index 0000000..bd4ad5d --- /dev/null +++ b/vue/dist/assets/FileItem-5c27aa5d.js @@ -0,0 +1,3 @@ +var ut=Object.defineProperty;var dt=(i,n,e)=>n in i?ut(i,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[n]=e;var q=(i,n,e)=>(dt(i,typeof n!="symbol"?n+"":n,e),e);import{c as I,A as Y,dx as le,O as de,am as ye,bk as ct,dh as ft,c0 as ht,dy as gt,r as L,cR as pt,bF as De,dz as mt,p as vt,dA as xe,bB as yt,dB as be,dC as bt,aH as At,G as H,dD as St,C as kt,dE as _t,n as ce,m as ne,aU as It,t as Ue,a1 as Ae,c9 as Je,aJ as wt,dF as We,dG as Ct,Q as Et,x as Tt,ct as fe,d0 as Ke,d1 as Ge,aP as Se,aQ as ke,az as Ye,U as l,a2 as F,dH as Pt,dI as Ot,dJ as Dt,c5 as zt,dK as Nt,at as Qt,V as c,aG as Z,$ as y,a3 as A,Z as V,a8 as x,c6 as ze,c7 as Mt,dL as $t,a7 as qe,ag as W,d as _e,X as S,Y as h,a4 as $,al as Ze,dq as Bt,dp as Ft,M as Xe,W as a,a0 as et,di as Rt,dM as Ne,af as Lt,dN as Vt,dl as jt,dO as Ht,dP as xt,dQ as ae,cW as Ut,dR as Jt,dS as Wt,dT as Kt}from"./index-8b1d4076.js";import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-26786c56.js";import{i as Gt}from"./_isIterateeCall-4f946453.js";import{_ as Yt}from"./index-404f2353.js";import{D as G,a as he}from"./index-133a27d3.js";/* empty css */G.Button=he;G.install=function(i){return i.component(G.name,G),i.component(he.name,he),i};var qt={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3a32.05 32.05 0 00.6 45.3l183.7 179.1-43.4 252.9a31.95 31.95 0 0046.4 33.7L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3z"}}]},name:"star",theme:"filled"};const Zt=qt;function Qe(i){for(var n=1;n{const r=ht();de(r),X.has(r)||(X.set(r,ye(i(r,t??(n==null?void 0:n())))),ct(()=>{X.delete(r)}));const o=X.get(r);return de(o),{state:o,toRefs(){return ft(o)}}}}}var vi={icon:{tag:"svg",attrs:{viewBox:"0 0 1024 1024",focusable:"false"},children:[{tag:"path",attrs:{d:"M715.8 493.5L335 165.1c-14.2-12.2-35-1.2-35 18.5v656.8c0 19.7 20.8 30.7 35 18.5l380.8-328.4c10.9-9.4 10.9-27.6 0-37z"}}]},name:"caret-right",theme:"outlined"};const yi=vi;function Be(i){for(var n=1;n{const i=L([]);return{selectdFiles:i,addFiles:e=>{i.value=pt([...i.value,...e])}}});class se{constructor(n,e=mt.CREATED_TIME_DESC){q(this,"root");q(this,"execQueue",[]);q(this,"walkerInitPromsie");this.entryPath=n,this.sortMethod=e,this.root={children:[],info:{name:this.entryPath,size:"-",bytes:0,created_time:"",is_under_scanned_path:!0,date:"",type:"dir",fullpath:this.entryPath}},this.walkerInitPromsie=new Promise(t=>{De([this.entryPath]).then(async r=>{this.root.info=r[this.entryPath],await this.fetchChildren(this.root),t()})})}reset(){return this.root.children=[],this.fetchChildren(this.root)}get images(){const n=e=>e.children.map(t=>{if(t.info.type==="dir")return n(t);if(be(t.info.name))return t.info}).filter(t=>t).flat(1);return n(this.root)}get isCompleted(){return this.execQueue.length===0}async fetchChildren(n){const{files:e}=await vt(n.info.fullpath);return n.children=xe(e,this.sortMethod).map(t=>({info:t,children:[]})),this.execQueue.shift(),this.execQueue.unshift(...n.children.filter(t=>t.info.type==="dir").map(t=>({fn:()=>this.fetchChildren(t),...t}))),n}async next(){await this.walkerInitPromsie;const n=ai(this.execQueue);if(!n)return null;const e=await n.fn();return this.execQueue=this.execQueue.slice(),this.root={...this.root},e}async isExpired(){const n=[this.root.info],e=r=>{for(const o of r.children)o.info.type==="dir"&&(n.push(o.info),e(o))};e(this.root);const t=await De(n.map(r=>r.fullpath));for(const r of n)if(!yt(r,t[r.fullpath]))return!0;return!1}async seamlessRefresh(n,e=L(!1)){const t=performance.now(),r=new se(this.entryPath,this.sortMethod);for(await r.walkerInitPromsie;!r.isCompleted&&r.images.length
'};e.configure=function(u){var d,s;for(d in u)s=u[d],s!==void 0&&u.hasOwnProperty(d)&&(t[d]=s);return this},e.status=null,e.set=function(u){var d=e.isStarted();u=r(u,t.minimum,1),e.status=u===1?null:u;var s=e.render(!d),b=s.querySelector(t.barSelector),w=t.speed,M=t.easing;return s.offsetWidth,f(function(p){t.positionUsing===""&&(t.positionUsing=e.getPositioningCSS()),g(b,v(u,w,M)),u===1?(g(s,{transition:"none",opacity:1}),s.offsetWidth,setTimeout(function(){g(s,{transition:"all "+w+"ms linear",opacity:0}),setTimeout(function(){e.remove(),p()},w)},w)):setTimeout(p,w)}),this},e.isStarted=function(){return typeof e.status=="number"},e.start=function(){e.status||e.set(0);var u=function(){setTimeout(function(){e.status&&(e.trickle(),u())},t.trickleSpeed)};return t.trickle&&u(),this},e.done=function(u){return!u&&!e.status?this:e.inc(.3+.5*Math.random()).set(1)},e.inc=function(u){var d=e.status;return d?d>1?void 0:(typeof u!="number"&&(d>=0&&d<.2?u=.1:d>=.2&&d<.5?u=.04:d>=.5&&d<.8?u=.02:d>=.8&&d<.99?u=.005:u=0),d=r(d+u,0,.994),e.set(d)):e.start()},e.trickle=function(){return e.inc()},function(){var u=0,d=0;e.promise=function(s){return!s||s.state()==="resolved"?this:(d===0&&e.start(),u++,d++,s.always(function(){d--,d===0?(u=0,e.done()):e.set((u-d)/u)}),this)}}(),e.getElement=function(){var u=e.getParent();if(u){var d=Array.prototype.slice.call(u.querySelectorAll(".nprogress")).filter(function(s){return s.parentElement===u});if(d.length>0)return d[0]}return null},e.getParent=function(){if(t.parent instanceof HTMLElement)return t.parent;if(typeof t.parent=="string")return document.querySelector(t.parent)},e.render=function(u){if(e.isRendered())return e.getElement();N(document.documentElement,"nprogress-busy");var d=document.createElement("div");d.id="nprogress",d.className="nprogress",d.innerHTML=t.template;var s=d.querySelector(t.barSelector),b=u?"-100":o(e.status||0),w=e.getParent(),M;return g(s,{transition:"all 0 linear",transform:"translate3d("+b+"%,0,0)"}),t.showSpinner||(M=d.querySelector(t.spinnerSelector),M&&j(M)),w!=document.body&&N(w,"nprogress-custom-parent"),w.appendChild(d),d},e.remove=function(){e.status=null,T(document.documentElement,"nprogress-busy"),T(e.getParent(),"nprogress-custom-parent");var u=e.getElement();u&&j(u)},e.isRendered=function(){return!!e.getElement()},e.getPositioningCSS=function(){var u=document.body.style,d="WebkitTransform"in u?"Webkit":"MozTransform"in u?"Moz":"msTransform"in u?"ms":"OTransform"in u?"O":"";return d+"Perspective"in u?"translate3d":d+"Transform"in u?"translate":"margin"};function r(u,d,s){return us?s:u}function o(u){return(-1+u)*100}function v(u,d,s){var b;return t.positionUsing==="translate3d"?b={transform:"translate3d("+o(u)+"%,0,0)"}:t.positionUsing==="translate"?b={transform:"translate("+o(u)+"%,0)"}:b={"margin-left":o(u)+"%"},b.transition="all "+d+"ms "+s,b}var f=function(){var u=[];function d(){var s=u.shift();s&&s(d)}return function(s){u.push(s),u.length==1&&d()}}(),g=function(){var u=["Webkit","O","Moz","ms"],d={};function s(p){return p.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(C,E){return E.toUpperCase()})}function b(p){var C=document.body.style;if(p in C)return p;for(var E=u.length,Q=p.charAt(0).toUpperCase()+p.slice(1),m;E--;)if(m=u[E]+Q,m in C)return m;return p}function w(p){return p=s(p),d[p]||(d[p]=b(p))}function M(p,C,E){C=w(C),p.style[C]=E}return function(p,C){var E=arguments,Q,m;if(E.length==2)for(Q in C)m=C[Q],m!==void 0&&C.hasOwnProperty(Q)&&M(p,Q,m);else M(p,E[1],E[2])}}();function _(u,d){var s=typeof u=="string"?u:P(u);return s.indexOf(" "+d+" ")>=0}function N(u,d){var s=P(u),b=s+d;_(s,d)||(u.className=b.substring(1))}function T(u,d){var s=P(u),b;_(u,d)&&(b=s.replace(" "+d+" "," "),u.className=b.substring(1,b.length-1))}function P(u){return(" "+(u&&u.className||"")+" ").replace(/\s+/gi," ")}function j(u){u&&u.parentNode&&u.parentNode.removeChild(u)}return e})})(nt);var wi=nt.exports;const Gs=At(wi);function Ys({fetchNext:i}={}){const{scroller:n,sortedFiles:e,sortMethod:t,currLocation:r,stackViewEl:o,canLoadNext:v,previewIdx:f,props:g,walker:_,getViewableAreaFiles:N}=re().toRefs(),{state:T}=re(),P=L(!1),j=L(K.defaultGridCellWidth),u=H(()=>j.value+16),d=44,{width:s}=St(o),b=H(()=>~~(s.value/u.value)),w=ye(new Map),M=H(()=>{const O=u.value;return{first:O+(j.value<=160?0:d),second:O}}),p=L(!1),C=async()=>{var O;if(!(p.value||g.value.mode!=="walk"||!v.value))try{p.value=!0,await((O=_.value)==null?void 0:O.next())}finally{p.value=!1}},E=async(O=!1)=>{const k=n.value,R=()=>O?f.value:(k==null?void 0:k.$_endIndex)??0,D=()=>{const B=e.value.length,J=50;return B?i?R()>B-J:R()>B-J&&v.value:!0};for(;D();){await Ue(30);const B=await(i??C)();if(typeof B=="boolean"&&!B)return}};T.useEventListen("loadNextDir",kt(async(O=!1)=>{await E(O),g.value.mode==="walk"&&Q()})),T.useEventListen("viewableAreaFilesChange",()=>{const O=N.value(),k=O.filter(D=>D.is_under_scanned_path&&be(D.name)).map(D=>D.fullpath);Ci.fetchImageTags(k);const R=O.filter(D=>D.is_under_scanned_path&&D.type==="dir"&&!w.has(D.fullpath)).map(D=>D.fullpath);R.length&&_t(R).then(D=>{for(const B in D)if(Object.prototype.hasOwnProperty.call(D,B)){const J=D[B];w.set(B,J)}})}),T.useEventListen("refresh",async()=>{T.eventEmitter.emit("viewableAreaFilesChange")});const Q=ce(()=>T.eventEmitter.emit("viewableAreaFilesChange"),300);ne(r,Q);const m=ce(async()=>{await E(),Q()},150);return{gridItems:b,sortedFiles:e,sortMethodConv:It,moreActionsDropdownShow:P,gridSize:u,sortMethod:t,onScroll:m,loadNextDir:C,loadNextDirLoading:p,canLoadNext:v,itemSize:M,cellWidth:j,dirCoverCache:w}}const qs=new Map,K=Ae(),Zs=Ii(),Ci=Je(),Xs=wt(),er=new BroadcastChannel("iib-image-transfer-bus"),{eventEmitter:tr,useEventListen:ir}=We(),{useHookShareState:re}=mi((i,{images:n})=>{const e=L({tabIdx:-1,paneIdx:-1}),t=H(()=>Et(r.value)),r=L([]),o=H(()=>{var C;return r.value.map(E=>E.curr).slice((C=K.conf)!=null&&C.is_win&&e.value.mode!=="scanned-fixed"?1:0)}),v=H(()=>Tt(...o.value)),f=H(()=>{var C,E;return e.value.mode==="scanned-fixed"?((E=(C=r.value)==null?void 0:C[0])==null?void 0:E.curr)??"":e.value.mode==="walk"?e.value.path??"":r.value.length===1?"/":v.value}),g=L(K.defaultSortingMethod),_=L(e.value.mode=="walk"?new se(e.value.path,g.value):void 0);ne([()=>e.value.mode,()=>e.value.path,g],async([C,E,Q])=>{var m;C==="walk"?(_.value=new se(E,Q),r.value=[{files:[],curr:E}],await Ue(),await((m=_.value)==null?void 0:m.reset()),M.eventEmitter.emit("loadNextDir")):_.value=void 0});const N=ye(new Set);ne(t,()=>N.clear());const T=H(()=>{var m;if(n.value)return n.value;if(_.value)return _.value.images.filter(O=>!N.has(O.fullpath));if(!t.value)return[];const C=((m=t.value)==null?void 0:m.files)??[],E=g.value;return xe((O=>{const k=K.fileTypeFilter;return k.includes("all")||k.length===0?O:O.filter(R=>!!(R.type==="dir"||k.includes("image")&&fe(R.name)||k.includes("video")&&Ke(R.name)||k.includes("audio")&&Ge(R.name)))})(C),E).filter(O=>!N.has(O.fullpath))}),P=L([]),j=L(-1),u=H(()=>_.value?!_.value.isCompleted:!1),d=L(!1),s=L(!1),b=L(),w=()=>{var C,E,Q;return(Q=(E=(C=K.tabList)==null?void 0:C[e.value.tabIdx])==null?void 0:E.panes)==null?void 0:Q[e.value.paneIdx]},M=We();M.useEventListen("selectAll",()=>{console.log(`select all 0 -> ${T.value.length}`),P.value=gi(0,T.value.length)});const p=()=>{const C=b.value;if(C){const E=Math.max(C.$_startIndex-10,0);return T.value.slice(E,C.$_endIndex+10)}return[]};return{previewing:s,spinning:d,canLoadNext:u,multiSelectedIdxs:P,previewIdx:j,basePath:o,currLocation:f,currPage:t,stack:r,sortMethod:g,sortedFiles:T,scroller:b,stackViewEl:L(),props:e,getPane:w,walker:_,deletedFiles:N,getViewableAreaFiles:p,...M}},()=>({images:L()}));function nr(){const{eventEmitter:i,multiSelectedIdxs:n,sortedFiles:e}=re().toRefs();return{onSelectAll:()=>i.value.emit("selectAll"),onReverseSelect:()=>{n.value=e.value.map((v,f)=>f).filter(v=>!n.value.includes(v))},onClearAllSelected:()=>{n.value=[]}}}const sr=()=>{const{stackViewEl:i}=re().toRefs(),n=L(-1);return Ct(i,e=>{var r;let t=e.target;for(;t.parentElement;)if(t=t.parentElement,t.tagName.toLowerCase()==="li"&&t.classList.contains("file-item-trigger")){const o=(r=t.dataset)==null?void 0:r.idx;o&&Number.isSafeInteger(+o)&&(n.value=+o);return}}),{showMenuIdx:n}};function Ei(){var i=window.navigator.userAgent,n=i.indexOf("MSIE ");if(n>0)return parseInt(i.substring(n+5,i.indexOf(".",n)),10);var e=i.indexOf("Trident/");if(e>0){var t=i.indexOf("rv:");return parseInt(i.substring(t+3,i.indexOf(".",t)),10)}var r=i.indexOf("Edge/");return r>0?parseInt(i.substring(r+5,i.indexOf(".",r)),10):-1}let te;function ge(){ge.init||(ge.init=!0,te=Ei()!==-1)}var oe={name:"ResizeObserver",props:{emitOnMount:{type:Boolean,default:!1},ignoreWidth:{type:Boolean,default:!1},ignoreHeight:{type:Boolean,default:!1}},emits:["notify"],mounted(){ge(),Ye(()=>{this._w=this.$el.offsetWidth,this._h=this.$el.offsetHeight,this.emitOnMount&&this.emitSize()});const i=document.createElement("object");this._resizeObject=i,i.setAttribute("aria-hidden","true"),i.setAttribute("tabindex",-1),i.onload=this.addResizeHandlers,i.type="text/html",te&&this.$el.appendChild(i),i.data="about:blank",te||this.$el.appendChild(i)},beforeUnmount(){this.removeResizeHandlers()},methods:{compareAndNotify(){(!this.ignoreWidth&&this._w!==this.$el.offsetWidth||!this.ignoreHeight&&this._h!==this.$el.offsetHeight)&&(this._w=this.$el.offsetWidth,this._h=this.$el.offsetHeight,this.emitSize())},emitSize(){this.$emit("notify",{width:this._w,height:this._h})},addResizeHandlers(){this._resizeObject.contentDocument.defaultView.addEventListener("resize",this.compareAndNotify),this.compareAndNotify()},removeResizeHandlers(){this._resizeObject&&this._resizeObject.onload&&(!te&&this._resizeObject.contentDocument&&this._resizeObject.contentDocument.defaultView.removeEventListener("resize",this.compareAndNotify),this.$el.removeChild(this._resizeObject),this._resizeObject.onload=null,this._resizeObject=null)}}};const Ti=Pt();Se("data-v-b329ee4c");const Pi={class:"resize-observer",tabindex:"-1"};ke();const Oi=Ti((i,n,e,t,r,o)=>(l(),F("div",Pi)));oe.render=Oi;oe.__scopeId="data-v-b329ee4c";oe.__file="src/components/ResizeObserver.vue";function ie(i){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?ie=function(n){return typeof n}:ie=function(n){return n&&typeof Symbol=="function"&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},ie(i)}function Di(i,n){if(!(i instanceof n))throw new TypeError("Cannot call a class as a function")}function Le(i,n){for(var e=0;ei.length)&&(n=i.length);for(var e=0,t=new Array(n);e2&&arguments[2]!==void 0?arguments[2]:{},t,r,o,v=function(g){for(var _=arguments.length,N=new Array(_>1?_-1:0),T=1;T<_;T++)N[T-1]=arguments[T];if(o=N,!(t&&g===r)){var P=e.leading;typeof P=="function"&&(P=P(g,r)),(!t||g!==r)&&P&&i.apply(void 0,[g].concat(Ve(o))),r=g,clearTimeout(t),t=setTimeout(function(){i.apply(void 0,[g].concat(Ve(o))),t=0},n)}};return v._clear=function(){clearTimeout(t),t=null},v}function st(i,n){if(i===n)return!0;if(ie(i)==="object"){for(var e in i)if(!st(i[e],n[e]))return!1;return!0}return!1}var Ri=function(){function i(n,e,t){Di(this,i),this.el=n,this.observer=null,this.frozen=!1,this.createObserver(e,t)}return zi(i,[{key:"createObserver",value:function(e,t){var r=this;if(this.observer&&this.destroyObserver(),!this.frozen){if(this.options=Bi(e),this.callback=function(f,g){r.options.callback(f,g),f&&r.options.once&&(r.frozen=!0,r.destroyObserver())},this.callback&&this.options.throttle){var o=this.options.throttleOptions||{},v=o.leading;this.callback=Fi(this.callback,this.options.throttle,{leading:function(g){return v==="both"||v==="visible"&&g||v==="hidden"&&!g}})}this.oldResult=void 0,this.observer=new IntersectionObserver(function(f){var g=f[0];if(f.length>1){var _=f.find(function(T){return T.isIntersecting});_&&(g=_)}if(r.callback){var N=g.isIntersecting&&g.intersectionRatio>=r.threshold;if(N===r.oldResult)return;r.oldResult=N,r.callback(N,g)}},this.options.intersection),Ye(function(){r.observer&&r.observer.observe(r.el)})}}},{key:"destroyObserver",value:function(){this.observer&&(this.observer.disconnect(),this.observer=null),this.callback&&this.callback._clear&&(this.callback._clear(),this.callback=null)}},{key:"threshold",get:function(){return this.options.intersection&&typeof this.options.intersection.threshold=="number"?this.options.intersection.threshold:0}}]),i}();function rt(i,n,e){var t=n.value;if(t)if(typeof IntersectionObserver>"u")console.warn("[vue-observe-visibility] IntersectionObserver API is not available in your browser. Please install this polyfill: https://github.com/w3c/IntersectionObserver/tree/master/polyfill");else{var r=new Ri(i,t,e);i._vue_visibilityState=r}}function Li(i,n,e){var t=n.value,r=n.oldValue;if(!st(t,r)){var o=i._vue_visibilityState;if(!t){ot(i);return}o?o.createObserver(t,e):rt(i,{value:t},e)}}function ot(i){var n=i._vue_visibilityState;n&&(n.destroyObserver(),delete i._vue_visibilityState)}var Vi={beforeMount:rt,updated:Li,unmounted:ot},ji={itemsLimit:1e3},Hi=/(auto|scroll)/;function lt(i,n){return i.parentNode===null?n:lt(i.parentNode,n.concat([i]))}var ue=function(n,e){return getComputedStyle(n,null).getPropertyValue(e)},xi=function(n){return ue(n,"overflow")+ue(n,"overflow-y")+ue(n,"overflow-x")},Ui=function(n){return Hi.test(xi(n))};function je(i){if(i instanceof HTMLElement||i instanceof SVGElement){for(var n=lt(i.parentNode,[]),e=0;e{this.$_prerender=!1,this.updateVisibleItems(!0),this.ready=!0})},activated(){const i=this.$_lastUpdateScrollPosition;typeof i=="number"&&this.$nextTick(()=>{this.scrollToPosition(i)})},beforeUnmount(){this.removeListeners()},methods:{addView(i,n,e,t,r){const o=Ot({id:Gi++,index:n,used:!0,key:t,type:r}),v=Dt({item:e,position:0,nr:o});return i.push(v),v},unuseView(i,n=!1){const e=this.$_unusedViews,t=i.nr.type;let r=e.get(t);r||(r=[],e.set(t,r)),r.push(i),n||(i.nr.used=!1,i.position=-9999)},handleResize(){this.$emit("resize"),this.ready&&this.updateVisibleItems(!1)},handleScroll(i){if(!this.$_scrollDirty){if(this.$_scrollDirty=!0,this.$_updateTimeout)return;const n=()=>requestAnimationFrame(()=>{this.$_scrollDirty=!1;const{continuous:e}=this.updateVisibleItems(!1,!0);e||(clearTimeout(this.$_refreshTimout),this.$_refreshTimout=setTimeout(this.handleScroll,this.updateInterval+100))});n(),this.updateInterval&&(this.$_updateTimeout=setTimeout(()=>{this.$_updateTimeout=0,this.$_scrollDirty&&n()},this.updateInterval))}},handleVisibilityChange(i,n){this.ready&&(i||n.boundingClientRect.width!==0||n.boundingClientRect.height!==0?(this.$emit("visible"),requestAnimationFrame(()=>{this.updateVisibleItems(!1)})):this.$emit("hidden"))},updateVisibleItems(i,n=!1){const e=this.itemSize,t=this.gridItems||1,r=this.itemSecondarySize||e,o=this.$_computedMinItemSize,v=this.typeField,f=this.simpleArray?null:this.keyField,g=this.items,_=g.length,N=this.sizes,T=this.$_views,P=this.$_unusedViews,j=this.pool,u=this.itemIndexByKey;let d,s,b,w,M;if(!_)d=s=w=M=b=0;else if(this.$_prerender)d=w=0,s=M=Math.min(this.prerender,g.length),b=null;else{const k=this.getScroll();if(n){let B=k.start-this.$_lastUpdateScrollPosition;if(B<0&&(B=-B),e===null&&Bk.start&&(Pe=U),U=~~((J+Pe)/2);while(U!==Oe);for(U<0&&(U=0),d=U,b=N[_-1].accumulator,s=U;s<_&&N[s].accumulator_&&(s=_)),w=d;w<_&&D+N[w].accumulator_&&(s=_),w<0&&(w=0),M>_&&(M=_),b=Math.ceil(_/t)*e}}s-d>ji.itemsLimit&&this.itemsLimitError(),this.totalSize=b;let p;const C=d<=this.$_endIndex&&s>=this.$_startIndex;if(C)for(let k=0,R=j.length;k=s)&&this.unuseView(p));const E=C?null:new Map;let Q,m,O;for(let k=d;k=D.length)&&(p=this.addView(j,k,Q,R,m),this.unuseView(p,!0),D=P.get(m)),p=D[O],E.set(m,O+1)),T.delete(p.nr.key),p.nr.used=!0,p.nr.index=k,p.nr.key=R,p.nr.type=m,T.set(R,p),B=!0;else if(!p.nr.used&&(p.nr.used=!0,p.nr.index=k,B=!0,D)){const J=D.indexOf(p);J!==-1&&D.splice(J,1)}p.item=Q,B&&(k===g.length-1&&this.$emit("scroll-end"),k===0&&this.$emit("scroll-start")),e===null?(p.position=N[k-1].accumulator,p.offset=0):(p.position=Math.floor(k/t)*e,p.offset=k%t*r)}return this.$_startIndex=d,this.$_endIndex=s,this.emitUpdate&&this.$emit("update",d,s,w,M),clearTimeout(this.$_sortTimer),this.$_sortTimer=setTimeout(this.sortViews,this.updateInterval+300),{continuous:C}},getListenerTarget(){let i=je(this.$el);return window.document&&(i===window.document.documentElement||i===window.document.body)&&(i=window),i},getScroll(){const{$el:i,direction:n}=this,e=n==="vertical";let t;if(this.pageMode){const r=i.getBoundingClientRect(),o=e?r.height:r.width;let v=-(e?r.top:r.left),f=e?window.innerHeight:window.innerWidth;v<0&&(f+=v,v=0),v+f>o&&(f=o-v),t={start:v,end:v+f}}else e?t={start:i.scrollTop,end:i.scrollTop+i.clientHeight}:t={start:i.scrollLeft,end:i.scrollLeft+i.clientWidth};return t},applyPageMode(){this.pageMode?this.addListeners():this.removeListeners()},addListeners(){this.listenerTarget=this.getListenerTarget(),this.listenerTarget.addEventListener("scroll",this.handleScroll,ve?{passive:!0}:!1),this.listenerTarget.addEventListener("resize",this.handleResize)},removeListeners(){this.listenerTarget&&(this.listenerTarget.removeEventListener("scroll",this.handleScroll),this.listenerTarget.removeEventListener("resize",this.handleResize),this.listenerTarget=null)},scrollToItem(i){let n;const e=this.gridItems||1;this.itemSize===null?n=i>0?this.sizes[i-1].accumulator:0:n=Math.floor(i/e)*this.itemSize,this.scrollToPosition(n)},scrollToPosition(i){const n=this.direction==="vertical"?{scroll:"scrollTop",start:"top"}:{scroll:"scrollLeft",start:"left"};let e,t,r;if(this.pageMode){const o=je(this.$el),v=o.tagName==="HTML"?0:o[n.scroll],f=o.getBoundingClientRect(),_=this.$el.getBoundingClientRect()[n.start]-f[n.start];e=o,t=n.scroll,r=i+v+_}else e=this.$el,t=n.scroll,r=i;e[t]=r},itemsLimitError(){throw setTimeout(()=>{console.log("It seems the scroller element isn't scrolling, so it tries to render all the items at once.","Scroller:",this.$el),console.log("Make sure the scroller has a fixed height (or width) and 'overflow-y' (or 'overflow-x') set to 'auto' so it can scroll correctly and only render the items visible in the scroll viewport.")}),new Error("Rendered items limit reached")},sortViews(){this.pool.sort((i,n)=>i.nr.index-n.nr.index)}}};const Yi={key:0,ref:"before",class:"vue-recycle-scroller__slot"},qi={key:1,ref:"after",class:"vue-recycle-scroller__slot"};function Zi(i,n,e,t,r,o){const v=zt("ResizeObserver"),f=Nt("observe-visibility");return Qt((l(),c("div",{class:W(["vue-recycle-scroller",{ready:r.ready,"page-mode":e.pageMode,[`direction-${i.direction}`]:!0}]),onScrollPassive:n[0]||(n[0]=(...g)=>o.handleScroll&&o.handleScroll(...g))},[i.$slots.before?(l(),c("div",Yi,[Z(i.$slots,"before")],512)):y("v-if",!0),(l(),F(ze(e.listTag),{ref:"wrapper",style:qe({[i.direction==="vertical"?"minHeight":"minWidth"]:r.totalSize+"px"}),class:W(["vue-recycle-scroller__item-wrapper",e.listClass])},{default:A(()=>[(l(!0),c(V,null,x(r.pool,g=>(l(),F(ze(e.itemTag),Mt({key:g.nr.id,style:r.ready?{transform:`translate${i.direction==="vertical"?"Y":"X"}(${g.position}px) translate${i.direction==="vertical"?"X":"Y"}(${g.offset}px)`,width:e.gridItems?`${i.direction==="vertical"&&e.itemSecondarySize||e.itemSize}px`:void 0,height:e.gridItems?`${i.direction==="horizontal"&&e.itemSecondarySize||e.itemSize}px`:void 0}:null,class:["vue-recycle-scroller__item-view",[e.itemClass,{hover:!e.skipHover&&r.hoverKey===g.nr.key}]]},$t(e.skipHover?{}:{mouseenter:()=>{r.hoverKey=g.nr.key},mouseleave:()=>{r.hoverKey=null}})),{default:A(()=>[Z(i.$slots,"default",{item:g.item,index:g.nr.index,active:g.nr.used})]),_:2},1040,["style","class"]))),128)),Z(i.$slots,"empty")]),_:3},8,["style","class"])),i.$slots.after?(l(),c("div",qi,[Z(i.$slots,"after")],512)):y("v-if",!0),I(v,{onNotify:o.handleResize},null,8,["onNotify"])],34)),[[f,o.handleVisibilityChange]])}at.render=Zi;at.__file="src/components/RecycleScroller.vue";const He=_e({__name:"ContextMenu",props:{file:{},idx:{},selectedTag:{},isSelectedMutilFiles:{type:Boolean}},emits:["contextMenuClick"],setup(i,{emit:n}){const e=i,t=Ae(),r=H(()=>{var o;return(((o=t.conf)==null?void 0:o.all_custom_tags)??[]).reduce((v,f)=>[...v,{...f,selected:!!e.selectedTag.find(g=>g.id===f.id)}],[])});return(o,v)=>{const f=Ze,g=Bt,_=Ft,N=Xe;return l(),F(N,{onClick:v[0]||(v[0]=T=>n("contextMenuClick",T,o.file,o.idx))},{default:A(()=>{var T;return[I(f,{key:"deleteFiles"},{default:A(()=>[S(h(o.$t("deleteSelected")),1)]),_:1}),I(f,{key:"openWithDefaultApp"},{default:A(()=>[S(h(o.$t("openWithDefaultApp")),1)]),_:1}),I(f,{key:"saveSelectedAsJson"},{default:A(()=>[S(h(o.$t("saveSelectedAsJson")),1)]),_:1}),o.file.type==="dir"?(l(),c(V,{key:0},[I(f,{key:"openInNewTab"},{default:A(()=>[S(h(o.$t("openInNewTab")),1)]),_:1}),I(f,{key:"openOnTheRight"},{default:A(()=>[S(h(o.$t("openOnTheRight")),1)]),_:1}),I(f,{key:"openWithWalkMode"},{default:A(()=>[S(h(o.$t("openWithWalkMode")),1)]),_:1})],64)):y("",!0),o.file.type==="file"?(l(),c(V,{key:1},[$(be)(o.file.name)?(l(),c(V,{key:0},[I(f,{key:"viewGenInfo"},{default:A(()=>[S(h(o.$t("viewGenerationInfo")),1)]),_:1}),I(f,{key:"tiktokView"},{default:A(()=>[S(h(o.$t("tiktokView")),1)]),_:1}),I(g),((T=$(t).conf)==null?void 0:T.launch_mode)!=="server"?(l(),c(V,{key:0},[I(f,{key:"send2txt2img"},{default:A(()=>[S(h(o.$t("sendToTxt2img")),1)]),_:1}),I(f,{key:"send2img2img"},{default:A(()=>[S(h(o.$t("sendToImg2img")),1)]),_:1}),I(f,{key:"send2inpaint"},{default:A(()=>[S(h(o.$t("sendToInpaint")),1)]),_:1}),I(f,{key:"send2extras"},{default:A(()=>[S(h(o.$t("sendToExtraFeatures")),1)]),_:1}),I(_,{key:"sendToThirdPartyExtension",title:o.$t("sendToThirdPartyExtension")},{default:A(()=>[I(f,{key:"send2controlnet-txt2img"},{default:A(()=>[S("ControlNet - "+h(o.$t("t2i")),1)]),_:1}),I(f,{key:"send2controlnet-img2img"},{default:A(()=>[S("ControlNet - "+h(o.$t("i2i")),1)]),_:1}),I(f,{key:"send2outpaint"},{default:A(()=>[S("openOutpaint")]),_:1})]),_:1},8,["title"])],64)):y("",!0),I(f,{key:"send2BatchDownload"},{default:A(()=>[S(h(o.$t("sendToBatchDownload")),1)]),_:1}),I(_,{key:"copy2target",title:o.$t("copyTo")},{default:A(()=>[(l(!0),c(V,null,x($(t).quickMovePaths,P=>(l(),F(f,{key:`copy-to-${P.dir}`},{default:A(()=>[S(h(P.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),I(_,{key:"move2target",title:o.$t("moveTo")},{default:A(()=>[(l(!0),c(V,null,x($(t).quickMovePaths,P=>(l(),F(f,{key:`move-to-${P.dir}`},{default:A(()=>[S(h(P.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),I(g),o.isSelectedMutilFiles?(l(),c(V,{key:1},[I(_,{key:"batch-add-tag",title:o.$t("batchAddTag")},{default:A(()=>[I(f,{key:"add-custom-tag"},{default:A(()=>[S("+ "+h(o.$t("addNewCustomTag")),1)]),_:1}),(l(!0),c(V,null,x(r.value,P=>(l(),F(f,{key:`batch-add-tag-${P.id}`},{default:A(()=>[S(h(P.name),1)]),_:2},1024))),128))]),_:1},8,["title"]),I(_,{key:"batch-remove-tag",title:o.$t("batchRemoveTag")},{default:A(()=>[(l(!0),c(V,null,x(r.value,P=>(l(),F(f,{key:`batch-remove-tag-${P.id}`},{default:A(()=>[S(h(P.name),1)]),_:2},1024))),128))]),_:1},8,["title"])],64)):(l(),F(_,{key:"toggle-tag",title:o.$t("toggleTag")},{default:A(()=>[I(f,{key:"add-custom-tag"},{default:A(()=>[S("+ "+h(o.$t("addNewCustomTag")),1)]),_:1}),(l(!0),c(V,null,x(r.value,P=>(l(),F(f,{key:`toggle-tag-${P.id}`},{default:A(()=>[S(h(P.name)+" ",1),P.selected?(l(),F($(tt),{key:0})):(l(),F($(it),{key:1}))]),_:2},1024))),128))]),_:1},8,["title"])),I(g),I(f,{key:"openFileLocationInNewTab"},{default:A(()=>[S(h(o.$t("openFileLocationInNewTab")),1)]),_:1}),I(f,{key:"openWithLocalFileBrowser"},{default:A(()=>[S(h(o.$t("openWithLocalFileBrowser")),1)]),_:1})],64)):y("",!0),I(g),I(f,{key:"rename"},{default:A(()=>[S(h(o.$t("rename")),1)]),_:1}),I(f,{key:"previewInNewWindow"},{default:A(()=>[S(h(o.$t("previewInNewWindow")),1)]),_:1}),I(f,{key:"download"},{default:A(()=>[S(h(o.$t("download")),1)]),_:1}),I(f,{key:"copyPreviewUrl"},{default:A(()=>[S(h(o.$t("copySourceFilePreviewLink")),1)]),_:1}),I(f,{key:"copyFilePath"},{default:A(()=>[S(h(o.$t("copyFilePath")),1)]),_:1})],64)):y("",!0)]}),_:1})}}}),z=i=>(Se("data-v-78cd67a3"),i=i(),ke(),i),Xi={class:"changeIndicatorWrapper"},en={key:0,class:"changeIndicatorsLeft changeIndicators"},tn={key:0,class:"promptChangeIndicator changeIndicator"},nn={key:1,class:"negpromptChangeIndicator changeIndicator"},sn={key:2,class:"seedChangeIndicator changeIndicator"},rn={key:3,class:"stepsChangeIndicator changeIndicator"},on={key:4,class:"cfgChangeIndicator changeIndicator"},ln={key:5,class:"sizeChangeIndicator changeIndicator"},an={key:6,class:"modelChangeIndicator changeIndicator"},un={key:7,class:"samplerChangeIndicator changeIndicator"},dn={key:8,class:"otherChangeIndicator changeIndicator"},cn={class:"hoverOverlay"},fn=z(()=>a("strong",null,"This file",-1)),hn=z(()=>a("br",null,null,-1)),gn=z(()=>a("br",null,null,-1)),pn={key:0},mn=z(()=>a("td",null,[a("span",{class:"promptChangeIndicator"},"+ Prompt")],-1)),vn={key:1},yn=z(()=>a("td",null,[a("span",{class:"negpromptChangeIndicator"},"- Prompt")],-1)),bn={key:2},An=z(()=>a("td",null,[a("span",{class:"seedChangeIndicator"},"Seed")],-1)),Sn={key:3},kn=z(()=>a("td",null,[a("span",{class:"stepsChangeIndicator"},"Steps")],-1)),_n={key:4},In=z(()=>a("td",null,[a("span",{class:"cfgChangeIndicator"},"Cfg Scale")],-1)),wn={key:5},Cn=z(()=>a("td",null,[a("span",{class:"sizeChangeIndicator"},"Size")],-1)),En={key:6},Tn=z(()=>a("td",null,[a("span",{class:"modelChangeIndicator"},"Model")],-1)),Pn=z(()=>a("br",null,null,-1)),On={key:7},Dn=z(()=>a("td",null,[a("span",{class:"samplerChangeIndicator"},"Sampler")],-1)),zn=z(()=>a("br",null,null,-1)),Nn=z(()=>a("br",null,null,-1)),Qn={key:0},Mn=z(()=>a("span",{class:"otherChangeIndicator"},"Other",-1)),$n=z(()=>a("br",null,null,-1)),Bn=z(()=>a("br",null,null,-1)),Fn={key:1,class:"changeIndicatorsRight changeIndicators"},Rn={key:0,class:"promptChangeIndicator changeIndicator"},Ln={key:1,class:"negpromptChangeIndicator changeIndicator"},Vn={key:2,class:"seedChangeIndicator changeIndicator"},jn={key:3,class:"stepsChangeIndicator changeIndicator"},Hn={key:4,class:"cfgChangeIndicator changeIndicator"},xn={key:5,class:"sizeChangeIndicator changeIndicator"},Un={key:6,class:"modelChangeIndicator changeIndicator"},Jn={key:7,class:"samplerChangeIndicator changeIndicator"},Wn={key:8,class:"otherChangeIndicator changeIndicator"},Kn={class:"hoverOverlay"},Gn=z(()=>a("strong",null,"This file",-1)),Yn=z(()=>a("br",null,null,-1)),qn=z(()=>a("br",null,null,-1)),Zn={key:0},Xn=z(()=>a("td",null,[a("span",{class:"promptChangeIndicator"},"+ Prompt")],-1)),es={key:1},ts=z(()=>a("td",null,[a("span",{class:"negpromptChangeIndicator"},"- Prompt")],-1)),is={key:2},ns=z(()=>a("td",null,[a("span",{class:"seedChangeIndicator"},"Seed")],-1)),ss={key:3},rs=z(()=>a("td",null,[a("span",{class:"stepsChangeIndicator"},"Steps")],-1)),os={key:4},ls=z(()=>a("td",null,[a("span",{class:"cfgChangeIndicator"},"Cfg Scale")],-1)),as={key:5},us=z(()=>a("td",null,[a("span",{class:"sizeChangeIndicator"},"Size")],-1)),ds={key:6},cs=z(()=>a("td",null,[a("span",{class:"modelChangeIndicator"},"Model")],-1)),fs=z(()=>a("br",null,null,-1)),hs={key:7},gs=z(()=>a("td",null,[a("span",{class:"samplerChangeIndicator"},"Sampler")],-1)),ps=z(()=>a("br",null,null,-1)),ms=z(()=>a("br",null,null,-1)),vs={key:0},ys=z(()=>a("span",{class:"otherChangeIndicator"},"Other",-1)),bs=z(()=>a("br",null,null,-1)),As=z(()=>a("br",null,null,-1)),Ss=_e({__name:"ChangeIndicator",props:{genDiffToPrevious:{},genDiffToNext:{},genInfo:{}},setup(i){function n(t){const r=["prompt","negativePrompt","seed","steps","cfgScale","size","Model","others"],o=Object.keys(t).filter(v=>!r.includes(v));return Object.fromEntries(o.map(v=>[v,t[v]]))}function e(t){return Object.keys(n(t)).length>0}return(t,r)=>(l(),c("div",Xi,[t.genDiffToPrevious.empty?y("",!0):(l(),c("div",en,["prompt"in t.genDiffToPrevious.diff?(l(),c("div",tn,"P+")):y("",!0),"negativePrompt"in t.genDiffToPrevious.diff?(l(),c("div",nn,"P-")):y("",!0),"seed"in t.genDiffToPrevious.diff?(l(),c("div",sn,"Se")):y("",!0),"steps"in t.genDiffToPrevious.diff?(l(),c("div",rn,"St")):y("",!0),"cfgScale"in t.genDiffToPrevious.diff?(l(),c("div",on,"Cf")):y("",!0),"size"in t.genDiffToPrevious.diff?(l(),c("div",ln,"Si")):y("",!0),"Model"in t.genDiffToPrevious.diff?(l(),c("div",an,"Mo")):y("",!0),"Sampler"in t.genDiffToPrevious.diff?(l(),c("div",un,"Sa")):y("",!0),e(t.genDiffToPrevious.diff)?(l(),c("div",dn,"Ot")):y("",!0)])),a("div",cn,[a("small",null,[I($(Fe)),fn,S(" vs "+h(t.genDiffToPrevious.otherFile)+" ",1),hn,gn,a("table",null,["prompt"in t.genDiffToPrevious.diff?(l(),c("tr",pn,[mn,a("td",null,h(t.genDiffToPrevious.diff.prompt)+" tokens changed",1)])):y("",!0),"negativePrompt"in t.genDiffToPrevious.diff?(l(),c("tr",vn,[yn,a("td",null,h(t.genDiffToPrevious.diff.negativePrompt)+" tokens changed",1)])):y("",!0),"seed"in t.genDiffToPrevious.diff?(l(),c("tr",bn,[An,a("td",null,[a("strong",null,h(t.genDiffToPrevious.diff.seed[0]),1),S(" vs "+h(t.genDiffToPrevious.diff.seed[1]),1)])])):y("",!0),"steps"in t.genDiffToPrevious.diff?(l(),c("tr",Sn,[kn,a("td",null,[a("strong",null,h(t.genDiffToPrevious.diff.steps[0]),1),S(" vs "+h(t.genDiffToPrevious.diff.steps[1]),1)])])):y("",!0),"cfgScale"in t.genDiffToPrevious.diff?(l(),c("tr",_n,[In,a("td",null,[a("strong",null,h(t.genDiffToPrevious.diff.cfgScale[0]),1),S(" vs "+h(t.genDiffToPrevious.diff.cfgScale[1]),1)])])):y("",!0),"size"in t.genDiffToPrevious.diff?(l(),c("tr",wn,[Cn,a("td",null,[a("strong",null,h(t.genDiffToPrevious.diff.size[0]),1),S(" vs "+h(t.genDiffToPrevious.diff.size[1]),1)])])):y("",!0),"Model"in t.genDiffToPrevious.diff?(l(),c("tr",En,[Tn,a("td",null,[a("strong",null,h(t.genDiffToPrevious.diff.Model[0]),1),Pn,S(" vs "+h(t.genDiffToPrevious.diff.Model[1]),1)])])):y("",!0),"Sampler"in t.genDiffToPrevious.diff?(l(),c("tr",On,[Dn,a("td",null,[a("strong",null,h(t.genDiffToPrevious.diff.Sampler[0]),1),zn,S(" vs "+h(t.genDiffToPrevious.diff.Sampler[1]),1)])])):y("",!0)]),Nn,e(t.genDiffToPrevious.diff)?(l(),c("div",Qn,[Mn,S(" props that changed:"),$n,Bn,a("ul",null,[(l(!0),c(V,null,x(n(t.genDiffToPrevious.diff),(o,v)=>(l(),c("li",null,h(v),1))),256))])])):y("",!0)])]),t.genDiffToNext.empty?y("",!0):(l(),c("div",Fn,["prompt"in t.genDiffToNext.diff?(l(),c("div",Rn,"P+")):y("",!0),"negativePrompt"in t.genDiffToNext.diff?(l(),c("div",Ln,"P-")):y("",!0),"seed"in t.genDiffToNext.diff?(l(),c("div",Vn,"Se")):y("",!0),"steps"in t.genDiffToNext.diff?(l(),c("div",jn,"St")):y("",!0),"cfgScale"in t.genDiffToNext.diff?(l(),c("div",Hn,"Cf")):y("",!0),"size"in t.genDiffToNext.diff?(l(),c("div",xn,"Si")):y("",!0),"Model"in t.genDiffToNext.diff?(l(),c("div",Un,"Mo")):y("",!0),"Sampler"in t.genDiffToNext.diff?(l(),c("div",Jn,"Sa")):y("",!0),e(t.genDiffToNext.diff)?(l(),c("div",Wn,"Ot")):y("",!0)])),a("div",Kn,[a("small",null,[I($(Fe)),Gn,S(" vs "+h(t.genDiffToNext.otherFile)+" ",1),Yn,qn,a("table",null,["prompt"in t.genDiffToNext.diff?(l(),c("tr",Zn,[Xn,a("td",null,h(t.genDiffToNext.diff.prompt)+" tokens changed",1)])):y("",!0),"negativePrompt"in t.genDiffToNext.diff?(l(),c("tr",es,[ts,a("td",null,h(t.genDiffToNext.diff.negativePrompt)+" tokens changed",1)])):y("",!0),"seed"in t.genDiffToNext.diff?(l(),c("tr",is,[ns,a("td",null,[a("strong",null,h(t.genDiffToNext.diff.seed[0]),1),S(" vs "+h(t.genDiffToNext.diff.seed[1]),1)])])):y("",!0),"steps"in t.genDiffToNext.diff?(l(),c("tr",ss,[rs,a("td",null,[a("strong",null,h(t.genDiffToNext.diff.steps[0]),1),S(" vs "+h(t.genDiffToNext.diff.steps[1]),1)])])):y("",!0),"cfgScale"in t.genDiffToNext.diff?(l(),c("tr",os,[ls,a("td",null,[a("strong",null,h(t.genDiffToNext.diff.cfgScale[0]),1),S(" vs "+h(t.genDiffToNext.diff.cfgScale[1]),1)])])):y("",!0),"size"in t.genDiffToNext.diff?(l(),c("tr",as,[us,a("td",null,[a("strong",null,h(t.genDiffToNext.diff.size[0]),1),S(" vs "+h(t.genDiffToNext.diff.size[1]),1)])])):y("",!0),"Model"in t.genDiffToNext.diff?(l(),c("tr",ds,[cs,a("td",null,[a("strong",null,h(t.genDiffToNext.diff.Model[0]),1),fs,S(" vs "+h(t.genDiffToNext.diff.Model[1]),1)])])):y("",!0),"Sampler"in t.genDiffToNext.diff?(l(),c("tr",hs,[gs,a("td",null,[a("strong",null,h(t.genDiffToNext.diff.Sampler[0]),1),ps,S(" vs "+h(t.genDiffToNext.diff.Sampler[1]),1)])])):y("",!0)]),ms,e(t.genDiffToNext.diff)?(l(),c("div",vs,[ys,S(" props that changed:"),bs,As,a("ul",null,[(l(!0),c(V,null,x(n(t.genDiffToNext.diff),(o,v)=>(l(),c("li",null,h(v),1))),256))])])):y("",!0)])])]))}});const ks=et(Ss,[["__scopeId","data-v-78cd67a3"]]),_s=i=>(Se("data-v-0f74bba6"),i=i(),ke(),i),Is=["data-idx"],ws={key:1,class:"more"},Cs={class:"float-btn-wrap"},Es={key:1,class:"tags-container"},Ts=["url"],Ps={class:"play-icon"},Os=["src"],Ds={key:0,class:"tags-container"},zs=_s(()=>a("div",{class:"audio-icon"},"🎵",-1)),Ns={key:0,class:"tags-container"},Qs={key:5,class:"preview-icon-wrap"},Ms={key:1,class:"dir-cover-container"},$s=["src"],Bs={key:6,class:"profile"},Fs=["title"],Rs={class:"basic-info"},Ls={style:{"margin-right":"4px"}},ee=160,Vs=_e({__name:"FileItem",props:{file:{},idx:{},selected:{type:Boolean,default:!1},showMenuIdx:{},cellWidth:{},fullScreenPreviewImageUrl:{},enableRightClickMenu:{type:Boolean,default:!0},enableCloseIcon:{type:Boolean,default:!1},isSelectedMutilFiles:{type:Boolean},genInfo:{},enableChangeIndicator:{type:Boolean},extraTags:{},coverFiles:{},getGenDiff:{},getGenDiffWatchDep:{}},emits:["update:showMenuIdx","fileItemClick","dragstart","dragend","previewVisibleChange","contextMenuClick","close-icon-click","tiktokView"],setup(i,{emit:n}){const e=i;Rt(s=>({"5a16e08d":s.$props.cellWidth+"px"}));const t=Ae(),r=Je(),o=L(),v=L(),f=ce(()=>{const{getGenDiff:s,file:b,idx:w}=e;s&&(v.value=s(b.gen_info_obj,w,1,b),o.value=s(b.gen_info_obj,w,-1,b))},200+100*Math.random());ne(()=>{var s;return(s=e.getGenDiffWatchDep)==null?void 0:s.call(e,e.idx)},()=>{f()},{immediate:!0,deep:!0});const g=H(()=>r.tagMap.get(e.file.fullpath)??[]),_=H(()=>{const s=t.gridThumbnailResolution;return t.enableThumbnail?Ne(e.file,[s,s].join("x")):Lt(e.file)}),N=H(()=>{var s;return(((s=t.conf)==null?void 0:s.all_custom_tags)??[]).reduce((b,w)=>[...b,{...w,selected:!!g.value.find(M=>M.id===w.id)}],[])}),T=H(()=>N.value.find(s=>s.type==="custom"&&s.name==="like")),P=()=>{de(T.value),n("contextMenuClick",{key:`toggle-tag-${T.value.id}`},e.file,e.idx)},j=s=>{t.magicSwitchTiktokView&&e.file.type==="file"&&fe(e.file.name)?(s.stopPropagation(),s.preventDefault(),n("tiktokView",e.file,e.idx),setTimeout(()=>{Ut()},500)):n("fileItemClick",s,e.file,e.idx)},u=()=>{t.magicSwitchTiktokView?n("tiktokView",e.file,e.idx):Jt(e.file,s=>n("contextMenuClick",{key:`toggle-tag-${s}`},e.file,e.idx),()=>n("tiktokView",e.file,e.idx))},d=()=>{t.magicSwitchTiktokView?n("tiktokView",e.file,e.idx):Wt(e.file,s=>n("contextMenuClick",{key:`toggle-tag-${s}`},e.file,e.idx),()=>n("tiktokView",e.file,e.idx))};return(s,b)=>{const w=G,M=Ze,p=Xe,C=Kt,E=Yt;return l(),F(w,{trigger:["contextmenu"],visible:$(t).longPressOpenContextMenu?typeof s.idx=="number"&&s.showMenuIdx===s.idx:void 0,"onUpdate:visible":b[7]||(b[7]=Q=>typeof s.idx=="number"&&n("update:showMenuIdx",Q?s.idx:-1))},{overlay:A(()=>[s.enableRightClickMenu?(l(),F(He,{key:0,file:s.file,idx:s.idx,"selected-tag":g.value,onContextMenuClick:b[6]||(b[6]=(Q,m,O)=>n("contextMenuClick",Q,m,O)),"is-selected-mutil-files":s.isSelectedMutilFiles},null,8,["file","idx","selected-tag","is-selected-mutil-files"])):y("",!0)]),default:A(()=>{var Q;return[(l(),c("li",{class:W(["file file-item-trigger grid",{clickable:s.file.type==="dir",selected:s.selected}]),"data-idx":s.idx,key:s.file.name,draggable:"true",onDragstart:b[3]||(b[3]=m=>n("dragstart",m,s.idx)),onDragend:b[4]||(b[4]=m=>n("dragend",m,s.idx)),onClickCapture:b[5]||(b[5]=m=>j(m))},[a("div",null,[s.enableCloseIcon?(l(),c("div",{key:0,class:"close-icon",onClick:b[0]||(b[0]=m=>n("close-icon-click"))},[I($(Vt))])):y("",!0),s.enableRightClickMenu?(l(),c("div",ws,[I(w,null,{overlay:A(()=>[I(He,{file:s.file,idx:s.idx,"selected-tag":g.value,onContextMenuClick:b[1]||(b[1]=(m,O,k)=>n("contextMenuClick",m,O,k)),"is-selected-mutil-files":s.isSelectedMutilFiles},null,8,["file","idx","selected-tag","is-selected-mutil-files"])]),default:A(()=>[a("div",Cs,[I($(jt))])]),_:1}),s.file.type==="file"?(l(),F(w,{key:0},{overlay:A(()=>[N.value.length>1?(l(),F(p,{key:0,onClick:b[2]||(b[2]=m=>n("contextMenuClick",m,s.file,s.idx))},{default:A(()=>[(l(!0),c(V,null,x(N.value,m=>(l(),F(M,{key:`toggle-tag-${m.id}`},{default:A(()=>[S(h(m.name)+" ",1),m.selected?(l(),F($(tt),{key:0})):(l(),F($(it),{key:1}))]),_:2},1024))),128))]),_:1})):y("",!0)]),default:A(()=>{var m,O;return[a("div",{class:W(["float-btn-wrap",{"like-selected":(m=T.value)==null?void 0:m.selected}]),onClick:P},[(O=T.value)!=null&&O.selected?(l(),F($(Ht),{key:0})):(l(),F($(xt),{key:1}))],2)]}),_:1})):y("",!0)])):y("",!0),$(fe)(s.file.name)?(l(),c("div",{key:s.file.fullpath,class:W(`idx-${s.idx} item-content`)},[s.enableChangeIndicator&&v.value&&o.value?(l(),F(ks,{key:0,"gen-diff-to-next":v.value,"gen-diff-to-previous":o.value},null,8,["gen-diff-to-next","gen-diff-to-previous"])):y("",!0),I(C,{src:_.value,fallback:$(pi),preview:{src:s.fullScreenPreviewImageUrl,onVisibleChange:(m,O)=>n("previewVisibleChange",m,O)}},null,8,["src","fallback","preview"]),g.value&&s.cellWidth>ee?(l(),c("div",Es,[(l(!0),c(V,null,x(s.extraTags??g.value,m=>(l(),F(E,{key:m.id,color:$(r).getColor(m)},{default:A(()=>[S(h(m.name),1)]),_:2},1032,["color"]))),128))])):y("",!0)],2)):$(Ke)(s.file.name)?(l(),c("div",{key:3,class:W(`idx-${s.idx} item-content video`),url:$(ae)(s.file),style:qe({"background-image":`url('${s.file.cover_url??$(ae)(s.file)}')`}),onClick:u},[a("div",Ps,[a("img",{src:$(_i),style:{width:"40px",height:"40px"}},null,8,Os)]),g.value&&s.cellWidth>ee?(l(),c("div",Ds,[(l(!0),c(V,null,x(g.value,m=>(l(),F(E,{key:m.id,color:$(r).getColor(m)},{default:A(()=>[S(h(m.name),1)]),_:2},1032,["color"]))),128))])):y("",!0)],14,Ts)):$(Ge)(s.file.name)?(l(),c("div",{key:4,class:W(`idx-${s.idx} item-content audio`),onClick:d},[zs,g.value&&s.cellWidth>ee?(l(),c("div",Ns,[(l(!0),c(V,null,x(g.value,m=>(l(),F(E,{key:m.id,color:$(r).getColor(m)},{default:A(()=>[S(h(m.name),1)]),_:2},1032,["color"]))),128))])):y("",!0)],2)):(l(),c("div",Qs,[s.file.type==="file"?(l(),F($(ni),{key:0,class:"icon center"})):(Q=s.coverFiles)!=null&&Q.length&&s.cellWidth>160?(l(),c("div",Ms,[(l(!0),c(V,null,x(s.coverFiles,m=>(l(),c("img",{class:"dir-cover-item",src:m.media_type==="image"?$(Ne)(m):$(ae)(m),key:m.fullpath},null,8,$s))),128))])):(l(),F($(li),{key:2,class:"icon center"}))])),s.cellWidth>ee?(l(),c("div",Bs,[a("div",{class:"name line-clamp-1",title:s.file.name},h(s.file.name),9,Fs),a("div",Rs,[a("div",Ls,h(s.file.type)+" "+h(s.file.size),1),a("div",null,h(s.file.date),1)])])):y("",!0)])],42,Is))]}),_:1},8,["visible"])}}});const rr=et(Vs,[["__scopeId","data-v-0f74bba6"]]);export{rr as F,Gs as N,He as _,Ys as a,sr as b,nr as c,at as d,ir as e,Ii as f,K as g,Xs as h,tr as i,Zs as j,er as k,gi as r,qs as s,Ci as t,re as u}; diff --git a/vue/dist/assets/FileItem-805913ea.css b/vue/dist/assets/FileItem-d0ea10d7.css similarity index 65% rename from vue/dist/assets/FileItem-805913ea.css rename to vue/dist/assets/FileItem-d0ea10d7.css index ee9b41a..fc0793b 100644 --- a/vue/dist/assets/FileItem-805913ea.css +++ b/vue/dist/assets/FileItem-d0ea10d7.css @@ -1 +1 @@ -.vue-recycle-scroller{position:relative}.vue-recycle-scroller.direction-vertical:not(.page-mode){overflow-y:auto}.vue-recycle-scroller.direction-horizontal:not(.page-mode){overflow-x:auto}.vue-recycle-scroller.direction-horizontal{display:flex}.vue-recycle-scroller__slot{flex:auto 0 0}.vue-recycle-scroller__item-wrapper{flex:1;box-sizing:border-box;overflow:hidden;position:relative}.vue-recycle-scroller.ready .vue-recycle-scroller__item-view{position:absolute;top:0;left:0;will-change:transform}.vue-recycle-scroller.direction-vertical .vue-recycle-scroller__item-wrapper{width:100%}.vue-recycle-scroller.direction-horizontal .vue-recycle-scroller__item-wrapper{height:100%}.vue-recycle-scroller.ready.direction-vertical .vue-recycle-scroller__item-view{width:100%}.vue-recycle-scroller.ready.direction-horizontal .vue-recycle-scroller__item-view{height:100%}.resize-observer[data-v-b329ee4c]{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;border:none;background-color:transparent;pointer-events:none;display:block;overflow:hidden;opacity:0}.resize-observer[data-v-b329ee4c] object{display:block;position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1}.ant-tag{box-sizing:border-box;margin:0 8px 0 0;color:#000000d9;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;font-feature-settings:"tnum";display:inline-block;height:auto;padding:0 7px;font-size:12px;line-height:20px;white-space:nowrap;background:#fafafa;border:1px solid #d9d9d9;border-radius:2px;opacity:1;transition:all .3s}.ant-tag,.ant-tag a,.ant-tag a:hover{color:#000000d9}.ant-tag>a:first-child:last-child{display:inline-block;margin:0 -8px;padding:0 8px}.ant-tag-close-icon{margin-left:3px;color:#00000073;font-size:10px;cursor:pointer;transition:all .3s}.ant-tag-close-icon:hover{color:#000000d9}.ant-tag-has-color{border-color:transparent}.ant-tag-has-color,.ant-tag-has-color a,.ant-tag-has-color a:hover,.ant-tag-has-color .anticon-close,.ant-tag-has-color .anticon-close:hover{color:#fff}.ant-tag-checkable{background-color:transparent;border-color:transparent;cursor:pointer}.ant-tag-checkable:not(.ant-tag-checkable-checked):hover{color:#d03f0a}.ant-tag-checkable:active,.ant-tag-checkable-checked{color:#fff}.ant-tag-checkable-checked{background-color:#d03f0a}.ant-tag-checkable:active{background-color:#ab2800}.ant-tag-hidden{display:none}.ant-tag-pink{color:#c41d7f;background:#fff0f6;border-color:#ffadd2}.ant-tag-pink-inverse{color:#fff;background:#eb2f96;border-color:#eb2f96}.ant-tag-magenta{color:#c41d7f;background:#fff0f6;border-color:#ffadd2}.ant-tag-magenta-inverse{color:#fff;background:#eb2f96;border-color:#eb2f96}.ant-tag-red{color:#cf1322;background:#fff1f0;border-color:#ffa39e}.ant-tag-red-inverse{color:#fff;background:#f5222d;border-color:#f5222d}.ant-tag-volcano{color:#d4380d;background:#fff2e8;border-color:#ffbb96}.ant-tag-volcano-inverse{color:#fff;background:#fa541c;border-color:#fa541c}.ant-tag-orange{color:#d46b08;background:#fff7e6;border-color:#ffd591}.ant-tag-orange-inverse{color:#fff;background:#fa8c16;border-color:#fa8c16}.ant-tag-yellow{color:#d4b106;background:#feffe6;border-color:#fffb8f}.ant-tag-yellow-inverse{color:#fff;background:#fadb14;border-color:#fadb14}.ant-tag-gold{color:#d48806;background:#fffbe6;border-color:#ffe58f}.ant-tag-gold-inverse{color:#fff;background:#faad14;border-color:#faad14}.ant-tag-cyan{color:#08979c;background:#e6fffb;border-color:#87e8de}.ant-tag-cyan-inverse{color:#fff;background:#13c2c2;border-color:#13c2c2}.ant-tag-lime{color:#7cb305;background:#fcffe6;border-color:#eaff8f}.ant-tag-lime-inverse{color:#fff;background:#a0d911;border-color:#a0d911}.ant-tag-green{color:#389e0d;background:#f6ffed;border-color:#b7eb8f}.ant-tag-green-inverse{color:#fff;background:#52c41a;border-color:#52c41a}.ant-tag-blue{color:#096dd9;background:#e6f7ff;border-color:#91d5ff}.ant-tag-blue-inverse{color:#fff;background:#1890ff;border-color:#1890ff}.ant-tag-geekblue{color:#1d39c4;background:#f0f5ff;border-color:#adc6ff}.ant-tag-geekblue-inverse{color:#fff;background:#2f54eb;border-color:#2f54eb}.ant-tag-purple{color:#531dab;background:#f9f0ff;border-color:#d3adf7}.ant-tag-purple-inverse{color:#fff;background:#722ed1;border-color:#722ed1}.ant-tag-success{color:#52c41a;background:#f6ffed;border-color:#b7eb8f}.ant-tag-processing{color:#d03f0a;background:#fff1e6;border-color:#f7ae83}.ant-tag-error{color:#ff4d4f;background:#fff2f0;border-color:#ffccc7}.ant-tag-warning{color:#faad14;background:#fffbe6;border-color:#ffe58f}.ant-tag>.anticon+span,.ant-tag>span+.anticon{margin-left:7px}.ant-tag.ant-tag-rtl{margin-right:0;margin-left:8px;direction:rtl;text-align:right}.ant-tag-rtl .ant-tag-close-icon{margin-right:3px;margin-left:0}.ant-tag-rtl.ant-tag>.anticon+span,.ant-tag-rtl.ant-tag>span+.anticon{margin-right:7px;margin-left:0}.changeIndicators[data-v-78cd67a3]{position:absolute;display:flex;flex-direction:column;height:100%;align-items:center;justify-content:center;opacity:.6}.changeIndicatorsRight[data-v-78cd67a3]{position:absolute;right:0}.changeIndicator[data-v-78cd67a3]{margin-left:-4px;width:16px;height:16px;border-radius:2px;border:1px solid rgba(255,255,255,.2);background-color:gray;line-height:16px;margin-bottom:2px;text-align:center;font-size:6pt;font-weight:600;color:#000;z-index:9999;pointer-events:auto;box-shadow:0 0 4px #00000080}.changeIndicatorsRight .changeIndicator[data-v-78cd67a3]{margin-right:-4px;border-top-right-radius:8px;border-bottom-right-radius:8px;text-align:left;padding-left:2px}.changeIndicatorsLeft .changeIndicator[data-v-78cd67a3]{border-top-left-radius:8px;border-bottom-left-radius:8px;text-align:right;padding-right:2px}.changeIndicatorWrapper[data-v-78cd67a3]{top:0;position:absolute;user-select:none;width:100%;height:100%;z-index:999999;pointer-events:none}.hoverOverlay[data-v-78cd67a3]{display:none;background-color:#000c;color:#fff;border:1px solid gray;padding:10px 20px;border-radius:5px;z-index:100;opacity:1;font-size:8pt;line-height:1.2;overflow:hidden}.hoverOverlay ul[data-v-78cd67a3]{list-style:none;padding:0}.hoverOverlay ul li[data-v-78cd67a3]{display:inline-block;padding-left:4px;padding-right:4px;border:1px solid gray;border-radius:2px;margin:1px;font-weight:200}.changeIndicators[data-v-78cd67a3]:hover{opacity:1}.changeIndicators:hover+div.hoverOverlay[data-v-78cd67a3]{display:block;position:absolute;top:0;left:0;width:100%;height:100%}table tr td:first-child span[data-v-78cd67a3]{padding:1px 3px;display:inline-block;width:100%}table tr td[data-v-78cd67a3]:first-child{padding-right:10px;vertical-align:top}.otherChangeIndicator[data-v-78cd67a3]{background-color:#8b5b8e;color:#efefef}.stepsChangeIndicator[data-v-78cd67a3]{background-color:#577ab8;color:#efefef}.seedChangeIndicator[data-v-78cd67a3]{background-color:#649da3;color:#121}.negpromptChangeIndicator[data-v-78cd67a3]{background-color:#d8a390;color:#2f2f2f}.modelChangeIndicator[data-v-78cd67a3]{background-color:#d68679;color:#efefef}.promptChangeIndicator[data-v-78cd67a3]{background-color:#8fba99;color:#121}.cfgChangeIndicator[data-v-78cd67a3]{background-color:#d4c98f;color:#121}.sizeChangeIndicator[data-v-78cd67a3]{background-color:#678a6c;color:#efefef}.center[data-v-0f74bba6]{display:flex;justify-content:center;align-items:center}.item-content[data-v-0f74bba6]{position:relative}.item-content.video[data-v-0f74bba6]{background-color:var(--zp-border);border-radius:8px;overflow:hidden;width:var(--5a16e08d);height:var(--5a16e08d);background-size:cover;background-position:center;cursor:pointer}.item-content.audio[data-v-0f74bba6]{background:linear-gradient(135deg,#1a1a2e 0%,#16213e 50%,#0f3460 100%);border-radius:8px;overflow:hidden;width:var(--5a16e08d);height:var(--5a16e08d);display:flex;align-items:center;justify-content:center;cursor:pointer}.item-content.audio .audio-icon[data-v-0f74bba6]{font-size:48px}.item-content .play-icon[data-v-0f74bba6]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);border-radius:100%;display:flex}.item-content .tags-container[data-v-0f74bba6]{position:absolute;right:8px;bottom:8px;display:flex;width:calc(100% - 16px);flex-wrap:wrap-reverse;flex-direction:row-reverse}.item-content .tags-container>*[data-v-0f74bba6]{margin:0 0 4px 4px;font-size:14px;line-height:1.6}.close-icon[data-v-0f74bba6]{position:absolute;top:0;right:0;transform:translate(50%,-50%) scale(1.5);cursor:pointer;z-index:100;border-radius:100%;overflow:hidden;line-height:1;background-color:var(--zp-primary-background)}.file[data-v-0f74bba6]{padding:8px 16px;margin:8px;display:flex;align-items:center;background:var(--zp-primary-background);border-radius:8px;box-shadow:0 0 4px var(--zp-secondary-variant-background);position:relative}.file:hover .more[data-v-0f74bba6]{opacity:1}.file .more[data-v-0f74bba6]{opacity:0;transition:all .3s ease;position:absolute;top:4px;right:4px;z-index:100;display:flex;align-items:center;justify-content:center;flex-direction:column;line-height:1em}.file .more .float-btn-wrap[data-v-0f74bba6]{font-size:1.5em;cursor:pointer;font-size:500;padding:4px;border-radius:100vh;color:#fff;background:var(--zp-icon-bg);margin-bottom:4px}.file .more .float-btn-wrap.like-selected[data-v-0f74bba6]{color:#df0505}.file.grid[data-v-0f74bba6]{padding:0;display:inline-block;box-sizing:content-box;box-shadow:unset;background-color:var(--zp-secondary-background)}.file.grid[data-v-0f74bba6] .icon{font-size:8em}.file.grid[data-v-0f74bba6] .profile{padding:0 4px}.file.grid[data-v-0f74bba6] .profile .name{font-weight:500;padding:0}.file.grid[data-v-0f74bba6] .profile .basic-info{display:flex;justify-content:space-between;flex-direction:row;margin:0;font-size:.7em}.file.grid[data-v-0f74bba6] .profile .basic-info *{white-space:nowrap;overflow:hidden}.file.grid[data-v-0f74bba6] .ant-image,.file.grid[data-v-0f74bba6] .preview-icon-wrap{border:1px solid var(--zp-secondary);background-color:var(--zp-secondary-variant-background);border-radius:8px;overflow:hidden}.file.grid[data-v-0f74bba6] img:not(.dir-cover-item),.file.grid[data-v-0f74bba6] .dir-cover-container,.file.grid[data-v-0f74bba6] .preview-icon-wrap>[role=img]{height:var(--5a16e08d);width:var(--5a16e08d);object-fit:contain}.file.clickable[data-v-0f74bba6]{cursor:pointer}.file.selected[data-v-0f74bba6]{outline:#0084ff solid 2px}.file .name[data-v-0f74bba6]{flex:1;padding:8px;word-break:break-all}.file .basic-info[data-v-0f74bba6]{overflow:hidden;display:flex;flex-direction:column;align-items:flex-end}.file .dir-cover-container[data-v-0f74bba6]{top:0;display:flex;flex-wrap:wrap;padding:4px}.file .dir-cover-container>img[data-v-0f74bba6]{width:calc(50% - 8px);height:calc(50% - 8px);margin:4px;object-fit:cover;border-radius:8px;overflow:hidden} +.vue-recycle-scroller{position:relative}.vue-recycle-scroller.direction-vertical:not(.page-mode){overflow-y:auto}.vue-recycle-scroller.direction-horizontal:not(.page-mode){overflow-x:auto}.vue-recycle-scroller.direction-horizontal{display:flex}.vue-recycle-scroller__slot{flex:auto 0 0}.vue-recycle-scroller__item-wrapper{flex:1;box-sizing:border-box;overflow:hidden;position:relative}.vue-recycle-scroller.ready .vue-recycle-scroller__item-view{position:absolute;top:0;left:0;will-change:transform}.vue-recycle-scroller.direction-vertical .vue-recycle-scroller__item-wrapper{width:100%}.vue-recycle-scroller.direction-horizontal .vue-recycle-scroller__item-wrapper{height:100%}.vue-recycle-scroller.ready.direction-vertical .vue-recycle-scroller__item-view{width:100%}.vue-recycle-scroller.ready.direction-horizontal .vue-recycle-scroller__item-view{height:100%}.resize-observer[data-v-b329ee4c]{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;border:none;background-color:transparent;pointer-events:none;display:block;overflow:hidden;opacity:0}.resize-observer[data-v-b329ee4c] object{display:block;position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1}.changeIndicators[data-v-78cd67a3]{position:absolute;display:flex;flex-direction:column;height:100%;align-items:center;justify-content:center;opacity:.6}.changeIndicatorsRight[data-v-78cd67a3]{position:absolute;right:0}.changeIndicator[data-v-78cd67a3]{margin-left:-4px;width:16px;height:16px;border-radius:2px;border:1px solid rgba(255,255,255,.2);background-color:gray;line-height:16px;margin-bottom:2px;text-align:center;font-size:6pt;font-weight:600;color:#000;z-index:9999;pointer-events:auto;box-shadow:0 0 4px #00000080}.changeIndicatorsRight .changeIndicator[data-v-78cd67a3]{margin-right:-4px;border-top-right-radius:8px;border-bottom-right-radius:8px;text-align:left;padding-left:2px}.changeIndicatorsLeft .changeIndicator[data-v-78cd67a3]{border-top-left-radius:8px;border-bottom-left-radius:8px;text-align:right;padding-right:2px}.changeIndicatorWrapper[data-v-78cd67a3]{top:0;position:absolute;user-select:none;width:100%;height:100%;z-index:999999;pointer-events:none}.hoverOverlay[data-v-78cd67a3]{display:none;background-color:#000c;color:#fff;border:1px solid gray;padding:10px 20px;border-radius:5px;z-index:100;opacity:1;font-size:8pt;line-height:1.2;overflow:hidden}.hoverOverlay ul[data-v-78cd67a3]{list-style:none;padding:0}.hoverOverlay ul li[data-v-78cd67a3]{display:inline-block;padding-left:4px;padding-right:4px;border:1px solid gray;border-radius:2px;margin:1px;font-weight:200}.changeIndicators[data-v-78cd67a3]:hover{opacity:1}.changeIndicators:hover+div.hoverOverlay[data-v-78cd67a3]{display:block;position:absolute;top:0;left:0;width:100%;height:100%}table tr td:first-child span[data-v-78cd67a3]{padding:1px 3px;display:inline-block;width:100%}table tr td[data-v-78cd67a3]:first-child{padding-right:10px;vertical-align:top}.otherChangeIndicator[data-v-78cd67a3]{background-color:#8b5b8e;color:#efefef}.stepsChangeIndicator[data-v-78cd67a3]{background-color:#577ab8;color:#efefef}.seedChangeIndicator[data-v-78cd67a3]{background-color:#649da3;color:#121}.negpromptChangeIndicator[data-v-78cd67a3]{background-color:#d8a390;color:#2f2f2f}.modelChangeIndicator[data-v-78cd67a3]{background-color:#d68679;color:#efefef}.promptChangeIndicator[data-v-78cd67a3]{background-color:#8fba99;color:#121}.cfgChangeIndicator[data-v-78cd67a3]{background-color:#d4c98f;color:#121}.sizeChangeIndicator[data-v-78cd67a3]{background-color:#678a6c;color:#efefef}.center[data-v-0f74bba6]{display:flex;justify-content:center;align-items:center}.item-content[data-v-0f74bba6]{position:relative}.item-content.video[data-v-0f74bba6]{background-color:var(--zp-border);border-radius:8px;overflow:hidden;width:var(--5a16e08d);height:var(--5a16e08d);background-size:cover;background-position:center;cursor:pointer}.item-content.audio[data-v-0f74bba6]{background:linear-gradient(135deg,#1a1a2e 0%,#16213e 50%,#0f3460 100%);border-radius:8px;overflow:hidden;width:var(--5a16e08d);height:var(--5a16e08d);display:flex;align-items:center;justify-content:center;cursor:pointer}.item-content.audio .audio-icon[data-v-0f74bba6]{font-size:48px}.item-content .play-icon[data-v-0f74bba6]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);border-radius:100%;display:flex}.item-content .tags-container[data-v-0f74bba6]{position:absolute;right:8px;bottom:8px;display:flex;width:calc(100% - 16px);flex-wrap:wrap-reverse;flex-direction:row-reverse}.item-content .tags-container>*[data-v-0f74bba6]{margin:0 0 4px 4px;font-size:14px;line-height:1.6}.close-icon[data-v-0f74bba6]{position:absolute;top:0;right:0;transform:translate(50%,-50%) scale(1.5);cursor:pointer;z-index:100;border-radius:100%;overflow:hidden;line-height:1;background-color:var(--zp-primary-background)}.file[data-v-0f74bba6]{padding:8px 16px;margin:8px;display:flex;align-items:center;background:var(--zp-primary-background);border-radius:8px;box-shadow:0 0 4px var(--zp-secondary-variant-background);position:relative}.file:hover .more[data-v-0f74bba6]{opacity:1}.file .more[data-v-0f74bba6]{opacity:0;transition:all .3s ease;position:absolute;top:4px;right:4px;z-index:100;display:flex;align-items:center;justify-content:center;flex-direction:column;line-height:1em}.file .more .float-btn-wrap[data-v-0f74bba6]{font-size:1.5em;cursor:pointer;font-size:500;padding:4px;border-radius:100vh;color:#fff;background:var(--zp-icon-bg);margin-bottom:4px}.file .more .float-btn-wrap.like-selected[data-v-0f74bba6]{color:#df0505}.file.grid[data-v-0f74bba6]{padding:0;display:inline-block;box-sizing:content-box;box-shadow:unset;background-color:var(--zp-secondary-background)}.file.grid[data-v-0f74bba6] .icon{font-size:8em}.file.grid[data-v-0f74bba6] .profile{padding:0 4px}.file.grid[data-v-0f74bba6] .profile .name{font-weight:500;padding:0}.file.grid[data-v-0f74bba6] .profile .basic-info{display:flex;justify-content:space-between;flex-direction:row;margin:0;font-size:.7em}.file.grid[data-v-0f74bba6] .profile .basic-info *{white-space:nowrap;overflow:hidden}.file.grid[data-v-0f74bba6] .ant-image,.file.grid[data-v-0f74bba6] .preview-icon-wrap{border:1px solid var(--zp-secondary);background-color:var(--zp-secondary-variant-background);border-radius:8px;overflow:hidden}.file.grid[data-v-0f74bba6] img:not(.dir-cover-item),.file.grid[data-v-0f74bba6] .dir-cover-container,.file.grid[data-v-0f74bba6] .preview-icon-wrap>[role=img]{height:var(--5a16e08d);width:var(--5a16e08d);object-fit:contain}.file.clickable[data-v-0f74bba6]{cursor:pointer}.file.selected[data-v-0f74bba6]{outline:#0084ff solid 2px}.file .name[data-v-0f74bba6]{flex:1;padding:8px;word-break:break-all}.file .basic-info[data-v-0f74bba6]{overflow:hidden;display:flex;flex-direction:column;align-items:flex-end}.file .dir-cover-container[data-v-0f74bba6]{top:0;display:flex;flex-wrap:wrap;padding:4px}.file .dir-cover-container>img[data-v-0f74bba6]{width:calc(50% - 8px);height:calc(50% - 8px);margin:4px;object-fit:cover;border-radius:8px;overflow:hidden} diff --git a/vue/dist/assets/ImgSliPagePane-786cf7f6.js b/vue/dist/assets/ImgSliPagePane-9e993fca.js similarity index 64% rename from vue/dist/assets/ImgSliPagePane-786cf7f6.js rename to vue/dist/assets/ImgSliPagePane-9e993fca.js index 0bb056d..6399f81 100644 --- a/vue/dist/assets/ImgSliPagePane-786cf7f6.js +++ b/vue/dist/assets/ImgSliPagePane-9e993fca.js @@ -1 +1 @@ -import{d as a,U as t,V as s,c as n,cD as _,a0 as o}from"./index-5ed9cd5a.js";const c={class:"img-sli-container"},i=a({__name:"ImgSliPagePane",props:{paneIdx:{},tabIdx:{},left:{},right:{}},setup(l){return(e,r)=>(t(),s("div",c,[n(_,{left:e.left,right:e.right},null,8,["left","right"])]))}});const d=o(i,[["__scopeId","data-v-ae3fb9a8"]]);export{d as default}; +import{d as a,U as t,V as s,c as n,cN as _,a0 as o}from"./index-8b1d4076.js";const c={class:"img-sli-container"},i=a({__name:"ImgSliPagePane",props:{paneIdx:{},tabIdx:{},left:{},right:{}},setup(l){return(e,r)=>(t(),s("div",c,[n(_,{left:e.left,right:e.right},null,8,["left","right"])]))}});const d=o(i,[["__scopeId","data-v-ae3fb9a8"]]);export{d as default}; diff --git a/vue/dist/assets/MatchedImageGrid-0b5a42ca.js b/vue/dist/assets/MatchedImageGrid-0b5a42ca.js new file mode 100644 index 0000000..f535ed2 --- /dev/null +++ b/vue/dist/assets/MatchedImageGrid-0b5a42ca.js @@ -0,0 +1 @@ +import{d as ke,r as he,m as C,az as B,a1 as ve,U as u,V as S,c as n,a4 as e,a3 as o,a6 as G,W as d,L as we,Y as a,X as p,a2 as U,af as Ie,aT as _e,$ as b,ag as E,ai as Ce,T as Se,ak as L,aP as be,aQ as ye,bE as xe,a0 as Me}from"./index-8b1d4076.js";import{S as Te}from"./index-2ee82e1b.js";import{_ as Ae}from"./index-19cfb514.js";import{o as N,L as Ve,R as $e,f as De,M as Fe}from"./MultiSelectKeep-4ce030ff.js";import{c as Re,d as ze,F as Be}from"./FileItem-5c27aa5d.js";import{c as Ge,u as Ue}from"./hook-3db965e4.js";import"./shortcut-d7b854eb.js";import"./Checkbox-8b8e8d31.js";/* empty css */import"./index-fd0b9b75.js";import"./index-133a27d3.js";import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-26786c56.js";import"./_isIterateeCall-4f946453.js";import"./index-404f2353.js";import"./useGenInfoDiff-068a10f2.js";const Ee=c=>(be("data-v-4815fec6"),c=c(),ye(),c),Le={class:"hint"},Ne={class:"action-bar"},Pe=Ee(()=>d("div",{style:{padding:"16px 0 512px"}},null,-1)),Je={key:1},We={class:"no-res-hint"},Ke={class:"hint"},Oe={key:2,class:"preview-switch"},qe=ke({__name:"MatchedImageGrid",props:{tabIdx:{},paneIdx:{},selectedTagIds:{},id:{}},setup(c){const k=c,m=he(!1),g=Ge(t=>xe({...k.selectedTagIds,random_sort:m.value},t)),{queue:P,images:s,onContextMenuClickU:y,stackViewEl:J,previewIdx:r,previewing:x,onPreviewVisibleChange:W,previewImgMove:M,canPreview:T,itemSize:A,gridItems:K,showGenInfo:f,imageGenInfo:V,q:O,multiSelectedIdxs:h,onFileItemClick:q,scroller:v,showMenuIdx:w,onFileDragStart:Q,onFileDragEnd:X,cellWidth:Y,onScroll:I,saveAllFileAsJson:j,props:H,saveLoadedFileAsJson:Z,changeIndchecked:ee,seedChangeChecked:te,getGenDiff:le,getGenDiffWatchDep:ne}=Ue(g);C(()=>k.selectedTagIds,async()=>{var t;await g.reset(),await B(),(t=v.value)==null||t.scrollToItem(0),I()},{immediate:!0}),C(m,async()=>{var t;await g.reset(),await B(),(t=v.value)==null||t.scrollToItem(0),I()}),C(()=>k,async t=>{H.value=t},{deep:!0,immediate:!0});const se=ve(),{onClearAllSelected:ie,onSelectAll:oe,onReverseSelect:ae}=Re(),de=()=>{s.value.length!==0&&N(s.value,0)};return(t,l)=>{const ce=Fe,re=Ce,ue=Se,pe=Ae,_=L,me=L,ge=Te;return u(),S("div",{class:"container",ref_key:"stackViewEl",ref:J},[n(ce,{show:!!e(h).length||e(se).keepMultiSelect,onClearAllSelected:e(ie),onSelectAll:e(oe),onReverseSelect:e(ae)},null,8,["show","onClearAllSelected","onSelectAll","onReverseSelect"]),n(ge,{size:"large",spinning:!e(P).isIdle},{default:o(()=>{var $,D,F;return[n(ue,{visible:e(f),"onUpdate:visible":l[1]||(l[1]=i=>G(f)?f.value=i:null),width:"70vw","mask-closable":"",onOk:l[2]||(l[2]=i=>f.value=!1)},{cancelText:o(()=>[]),default:o(()=>[n(re,{active:"",loading:!e(O).isIdle},{default:o(()=>[d("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:l[0]||(l[0]=i=>e(we)(e(V)))},[d("div",Le,a(t.$t("doubleClickToCopy")),1),p(" "+a(e(V)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),d("div",Ne,[n(pe,{checked:m.value,"onUpdate:checked":l[3]||(l[3]=i=>m.value=i),"checked-children":t.$t("randomSort"),"un-checked-children":t.$t("sortByDate")},null,8,["checked","checked-children","un-checked-children"]),n(_,{onClick:de,disabled:!(($=e(s))!=null&&$.length)},{default:o(()=>[p(a(t.$t("tiktokView")),1)]),_:1},8,["disabled"]),n(_,{onClick:e(Z)},{default:o(()=>[p(a(t.$t("saveLoadedImageAsJson")),1)]),_:1},8,["onClick"]),n(_,{onClick:e(j)},{default:o(()=>[p(a(t.$t("saveAllAsJson")),1)]),_:1},8,["onClick"])]),(D=e(s))!=null&&D.length?(u(),U(e(ze),{key:0,ref_key:"scroller",ref:v,class:"file-list",items:e(s),"item-size":e(A).first,"key-field":"fullpath","item-secondary-size":e(A).second,gridItems:e(K),onScroll:e(I)},{after:o(()=>[Pe]),default:o(({item:i,index:R})=>[n(Be,{idx:R,file:i,"cell-width":e(Y),"show-menu-idx":e(w),"onUpdate:showMenuIdx":l[4]||(l[4]=z=>G(w)?w.value=z:null),onDragstart:e(Q),onDragend:e(X),onFileItemClick:e(q),onTiktokView:(z,fe)=>e(N)(e(s),fe),"full-screen-preview-image-url":e(s)[e(r)]?e(Ie)(e(s)[e(r)]):"",selected:e(h).includes(R),onContextMenuClick:e(y),onPreviewVisibleChange:e(W),"is-selected-mutil-files":e(h).length>1,"enable-change-indicator":e(ee),"seed-change-checked":e(te),"get-gen-diff":e(le),"get-gen-diff-watch-dep":e(ne)},null,8,["idx","file","cell-width","show-menu-idx","onDragstart","onDragend","onFileItemClick","onTiktokView","full-screen-preview-image-url","selected","onContextMenuClick","onPreviewVisibleChange","is-selected-mutil-files","enable-change-indicator","seed-change-checked","get-gen-diff","get-gen-diff-watch-dep"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"])):e(g).load&&t.selectedTagIds.and_tags.length===1&&!((F=t.selectedTagIds.folder_paths_str)!=null&&F.trim())?(u(),S("div",Je,[d("div",We,[d("p",Ke,a(t.$t("tagSearchNoResultsMessage")),1),n(me,{onClick:l[5]||(l[5]=i=>e(_e)()),type:"primary"},{default:o(()=>[p(a(t.$t("rebuildImageIndex")),1)]),_:1})])])):b("",!0),e(x)?(u(),S("div",Oe,[n(e(Ve),{onClick:l[6]||(l[6]=i=>e(M)("prev")),class:E({disable:!e(T)("prev")})},null,8,["class"]),n(e($e),{onClick:l[7]||(l[7]=i=>e(M)("next")),class:E({disable:!e(T)("next")})},null,8,["class"])])):b("",!0)]}),_:1},8,["spinning"]),e(x)&&e(s)&&e(s)[e(r)]?(u(),U(De,{key:0,file:e(s)[e(r)],idx:e(r),onContextMenuClick:e(y)},null,8,["file","idx","onContextMenuClick"])):b("",!0)],512)}}});const ct=Me(qe,[["__scopeId","data-v-4815fec6"]]);export{ct as default}; diff --git a/vue/dist/assets/MatchedImageGrid-179bc6f4.js b/vue/dist/assets/MatchedImageGrid-179bc6f4.js deleted file mode 100644 index 2b7a991..0000000 --- a/vue/dist/assets/MatchedImageGrid-179bc6f4.js +++ /dev/null @@ -1 +0,0 @@ -import{d as ke,r as he,m as C,az as B,a1 as ve,U as u,V as S,c as n,a4 as e,a3 as o,a6 as G,W as d,L as we,Y as a,X as p,a2 as U,af as Ie,aT as _e,$ as b,ag as E,ai as Ce,T as Se,ak as L,aP as be,aQ as ye,bE as xe,a0 as Me}from"./index-5ed9cd5a.js";import{S as Te}from"./index-20b432d5.js";import{_ as Ae}from"./index-4e015155.js";import{o as N,L as Ve,R as $e,f as De,M as Fe}from"./MultiSelectKeep-68ce9bb5.js";import{c as Re,d as ze,F as Be}from"./FileItem-2ecfe4d5.js";import{c as Ge,u as Ue}from"./hook-d4530521.js";import"./shortcut-bf073698.js";import"./Checkbox-bbe5a1a5.js";/* empty css */import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-47577760.js";import"./index-7cbf21fe.js";import"./_isIterateeCall-cd370691.js";import"./useGenInfoDiff-b31dce1f.js";const Ee=c=>(be("data-v-4815fec6"),c=c(),ye(),c),Le={class:"hint"},Ne={class:"action-bar"},Pe=Ee(()=>d("div",{style:{padding:"16px 0 512px"}},null,-1)),Je={key:1},We={class:"no-res-hint"},Ke={class:"hint"},Oe={key:2,class:"preview-switch"},qe=ke({__name:"MatchedImageGrid",props:{tabIdx:{},paneIdx:{},selectedTagIds:{},id:{}},setup(c){const k=c,m=he(!1),g=Ge(t=>xe({...k.selectedTagIds,random_sort:m.value},t)),{queue:P,images:s,onContextMenuClickU:y,stackViewEl:J,previewIdx:r,previewing:x,onPreviewVisibleChange:W,previewImgMove:M,canPreview:T,itemSize:A,gridItems:K,showGenInfo:f,imageGenInfo:V,q:O,multiSelectedIdxs:h,onFileItemClick:q,scroller:v,showMenuIdx:w,onFileDragStart:Q,onFileDragEnd:X,cellWidth:Y,onScroll:I,saveAllFileAsJson:j,props:H,saveLoadedFileAsJson:Z,changeIndchecked:ee,seedChangeChecked:te,getGenDiff:le,getGenDiffWatchDep:ne}=Ue(g);C(()=>k.selectedTagIds,async()=>{var t;await g.reset(),await B(),(t=v.value)==null||t.scrollToItem(0),I()},{immediate:!0}),C(m,async()=>{var t;await g.reset(),await B(),(t=v.value)==null||t.scrollToItem(0),I()}),C(()=>k,async t=>{H.value=t},{deep:!0,immediate:!0});const se=ve(),{onClearAllSelected:ie,onSelectAll:oe,onReverseSelect:ae}=Re(),de=()=>{s.value.length!==0&&N(s.value,0)};return(t,l)=>{const ce=Fe,re=Ce,ue=Se,pe=Ae,_=L,me=L,ge=Te;return u(),S("div",{class:"container",ref_key:"stackViewEl",ref:J},[n(ce,{show:!!e(h).length||e(se).keepMultiSelect,onClearAllSelected:e(ie),onSelectAll:e(oe),onReverseSelect:e(ae)},null,8,["show","onClearAllSelected","onSelectAll","onReverseSelect"]),n(ge,{size:"large",spinning:!e(P).isIdle},{default:o(()=>{var $,D,F;return[n(ue,{visible:e(f),"onUpdate:visible":l[1]||(l[1]=i=>G(f)?f.value=i:null),width:"70vw","mask-closable":"",onOk:l[2]||(l[2]=i=>f.value=!1)},{cancelText:o(()=>[]),default:o(()=>[n(re,{active:"",loading:!e(O).isIdle},{default:o(()=>[d("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:l[0]||(l[0]=i=>e(we)(e(V)))},[d("div",Le,a(t.$t("doubleClickToCopy")),1),p(" "+a(e(V)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),d("div",Ne,[n(pe,{checked:m.value,"onUpdate:checked":l[3]||(l[3]=i=>m.value=i),"checked-children":t.$t("randomSort"),"un-checked-children":t.$t("sortByDate")},null,8,["checked","checked-children","un-checked-children"]),n(_,{onClick:de,disabled:!(($=e(s))!=null&&$.length)},{default:o(()=>[p(a(t.$t("tiktokView")),1)]),_:1},8,["disabled"]),n(_,{onClick:e(Z)},{default:o(()=>[p(a(t.$t("saveLoadedImageAsJson")),1)]),_:1},8,["onClick"]),n(_,{onClick:e(j)},{default:o(()=>[p(a(t.$t("saveAllAsJson")),1)]),_:1},8,["onClick"])]),(D=e(s))!=null&&D.length?(u(),U(e(ze),{key:0,ref_key:"scroller",ref:v,class:"file-list",items:e(s),"item-size":e(A).first,"key-field":"fullpath","item-secondary-size":e(A).second,gridItems:e(K),onScroll:e(I)},{after:o(()=>[Pe]),default:o(({item:i,index:R})=>[n(Be,{idx:R,file:i,"cell-width":e(Y),"show-menu-idx":e(w),"onUpdate:showMenuIdx":l[4]||(l[4]=z=>G(w)?w.value=z:null),onDragstart:e(Q),onDragend:e(X),onFileItemClick:e(q),onTiktokView:(z,fe)=>e(N)(e(s),fe),"full-screen-preview-image-url":e(s)[e(r)]?e(Ie)(e(s)[e(r)]):"",selected:e(h).includes(R),onContextMenuClick:e(y),onPreviewVisibleChange:e(W),"is-selected-mutil-files":e(h).length>1,"enable-change-indicator":e(ee),"seed-change-checked":e(te),"get-gen-diff":e(le),"get-gen-diff-watch-dep":e(ne)},null,8,["idx","file","cell-width","show-menu-idx","onDragstart","onDragend","onFileItemClick","onTiktokView","full-screen-preview-image-url","selected","onContextMenuClick","onPreviewVisibleChange","is-selected-mutil-files","enable-change-indicator","seed-change-checked","get-gen-diff","get-gen-diff-watch-dep"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"])):e(g).load&&t.selectedTagIds.and_tags.length===1&&!((F=t.selectedTagIds.folder_paths_str)!=null&&F.trim())?(u(),S("div",Je,[d("div",We,[d("p",Ke,a(t.$t("tagSearchNoResultsMessage")),1),n(me,{onClick:l[5]||(l[5]=i=>e(_e)()),type:"primary"},{default:o(()=>[p(a(t.$t("rebuildImageIndex")),1)]),_:1})])])):b("",!0),e(x)?(u(),S("div",Oe,[n(e(Ve),{onClick:l[6]||(l[6]=i=>e(M)("prev")),class:E({disable:!e(T)("prev")})},null,8,["class"]),n(e($e),{onClick:l[7]||(l[7]=i=>e(M)("next")),class:E({disable:!e(T)("next")})},null,8,["class"])])):b("",!0)]}),_:1},8,["spinning"]),e(x)&&e(s)&&e(s)[e(r)]?(u(),U(De,{key:0,file:e(s)[e(r)],idx:e(r),onContextMenuClick:e(y)},null,8,["file","idx","onContextMenuClick"])):b("",!0)],512)}}});const at=Me(qe,[["__scopeId","data-v-4815fec6"]]);export{at as default}; diff --git a/vue/dist/assets/MatchedImageGrid-962cf3e3.js b/vue/dist/assets/MatchedImageGrid-962cf3e3.js new file mode 100644 index 0000000..93732a1 --- /dev/null +++ b/vue/dist/assets/MatchedImageGrid-962cf3e3.js @@ -0,0 +1 @@ +import{d as pe,am as ue,bF as fe,m as me,az as ge,a1 as he,U as g,V as I,c as s,a4 as e,a3 as a,a6 as P,W as d,L as ke,Y as c,X as v,a2 as U,af as ve,ag as E,$ as J,ai as we,T as _e,ak as Ce,aP as Se,aQ as Ie,a0 as xe}from"./index-8b1d4076.js";import{S as be}from"./index-2ee82e1b.js";import{o as N,L as ye,R as Me,f as Ae,M as Ve}from"./MultiSelectKeep-4ce030ff.js";import{c as Fe,d as ze,F as De}from"./FileItem-5c27aa5d.js";import{u as Te}from"./hook-3db965e4.js";import"./shortcut-d7b854eb.js";import"./Checkbox-8b8e8d31.js";/* empty css */import"./index-fd0b9b75.js";import"./index-19cfb514.js";import"./index-133a27d3.js";import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-26786c56.js";import"./_isIterateeCall-4f946453.js";import"./index-404f2353.js";import"./useGenInfoDiff-068a10f2.js";const x=r=>(Se("data-v-aea581a5"),r=r(),Ie(),r),$e={class:"hint"},Ge={class:"action-bar"},Re={class:"title line-clamp-1"},Be=x(()=>d("div",{"flex-placeholder":""},null,-1)),Le=x(()=>d("div",{style:{padding:"16px 0 512px"}},null,-1)),Pe={key:1,class:"no-res-hint"},Ue=x(()=>d("p",{class:"hint"},"暂无结果",-1)),Ee=[Ue],Je={key:2,class:"preview-switch"},Ne=pe({__name:"MatchedImageGrid",props:{tabIdx:{},paneIdx:{},id:{},title:{},paths:{}},setup(r){const h=r,t=ue({res:[],load:!1,loading:!1,async next(){var n;if(!(t.loading||t.load)){t.loading=!0;try{const u=t.res.length,f=(h.paths??[]).slice(u,u+200);if(!f.length){t.load=!0;return}const C=await fe(f),m=f.map(S=>C[S]).filter(Boolean);t.res.push(...m),u+200>=(((n=h.paths)==null?void 0:n.length)??0)&&(t.load=!0)}finally{t.loading=!1}}},async reset(){t.res=[],t.load=!1,await t.next()}}),{queue:W,images:l,onContextMenuClickU:b,stackViewEl:K,previewIdx:p,previewing:y,onPreviewVisibleChange:O,previewImgMove:M,canPreview:A,itemSize:V,gridItems:q,showGenInfo:k,imageGenInfo:F,q:Q,multiSelectedIdxs:w,onFileItemClick:X,scroller:z,showMenuIdx:_,onFileDragStart:Y,onFileDragEnd:j,cellWidth:H,onScroll:D,saveAllFileAsJson:Z,saveLoadedFileAsJson:ee,changeIndchecked:te,seedChangeChecked:le,getGenDiff:ie,getGenDiffWatchDep:ne}=Te(t);me(()=>h.paths,async()=>{var n;await t.reset({refetch:!0}),await ge(),(n=z.value)==null||n.scrollToItem(0),D()},{immediate:!0});const se=he(),{onClearAllSelected:ae,onSelectAll:oe,onReverseSelect:de}=Fe(),ce=()=>{l.value.length!==0&&N(l.value,0)};return(n,i)=>{const u=Ve,f=we,C=_e,m=Ce,S=be;return g(),I("div",{class:"container",ref_key:"stackViewEl",ref:K},[s(u,{show:!!e(w).length||e(se).keepMultiSelect,onClearAllSelected:e(ae),onSelectAll:e(oe),onReverseSelect:e(de)},null,8,["show","onClearAllSelected","onSelectAll","onReverseSelect"]),s(S,{size:"large",spinning:!e(W).isIdle||t.loading},{default:a(()=>{var T,$,G,R;return[s(C,{visible:e(k),"onUpdate:visible":i[1]||(i[1]=o=>P(k)?k.value=o:null),width:"70vw","mask-closable":"",onOk:i[2]||(i[2]=o=>k.value=!1)},{cancelText:a(()=>[]),default:a(()=>[s(f,{active:"",loading:!e(Q).isIdle},{default:a(()=>[d("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:i[0]||(i[0]=o=>e(ke)(e(F)))},[d("div",$e,c(n.$t("doubleClickToCopy")),1),v(" "+c(e(F)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),d("div",Ge,[d("div",Re,"🧩 "+c(h.title),1),Be,s(m,{onClick:ce,disabled:!((T=e(l))!=null&&T.length)},{default:a(()=>[v(c(n.$t("tiktokView")),1)]),_:1},8,["disabled"]),s(m,{onClick:e(ee),disabled:!(($=e(l))!=null&&$.length)},{default:a(()=>[v(c(n.$t("saveLoadedImageAsJson")),1)]),_:1},8,["onClick","disabled"]),s(m,{onClick:e(Z),disabled:!((G=e(l))!=null&&G.length)},{default:a(()=>[v(c(n.$t("saveAllAsJson")),1)]),_:1},8,["onClick","disabled"])]),(R=e(l))!=null&&R.length?(g(),U(e(ze),{key:0,ref_key:"scroller",ref:z,class:"file-list",items:e(l),"item-size":e(V).first,"key-field":"fullpath","item-secondary-size":e(V).second,gridItems:e(q),onScroll:e(D)},{after:a(()=>[Le]),default:a(({item:o,index:B})=>[s(De,{idx:B,file:o,"cell-width":e(H),"show-menu-idx":e(_),"onUpdate:showMenuIdx":i[3]||(i[3]=L=>P(_)?_.value=L:null),onDragstart:e(Y),onDragend:e(j),onFileItemClick:e(X),onTiktokView:(L,re)=>e(N)(e(l),re),"full-screen-preview-image-url":e(l)[e(p)]?e(ve)(e(l)[e(p)]):"",selected:e(w).includes(B),onContextMenuClick:e(b),onPreviewVisibleChange:e(O),"is-selected-mutil-files":e(w).length>1,"enable-change-indicator":e(te),"seed-change-checked":e(le),"get-gen-diff":e(ie),"get-gen-diff-watch-dep":e(ne)},null,8,["idx","file","cell-width","show-menu-idx","onDragstart","onDragend","onFileItemClick","onTiktokView","full-screen-preview-image-url","selected","onContextMenuClick","onPreviewVisibleChange","is-selected-mutil-files","enable-change-indicator","seed-change-checked","get-gen-diff","get-gen-diff-watch-dep"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"])):(g(),I("div",Pe,Ee)),e(y)?(g(),I("div",Je,[s(e(ye),{onClick:i[4]||(i[4]=o=>e(M)("prev")),class:E({disable:!e(A)("prev")})},null,8,["class"]),s(e(Me),{onClick:i[5]||(i[5]=o=>e(M)("next")),class:E({disable:!e(A)("next")})},null,8,["class"])])):J("",!0)]}),_:1},8,["spinning"]),e(y)&&e(l)&&e(l)[e(p)]?(g(),U(Ae,{key:0,file:e(l)[e(p)],idx:e(p),onContextMenuClick:e(b)},null,8,["file","idx","onContextMenuClick"])):J("",!0)],512)}}});const st=xe(Ne,[["__scopeId","data-v-aea581a5"]]);export{st as default}; diff --git a/vue/dist/assets/MatchedImageGrid-e9e22234.css b/vue/dist/assets/MatchedImageGrid-e9e22234.css new file mode 100644 index 0000000..b6a56f4 --- /dev/null +++ b/vue/dist/assets/MatchedImageGrid-e9e22234.css @@ -0,0 +1 @@ +.container[data-v-aea581a5]{background:var(--zp-secondary-background);position:relative;height:var(--pane-max-height)}.action-bar[data-v-aea581a5]{display:flex;align-items:center;user-select:none;gap:6px;padding:6px 8px}.title[data-v-aea581a5]{font-weight:700;max-width:40vw}.file-list[data-v-aea581a5]{list-style:none;padding:8px;overflow:auto;height:calc(var(--pane-max-height) - 44px);width:100%}.no-res-hint[data-v-aea581a5]{height:calc(var(--pane-max-height) - 44px);display:flex;align-items:center;flex-direction:column;justify-content:center}.no-res-hint .hint[data-v-aea581a5]{font-size:1.2em;opacity:.7}.preview-switch[data-v-aea581a5]{position:fixed;bottom:24px;right:24px;display:flex;gap:8px;font-size:36px;user-select:none}.disable[data-v-aea581a5]{opacity:.3;pointer-events:none} diff --git a/vue/dist/assets/MultiSelectKeep-396362eb.css b/vue/dist/assets/MultiSelectKeep-396362eb.css deleted file mode 100644 index 91f05c1..0000000 --- a/vue/dist/assets/MultiSelectKeep-396362eb.css +++ /dev/null @@ -1 +0,0 @@ -.full-screen-menu[data-v-50c80b83]{position:fixed;z-index:9999;background:var(--zp-primary-background);padding:8px 16px;box-shadow:0 0 4px var(--zp-secondary);border-radius:4px}.full-screen-menu .tags-container[data-v-50c80b83]{margin:4px 0}.full-screen-menu .tags-container .tag[data-v-50c80b83]{margin-right:4px;margin-bottom:4px;padding:2px 16px;border-radius:4px;display:inline-block;cursor:pointer;font-weight:700;transition:.5s all ease;border:2px solid var(--tag-color);color:var(--tag-color);background:var(--zp-primary-background);user-select:none}.full-screen-menu .tags-container .tag.selected[data-v-50c80b83]{background:var(--tag-color);color:#fff}.full-screen-menu .container[data-v-50c80b83]{height:100%;display:flex;overflow:hidden;flex-direction:column}.full-screen-menu .gen-info[data-v-50c80b83]{flex:1;word-break:break-all;white-space:pre-line;overflow:auto;z-index:1;padding-top:4px;position:relative}.full-screen-menu .gen-info code[data-v-50c80b83]{font-size:.9em;display:block;padding:4px;background:var(--zp-primary-background);border-radius:4px;margin-right:20px;white-space:pre-wrap;word-break:break-word;line-height:1.78em}.full-screen-menu .gen-info code[data-v-50c80b83] .natural-text{margin:.5em 0;line-height:1.6em;text-align:justify;color:var(--zp-primary)}.full-screen-menu .gen-info code[data-v-50c80b83] .short-tag{word-break:break-all;white-space:nowrap}.full-screen-menu .gen-info code[data-v-50c80b83] span.tag{background:var(--zp-secondary-variant-background);color:var(--zp-primary);padding:2px 4px;border-radius:6px;margin-right:6px;margin-top:4px;line-height:1.3em;display:inline-block}.full-screen-menu .gen-info code[data-v-50c80b83] .has-parentheses.tag{background:rgba(255,100,100,.14)}.full-screen-menu .gen-info code[data-v-50c80b83] span.tag:hover{background:rgba(120,0,0,.15)}.full-screen-menu .gen-info table[data-v-50c80b83]{font-size:1em;border-radius:4px;border-collapse:separate;margin-bottom:3em}.full-screen-menu .gen-info table tr td[data-v-50c80b83]:first-child{white-space:nowrap}.full-screen-menu .gen-info table td[data-v-50c80b83]{padding-right:14px;padding-left:4px;border-bottom:1px solid var(--zp-secondary);border-collapse:collapse}.full-screen-menu .gen-info .info-tags .info-tag[data-v-50c80b83]{display:inline-block;overflow:hidden;border-radius:4px;margin-right:8px;border:2px solid var(--zp-primary)}.full-screen-menu .gen-info .info-tags .name[data-v-50c80b83]{background-color:var(--zp-primary);color:var(--zp-primary-background);padding:4px;border-bottom-right-radius:4px}.full-screen-menu .gen-info .info-tags .value[data-v-50c80b83]{padding:4px}.full-screen-menu.unset-size[data-v-50c80b83]{width:unset!important;height:unset!important}.full-screen-menu .mouse-sensor[data-v-50c80b83]{position:absolute;bottom:0;right:0;transform:rotate(90deg);cursor:se-resize;z-index:1;background:var(--zp-primary-background);border-radius:2px}.full-screen-menu .mouse-sensor>*[data-v-50c80b83]{font-size:18px;padding:4px}.full-screen-menu .action-bar[data-v-50c80b83]{display:flex;align-items:center;user-select:none;gap:4px}.full-screen-menu .action-bar .icon[data-v-50c80b83]{font-size:1.5em;padding:2px 4px;border-radius:4px}.full-screen-menu .action-bar .icon[data-v-50c80b83]:hover{background:var(--zp-secondary-variant-background)}.full-screen-menu .action-bar>*[data-v-50c80b83]{flex-wrap:wrap}.full-screen-menu.lr[data-v-50c80b83]{top:var(--3eebcda7)!important;right:0!important;bottom:0!important;left:100vw!important;height:unset!important;width:var(--3e27f0da)!important;transition:left ease .3s}.full-screen-menu.lr.always-on[data-v-50c80b83],.full-screen-menu.lr.mouse-in[data-v-50c80b83]{left:var(--37c6591e)!important}.tag-alpha-item[data-v-50c80b83]{display:flex;margin-top:4px}.tag-alpha-item h4[data-v-50c80b83]{width:32px;flex-shrink:0}.sort-tag-switch[data-v-50c80b83]{display:inline-block;padding-right:16px;padding-left:8px;cursor:pointer;user-select:none}.sort-tag-switch span[data-v-50c80b83]{transition:all ease .3s;transform:scale(1.2)}.sort-tag-switch:hover span[data-v-50c80b83]{transform:scale(1.3)}.lr-layout-control[data-v-50c80b83]{display:flex;align-items:center;gap:16px;padding:4px 8px;flex-wrap:wrap;border-radius:2px;border-left:3px solid var(--zp-luminous);background-color:var(--zp-secondary-background)}.lr-layout-control .ctrl-item[data-v-50c80b83]{display:flex;align-items:center;gap:4px;flex-wrap:nowrap}.select-actions[data-v-b04c3508]>:not(:last-child){margin-right:4px}.float-panel[data-v-b04c3508]{position:absolute;bottom:32px;right:32px;background:var(--zp-primary-background);border-radius:4px;z-index:1000;padding:8px;box-shadow:0 0 4px var(--zp-secondary)} diff --git a/vue/dist/assets/MultiSelectKeep-68ce9bb5.js b/vue/dist/assets/MultiSelectKeep-4ce030ff.js similarity index 59% rename from vue/dist/assets/MultiSelectKeep-68ce9bb5.js rename to vue/dist/assets/MultiSelectKeep-4ce030ff.js index d47e637..0e0ae40 100644 --- a/vue/dist/assets/MultiSelectKeep-68ce9bb5.js +++ b/vue/dist/assets/MultiSelectKeep-4ce030ff.js @@ -1,7 +1,18 @@ -import{bk as bt,c as u,A as fe,cM as ke,cs as ee,z as le,B as A,m as pe,y as We,cN as it,cF as jt,cb as Je,T as ye,cO as _t,ak as ge,cB as Wt,cP as Ot,cQ as Ue,cR as Ut,cS as zt,cT as xt,cU as qt,cV as Vt,af as re,r as ie,Q as qe,cW as Ct,H as st,cX as Nt,cY as Ve,cZ as Bt,X as C,ae as Xt,c_ as Ne,R as Oe,N as Ht,c$ as Jt,d0 as Yt,L as de,d1 as Zt,d2 as Gt,cr as Kt,d3 as Qt,d4 as Rt,d5 as en,t as ut,d6 as tn,o as Mt,az as nn,a1 as Ye,J as we,K as Be,am as an,G as R,d7 as on,n as Me,aR as ln,d as Lt,d8 as sn,c8 as un,cu as rt,aS as rn,U as $,V as _,a4 as c,$ as B,W as O,a2 as oe,d9 as cn,da as dn,a3 as k,db as ct,Z as Q,Y as y,a8 as ue,a5 as dt,a7 as Te,ag as Fe,a6 as ze,dc as Ae,al as gn,dd as pn,de as hn,M as fn,aN as vn,df as mn,dg as $n,aP as yn,aQ as wn,a0 as St}from"./index-5ed9cd5a.js";import{u as Le,e as Xe,g as J,h as gt,i as ce,r as kn,t as Pe,j as bn,s as pt,k as xe,_ as _n}from"./FileItem-2ecfe4d5.js";import{C as On,g as zn}from"./shortcut-bf073698.js";/* empty css */import{a as xn}from"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-47577760.js";import{_ as Cn}from"./index-4e015155.js";import{D as Mn}from"./index-7cbf21fe.js";const he=(...e)=>{document.addEventListener(...e),bt(()=>document.removeEventListener(...e))};var Ln={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M464 144H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H212V212h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H612V212h200v200zM464 544H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H212V612h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H612V612h200v200z"}}]},name:"appstore",theme:"outlined"};const Sn=Ln;function ht(e){for(var t=1;t{var h;i.value=M,P!=null&&!M&&g&&((h=w.value)==null||h.scrollToItem(P),P=null)},W=()=>{if(!D("next")){if(e!=null&&e.loadNext)return e.loadNext();z.value.mode==="walk"&&a.value&&(le.info(A("loadingNextFolder")),n.value.emit("loadNextDir",!0))}};he("keydown",M=>{var g;if(i.value){let h=t.value;if(["ArrowDown","ArrowRight"].includes(M.key))for(h++;s.value[h]&&!ee(s.value[h].name);)h++;else if(["ArrowUp","ArrowLeft"].includes(M.key))for(h--;s.value[h]&&!ee(s.value[h].name);)h--;if(ee((g=s.value[h])==null?void 0:g.name)??""){t.value=h;const L=w.value;L&&!(h>=L.$_startIndex&&h<=L.$_endIndex)&&(P=h)}W()}});const T=M=>{var h;let g=t.value;if(M==="next")for(g++;s.value[g]&&!ee(s.value[g].name);)g++;else if(M==="prev")for(g--;s.value[g]&&!ee(s.value[g].name);)g--;if(ee((h=s.value[g])==null?void 0:h.name)??""){t.value=g;const L=w.value;L&&!(g>=L.$_startIndex&&g<=L.$_endIndex)&&(P=g)}W()},D=M=>{var h;let g=t.value;if(M==="next")for(g++;s.value[g]&&!ee(s.value[g].name);)g++;else if(M==="prev")for(g--;s.value[g]&&!ee(s.value[g].name);)g--;return ee((h=s.value[g])==null?void 0:h.name)};return Xe("removeFiles",async()=>{i.value&&!S.sortedFiles[t.value]&&ke()}),{previewIdx:t,onPreviewVisibleChange:V,previewing:i,previewImgMove:T,canPreview:D}}function De(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!Wt(e)}function co(){const{currLocation:e,sortedFiles:t,currPage:n,multiSelectedIdxs:a,eventEmitter:i,walker:s}=Le().toRefs(),w=()=>{a.value=[]};return he("click",()=>{J.keepMultiSelect||w()}),he("blur",()=>{J.keepMultiSelect||w()}),pe(n,w),{onFileDragStart:(V,W)=>{const T=We(t.value[W]);gt.fileDragging=!0,console.log("onFileDragStart set drag file ",V,W,T);const D=[T];let M=T.type==="dir";if(a.value.includes(W)){const h=a.value.map(L=>t.value[L]);D.push(...h),M=h.some(L=>L.type==="dir")}const g={includeDir:M,loc:e.value||"search-result",path:it(D,"fullpath").map(h=>h.fullpath),nodes:it(D,"fullpath"),__id:"FileTransferData"};V.dataTransfer.setData("text/plain",JSON.stringify(g))},onDrop:async V=>{if(s.value)return;const W=jt(V);if(!W)return;const T=e.value;if(W.loc===T)return;const D=Je(),M=async()=>D.pushAction(async()=>{await Ot(W.path,T),i.value.emit("refresh"),ye.destroyAll()}),g=()=>D.pushAction(async()=>{await Ue(W.path,T),ce.emit("removeFiles",{paths:W.path,loc:W.loc}),i.value.emit("refresh"),ye.destroyAll()});ye.confirm({title:A("confirm")+"?",width:"60vw",content:()=>{let h,L,I;return u("div",null,[u("div",null,[`${A("moveSelectedFilesTo")} ${T}`,u("ol",{style:{maxHeight:"50vh",overflow:"auto"}},[W.path.map(E=>u("li",null,[E.split(/[/\\]/).pop()]))])]),u(_t,null,null),u("div",{style:{display:"flex",alignItems:"center",justifyContent:"flex-end"},class:"actions"},[u(ge,{onClick:ye.destroyAll},De(h=A("cancel"))?h:{default:()=>[h]}),u(ge,{type:"primary",loading:!D.isIdle,onClick:M},De(L=A("copy"))?L:{default:()=>[L]}),u(ge,{type:"primary",loading:!D.isIdle,onClick:g},De(I=A("move"))?I:{default:()=>[I]})])])},maskClosable:!0,wrapClassName:"hidden-antd-btns-modal"})},multiSelectedIdxs:a,onFileDragEnd:()=>{gt.fileDragging=!1}}}const Qn=e=>{const t=zt(e.name),n=xt(e.name);let a,i;return t?(a=qt(e),i="video"):n?(a=Vt(e),i="audio"):(a=re(e),i="image"),{id:e.fullpath,url:a,type:i,originalFile:e,name:e.name,fullpath:e.fullpath}},Rn=e=>e.filter(t=>t.type==="file"&&(ee(t.name)||zt(t.name)||xt(t.name))).map(Qn),ea=(e,t=0)=>{t=Math.min(t,e.length-1),t=Math.max(t,0);const n=Ut(),a=Rn(e);if(a.length===0){console.warn("没有找到可以显示的媒体文件");return}let i=0;if(tw.id===s.fullpath),i===-1&&(i=0)}n.openTiktokView(a,i)};function go({openNext:e}){const t=ie(!1),n=ie(""),{sortedFiles:a,previewIdx:i,multiSelectedIdxs:s,stack:w,currLocation:z,spinning:S,previewing:P,stackViewEl:V,eventEmitter:W,props:T,deletedFiles:D}=Le().toRefs(),M=st;Xe("removeFiles",({paths:E,loc:l})=>{M(l)!==M(z.value)||!qe(w.value)||(E.forEach(p=>D.value.add(p)),E.filter(ee).forEach(p=>D.value.add(p.replace(/\.\w+$/,".txt"))))}),Xe("addFiles",({files:E,loc:l})=>{if(M(l)!==M(z.value))return;const v=qe(w.value);v&&v.files.unshift(...E)});const g=Je(),h=async(E,l,v)=>{i.value=v,J.fullscreenPreviewInitialUrl=re(l);const p=s.value.indexOf(v);if(E.shiftKey){if(p!==-1)s.value.splice(p,1);else{s.value.push(v),s.value.sort((j,Z)=>j-Z);const N=s.value[0],X=s.value[s.value.length-1];s.value=kn(N,X+1)}E.stopPropagation()}else E.ctrlKey||E.metaKey?(p!==-1?s.value.splice(p,1):s.value.push(v),E.stopPropagation()):await e(l)},L=async(E,l,v)=>{var ae,te,be;const p=re(l),N=z.value,X={IIB_container_id:parent.IIB_container_id},j=()=>{let d=[];return s.value.includes(v)?d=s.value.map(m=>a.value[m]):d.push(l),d},Z=async d=>{if(!S.value)try{S.value=!0,await Qt(l.fullpath),xe.postMessage({...X,event:"click_hidden_button",btnEleId:"iib_hidden_img_update_trigger"}),await Rt(),xe.postMessage({...X,event:"click_hidden_button",btnEleId:`iib_hidden_tab_${d}`})}catch(m){console.error(m),le.error("发送图像失败,请携带console的错误消息找开发者")}finally{S.value=!1}},Y=`${E.key}`;if(Y.startsWith("toggle-tag-")){const d=+Y.split("toggle-tag-")[1],{is_remove:m}=await Nt({tag_id:d,img_path:l.fullpath}),q=(te=(ae=J.conf)==null?void 0:ae.all_custom_tags.find(F=>F.id===d))==null?void 0:te.name;await Pe.refreshTags([l.fullpath]),le.success(A(m?"removedTagFromImage":"addedTagToImage",{tag:q}));return}else if(Y==="add-custom-tag")Ve();else if(Y.startsWith("batch-add-tag-")||Y.startsWith("batch-remove-tag-")){const d=+Y.split("-tag-")[1],m=Y.includes("add")?"add":"remove",q=j().map(F=>F.fullpath);await Bt({tag_id:d,img_paths:q,action:m}),await Pe.refreshTags(q),le.success(A(m==="add"?"addCompleted":"removeCompleted"));return}else if(Y.startsWith("copy-to-")){const d=Y.split("copy-to-")[1],m=j(),q=m.map(F=>F.fullpath);await Ot(q,d,!0),ce.emit("addFiles",{files:m,loc:d}),le.success(A("copySuccess"));return}else if(Y.startsWith("move-to-")){const d=Y.split("move-to-")[1],m=j(),q=m.map(F=>F.fullpath);await Ue(q,d,!0),ce.emit("removeFiles",{paths:q,loc:z.value}),ce.emit("addFiles",{files:m,loc:d}),le.success(A("moveSuccess"));return}switch(E.key){case"previewInNewWindow":return window.open(p);case"copyFilePath":return de(l.fullpath);case"saveSelectedAsJson":return Kt(j());case"openWithDefaultApp":return Gt(l.fullpath);case"download":{const d=j();Zt(d.map(m=>re(m,!0)));break}case"copyPreviewUrl":return de(parent.document.location.origin+p);case"rename":{let d=await Yt(l.fullpath);d=st(d);const m=Pe.tagMap;m.set(d,m.get(l.fullpath)??[]),m.delete(l.fullpath),l.fullpath=d,l.name=d.split(/[\\/]/).pop()??"";return}case"send2txt2img":return Z("txt2img");case"send2img2img":return Z("img2img");case"send2inpaint":return Z("inpaint");case"send2extras":return Z("extras");case"send2savedDir":{const d=J.quickMovePaths.find(F=>F.key==="outdir_save");if(!d)return le.error(A("unknownSavedDir"));const m=Jt(d.dir,(be=J.conf)==null?void 0:be.sd_cwd),q=j();await Ue(q.map(F=>F.fullpath),m,!0),ce.emit("removeFiles",{paths:q.map(F=>F.fullpath),loc:z.value}),ce.emit("addFiles",{files:q,loc:m});break}case"send2controlnet-img2img":case"send2controlnet-txt2img":{const d=E.key.split("-")[1];xe.postMessage({...X,event:"send_to_control_net",type:d,url:re(l)});break}case"send2outpaint":{n.value=await g.pushAction(()=>Ne(l.fullpath)).res;const[d,m]=(n.value||"").split(` -`);xe.postMessage({...X,event:"send_to_outpaint",url:re(l),prompt:d,negPrompt:m.slice(17)});break}case"openWithWalkMode":{pt.set(N,w.value);const d=J.tabList[T.value.tabIdx],m={type:"local",key:Oe(),path:l.fullpath,name:A("local"),stackKey:N,mode:"walk"};d.panes.push(m),d.key=m.key;break}case"openFileLocationInNewTab":case"openInNewTab":{const d=J.tabList[T.value.tabIdx],m={type:"local",key:Oe(),path:E.key==="openInNewTab"?l.fullpath:Ht(l.fullpath),name:A("local"),mode:"scanned-fixed"};d.panes.push(m),d.key=m.key;break}case"openOnTheRight":{pt.set(N,w.value);let d=J.tabList[T.value.tabIdx+1];d||(d={panes:[],key:"",id:Oe()},J.tabList[T.value.tabIdx+1]=d);const m={type:"local",key:Oe(),path:l.fullpath,name:A("local"),stackKey:N};d.panes.push(m),d.key=m.key;break}case"send2BatchDownload":{bn.addFiles(j());break}case"viewGenInfo":{t.value=!0,n.value=await g.pushAction(()=>Ne(l.fullpath)).res;break}case"tiktokView":{ea(a.value,v);break}case"openWithLocalFileBrowser":{await Xt(l.fullpath);break}case"deleteFiles":{const d=j(),m=async()=>{const q=d.map(F=>F.fullpath);if(await en(q),le.success(A("deleteSuccess")),P.value){const F=re(l)===J.fullscreenPreviewInitialUrl,me=i.value===a.value.length-1;if((F||me)&&(ke(),await ut(100),F&&a.value.length>1)){const $e=i.value;ut(0).then(()=>tn($e,V.value))}}ce.emit("removeFiles",{paths:q,loc:z.value})};if(d.length===1&&J.ignoredConfirmActions.deleteOneOnly)return m();await new Promise(q=>{ye.confirm({title:A("confirmDelete"),maskClosable:!0,width:"60vw",content:()=>u("div",null,[u("ol",{style:{maxHeight:"50vh",overflow:"auto"}},[d.map(F=>u("li",null,[F.fullpath.split(/[/\\]/).pop()]))]),u(_t,null,null),u(On,{checked:J.ignoredConfirmActions.deleteOneOnly,"onUpdate:checked":F=>J.ignoredConfirmActions.deleteOneOnly=F},{default:()=>[A("deleteOneOnlySkipConfirm"),C(" ("),A("resetOnGlobalSettingsPage"),C(")")]})]),async onOk(){await m(),q()}})});break}}return{}},{isOutside:I}=Ct(V);return he("keydown",E=>{var v,p,N;const l=zn(E);if(P.value){l==="Esc"&&ke();const X=(v=Object.entries(J.shortcut).find(j=>j[1]===l&&j[1]))==null?void 0:v[0];if(X){E.stopPropagation(),E.preventDefault();const j=i.value,Z=a.value[j];switch(X){case"delete":return L({key:"deleteFiles"},Z,j);case"download":return L({key:"download"},Z,j);default:{const Y=(p=/^toggle_tag_(.*)$/.exec(X))==null?void 0:p[1],ae=(N=J.conf)==null?void 0:N.all_custom_tags.find(te=>te.name===Y);if(ae)return L({key:`toggle-tag-${ae.id}`},Z,j);if(X.startsWith("copy_to_")){const te=X.split("copy_to_")[1];return L({key:`copy-to-${te}`},Z,j)}if(X.startsWith("move_to_")){const te=X.split("move_to_")[1];return L({key:`move-to-${te}`},Z,j)}}}}}else!I.value&&["Ctrl + KeyA","Cmd + KeyA"].includes(l)&&(E.preventDefault(),E.stopPropagation(),W.value.emit("selectAll"))}),{onFileItemClick:h,onContextMenuClick:L,showGenInfo:t,imageGenInfo:n,q:g}}function ta(e,t,n,a){let i=0,s=0,w=typeof(a==null?void 0:a.width)=="number"?a.width:0,z=typeof(a==null?void 0:a.height)=="number"?a.height:0,S=typeof(a==null?void 0:a.left)=="number"?a.left:0,P=typeof(a==null?void 0:a.top)=="number"?a.top:0,V=!1;const W=l=>{l.stopPropagation(),l.preventDefault(),!(!e.value||!t.value)&&(i=l instanceof MouseEvent?l.clientX:l.touches[0].clientX,s=l instanceof MouseEvent?l.clientY:l.touches[0].clientY,w=e.value.offsetWidth,z=e.value.offsetHeight,t.value.offsetLeft,t.value.offsetTop,document.documentElement.addEventListener("mousemove",T),document.documentElement.addEventListener("touchmove",T),document.documentElement.addEventListener("mouseup",D),document.documentElement.addEventListener("touchend",D))},T=l=>{if(!e.value||!t.value)return;let v=w+((l instanceof MouseEvent?l.clientX:l.touches[0].clientX)-i),p=z+((l instanceof MouseEvent?l.clientY:l.touches[0].clientY)-s);e.value.offsetLeft+v>window.innerWidth&&(v=window.innerWidth-e.value.offsetLeft),e.value.offsetTop+p>window.innerHeight&&(p=window.innerHeight-e.value.offsetTop),e.value.style.width=`${v}px`,e.value.style.height=`${p}px`,a!=null&&a.onResize&&a.onResize(v,p)},D=()=>{document.documentElement.removeEventListener("mousemove",T),document.documentElement.removeEventListener("touchmove",T),document.documentElement.removeEventListener("mouseup",D),document.documentElement.removeEventListener("touchend",D)},M=l=>{l.stopPropagation(),l.preventDefault(),!(!e.value||!n.value)&&(V=!0,S=e.value.offsetLeft,P=e.value.offsetTop,i=l instanceof MouseEvent?l.clientX:l.touches[0].clientX,s=l instanceof MouseEvent?l.clientY:l.touches[0].clientY,document.documentElement.addEventListener("mousemove",g),document.documentElement.addEventListener("touchmove",g),document.documentElement.addEventListener("mouseup",h),document.documentElement.addEventListener("touchend",h))},g=l=>{if(!e.value||!n.value||!V)return;const v=S+((l instanceof MouseEvent?l.clientX:l.touches[0].clientX)-i),p=P+((l instanceof MouseEvent?l.clientY:l.touches[0].clientY)-s);v<0?e.value.style.left="0px":v+e.value.offsetWidth>window.innerWidth?e.value.style.left=`${window.innerWidth-e.value.offsetWidth}px`:e.value.style.left=`${v}px`,p<0?e.value.style.top="0px":p+e.value.offsetHeight>window.innerHeight?e.value.style.top=`${window.innerHeight-e.value.offsetHeight}px`:e.value.style.top=`${p}px`,a!=null&&a.onDrag&&a.onDrag(v,p)},h=()=>{V=!1,document.documentElement.removeEventListener("mousemove",g),document.documentElement.removeEventListener("touchmove",g),document.documentElement.removeEventListener("mouseup",h),document.documentElement.removeEventListener("touchend",h)},L=()=>{if(!e.value||!t.value)return;let l=e.value.offsetLeft,v=e.value.offsetTop,p=e.value.offsetWidth,N=e.value.offsetHeight;l+p>window.innerWidth&&(l=window.innerWidth-p,l<0&&(l=0,p=window.innerWidth)),v+N>window.innerHeight&&(v=window.innerHeight-N,v<0&&(v=0,N=window.innerHeight)),e.value.style.left=`${l}px`,e.value.style.top=`${v}px`,e.value.style.width=`${p}px`,e.value.style.height=`${N}px`},I=()=>{!e.value||!a||(typeof a.width=="number"&&(e.value.style.width=`${a.width}px`),typeof a.height=="number"&&(e.value.style.height=`${a.height}px`),typeof a.left=="number"&&(e.value.style.left=`${a.left}px`),typeof a.top=="number"&&(e.value.style.top=`${a.top}px`),L(),window.addEventListener("resize",L))},E=()=>{document.documentElement.removeEventListener("mousemove",T),document.documentElement.removeEventListener("touchmove",T),document.documentElement.removeEventListener("mouseup",D),document.documentElement.removeEventListener("touchend",D),document.documentElement.removeEventListener("mousemove",g),document.documentElement.removeEventListener("touchmove",g),document.documentElement.removeEventListener("mouseup",h),document.documentElement.removeEventListener("touchend",h),window.removeEventListener("resize",L)};return Mt(I),bt(E),pe(()=>a==null?void 0:a.disbaled,async l=>{await nn(),l!==void 0&&(l?E():I())}),pe(()=>[e.value,t.value,n.value],([l,v,p])=>{l&&v&&(v.addEventListener("mousedown",W),v.addEventListener("touchstart",W)),l&&p&&(p.addEventListener("mousedown",M),p.addEventListener("touchstart",M))}),{handleResizeMouseDown:W,handleDragMouseDown:M}}let wt=null;const na=()=>{var S,P;const e=Ye(),t=we(Be+"fullscreen_layout",{enable:!0,panelWidth:384,alwaysOn:!0}),n=an(wt??((P=(S=e.conf)==null?void 0:S.app_fe_setting)==null?void 0:P.fullscreen_layout)??We(t.value)),a="--iib-lr-layout-info-panel-width",i=R(()=>n.alwaysOn&&n.enable?n.panelWidth:0);pe(n,V=>{t.value=We(V),kt(n,a,i),aa(n),wt=n},{deep:!0}),Mt(()=>kt(n,a,i));const{enable:s,panelWidth:w,alwaysOn:z}=on(n);return{state:n,isLeftRightLayout:s,panelwidtrhStyleVarName:a,lrLayoutInfoPanelWidth:w,lrMenuAlwaysOn:z}},aa=Me(e=>ln("fullscreen_layout",e),300),kt=Me((e,t,n)=>{e.enable?(document.body.classList.add("fullscreen-lr-layout"),document.documentElement.style.setProperty(t,`${e.panelWidth}px`),document.documentElement.style.setProperty("--iib-lr-layout-container-offset",`${n.value}px`)):(document.documentElement.style.removeProperty(t),document.documentElement.style.removeProperty("--iib-lr-layout-container-offset"),document.body.classList.remove("fullscreen-lr-layout"))},300);/*! +import{bk as Tt,c as u,A as we,cW as Oe,ct as ae,z as Q,B as x,m as ye,y as Je,cX as ht,cP as Nt,cc as tt,T as be,cY as Lt,ak as ve,cL as Bt,cZ as St,c_ as Ye,c$ as Xt,d0 as Et,d1 as At,d2 as Ht,d3 as Jt,af as de,r as ie,Q as Ze,d4 as Ft,H as ft,d5 as Yt,d6 as Ge,d7 as Zt,X as M,ae as Gt,d8 as Ke,R as Te,N as Kt,d9 as Qt,da as Rt,L as pe,db as en,dc as tn,cs as nn,dd as an,de as on,df as ln,t as mt,dg as sn,o as It,az as un,a1 as nt,J as ke,K as Qe,am as rn,G as ee,dh as cn,n as Ae,aR as dn,d as Pt,di as gn,c9 as pn,cv as We,aS as hn,U as h,V as z,a4 as c,$ as X,W as k,a2 as se,dj as fn,dk as mn,a3 as b,dl as vt,Z as R,Y as v,a8 as ue,a5 as yt,a7 as Ue,ag as qe,a6 as Le,dm as Ve,dn as vn,al as yn,dp as $n,dq as wn,M as _n,aN as bn,dr as kn,ds as On,aP as zn,aQ as xn,a0 as Dt}from"./index-8b1d4076.js";import{u as Fe,e as Re,g as Z,h as $t,i as ge,r as Cn,t as Ne,j as Mn,s as wt,k as Se,_ as Tn}from"./FileItem-5c27aa5d.js";import{C as Ln,g as Sn}from"./shortcut-d7b854eb.js";/* empty css */import{_ as En}from"./index-fd0b9b75.js";import{_ as An}from"./index-19cfb514.js";import{D as Fn}from"./index-133a27d3.js";const $e=(...e)=>{document.addEventListener(...e),Tt(()=>document.removeEventListener(...e))};var In={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M464 144H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H212V212h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H612V212h200v200zM464 544H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H212V612h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H612V612h200v200z"}}]},name:"appstore",theme:"outlined"};const Pn=In;function _t(e){for(var t=1;t{var f;s.value=S,I!=null&&!S&&p&&((f=w.value)==null||f.scrollToItem(I),I=null)},W=()=>{if(!P("next")){if(e!=null&&e.loadNext)return e.loadNext();T.value.mode==="walk"&&a.value&&(Q.info(x("loadingNextFolder")),n.value.emit("loadNextDir",!0))}};$e("keydown",S=>{var p;if(s.value){let f=t.value;if(["ArrowDown","ArrowRight"].includes(S.key))for(f++;i.value[f]&&!ae(i.value[f].name);)f++;else if(["ArrowUp","ArrowLeft"].includes(S.key))for(f--;i.value[f]&&!ae(i.value[f].name);)f--;if(ae((p=i.value[f])==null?void 0:p.name)??""){t.value=f;const E=w.value;E&&!(f>=E.$_startIndex&&f<=E.$_endIndex)&&(I=f)}W()}});const L=S=>{var f;let p=t.value;if(S==="next")for(p++;i.value[p]&&!ae(i.value[p].name);)p++;else if(S==="prev")for(p--;i.value[p]&&!ae(i.value[p].name);)p--;if(ae((f=i.value[p])==null?void 0:f.name)??""){t.value=p;const E=w.value;E&&!(p>=E.$_startIndex&&p<=E.$_endIndex)&&(I=p)}W()},P=S=>{var f;let p=t.value;if(S==="next")for(p++;i.value[p]&&!ae(i.value[p].name);)p++;else if(S==="prev")for(p--;i.value[p]&&!ae(i.value[p].name);)p--;return ae((f=i.value[p])==null?void 0:f.name)};return Re("removeFiles",async()=>{s.value&&!A.sortedFiles[t.value]&&Oe()}),{previewIdx:t,onPreviewVisibleChange:V,previewing:s,previewImgMove:L,canPreview:P}}function Be(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!Bt(e)}function ko(){const{currLocation:e,sortedFiles:t,currPage:n,multiSelectedIdxs:a,eventEmitter:s,walker:i}=Fe().toRefs(),w=()=>{a.value=[]};return $e("click",()=>{Z.keepMultiSelect||w()}),$e("blur",()=>{Z.keepMultiSelect||w()}),ye(n,w),{onFileDragStart:(V,W)=>{const L=Je(t.value[W]);$t.fileDragging=!0,console.log("onFileDragStart set drag file ",V,W,L);const P=[L];let S=L.type==="dir";if(a.value.includes(W)){const f=a.value.map(E=>t.value[E]);P.push(...f),S=f.some(E=>E.type==="dir")}const p={includeDir:S,loc:e.value||"search-result",path:ht(P,"fullpath").map(f=>f.fullpath),nodes:ht(P,"fullpath"),__id:"FileTransferData"};V.dataTransfer.setData("text/plain",JSON.stringify(p))},onDrop:async V=>{if(i.value)return;const W=Nt(V);if(!W)return;const L=e.value;if(W.loc===L)return;const P=tt(),S=async()=>P.pushAction(async()=>{await St(W.path,L),s.value.emit("refresh"),be.destroyAll()}),p=()=>P.pushAction(async()=>{await Ye(W.path,L),ge.emit("removeFiles",{paths:W.path,loc:W.loc}),s.value.emit("refresh"),be.destroyAll()});be.confirm({title:x("confirm")+"?",width:"60vw",content:()=>{let f,E,te;return u("div",null,[u("div",null,[`${x("moveSelectedFilesTo")} ${L}`,u("ol",{style:{maxHeight:"50vh",overflow:"auto"}},[W.path.map(m=>u("li",null,[m.split(/[/\\]/).pop()]))])]),u(Lt,null,null),u("div",{style:{display:"flex",alignItems:"center",justifyContent:"flex-end"},class:"actions"},[u(ve,{onClick:be.destroyAll},Be(f=x("cancel"))?f:{default:()=>[f]}),u(ve,{type:"primary",loading:!P.isIdle,onClick:S},Be(E=x("copy"))?E:{default:()=>[E]}),u(ve,{type:"primary",loading:!P.isIdle,onClick:p},Be(te=x("move"))?te:{default:()=>[te]})])])},maskClosable:!0,wrapClassName:"hidden-antd-btns-modal"})},multiSelectedIdxs:a,onFileDragEnd:()=>{$t.fileDragging=!1}}}const oa=e=>{const t=Et(e.name),n=At(e.name);let a,s;return t?(a=Ht(e),s="video"):n?(a=Jt(e),s="audio"):(a=de(e),s="image"),{id:e.fullpath,url:a,type:s,originalFile:e,name:e.name,fullpath:e.fullpath}},la=e=>e.filter(t=>t.type==="file"&&(ae(t.name)||Et(t.name)||At(t.name))).map(oa),sa=(e,t=0)=>{t=Math.min(t,e.length-1),t=Math.max(t,0);const n=Xt(),a=la(e);if(a.length===0){console.warn("没有找到可以显示的媒体文件");return}let s=0;if(tw.id===i.fullpath),s===-1&&(s=0)}n.openTiktokView(a,s)};function Oo({openNext:e}){const t=ie(!1),n=ie(""),{sortedFiles:a,previewIdx:s,multiSelectedIdxs:i,stack:w,currLocation:T,spinning:A,previewing:I,stackViewEl:V,eventEmitter:W,props:L,deletedFiles:P}=Fe().toRefs(),S=ft;Re("removeFiles",({paths:m,loc:l})=>{S(l)!==S(T.value)||!Ze(w.value)||(m.forEach($=>P.value.add($)),m.filter(ae).forEach($=>P.value.add($.replace(/\.\w+$/,".txt"))))}),Re("addFiles",({files:m,loc:l})=>{if(S(l)!==S(T.value))return;const y=Ze(w.value);y&&y.files.unshift(...m)});const p=tt(),f=async(m,l,y)=>{s.value=y,Z.fullscreenPreviewInitialUrl=de(l);const $=i.value.indexOf(y);if(m.shiftKey){if($!==-1)i.value.splice($,1);else{i.value.push(y),i.value.sort((U,G)=>U-G);const F=i.value[0],H=i.value[i.value.length-1];i.value=Cn(F,H+1)}m.stopPropagation()}else m.ctrlKey||m.metaKey?($!==-1?i.value.splice($,1):i.value.push(y),m.stopPropagation()):await e(l)},E=async(m,l,y)=>{var ce,ne,ze;const $=de(l),F=T.value,H={IIB_container_id:parent.IIB_container_id},U=()=>{let d=[];return i.value.includes(y)?d=i.value.map(_=>a.value[_]):d.push(l),d},G=async d=>{if(!A.value)try{A.value=!0,await an(l.fullpath),Se.postMessage({...H,event:"click_hidden_button",btnEleId:"iib_hidden_img_update_trigger"}),await on(),Se.postMessage({...H,event:"click_hidden_button",btnEleId:`iib_hidden_tab_${d}`})}catch(_){console.error(_),Q.error("发送图像失败,请携带console的错误消息找开发者")}finally{A.value=!1}},K=`${m.key}`;if(K.startsWith("toggle-tag-")){const d=+K.split("toggle-tag-")[1],{is_remove:_}=await Yt({tag_id:d,img_path:l.fullpath}),q=(ne=(ce=Z.conf)==null?void 0:ce.all_custom_tags.find(D=>D.id===d))==null?void 0:ne.name;await Ne.refreshTags([l.fullpath]),Q.success(x(_?"removedTagFromImage":"addedTagToImage",{tag:q}));return}else if(K==="add-custom-tag")Ge();else if(K.startsWith("batch-add-tag-")||K.startsWith("batch-remove-tag-")){const d=+K.split("-tag-")[1],_=K.includes("add")?"add":"remove",q=U().map(D=>D.fullpath);await Zt({tag_id:d,img_paths:q,action:_}),await Ne.refreshTags(q),Q.success(x(_==="add"?"addCompleted":"removeCompleted"));return}else if(K.startsWith("copy-to-")){const d=K.split("copy-to-")[1],_=U(),q=_.map(D=>D.fullpath);await St(q,d,!0),ge.emit("addFiles",{files:_,loc:d}),Q.success(x("copySuccess"));return}else if(K.startsWith("move-to-")){const d=K.split("move-to-")[1],_=U(),q=_.map(D=>D.fullpath);await Ye(q,d,!0),ge.emit("removeFiles",{paths:q,loc:T.value}),ge.emit("addFiles",{files:_,loc:d}),Q.success(x("moveSuccess"));return}switch(m.key){case"previewInNewWindow":return window.open($);case"copyFilePath":return pe(l.fullpath);case"saveSelectedAsJson":return nn(U());case"openWithDefaultApp":return tn(l.fullpath);case"download":{const d=U();en(d.map(_=>de(_,!0)));break}case"copyPreviewUrl":return pe(parent.document.location.origin+$);case"rename":{let d=await Rt(l.fullpath);d=ft(d);const _=Ne.tagMap;_.set(d,_.get(l.fullpath)??[]),_.delete(l.fullpath),l.fullpath=d,l.name=d.split(/[\\/]/).pop()??"";return}case"send2txt2img":return G("txt2img");case"send2img2img":return G("img2img");case"send2inpaint":return G("inpaint");case"send2extras":return G("extras");case"send2savedDir":{const d=Z.quickMovePaths.find(D=>D.key==="outdir_save");if(!d)return Q.error(x("unknownSavedDir"));const _=Qt(d.dir,(ze=Z.conf)==null?void 0:ze.sd_cwd),q=U();await Ye(q.map(D=>D.fullpath),_,!0),ge.emit("removeFiles",{paths:q.map(D=>D.fullpath),loc:T.value}),ge.emit("addFiles",{files:q,loc:_});break}case"send2controlnet-img2img":case"send2controlnet-txt2img":{const d=m.key.split("-")[1];Se.postMessage({...H,event:"send_to_control_net",type:d,url:de(l)});break}case"send2outpaint":{n.value=await p.pushAction(()=>Ke(l.fullpath)).res;const[d,_]=(n.value||"").split(` +`);Se.postMessage({...H,event:"send_to_outpaint",url:de(l),prompt:d,negPrompt:_.slice(17)});break}case"openWithWalkMode":{wt.set(F,w.value);const d=Z.tabList[L.value.tabIdx],_={type:"local",key:Te(),path:l.fullpath,name:x("local"),stackKey:F,mode:"walk"};d.panes.push(_),d.key=_.key;break}case"openFileLocationInNewTab":case"openInNewTab":{const d=Z.tabList[L.value.tabIdx],_={type:"local",key:Te(),path:m.key==="openInNewTab"?l.fullpath:Kt(l.fullpath),name:x("local"),mode:"scanned-fixed"};d.panes.push(_),d.key=_.key;break}case"openOnTheRight":{wt.set(F,w.value);let d=Z.tabList[L.value.tabIdx+1];d||(d={panes:[],key:"",id:Te()},Z.tabList[L.value.tabIdx+1]=d);const _={type:"local",key:Te(),path:l.fullpath,name:x("local"),stackKey:F};d.panes.push(_),d.key=_.key;break}case"send2BatchDownload":{Mn.addFiles(U());break}case"viewGenInfo":{t.value=!0,n.value=await p.pushAction(()=>Ke(l.fullpath)).res;break}case"tiktokView":{sa(a.value,y);break}case"openWithLocalFileBrowser":{await Gt(l.fullpath);break}case"deleteFiles":{const d=U(),_=async()=>{const q=d.map(D=>D.fullpath);if(await ln(q),Q.success(x("deleteSuccess")),I.value){const D=de(l)===Z.fullscreenPreviewInitialUrl,he=s.value===a.value.length-1;if((D||he)&&(Oe(),await mt(100),D&&a.value.length>1)){const _e=s.value;mt(0).then(()=>sn(_e,V.value))}}ge.emit("removeFiles",{paths:q,loc:T.value})};if(d.length===1&&Z.ignoredConfirmActions.deleteOneOnly)return _();await new Promise(q=>{be.confirm({title:x("confirmDelete"),maskClosable:!0,width:"60vw",content:()=>u("div",null,[u("ol",{style:{maxHeight:"50vh",overflow:"auto"}},[d.map(D=>u("li",null,[D.fullpath.split(/[/\\]/).pop()]))]),u(Lt,null,null),u(Ln,{checked:Z.ignoredConfirmActions.deleteOneOnly,"onUpdate:checked":D=>Z.ignoredConfirmActions.deleteOneOnly=D},{default:()=>[x("deleteOneOnlySkipConfirm"),M(" ("),x("resetOnGlobalSettingsPage"),M(")")]})]),async onOk(){await _(),q()}})});break}}return{}},{isOutside:te}=Ft(V);return $e("keydown",m=>{var y,$,F;const l=Sn(m);if(I.value){l==="Esc"&&Oe();const H=(y=Object.entries(Z.shortcut).find(U=>U[1]===l&&U[1]))==null?void 0:y[0];if(H){m.stopPropagation(),m.preventDefault();const U=s.value,G=a.value[U];switch(H){case"delete":return E({key:"deleteFiles"},G,U);case"download":return E({key:"download"},G,U);default:{const K=($=/^toggle_tag_(.*)$/.exec(H))==null?void 0:$[1],ce=(F=Z.conf)==null?void 0:F.all_custom_tags.find(ne=>ne.name===K);if(ce)return E({key:`toggle-tag-${ce.id}`},G,U);if(H.startsWith("copy_to_")){const ne=H.split("copy_to_")[1];return E({key:`copy-to-${ne}`},G,U)}if(H.startsWith("move_to_")){const ne=H.split("move_to_")[1];return E({key:`move-to-${ne}`},G,U)}}}}}else!te.value&&["Ctrl + KeyA","Cmd + KeyA"].includes(l)&&(m.preventDefault(),m.stopPropagation(),W.value.emit("selectAll"))}),{onFileItemClick:f,onContextMenuClick:E,showGenInfo:t,imageGenInfo:n,q:p}}function ia(e,t,n,a){let s=0,i=0,w=typeof(a==null?void 0:a.width)=="number"?a.width:0,T=typeof(a==null?void 0:a.height)=="number"?a.height:0,A=typeof(a==null?void 0:a.left)=="number"?a.left:0,I=typeof(a==null?void 0:a.top)=="number"?a.top:0,V=!1;const W=l=>{l.stopPropagation(),l.preventDefault(),!(!e.value||!t.value)&&(s=l instanceof MouseEvent?l.clientX:l.touches[0].clientX,i=l instanceof MouseEvent?l.clientY:l.touches[0].clientY,w=e.value.offsetWidth,T=e.value.offsetHeight,t.value.offsetLeft,t.value.offsetTop,document.documentElement.addEventListener("mousemove",L),document.documentElement.addEventListener("touchmove",L),document.documentElement.addEventListener("mouseup",P),document.documentElement.addEventListener("touchend",P))},L=l=>{if(!e.value||!t.value)return;let y=w+((l instanceof MouseEvent?l.clientX:l.touches[0].clientX)-s),$=T+((l instanceof MouseEvent?l.clientY:l.touches[0].clientY)-i);e.value.offsetLeft+y>window.innerWidth&&(y=window.innerWidth-e.value.offsetLeft),e.value.offsetTop+$>window.innerHeight&&($=window.innerHeight-e.value.offsetTop),e.value.style.width=`${y}px`,e.value.style.height=`${$}px`,a!=null&&a.onResize&&a.onResize(y,$)},P=()=>{document.documentElement.removeEventListener("mousemove",L),document.documentElement.removeEventListener("touchmove",L),document.documentElement.removeEventListener("mouseup",P),document.documentElement.removeEventListener("touchend",P)},S=l=>{l.stopPropagation(),l.preventDefault(),!(!e.value||!n.value)&&(V=!0,A=e.value.offsetLeft,I=e.value.offsetTop,s=l instanceof MouseEvent?l.clientX:l.touches[0].clientX,i=l instanceof MouseEvent?l.clientY:l.touches[0].clientY,document.documentElement.addEventListener("mousemove",p),document.documentElement.addEventListener("touchmove",p),document.documentElement.addEventListener("mouseup",f),document.documentElement.addEventListener("touchend",f))},p=l=>{if(!e.value||!n.value||!V)return;const y=A+((l instanceof MouseEvent?l.clientX:l.touches[0].clientX)-s),$=I+((l instanceof MouseEvent?l.clientY:l.touches[0].clientY)-i);y<0?e.value.style.left="0px":y+e.value.offsetWidth>window.innerWidth?e.value.style.left=`${window.innerWidth-e.value.offsetWidth}px`:e.value.style.left=`${y}px`,$<0?e.value.style.top="0px":$+e.value.offsetHeight>window.innerHeight?e.value.style.top=`${window.innerHeight-e.value.offsetHeight}px`:e.value.style.top=`${$}px`,a!=null&&a.onDrag&&a.onDrag(y,$)},f=()=>{V=!1,document.documentElement.removeEventListener("mousemove",p),document.documentElement.removeEventListener("touchmove",p),document.documentElement.removeEventListener("mouseup",f),document.documentElement.removeEventListener("touchend",f)},E=()=>{if(!e.value||!t.value)return;let l=e.value.offsetLeft,y=e.value.offsetTop,$=e.value.offsetWidth,F=e.value.offsetHeight;l+$>window.innerWidth&&(l=window.innerWidth-$,l<0&&(l=0,$=window.innerWidth)),y+F>window.innerHeight&&(y=window.innerHeight-F,y<0&&(y=0,F=window.innerHeight)),e.value.style.left=`${l}px`,e.value.style.top=`${y}px`,e.value.style.width=`${$}px`,e.value.style.height=`${F}px`},te=()=>{!e.value||!a||(typeof a.width=="number"&&(e.value.style.width=`${a.width}px`),typeof a.height=="number"&&(e.value.style.height=`${a.height}px`),typeof a.left=="number"&&(e.value.style.left=`${a.left}px`),typeof a.top=="number"&&(e.value.style.top=`${a.top}px`),E(),window.addEventListener("resize",E))},m=()=>{document.documentElement.removeEventListener("mousemove",L),document.documentElement.removeEventListener("touchmove",L),document.documentElement.removeEventListener("mouseup",P),document.documentElement.removeEventListener("touchend",P),document.documentElement.removeEventListener("mousemove",p),document.documentElement.removeEventListener("touchmove",p),document.documentElement.removeEventListener("mouseup",f),document.documentElement.removeEventListener("touchend",f),window.removeEventListener("resize",E)};return It(te),Tt(m),ye(()=>a==null?void 0:a.disbaled,async l=>{await un(),l!==void 0&&(l?m():te())}),ye(()=>[e.value,t.value,n.value],([l,y,$])=>{l&&y&&(y.addEventListener("mousedown",W),y.addEventListener("touchstart",W)),l&&$&&($.addEventListener("mousedown",S),$.addEventListener("touchstart",S))}),{handleResizeMouseDown:W,handleDragMouseDown:S}}let Ct=null;const ua=()=>{var A,I;const e=nt(),t=ke(Qe+"fullscreen_layout",{enable:!0,panelWidth:384,alwaysOn:!0}),n=rn(Ct??((I=(A=e.conf)==null?void 0:A.app_fe_setting)==null?void 0:I.fullscreen_layout)??Je(t.value)),a="--iib-lr-layout-info-panel-width",s=ee(()=>n.alwaysOn&&n.enable?n.panelWidth:0);ye(n,V=>{t.value=Je(V),Mt(n,a,s),ra(n),Ct=n},{deep:!0}),It(()=>Mt(n,a,s));const{enable:i,panelWidth:w,alwaysOn:T}=cn(n);return{state:n,isLeftRightLayout:i,panelwidtrhStyleVarName:a,lrLayoutInfoPanelWidth:w,lrMenuAlwaysOn:T}},ra=Ae(e=>dn("fullscreen_layout",e),300),Mt=Ae((e,t,n)=>{e.enable?(document.body.classList.add("fullscreen-lr-layout"),document.documentElement.style.setProperty(t,`${e.panelWidth}px`),document.documentElement.style.setProperty("--iib-lr-layout-container-offset",`${n.value}px`)):(document.documentElement.style.removeProperty(t),document.documentElement.style.removeProperty("--iib-lr-layout-container-offset"),document.body.classList.remove("fullscreen-lr-layout"))},300);/*! author:kooboy_li@163.com MIT licensed -*/let Et=19968,oa=(40896-Et)/2,He="",Ce=",",la=(()=>{let e=[];for(let t=33;t<127;t++)t!=34&&t!=92&&t!=45&&e.push(String.fromCharCode(t));return e.join(He)})(),tt={a:{yi:"!]#R$!$q(3(p)[*2*g+6+d.C.q0[0w1L2<717l8B8E9?:8;V;[;e;{<)<+.>4??@~A`BbC:CGC^CiDMDjDkF!H/H;JaL?M.M2MoNCN|OgO|P$P)PBPyQ~R%R.S.T;Tk^l$lt?uJv$vMyE|R}a-!}-#&-#8-#L-#b-$Q-%?-+q-,6-,8",yu:"#V$l%S&9&I('(7(=)))m*#*$*B+2+F+v,0,b,i.W0.1F232L2a3(384>6P8n;';i;y<1>(>)>]@iB&X&m&s'2'X'd'f(9(c(i(j)@)l+'+M.).+1y1{2=3K4c6&6'6)606<6B6`9`9{:a`?`AgCLCuD%D2F2GyH&H1I;K~LkLuM&MYO0O3O9P8PbPcQqR5S2SCU0U~V%XYY&Z}[G^P`7cUc}dEeNgOj$j)l?m:n4p,sOuRv.y'{/|i}1~P-$B-%Y-)|-)}-*K-+G-+H-,m-.@-.M-/|-0y-2D-2c-4W-4`-4h-7a-7p-9c-9i",shang:")Y6V9cJvR8UqXJXa])asbQc,s,uSvz-#+-.;",xia:"#Y#w&,&;'''I)1.u/j7=:[<'B[ByCtL'NmNyQOR([0`(cLh[iRkVt/t_u4uezFzM|W|{~d-&)-*4-.}-0a-5;-8S",han:"#,.m/h:l

MFrGXJqNrOUPCPqPrQ|]@`+`2h1lBlZnXp*r;rWrkz9{4{B}x-#c-#y-$;-$l-$y-%Q-%n-(i-(x-)i-/!-3*-5B-9V",wan:"#=$0&o.]0F4@5X5b6*628u9pk@,JhR`b$b`knmtujz'z0}<-#+-'I-*Q-16-7m",san:"3T3q3w3x7~uJuwzA-'n-([-,s",ji:"#r%''l'y)3)d)o*Z+'+9+G+M+T+Z+^+g+x._.c/R090d1S1W2;43484J4R5C5w6)6C6`7f7s878H8t8w9J9X9Z9{;8;<;B;C=(=2>6?YA$B+CHD0D8DbE:EQF2I*I|JEJnKKL)L:LkLzMdN'N5N:NiQ6QyRrUWVcVnWPWQWtX6XEXYXuY(ZAZ|[/]O]e^F^J^U^~`)b#b0c*ckc}dee!e$e9e>eyf+fXfrg)hFhriMjZlrqmr)sRt%uov3vevw|@};}N}g~!~+~F~{-!&-!u-#N-$%-&a-'u-(,-*x-+]-,W-.?-.V-._-.d-.g-/+-0$-0H-1%-1/-10-1^-1o-2/-2@-3'-4)-4o-5>-5H-5U-6,-6J-7/-7P-9e-9g-9h-9i-9j-:l",bu:"0$192,FKJgT=UYZ^e+hhjmm8mFoGpGp}sjw]w{-'7-'E-/m-3#-4.-6=",fou:"4I:L:O:Q~1-3:",mian:"!G!d#4$U$W$]3Y5X6A6_6o9g9w@qB/CkG!H_Q;-!L-!M-!P-/_-7y-7z-8'-8,-8q-8r",gai:"):5=5LD,ErI!J1Z'_/`TaYaac!lnpcw[|O}1",chou:"!+#n$N+0/y0}2:4e5/6#9jB*B.GNLfUmZ+^3^5_4e%e4fWkan]nbo.o6oU}u~$~*-.X-/>",zhuan:"%H'S'V.K0k1B1H1r2?7Z+7+f,8.#.|0K0p2O>#DNE1P.ccd]eMlpt8y>-0&",ju:"!Z$L$w%R*W,c,l/e1~3&3J8#:t=#=`=k@FBGC0DlD}FeGAIaIkJbMrN[OVP`RDTlU|W>Y`[$^Z`Ua*ccc{dWd]dae#e@eFeff8fSg*ga@'@2@KA%C|DQO+O]O^PvR!REScU'UfZw]m`l`na'i[l_m;p-4F-6'-63-91",shi:"!E!Q!e#?$p%$&+'$([(](q*^.&/5/n0[1w204zQQR9VYW2W@W^X2XNYxY{ZI[:[<[v]X^l^{^}_p`DaDbmgqi8ixjdk!kNkpl(lkntoMo^ocoeofp5ppq%q&q*q4qbr=t9x/-&^-&_-&}-'<-'@-(*-(8-)!-)H-+,-/<-0?-0d-0o-0p-2:-2O-3+-38-57-6M-9C-9E",qiu:"*6*7+a0r3k4D5]6j>7CaCeF`HEJXMhNgNjONP;QMQ_RfSWUUX?XUXqXrajc$d'jpjskXl]n@o.oup:r?-#5-#6-$8-/'-/k-0W-0X-1,-2Z-4v-7&-9U-:Y-:Z-:]",bing:"!n)F*4+/,>.75@DsOcZ7l`puqar||>-!:-!q-#,-#G-''-'C-(D-/O",ye:"$>$E(0,a6g=;@?HfSb[]_]lUlfn(oip=rmtDtTtevTx?-!O-!R-$5-%N-'F-'e-(T-*o-4Y-61",cong:"$'&Y1>8==g=l=p=vDIE=I2JUK0LsRZZk]$a}a~sKtBuKu_-*)-*V-+Y",dong:"&&.r0b5D?7?C@JD|G;I#KwQ([&jV~^-)T-/=-0)-4g-5/-6T-9,",si:"'?(b)^)g)p*+.+>0KxL+NLP7PiQnReS&W_`tp1pvp{qTqnr8r`tIuzyB-&6-&R-&^-&c-&s-&{-(:-)L-)q-*8-+.-0.-5j-6`-9N-:o",cheng:"#0$,$P&W*O*[*w+A+{,O,v/l5[7#:`?}FQOoS(UKZV_#cHcJk#m$nhrxtkuxv@vWx=xB|2-!A-$h-'w-)o-*>-+B-/u",diu:"r2xL-&&",liang:"3A3D3{6K@0CRF{Q%Up[,_Oe1h!h2hCiBiHojss-!=-)h-.J-.O",you:"(r)O*I7o8W;L;f=5=M>VDKFoFsFwG/KaOOOSPSQLY8ZN_;`qh%hMjWjnk6kPlYmEn3n>ncodp~r3x&x<-),-.y-/1-1p-1z-7N-8P-9D",yan:"##%F%L&%&F&T&v(Z,j/u1?2$5t7V;!;h?<@@AsCVCYCZD3FmGpH.JlN_PVQAT$UxV9WUX/XkXmXnY?Z3[U^1^C^E_e_~`B`C`RbDbPc;g/g7kIm#mNmsn5nHnsnyoPoVo`x+z7zkzmzn{A{`{e|}}2}b-%'-%,-%B-%v-'0-(#-)~-*$-*F-*j-*s-+C-.4-.H-.Y-0V-3$-3*-3B-3n-5#-5G-5u-7K-7r-8T-8W-8_-8`-8a-8d-8j-9L-9Q-9w-:1-:N",sang:"'EVNts-%2-%{",gun:"#<&#'U6F6z9dJ>JpTFTwUu]4h:?B@}AbB3BwECHxJ1NwOrP'U9UPXM[X[hhLhmq`tetlu.xSyUzTzU{W}4-!S-!s-#F-#`-#j-%f-(A-*%-+t-.3-/K-/U-1u-3T-3z-6g",ya:"#B%C&{'I*{,a.g=UDEKqO;T1WEWGY.^[g=i!j4lUp=s=v7x;}f-3C-3c-4U-6O-6V-9o-:;",pan:"!&!>!?!H!o'L'x2A76=F>R?$AIH+m/V2T4{6b99>j@`BnEkK*O:OBP^R2RKSzTKTNTO[@e^f>ohparHtQv5wbyF-3_-9@",jie:"#S%@&{(.*d+=.G0e4J5,599D;k=(@/CfD,G#G`J[LzOFP&P:PTQ=SKSQSqT/TITPTlU4U7UPVQXOXSX}Z%ZWZh]/^K^~_5ckdve=j^qGtNtXz,|1}.-!m-!u-$U-%c-&v-+i-.l-/@-2&-4{-5$",feng:"!@%N'40m5v7R:3C$FdHnN.PFSaWI[R^c`?b.c5k'n+n;r[u5uXxs-!$-!4-&%-&J-&L-(w-3(-3,-3F-8)",guan:"!'$b$j$k(W)B,Y/f0E6:9&:]:gBVFqIEWSW{X+X.a?bifMh?kmsUu>w7zOzS{,{2}{-'K-(N-0q-1N-1j-2e-2z-6D-7A",kuang:"!Y!z$Y%1%r%w(G+}/O/z5'538V8vZ-8>",chuan:",40jA7BYB`BhBxEvale[hIkJp%wQ-5+",chan:"&6'W)K)q1N6D7$8*8A8[8_:6;xCODJIHKQQ2RGR_R{S1UeW!W`X3ZMZy]B^+^7_N_bfbi|n2n6o@rTr]uWw3xYz%ze{7{g-#Q-%D-%~-(%-(S-+Z",lin:"$B&['t0:393O5{8!S]SrU;VsD5E4GTO$WNYk`LdDdNgjozp?wr~~-!a-&.-.D-.`-/&-/0-1t-1v-1}-9=",dan:"!K%$%5)r,S0N1h4V8A=A=B=H=~>q@9ATAVH*JDOkPUTLV?VoXGX~ZK_'a|bBc3f{mHn&nKn~~t-$I-'G-'s-)*-)a-,C-3Z-8H-8b-8i",wei:"#o$M%}&0'#'D'M6/6p6r7+8y9f;6>n@gC+D!DOE+FCGBH)I&I(I4INJ]K$KJL7LdMDN0PwQ$QDQHR?T3T6V`WkX$Z)[#[^^*^4_I_^e;fefig@hbj>kg?:?k@N?#@!@D@E@nA3C!CWC}D*DFE'E,E]EpFFF|GKHKHjJXKsNSODOGOXOwPIPMQEQIQWTETsTvU.V(V6ViW+WKWMXpYS[C^H`Va4a{b4bXc(c7cRd=dZegh*hPhRiAiLlIm(m*mmnQowo|pFqZYZZ]U_6_9d9fYj6j~lWm)mep)rQrbrctvwkxc{y|U}6~?~C~`~m-!Z-*'-+R-/j-0j-3i-4/-4@-5,-5f-6j-6s-7)-9G-9W-9X",tuo:"%U%V&z0L2J4v?{@$F_H6MUTbT~Y'Yc^QdHdQnVq+r`x1{{|;|<-&d-(.-(z-({-)1-)J-)K-*:-*e-*p-+$-+3-.b-/%-/[-0b-3O-4,-6_-8}-9$-9?",zhe:"#'%+%E'P2f2|_@eB>CADvFAI0I>J:L]M:M~TgWHWfY/Ya[|[}^6_ngmi6k`kll*l9r!tdwhxRzv}!-!j-%=-&9-&T-'(-'=-*&-0u-1I-2f-3;-3]-5F-5Y-7+-9T-:%",zhi:"!7!t$s%=(J(i(k(s(y)2)I)Z*2*>*A*T*^*c+(+)+J+Y,G/k4Q4b5T5W5s6~7^7|9(98;(<0=E=Q=b=}>L>|?+?QA4^4g=0D{OPOZX]Yb[(]G]W^ng=o;t*xHzI{N~J-&t-/9-/a-1{-22-9]-9`",hu:"(1(~.j0Z1M3!3^545r757G?0AMCtCxD5C_{u-$*-'1-(A-1!-1d-2i",yue:"$S%!(a){0^0|242S2_373H4<8sAlM{O,O.ZaZc_>cid2dCdFfZgApDqBw2whw}zczd{[-,V-6:-6B-8Y-:^-:m",lao:"&)'n,71s3<5>9M~CXE%F$H(JWMaOQP%Yg^jgrh>mAqa-$^-(w-/(-1w",pang:"!o'A1+=/>R?$?=A/B|QmWsd@jf~6~|-0k-2g-:K-:M",guai:"0,;%",sheng:"!D!^...t7*7q859e=[=x?*E(KM]^aMb1q2t2|#|Y|u-4_-9B",hao:"*:.,25-%|-0i",mie:"!`(D1G1dJxL>SNS~W]vt-1e-3M",nie:"1&294(4,=G=|B)B0E!GDMlSX^=e)e?eAezforAs$sJu*vfw9wByVyY{&|c}(-%L-%x-:#",xi:"!>#6$3$d%/&(&g'J's(!)P)n*l+7,,,n313z434i5j6H7?7W81878g979U;V;n<2<5<6>c>d@>A6BABBB}FUG]HeI9IbIwJ+JVKzL2NdPjQoQqRYRqSiT!U)UzW9WFWiWlX7XfXjXlZH[K[m]5]F_@`.`/`W`_a(cCcGcfcwesf)fulGlplwm&m4m_n:oIokp2p7pbqLqMqvsYu+ufv&w6wSxJy,z[{5{b}9}?}P}U~#~2~q-!%-&?-'2-'`-'r-(1-(C-*C-*O-*{-.)-/x-0_-1+-1J-2X-2q-46-6*-8I-9O",xiang:"!;)*+50U5Q6Y8b9u:U;E;J<4APC{HGHvLTaU4UI`]a$a]bxdRjGl{m/q#qOrXu,x$x>y`-$a-$e-%c-%d-)B-+5-3J-3q-4(-7i",mao:"!M#i$i*:/66e:uqcsVx,y%-,B-,O-4|",mai:"?W?XF>K^LgS{aKaxj(l+~g~h-!'-5{-7t-7u",luan:";D?dAzA{L=NDW~o{r7w@-4'-6G-6h-:y",ru:"/M7F8G:1>AEgIYJ6KlLhQJSHU:VGW,inlEm`oSr+x_-%E-&!-1]-3)-3K-3x",xue:"$?,(A=C@E@IGLKStTnXd[p_[coe,hdibig~/-!_-#M-18-2k-6%-6^",sha:"%4&G052u4O8F8~<<WIYIuTJU!Zt`m`pgNlNlypHu7wcyZ~0-!d-.x",qian:"'K.(/~0A0t1'2*2D2R2p6+7[8J8q:G;h>b@vA~CnD(EIElF:I%IjK>KLNNO&O8P}VR[*[u]u_q`!`&gSh;i~kjk~p9pEpOq;q?r6sPtYukvqwPwgwtwvx+{x-#U-$z-*+-*/-*=-+U-,y-,z-0x-37-4M-6z-8G-8M",suo:"#*1Z1^4Z797U:?;cFaFbJ7P{VJcuk)tatju3u9xi-/b",gan:"!3%)*1*t.Y/x1*1}3%4s91>GCmE#T>Y^bJbTcAcTcti}nE-+e-.Q-1T-2w-3*-:i",gui:"!q#o$.$C%x%})0)s,E/?1K1T?NERJ;N%P/R*RpUgEi#lilxuyvlzY{P|M~#-#K-*;-.7-.:-.=-/S-1F-1U-2%-2r-34-:Y-:]",jue:"$Z$l$o%6,%525S8#9NA^D=KiKtNnO6RwRxU!WWWbX%X5X>XBXZXiY4Zj]N^f_}a0c[chd7h7x8D9V:4AQCyFOFPNxV}Zm]c_QazkFkHl.uqv!vF}*}/}G}H}w-#$-#r-+|-,/",gen:"CQEHdc",xie:"';(f*&3c4k5+595I5h6g6v7&8>8T92:B:M<3>l?T?V?ZA&LRLTM0Q7QKS+S@SBStTRV*V^W4XKXOXS[B[y^<_Z_mflfnl,lU-!i-!v-#1-#D-#h-$#-%c-/S-2%-9Z-9q-9t-9~-:b",zhai:"%X)3,92qP*Q,Znh5iGj+jM-.N",kang:"%<+U2v3tg1lJpgugwmz={L-17",da:"!W.u/(/S84;H=Xs]Q]fa`d0dhe3gvh_hfi;i?lvnkoHo]p#q]v*xW-'%-(B-*h-+;-/Q-1>-20-3|-5k-5s-78-:a",hai:"5L?Aj9l/lnnro<-'!-'~-)Z-)b-+>-+p",heng:"?J?mMZT9vc-3o-4$-6e",peng:"%c&'&S'+'Z+,.V1+1@5@8P>~AACgE%FdJRMkRiRjU3eSgbh:s9v{zL-$+-$0-):-*A-,X-,b-,q-4K-6y",mu:"!1#N%]+V7`7n:@?.C5DeF~G%O=e/qKqPx!~3~G-#9",ting:"/s5l%>&?qC)FnI7PWQ8ZJ[El=rUxKz`~K-!~-$g-%e-9F",qin:"$j$k*'*Q.d5c=>>MD1DAGZG^GkMRO8Q}RJS7TVWJWrZQc]pXpkriwix{}c-!]-$~-)f-+E-/c-33-4L",qing:"&/&Z'i046+60:ZDaHzQ#Wr[%]%_Agph+i7m;>t?fA!BuC,DrGWH=I'J{L4MmO^U+U,U6VrW5ZL[d]Rd8d_eKf@m3pxq5qFrVtow0wxw|x(yT-'4-'^-(E-(V-(d-(g-).-)[-*^-+)-+~-,$-/0-1=-1}-42-6k",lian:"'K+D2+2P2V6w7b8k94;s{M-#!",ren:"(o*,*e+#4A4U5)5y8x9$>?@AD)E}FGGDTUU2Y!ZC^I^Vg&gFi&p/p;pRqp-!W-![-#[-#w-&i-'#-(2-.^-3{",shen:"!U![$8$r$u%j)#)9,12e2g3T3U3q3w4l96:p:~>i>m?t@BFkHwH}JGK!LCPGPHUNX)Y1YHZ*[2^)_%_L_S_VfylPqRrj-$W-)W-.m-/z-0@-0|-1)-2N-4A-8b",ze:"#R#}$n(+*p/,0J1I=0BsKAS?Vz[(].a@b7b]c:jO-&t-6.-9s-:,",jin:"!#$j$k%M)8)G.U.m/J4W4`6L70:/B6F&F;GcGkJYM!TWW%WzXsTwGy2-!^-'m-(Y-)$-7D-88-::",pu:"$5*k+j0$8LBTBUFXGGGaH~IsIt[D]]_|bEfInprtupv=xbyqyu|[-/m",reng:"(_DGiu|z",zong:"&Y'h+?3P3]4$5z6E6Q6n6x7(7M7X7e7t9%9nz?!?MB'CwE5E7ENE`F4GHHuJbL;NsXHYOYP[I_caFa[bzb~cZcpd(h3hQiJmbp&pmsGtRtuy=yO-$s-$t-,I-/{-0r-2P-4e-9)-9f-9i-9u-:D",zai:"#^7HGHb+g|i9n^",ta:"(d)i2~VAZr]wdBe7etfFfOfpkdkiq+sBt]tex1{'{5{;{={R{o-!s-#*-#B-/?-0t-2d",xian:"!:!O#5$<&#(F(h)X*3+D/D0V2k3B4%4|5A5c5t6,6]7J7r8Z8c8q90:%;];d;h?&@oAnA~B;BvDSDwFzG,LOM'M*MpOKO_O}PJT+T0V_W:WRX,ZXZo[O]d`>awbKb^cYdgd}f;fhgBhHnfo'oPqvr#r$rFrqs0o334=4P4f5i8o8{;z*]+m.?/Q/i345D5N5`9PA@EjJPO1T,Z,cFj|ndq:qYqjxC-')-/L-2*",dai:"0,1n4x7%9AC?OMQ]TdW=Yd^xa7aLbqdff'gCgLg[i%jIk4p0~z-!0-)E-/>-3I-8N-8e",ling:"%d)D*M++.5/+4p6@9];K;U<.=KBqD[GiJJJmL%M|OiT(TcUjYVdLgZh/n8oWpts0x)zN|q~;~O~]~a~c-!2-$L-%`-)C-/$-05-2C-3L-6Y-7E-7q-9z-9{-:A-:T",chao:"!k,h,r2u6?9b;5J@mA+DTGMH!UlUqZfs&sWy+z'z(z0zh{1{a-#d-.0-02-1X-2H-2T-92-:d",sa:"8g?^HDK{LYY@fnpQuwwS}A-!c-!s-&,-&P-)&",fan:"%0(M/1/40i2A2d6R7i8$;o<[AIBcBfE0KNLPM>N!SOVqXva=bcfXo:-+g",wo:"#l&A,R,_6}>I@OAlB!G*HQLgP[Qbe:-(p-:4-:I-:L",jian:"!%#9#`$<$D$I&N&b','r'}(&(<(X+D.p/9/g0#0/0Q181k262I3_5U6Z788(899v:9$>S@fB4BoCICSCTETE~G-#O-#X-'A-'S-(7-(k-,h-0Y-0`-0h-1(-28-2h-37-40-4R-5@-71-7F-7I-7J-7W",fen:"#|%A*9./2x3=3r4S9';M;q;~ARD4IxKmO?O@TGY,`^`ff|hjnOpUvY}K~5-'W-'}-(c-(r-.w-1M-2Q-35-85-8n-9.-9:",bin:"%A8I::A)AiNc`X`cahailKvjya~l-$p-%G-%k-,'-,1-,E-,_-,p-.!",di:"!u#/%W')'.'{)<)_*U.v/*1=2c4+6c:);X;@WDXD_FMG9G_ICJMJrJwJ|M6Q+QVR-0>-69",fang:"!I!n(l4Y9*>TBjD;O!Y;^ed@lLp@siwn|,-,?-.v-1s-3E-51",pei:">Q?(JBSwUrUsauc2hyiPnBn{s5y7|%|f~M-)#",diao:"$#&a,C,k.B1]5FJML|NhOaXxZ8Zv_M`ro~p_r!r:s*s[vawUxExR}v~D-.c-//-0%-2L-2{-3&-4O-9>",dun:"!^?gD'G!O'O(R/RO`ahShWiNu6zlzqzw{<{D{Q{c~4-#?-#{-%(-'f-)(-)4-.r-0g-0z-2V-36-3G-9<",xin:"!=(F?zBID7FkLZSyVtY3Y-%T-%U-*[-,w-.G-.W-1_",tang:"$f'@)f0{3V3j3o;l=)@zA4J4LJQSR$RAcMc~eef&g+m]o=tiu)uTv'wDx[yWyd{1}:-#I-']-'h-5:-96",huo:"!V$S$^(*)>)S*Y*_*`+|,W10=$=4AuCJG.IhMTSI[g`0a:4<%<@?R?U@.AEANAhG{THVmd#uQ}Y-$|",che:"$;%I&?&@=JFjP@gFA}EKFRFcK:LmRBTDW6Y7Zz[Q[o^;_V`$arb;c`cad>dKeagKimjHmDo@pAt(|C|o~H-5T-7]-9l-9m-:=",xun:"!x$Q*p,^4;8MAjEnF:KLKSL[LaMcRzS%XwY#Y)Yt^R^T_+j%jajlkclsmzoTv`-%A-(}-)U-+%-1?-1H-24-5A",chi:"!]!y$).X.y/A0+02133,5W<#<$>?2?D@SE9E|GeO%OHORR;U/U0UkVMYFZ9Zq[t`8aRcBc^d+dfeGj@jBkKkfkrkyl7q7q^qusx~9-&l-(4-(|-+&-.R-3Y-4!-4r-4w-4y-5]-6Z-8(-8C-9k-9v-:<",xuan:"!m!x#d$['5)k0R5?7J7d7w9K-+4",bai:"+&.;3;3M51L^W3b:b_-#k",gu:"!/$J'B)A*~+P.z010?0u3g75:r:v;Q>K@(AfE)G>GhJ,LSOdOjSeXFYR^h`%a]bxgdgehYi,iXk,nYprpws]wwy.}h-%@-%W-'Y-(Q-+`-/;-0'-2I-3^-5?-6S-7%-9*-9+",ni:"!h#P*G2m73=i>$>}@pABA{DqLpOLP.Q!XXZt`~d`h.jhmCpnx3}L~X-(e-0,-2J-7`-:+",ban:"*E2s5!9;>PBgBkQ*QvVKd[iciipPqEwfzx|$-!h-$F-%Z-.n-35",zhou:"!+#U$x&y062.2@2C3+384:777o8p9:B>o?#B^F@GoI$LfY][a]y^r_4_Manc0gkg{h,i0inCqg~Q-);-)`-)t-*r-+[-0(-3~-6f",qu:"$L'o(}.2.F/@2U3?4o5#<1u?/AxDlG:HhKbM}O[OfOpQdRDRlSkSpT'T:U&WxX!X&X=YeYjZj^tcjcld%d*fqf}g2gWw-#)",ga:"g=onsfwH-.A",dian:"&p'v,j1iIiKRPXdXeVewq!x%|8~@-!E-%3-%4-%z-*g-8Q-:8",tian:"!:#;'1'H,j4w6D>v@:BRBXGvWmX9atnTr#rFsXx%xM{%{n-!>-!G-'$-3f-5J-5S-8:",bi:"#L#M'!(w)L*@*C+;.n.o/E/Y0(0)1/1<2r2y4M4m6>7Q8@8};7<,=a>a>r@lA[BlC|E*F.FJG~H:J*>1>2GdYf^ucScxorpC&CqD^FyHSK}Tjh$la-#&-$)-,Z-/`",zuo:"(|*S+!+n/,/p4*7{?'D{F^H`HaJ?Th[(nWp||7-&t",ti:"!g#e')'?)Z)|*v/8285f6|9Y9y:{DXF!KgLIUzV&V'[qd)d2eJemexf~g8jxk=kLo&rDt)xy-%$-%r-*2-+m-,0-,L-,]-,a-/^-0B-2U-4;-4w-4y-5L-5M-5i-6r",zhan:"$H&b.33*6=9oGQLMN2N`NaOeWyYQZ/]h]l^B`#cghUhgiSl0n|zK~V-%~-&*-&N-&e-'|-*b-*l-.Z-1S-2y-37-60-7=-8i-:h",he:"&c()*(0z2i3@4?8r-:`",she:"'y(`BJBKBLJuNpOgP(S5Y>^dagakc'cDg~{!{^-#h-)u-7l",die:"!g!t&w5M9GpB5C6D~PmQ`R@V,V]YU[7_WcbdOdXdreigojNz+-#1-0S-2R-3d",gou:"/01%2)3g6t:&DhO[U#VBWwX;YNY~_(`ob5bgk_pMqHwl}k-#A-#m",kou:"!P!Z#r$$,P.2/W1OD+K=KFp$-5K",ning:"$P=R>!DpLevm-,~-64",yong:"%p&>A]DcIPP=Yre2e]l@mJmio9rHuVyh}n}~-%*-%s-'x-/y-0w-15-2A-2o-5`",wa:"%K,),?,E,`=N@r@xOyTuW1lc-#W-#^-#t-8w",ka:"?8U@qV",bao:",<.~6h?,DgGYHcK`L4MJN^OJTeUdV4V5Vf`ib*d8q/w%x.zs~>-!6-&x-&|-(9-)/-+j-,M-/7-1~-3/-3A-6Q-9r-:B",huai:"=7N3N8VDVSeE-:f",ming:"!C!w#zEDJ'R,WuZ0m^n_q}xT-3.-6L",hen:"Y|-!y",quan:"$b%u/K0B5<6$7:9mEqI3NAP|SlXLZ#_)dkeIgzi=o5qxv%xO{#-#_-%M-&$-)V-*3-,e-0L-2^-9}",tiao:"!~(t),,J,g/!3/4.5F=S?PCdD^H0J@JMJNPnWdZ8Zv_McqdwjCr!rdtyxR-#%-,G-/o-1&-2;-9y-:C",xing:"!D#Z&$0Y0g6J@YApBFEuF7FhHrP9T#XVX_[_lMluo+pBqZqwrhwZx6|D|S-'V-(/-)p-+D-/5-0D",kan:"!N$=$g%?'^.QG&T%h8ho{4{q-%)-.+-:R-:X",lai:"#8#F/X0%2/2MG'H%MSW7Zqaob,c&c4k.mBsgxd-$q-$w-)y-0*-4B-4f-8%",kua:"50?>B~Z=d9dlq~-+s",gong:"'91*44474=8o;z>[OBXQXba6bZfzg$gtrG-!z-,T-:L-:Q-:W-:u",mi:"!s#p$A(w)')w*C1d2b2}3p407c;>;F?bClH{J#K'K/L}N#N6PaU*WZW[WcX1Z.[j[l_g_rjXo4oXoYo_r,z/-!K-66-7X-7Y-7j-82-9&",an:"!(!.;)?I@XEzGlHWHgJSUxZS[N_d`k`{r1s:x]zy}+~=-!w-!x-$1-(l-/E-4I-4u-6v-8c",lu:"!)#Q$_%|&L&d'])E)J*}+[+o071X1v2!2#2G2H3I6S8^9q:f?9A,AtBmBzCFCMCND.G@JcJeJtKcM[NSYXh[~aVb|d$dseCf#gxh^h|i/i>iTk5nwpis2sascu8uMumvGw&w+yr|A|t~x-%J-%_-)+-)r-*N-,3-.q-.t-00-1i-1r-1y-3w-4E-4P-6!-6>-6U-7;-7C-7M-7b-8l",mou:"!|7n:@Oq[[_Ue6t=-#9-3y-8!",cun:".N2nA>lS",lv:"$()(*r+~0`5Z5~6S7_7j9q:*@wA(A8A;HkM,NKV=VZm'rJw#xDz_{T-*u-+*-5a",zhen:"!X!b!c!}%Y'%)5)T)b+I.A0X264N4w5Y7D7L9,:2=I?%B9H5I5IWJ&LnTpUSWaYKZb^pa2afbWc%g^hZi4iqkOnNoxq$r~s`tOu$u%wJyS|0|_~L-)D-,o-1f-3@-6R-8d",ce:"/%/U/^/t0G1W36F/H3HPJA",chai:")&>HCjEJNzS9T[Xz`jp4wY",nong:")v*j+q8C?cAXL,V~]iioipoL-,{-9a",hou:"#c$t0q3Z@AGFyHCKyL2LtNBNMP{DoU1UbVTdPllnm-+o-/R-:p",jun:"&].=/`0<0CFlGCI1O/PeTXWhaeg?m1p^qfr&t'wj|Q}^}l-$j-'8-(J-)m-+F-/]-2?-43-44-47-7U-7^-7d-:Y-:]",zu:"(x*J+10H4}95GqHbIkYm^kd6eLtdu2u;yk|6-!f",hun:"!F#O#W#]F6I8JyXT[=_2hczo{d-'>-(L-.C-9J",su:"';+1+3+],X1U3.324X7K7U:?>,>/@{DWFwJsM+M]MiXWYE[r^o_lcyf(k$khksnZrR-':-*_-+L-/i-1@-5p-6~",pai:"0'1z1|IOhBjLtV",biao:"'c,!1D@3A,A1AoJoM=T@UoVa[3]#b?seuZw$ycz#-&&-&+-&5-&D-&E-&F-&H-&O-&W-&X-*~-+@-+W-,;-2j-7Q",fei:"%[//1!6M9aO>e>r>z>{@GDFGjH$KhP_PuRuUtZp_GaObsvEyP|g~T-!/-!H-!I-&Y-&[-&]-'H-(j-*!-*,-0+-2F-9;",bei:"&i&r)`0'3f>wA[DfJ9M8PAU'V;ZLZwa1bVgch@iDlbm5mQqWrPv[wd|=-!l-#,-#C-+k-4N-6x",dao:")=)H)x+B+K005F8hbdm?n~o,oJqQsMx#y8-$x",chui:"&U0D@8GPsFtny0|n-$u-:_",kong:"%.&V,/0@;gg,sA-#(-4[",juan:"!{#2#H5J5V7Z9S:|;=?w@7AaG[K3SfUM^&mTrZras6u0vHy5yXzt}^}l-#'-&k-'.-6m-:w",luo:"%T&!&='n/>0M2]5>8f9M:n;@@)@UAwF8H9HYJ5N9OrRHS6UvW~X'Z1dbf`g'kAl:uEw>y/yf}s-$f-('-)_-*P-*k-+=-+X-/K-4#-6)",song:"&P.@===yGOY0Z]^b_?jcu1-$@-%[-'[-)e-,c",leng:"#>&h++L@eD",ben:"/&<(DxRuaUblk/sIy&",cai:"#T677P8aGSK+U>a5b[dxeQob",ying:"!R$v&C&|(P)c+_2K2^6U7/8`9^:>:X:Y:c=?A:ASDzEAF7F9G0G1H@HAHBHZJKLqMwOmQ0QPQiR0S8SgVPWv[i]M]|adbHc@g:j/m2twv8vky?~_-##-$.-$i-%g-%o-%p-1V-3g-4q-5*-53-5o-5~-67-6C-74-7>",ruan:"&u(>6^U?sA7C~G3G}HRITJZQgSUb(hKn}o/sL|T-0#-0Q-4i-4~-6{",ruo:"0P1#DnI}mP-0e-0{-5<",dang:"!,#s%2'((2/[1f2&CDF3GbKuN(S)UCW&]b^A_kd&kEvWxB{9~A-8[",huang:"'w+e0f1q7O>=C1F#H|Q@RtSuYv[V[f_Xd,kWt3txu}yI},-$,-'P-*.-0T-1A-2]-5q-86-87",duan:"${'&.I1`2X6a:#IMK(QfRI]1a*g3kxu]yN|F~x-#J-+}-,*-5a",sou:"#v2BC;IQJ(L_M?Qum[o3t~uAyH-&:-&<-&S-'c-(R-*<",yuan:"!9!f)V.i0F6f7':.;m>CD3DYE?I?I_InLGLdO5PRPzQFQXQrT&TYUiUuV3VF[xa3bYh]iQj=k@kgl8lRnPphs'u(|^-%1-)9-*G-.o-30-3U-4V-5%-54-6K-6]-6}-8s-9!-90-95",rong:"+Q+S5E7@9C;^>FEFEfF5J/QhQwQxSDVEghthyb-)R",jiang:"(43u3|5P8:9L:F<>=.A2EaH^ILK.LAQjRM[w]=^W`6ngo>oF|H-#P-%5-12-2_",bang:"&<'A+%5_749B@uC8IcO!O*OvPt[s_olQlVt^y^-#3-,#",shan:"#:'m)K)q+W.s7g7}:D;p;r?pALATBaD&DtR}S,TCWjY%[b]r^ObFc?cVd^gGlAn#p!qtvBwRz4z5z;{@|P|X-'q-*J-+V-/l-1C-1D-2s-2y",que:"&5&E&g'6'7(1(N:P:RI]O6c}z}{*{l{p}a-4Q-6t",nuo:"+<+u3e3y4&5JiKWL.M4N*N+N7N@SPZ:^(^zhxnoqls?vPvvw:yz~<-!*-$O-$_-%7-%}-1Y-6<-9R",zao:",y,~1R3sC#LlMPOC]`d1f4fNk%ktoCwA",cao:"3m>9C=C[EwJ_R:VbV|n)uc-*D-94",ao:"!T'Y}I-*S-+S-0~-2b-5X-8{",cou:"@ThJiK",chuang:"'_,H,L,q{+{E",piao:"$+).1D7a:;_tmuuCuUye-#!-%;-%y-'i-(Z-,t-,u-1*-2m",zun:"8':^U5]Pk|qqv+-1B-2u-4n-5|",deng:"$7'q.M/H1pCCW|`:f9l>mxv6yx}E",tie:"=VH8OhaPbndXq'qzv>vRx'-&z-'Q-*i",seng:"-,v",zhuang:"3:3nF)F]UBUZ",min:"!B%9&`.}/<1l6O6d:,:wDiSSb'pqs7tEzEzZ{K{S-1$-2n-3P-8q-8r",sai:"2'@cb6c9-%#-0_-2X",tai:"0+27>h>yB8BeD]GeLjdIl[nSpfw^-&/-)E-+7-/6-2$",lan:"17212Q4/8K8i9x;+I2F7I@sAHM9N?R1Z@[`l1~u-)S-*B-*v-0s-97",long:"!p$a%n&=(R(S,u.!.6/;1*162N=P>'?6E'[,A6;9l;1;;-&@-&C-&U-'b-(W-)M-)c-*@-*d-+T-.9-0m-5=-5_-7.-76-7[",shou:"6.9h@yC2uA-(_-:s",ran:"7v>ZDZIFOEOYTST`Tz-,A-,K",gang:"%.&q/{639!:N:W:x>Ep+s)ttwe",gua:"506}:z;%>xU^|cnedr#rFxM-&'-&1-*9-3k-6c",zui:"#G)C+15&8d;$KjRdXHi]nInqo!s$s8",qia:"%{'I?1HyU4dUnU-!{-+z",mei:"!L!_#)#a({)]+X0h3p;I;T?S?r@PE&FfI@QGTZdMg0mOnlrKtUtZyMyQ~N-#^-.>-.F-5(-7(-8V-8h",zhun:"+$,56(>UT8YAZ{_Pj.",du:"#K#b*f.T.^1,>DCsFBR&SZSmUyWqZd^$^D_E`3b%bNc)mMo(sDs|v}yL{!{^-!Y-#V-#s-#u-*E-,,-8]-8k",kai:"II`7gysvtbt{vCxGxvy@z<{({U-&;",hua:"%;&K'B3S8/BWD9D:GgIKK[MzR#XKZ&Ze[4[>]A]o_&`0p(p)rbsdunxN-*]-+<-5m-8=",bie:"FTNFObRmVuf6-19-2l-8|-:[",pao:"%e(@(O,!?|H>M=TeTfV>dDdTgfq/x.-!N-!o-7Q-7S-7|",geng:"56575d6m7,9Q;j;uAbArG?HYM3PfQ4Q[SRi_i`l6v|z$-#0-,k-0F",pou:"0$UO",tuan:"1H4'V8a%u<-5V-6#",zuan:"1B2Y808N8U8e:Kb3fjftq)vxw?w~",keng:"%t&3&RZOr>t1uOxg|&",gao:"#R#g)4)6)e*m+N+O/v0~3i7E:5;O;TA'B,GILrMHZ[_:m+ryu#xny]-#o-'_-,4-,5-5R-5v-93",lang:"&7*n/dC(F{IXJ.JHPOQlZEg%lzl~m.rLu&xzz^{]-)h",weng:"#q:b;}=rJ0L(Qstg-56-7,-9_",tao:")?58617A7N9W9kG|PoUhX{Yn[{^MdwhXjPjenzs+|r-!k-!t-#@-#l-#|-&w-'d-'y-)P-)x-9/",nao:"%z&q'*?a@&@ZAkP6R~YZ]Ju|x@zJ{O-.'",zang:";S?_AmAyB$I,K@M#abambLbUb}rC-)A-++-,.",suan:"(z.b/m0;1BI^nn",nian:"':*5*P1Y3*C/K6evf5f[h=iCiS-/4-0;-1x-2K-4%-8B",shuai:"7>:4RNTH",mang:"!5!6&<&D.ZCvEXEiG4G5M_OvRaSAlDp.rsx:-)g",rou:"*!2w3X>3?l@aHdQC]tekhEt$-#2-#f-*7-0R-4t",cen:"+W.m1A",shuang:"(V7;CPuh}z~b-*M-*y-+^-5c-6A-7B",po:"%g%i/70I3'7i<,IlK,jLn%n[o1oKotq9uswMwz|=-$K-%a-)7-,N-.E",a:"@@s@x}|:",tun:"AYAeC~OlVL`G`IgJ~Z-&h-(0-.j-1q-8J",hang:".k/T5*9HBiDHOAT#UAa9j3lJ-$C-%]-.i",shun:"!x$&$1$9BZKo-$:-%S-,g",ne:"!vY6^]",chuo:"'j0^6?8&9bd!e'e`Q`b`va/hpj9k3l/lsn9tCvSyJy{{:{r}i}{-*|-,|-/n-0A-0K-2>-3?-4+-7<",ken:"&#>8>Y>fUFV$`S`wsh-:?-:E",chuai:"A0ACeb",pa:"/bm|roxk-.6-1K",nin:"?[",kun:"#7&H);*s+*5oGEPpUEUJUgV.`wo%sCy*z]zj{Y-)w-,<-,=-,D-0/-2G-4^-5'-6w",qun:"0<;_;`UVU^e.k&-7U",ri:"TMp/p;pd-)%-+(",lve:"+4rgrlxr",zhui:"&U((.h66729r:'@C@|[!b>c6j_o#s>sQvdy1})}Y-)s-+J-4Z",sao:"$O7m8<:A:HAdR4-&<-*#-*I-+Q-,:-0l-1R-2a",en:"J!",zou:"0&6GG=[)_CcNcOlem@mcn.|h-*H-+1-/w-06-2E-83-:.-:7-:n",nv:"2h=TSvSxp8wW",nuan:"-'M",shuo:"$m&+'$0cIvZaZc_>qttmv~x*",niu:"4H9.FxpTwq-!`",rao:"+i8)9FF,KdVvk}}B-'v-(>",niang:"nuoRoZ",shui:"#I)7*q*z@1U[ZaZcZg_>_KzG",nve:"&ONJ",niao:"@%E>K1T^UGVO-2{-6H",kuan:",s,tAqw(-,&-,2",cuan:",',Q,s,t,z1)1[fLfsrZw;yv",te:"?vRgr{xe",zen:"]V_y",zei:"S;a_bv-0M-1Q-2+",zhua:"2(AU-,Y",shuan:"5<@]z3{?",zhuai:"#1dmi'",nou:";v=,tfv;",shai:"/Z121J1e2[[K",sen:"Ve",run:"$1AOz@zQ{F",ei:"ZH_@",gei:"5C9J",miu:"7n:@]+_w",neng:"?LR'",fiao:"WL",shei:"Zg",zhei:"j:",nun:"-84"},m:{yi:"-:~-:<-:;-:4-:3-:#-:!-9~-9T-92-8u-8R-8N-8I-8+-8(-7O-7M-74-6l-6c-6L-5z-5)-40-2U-2Q-2>-11-0o-/_-..-,o-,B-,3-+q-+[-+<-)X-(o-(5-'w-'k-'=-'#-&6-$'-!?~=}E}1|x{Zz|zzxix6x.x%wKw,v%uPs_rurorEr8r)pppdpXojoioVnxn_,^g]|]{]`]/[!Z=Y5XVVTTgT_T7T1SxSsR~RyR;QwQ0Q!PDP6NbN^N,MZMSLXLIL6L$J9I}IUIIHMG?EaEHE4D!CwCFBkBTBEB9B5@2?Y?K?I>K>H>'=a=R;m:~:48c8!7,5g4q3&2}2Y1j1f1`1M1/1'0t.O.K,_,,*x*f(c'G&.&&%b%Y%G%$$b$6$/#x#T!9",ding:"-:}-8q-)?-%!vipfkGiydzY2Ik6u+B&^&[%_",zheng:"-:}-9O-7L-0#{1{,yjuvsRm*lNlIi;eheZe8e4e3d/`x_v]3[+ZSY8Y2XlVFTYT#Q1C@A!4W3w07.),]%*#C",kao:"-:|n{k][#TbL>>R3p/,",qiao:"-:|-:(-6A-5v-4=-3(-2[-.@-,2-$H-$5-!q-!=y/y$xkx4rSm+m!k]k%j:iSi(hqbvaT_wVuV6V$T%KgGaF^FKFGEpDSBCBBB;8<2b1C1>.}#e",yu:"-:|-:p-9^-9P-9J-9H-80-7t-75-6'-5g-5b-5H-4U-3F-2l-20-1F-+K-)O-)+-(J-%a-$p-$K-$9-!7}]}W}5{7zizNzEvyvwv9v3tytjtetcsqsos@rsq|pyp+p%oQn6m%l8kyklk8jfgvguf%eGdWbtb(aLaKa:`1_1^:]e]d]KZOZ!YmXiTDS`SUS7RpQyNvLAKsJKJJJ;IAH|HmHVDVD:D*D#D!CrC[CDC,B*@K=Q<><<<1;h;_:v9G908=7M7I7A535#2{2R1b1:1(0;/q.(.&,1+G+9+7)n)h)F))(+&*%!$M$D$=#V!A!0",qi:"-:{-:r-9{-9E-9;-99-82-8$-5f-5(-3D-2{-1:-0G-.j-(Y-(A-(.-'v-'C-&%-%m-%I-%F-%E-%:-$D-#N-!Z-!B}$zvyHwbw;w1u~t[tFn;n3n$m~l^kkiBg/dpdTcKbJ4GyGJEW8l1T",xia:"-:y-:s-9u-6I-5e-3w-+T-*+-(v-'m-%n-!!}({Mwtwpm/logkeB_3YST)P~M-1A-/j-/i-*P-*J-(^-&C-&9-$k}[{Xtrrbp,n8lJl%dqbm_c_L]cZ(VLV%T]R_R^QRQQPOK9IJCH@l@^@?=k=Z=?y>]=x<`;t;(9.9(857&6{6d5m3D/;.j+?(>(!&8%{%t%4$X$,#H#>#'!w",bu:"-:q-7F-,M-*w-*t-(d-'K-&D{B{?{6zPtOm#izh'gfd,bi[rY}Y{YfQHM,C>C;C:'=",fou:"-:q-(cvCBj4H",mian:"-:o-42-1d-0w-,S-,H-$`tktQsZqpq#aDNWJ^E=D~@p?|;k;,7G/o",gai:"-:n-9w-6e-+u-+t|'uYm@dy^AW%T`QYNaHZGNGM:M8|'{&6!,",chou:"-:m-:l-8m-5_-4=-2A-(m~{t/r!iKhld$b3aS_%[_Y%W~N?N=LJJkI|E?B_0h/O.s.p&3&!%l#v!m",zhuan:"-:k-7o-3G-3+-2y-.I-)n-%+~EzRyPreq;<`,E%g#(",ju:"-:j-:?-9m-7n-62-5`-5S-4x-4j-2l-19-0%-.Z-.:-,.-+n-)H-'d-$|{/ztx_uct_tNt$o{nvnqnOnMmqmil`jYj9j7g+e%d:-(h-(c-%5-!.-!,~|~X}2|L{2xhvCs7*6e4n2x.Q.G,n)Q'(%k%h%@$p#R!U",shi:"-:h-:g-9q-9l-9N-9M-8t-8_-7R-6k-6]-1X-0m-,^-,:-+_-+6-++-*>-);-()-'{-',-%.-#t-#7-!W-!>{>z|y{xn=}:{:s:W:5:'9v7C7?6n4=4%28.3.+.#,0)$&3$}",qiu:"-:f-:^-8m-6#-)u-)9-&+~*|FyTsQl4j2j1cFc&]rWkO%KIHeF8BpAn@s@b?J=o;^:l:k:j2D/T.k+D*'([!P!(",bing:"-:e-:W-8h-8b-6u-5B-4T-3Y-1;-0a-0[{mp1ngnZhbhah&cm[vY,W5R0QpN/MQLQLLJnJbGXE:@~4E)r%,",ye:"-:d-9z-9.-9&-4e-2_-0U-)7-(u-'%-$W-#,-!]{:zIxqxdwgoVm$jxjw[hZzZ!YyY;X:X6UhUcUUUSURQUPxP@P?P,OmOkMYMXIQHsHpCXBh>i-,u-,G-,/-'I|/{)y&u^tXr*mSm>lKl?eNc3_H^LZhXL^>J=,7[6?1e=_=G<8:?7f7d6/05/f*6*2)c%x!'",diu:"-:_-:[",liang:"-:]-:Y-9)-5x-5[-5>-5%-1G-0B-&J-%y-%7-$Ly2bWY7Q*KJIwG%~n}bvRuAq=pZo8o6m1lyh[hZh(d]d$c|cqbY`,^xXkTaS4OVM;LAKGK=H{GFD}DJ@8@(?V?>=g;C:b976B/j/i/O.b.D,?,>+Z+Q&g&d%O%!",yan:"-:X-9d-5]-4]-4O-3;-1u-1Z-1Y-.a-.[-+:-*O-*F-*/-*$-){-)z-'%-&=-&2-%'-$N-$G-!L~~~a~Q~5{GzAydy7xLx@wMw>vPv>uFu@titfrgr?r9qwqfqWpKmhlEl'kuktk0jUjKjJjIjGgM-9<-9:-7m-5K-0W-.$-*H-*G-*A-*?-(s-(H-&n-&'-%;}L}@}9{j{5zbxTuBu3t%q2n,lVlUhKh?[`[ZZZY:XLN'KlIsIFA0A,}>k:c9s84684l0$/w&C&/&,!*",zhong:"-:P-8A-83-7x-4Z-0j-/C-$Tz8ysx$vMvHs^o)i)eqe0dddYS`MKC2@=?G4w2k.T$F!>",jie:"-:N-8i-8<-5$-4~-4W-4!-3j-2]-/@-/?-/)-,r-,a-*j-*i-(e-&c-%d-%H-$m-$8-#q~zzKz7vevOuit>sasVsCs(qSpIoJnpnln*m|lCkvkbjrjqjgjbhihIeEbr^S^;]_[,YZY+X{XwX?W_UmUOUJS9RINXNJL0KxKoI~I1HqHgHfH8EOB,>j>;:z9b882?/'.6+0)H)8&K&J%g%]%M%##D!~",feng:"-:M-8:-5L-4N-2Y-0]-0&-0!-/{-/y-%p{Rz9z5w}w9v7odoYl}l|l5W4MkKPI.E[?m?h=S;Y;#:R8e5Z4i3V3*2g1h/1,O)u%C$B",guan:"-:L-58-1=-0l-*vphb@b?af`LXqW*SRJ+G*D(B2>wRWQkP#L)?N>=0X.X.U",chuan:"-:K-7o-3G-2t-.K-$]}Tz3jFjDPMIRIDCbA?@i,H+<)7",chan:"-:J-91-2y-2R-1~-1/-/:-.k-.J-.*-*~-%$-$F-!n~P~@xBszr>q3l>kJkCkBjXh{hpgWdu^r^lXsX+W;VqVhU#S9RYJsJXDEB#=v:^967o7n71655d5B2V1I,#&v&u",lin:"-:I-9U-2g-0e-00-0/-)v-(l-%PxDlbk,gIgHc=bob)_=_6[MVGS?Q+PGN!FIEmEDQ>L#JuJfJ3J,IoGcDh@j=|=h.h)e)N",zhu:"-:G-:B-9]-7d-7G-7?-6Z-.&-,t-,n-#T-!z~4|=xpx3qVq!ploNnWnIl*i>[[[WT&StS;OqO1O0O.N>M#LzLFGWFmF,DhDbD^D0BH?&>Q;b7t7Z6s5x5>4V4A3y2^2@1+0x0?,K*K%B$J",ba:"-:F-8l-7`-1E-)^-)@-(b-&M-&I|_{[x>wCv0mumIj,fq]o]I]6]#[GZ)O+M'D,5?4R0+.m+@%N#/#!",dan:"-:D-8~-7{-7H-2r-2J-/V-,,-+G-*~-*{-'f-&2-%C-%B-$v-$F-!m-!b~[vTsjiofTfOfEb$aga>_q_P]4[VXuV@V?UjRiM/BeBSA*@)>rc>C=n=$;S;N;0:N:08?837i6R6G5|4]4>4$2]2O2F1]0u02/$.r,[,P,I*~)h);'f&H%!$N#X#U",jing:"-:A-9C-9+-9'-5r-5%-3A-2O-1N-0K-0C-/9-.~-,y-,k-,[|i|g|cyIvQt:t8t+pojAh|fdfZeeeWb/___NUoT+S&S%Q:Q3PIP0KZJpEvBsBn@I@H>m>%=><87]6#,r,'(^(B(<%($u",li:"-:@-6_-5u-5k-5Z-3s-2&-1z-08-/Q-/=-.o-.G-.'-.%-,l-,&-*L-*I-*:-*.-*!-)|-)Z-)X-(z-(2-&U-&0-%g-$C~g~`~A~>|`yrxEu+tat#rjqYq,nAmkm5m.lzjag@b]bXbRbB`l^&]q]gWYU@U3TsTlSpP_P>P%O&NmN^MqMSLnLcLYLUK!JoJdJMG1ECDuDjD_D8D.C/C+?k?[?Z=Y=U=/:/8z7@6C6$5H0a0U/>/=/#.z,~,u*V*$)z(t(_'x'u'l'W%R%F$l#P#A!Y",pie:"-:>rVV]V[PHAD8>",fu:"-:=-9c-8[-8#-7z-73-5y-5m-5j-5U-46-3v-0d-/|-/J-.R-+h-(=-(6-'[-'S-&E-!s|<|!{]wvwWvVvRuru'tDt,sbr5qJq/pmp3oWmgmFi~ifi7hzh;fwfkeje?c{ct^w]l]J]&]%[Y[QZ+YfV7S}SLS)ORN+M]MGM)M'L1KWJ2IYIPHKA:>~>Y=W-8%-6;-5|-4k-2k-2:-1q-.T-,|-,C-+y-+/-*V-(U-(T-(J-(?-(+-&)-%K-#v}4|^zLykxvvxv4u%tjthsurTownkn9n+lmkzk_j6hFgQfudbd`d@c'b[bZbKat_]^[]e]d]]Z4WGTTS7RoROQENvNtNoM&K#FLCVC=B3@[@Z@S?{>T>*=V;^:,874(3C322*1w/V/A+3*4*3(|(P')$h",tuo:"-:6-8X-77-6h-6.-'a-'G-%[-%$|Sz;v8sNrRmck'gzet]i]`[H[F[EZMYuV1NgN^MTM8ITI+GbFBF0AvA_@d?`?_?^-)C-(W-'v-'8|||{|T|:z~z{yFy@x$v%uNtsrGp&m7l0j+iridiahyh5h3ggf5eYeKe4e3dmdUcU`6`*_$^{^E]Y]F]E[u[HZtZpZ]Y{XvWpWVW2V{VvVtUKUJU>TjSMRwRgQ`Q/NOMyMcM2LqLhL6K~K7JjIuI]I*H+GHF_D|DnCAC6BiAJ@t@O@N?v?T?3>V>34`1_/9,x,^(R'w'[&3%c%;%7${$z$k$E",zha:"-:0-48-.N-.=-*C-(w-'X-'?-&K-$j-$O-$Aw/pNd6]s[m[XZdX4WIW#O2M7M1M0LvLlI?H4Fv;X:67u5#4@2N/p&d%.!M!H",hu:"-:/-:'-9j-9F-5E-0Z-+U-+L-'h-'W-%n-%Z-$_-$4-$1-#>-#2~k}v|;x1x0x,uGt4sEr]r[oxm[iphxfxfgdFd*d)cGa{^V^6^4^3^/^.^,^']y]9[xWWW$SXRFR-'$-&N-%z-#p-!}uSr`ljk/cY_f_eYtVZO:L=G5F!=O='8%7a3{/^./*<$f#c",yin:"-:+-7}-6^-0t-0;-*c-(j-(V-%o-$d-!T-!+~l~+~$}`}$|&{w{YzXz:w_u=t0t&p:n}lnlLlfya@`i`B_u_t_0SMO[L:KKEkE@E1DKCwC_BYBGA5>l>d>U<5;~:}:i9}9V6^6]4).],|,j*I(U$7#k#_#:",ping:"-:*-5i-0]-/z-/s-'u|Qz1u/ngnZmTi[iJi4heh&`0_zMfEU?6>6=A[KMbLw",sheng:"-:%-:$-4H-.X-.Q-,?-+0-(9}=x{x7u*k}_VS[RGQJQIOeMuIyG~E{BzBF?%;k;@:q7G2u/M.N*h)i&y&s&`!'",hao:"-:!-65-3k-2)-)6-'j-&_-#k-!t-!Y-!#~xxRvacOblRDR'QBPePaPWP7J!A~Ao=]-'6-&/-%]-$X-$:-!p-![~T~8y?xWwnw'tgs;rCr@nsncn`nRnHkgk9jpj`jZiqiOeceOe9djd_dEcscgcZcKc/bqbeb8ay`r`p_s_r^V^6^4^3]_]O]HW%R:QKQ9Q6PEOzNON)MdLZKSIdIGG{GUFkFRE|EjCzCuCmCMCJA4@e>X>S=f<[;i:+9h9)8p8/8,7N3e3R3K343&2Y2+2)2%1q1P1O1N0}0P/E/?/*.{.t.#+p*r)|(#'h$1!k",xiang:"-9x-9,-9(-6}-3*-1}-,4-,$-*0-(x-&r-%L~Ww~uXk5j)h7gqe'abQXP5LWH^F1DH;!8:*E'g'T",shu:"-9s-61-5g-55-54-1|-1F-)Y-'3yNyGu[tGq4oNoCnWnIg}gxdWchcgcIbt^X].Z.Z#Y>WBU9T'S|PvPtP*OhO1O0O.N[NBMtL`JtFuFYEpBuBKAaA`?c&=L/3,E,B*n*d&f%0$8",mao:"-9k-1,-1(-0|-0z-*dzLwksLmOkzi?a=_?^(S/QvPrN4M@I'B!AcAW?9;F/Y/#,J)E#$",mai:"-9i-7I-,{-,*-*}-#${Kx5",luan:"-9h-9Y-9V-*^}C}Bvmu0qXq:q$m)jOZ[TvOuL2D69K5J59#4#3",ru:"-9f-6K-2C-1K-(N-#{-!$vkv[s7qyq)jciX]kZgUTP+NzL(E0@W>7;Q9u6b+^",xue:"-9e-.x-(Q-!9|Bxbq>q+mmmMjzf=ckT/SlKvFc?!>u9j7>5y1&.B%L%<",sha:"-9b-4c-3?-2H-/,-.t-*+-%t-%^-%H-%4-$R-$0iCgkZEZDW$<%81806O5S4B2Z/J/B/2+%!l",suo:"-9_-9=-3]-&8-%x-$&-#j-#gu&s(as^$ZEZDW:PjKaJz:E9y+|)w)v)!(]",gan:"-9Z-8S-7J-5&-0=-/u-'c|Ro'o%o#o!hfh_dqa5U~T]T6R_NuMDKLH6FNEd@??;<:8f7_7/55+;*w'#%?!T",gui:"-9X-6q-3{-/(-/&-.7-.5-+Q-+J-+I-+F-*%}3{zv2u;s?rhrIp|k$jpj`iLhLh,gmf;cMVxVVTiThRCQ2O%M9L.KeIeI`GTGAG_k_Z^b]7Z`Y~Y9V^V;TnSgKTF7F6D[CvAG@:?!5P2|1d1>0S0G000/+z+M+)+'*](n(G%L$3",liao:"-9R-2|-!rrLovomo[>90%*F",chu:"-9K-5N-3d-3R-2K-2!-0$-/m-/Y-/I-,t-*)-!o{$x!s>n5hjgXcj`g_SWxW$VoTNS=NEIjI&HoHQF|E}EsESE#DsDdCzCG?@9r9q6x4N/+*+(,&;",kui:"-9I-3{-/4-+I-+F-$U-$;-!xwow4s/rBo*mQjVjHb]a.a,_y^BXgQdPyI2I0E&BV:S7x2l.q!/",yun:"-9G-7r-3q-1p-+}-+x-(0-&^-$^}xwEvsvEqOb}aca4a)`c]2[yRNQTP}MwHWF@BmBaA&A%@0=3=!:!7W2h2:202(2$1b.Y+(&P",sui:"-9A-5#-&F-#U{3wytvr1nwn4kpRqEWC1C0Ab=H9[7+6z5}2C1g0~(/'p",gen:"-9@-9?-&pX=X'L7",xie:"-9=-9!-7[-4J-4A-4/-39-1{-0s-0c-,w-,+-+'-+!-*k-*Z-)7-$(-!C~e{ry_wrw8w1u)sOq]opnenVnNm$jrgJeFcT`z`p_BZ~ZWZ8X9WnWMV*UiUFT}SWRePXMZLIK@JwI,HOH?H/FlC]?K>p>A;P9h7B695{5!4Q4P3b3E2,0w0s0O,C+k+e)8",zhai:"-9;-6B-4f-4*-3E-*K-*C-&c~zw{p{os[u[2YxW/UwU>SiSfH#EL#t",tou:"-98-4'-4&{$wNv'sqs@aK]*T0SQ",wang:"-97-8v-87-1JvYo7o1o0o/eoeiefe[dldJa}]>RTQ(OEODO=N1JD@J6;+E",kang:"-96-8)-+X}|rmkKg|dG`8]f](G=8_4d.a",da:"-95-.N-+f-'f-'R-&m-#~-!J{hxrw[v*d'ag_q]nWZVJ@f?}:<4Y0p&@&4$#",jiao:"-94-6n-6D-2q-2j-2I-.B-.6-,6-)B-(<-$H-#M-#K-#?-#(-!^-!=~IuUu1r=r6qcm+m(k1k%k!e.e+cJbl_~_i_KZjZTZ5X&W9VlVCV(ToTJT?T,SwSuSgSSQbPgP2LOIpG!>!:l:k9Y8w8<7b5[5C443,2b1>1*.9+l*X(5#e!v!^!V",hai:"-93-'V-'0-$#-#h~ey]vOq;pL[!A3=N3[,C",heng:"-90-&B-%QuJcXcLbaVKL/FiF&<|42*B",peng:"-90-5,-3J-.F-+o-!~zgyqyYfUe|cyc+`%[tZ?Z6YkXpWvW4OTKCJLIlIWGGFn?6t}sxk~hVhJh)gBg?g;dzZT8T.O)O(NfN^MrMTMSM&KuIRAh?`?^&D$i",men:"-8{-8G-53d8bcbCaz_9_&]VYgS^PZIh@>3=1,+((W",ren:"-8z-8y-8s-8U-8F-88-/d-/cx;vSu`n:n2d|dwdv]XO,NiLPLMK6J7/]",shen:"-8t-7V-6i-6/-5d-1Q-)l-)k-)j-)i-(V-'i-&}z^u|u>ttsys.qmp_pHorn7lui(fp`t`b]b]4WPTFR4P9P3M:J7J(IHHRA9@+=D<0n:(9U7C5[!e",jin:"-8o-8j-8d-7}-6<-35-2^-2=-01-,y-,k-,[-*X-*'-%o-!F~y{Fzkz6yE=q=M:I9$6~6g3h2M0i*Y)y)K(z(d(@(*",pu:"-8n-3$-+k-!S}^}O}<{BzPy(]p[rY{V0UvTeTdQ;PiPPP&O*M,FZE_AS=`:17k6T614r3a+v(C$m",reng:"-8g]m",zong:"-8f-5:-4y-43-3KzFpikxkrkNeJcdaraVY^XXX(W&Q|O>MxJQIKG28L8D8#3+1n1c0{,b,R%E#w",fo:"-8e-8;-73|IJl",lun:"-8c-7i-6S-4u}l}Y{.t*lSlRb9[{YMJa?j<6:3",cang:"-8a-89-7h-5;-3e-07-+OkeDW<];o:Y9g9_8a7;/G+J(!&Y&7",zai:"-8`-3V-2G-1!-&v}8pOl.]j]>L3>f;>:.4|4{3~&Y&7",ta:"-8^-6E-3^-#~-!&~Kz$yyy6vep}lc[HZXW`V&HCG}EqA[?}u.t`tZs~r~rOrNr9q`pUo;o:nBmylxlhjthhgCfhf+dI_a_X_R_'ZPYQXsWnWiVhVXVSU6U'QlQNPKNFMhGiFFEtDRC~ArA@>S=E=7:]:C7Q6*574*0l.=,s,G+f+c+U+O*|*s*T*,'3$c#b#Z",cha:"-8X-6Q-4D-/,-.t-)e-$A-$$~s{yvbu?o|m}kqj3]a]OZ7Z.XZX5WJW1NsM0LvK?I?GjEB@k,<%s",hong:"-8W-)w-).-(X-(K-(;-&{-%}-$)~i{kvXu6pqpjn=j[fvfBa*``XeVNQ[@E?y?<>@=b=S;J;B:R8J7U5(3|31+>+4'T",tong:"-8V-7/-6R-4Z-2h-,/-(}-&|-#Z}o|/mNm>m3h:f(c%`P`)Z1Q]PwwuqtKqdmdmVlQjhekYffd9]bDaxT:RBQtPcIiATX7s5L",fan:"-8E-0)-0(-0'-,1-+R-)a-!hy%v_tDr;r:iwhwdi_h]l[ARvRtNpMLKXJrJAG,FD@w@g?4955t5_3n2E15.l.[(A&O&/&,!.",miao:"-8D-,m-)v-$?vDscrPh>gtgSX^NP<#;A+K",yang:"-8C-7<-6{-3[-15-,f-,@-*g-'Z|J{xwTukswmrl6l3e`d4cEaA`m^}]T[lXRUz>`8N6A4y4D4.2B+6*O)4%Q$|$@#F",ang:"-8C-*gn.RLQoN0!5",wo:"-8?-4s-4L-*l-(/-'&-%q-$atCtBsfi8^TZYYbYSXKV#SRN8I>@1=#YqXmXjX7WmV!UGU'R{PpO_MoM(LEK3JgIfIJICI)HEG]FhFCEKE2DLC&BMBLA]>a>$OYOSN.K&J*J)F)A>@66}5i4v391=16+{+.",bin:"-86-3S-2EpAe}W?UNShJnImGXE:B^BO@r9I6q6Q6M6,+.(j((",di:"-85-7@-5a-4F-3:-*D-'}-&t-&$-%R-%&-#O-!(}0|h|d|@{Q{L{8zMyFy;x|w?tqsmrimUkIjoi`hBg:fofjeld#`7]g[g[=YFX]XGW2TLT!R[NfN(MrM3KAK:JCHiG7AI=g<};T9f9=3F/K.V+=*5'1%c##",fang:"-84-4}-+^|r{Qzcv5er^%TZS:S(RER6N/@<@'8*4c1@/!+m",wen:"-8,-/X-(M-(C-(&-%Jy`vNf)dfde]:X.WRSmQsKNHWH)C$B`@>;z;R:*4s+1*8(}(&$;$.",xin:"-8*-7f-5d-5G-!3-!0~%vSCR9N@N%D$C^4a3$",ai:"-8&-2W-09-)h-'!-&q-&5-%Y-$'-#]-#E-!;{SzIyfxUtgtUrxr'kaa9_7_,ZNYaT&T$QqP^P.CxClB.:%9t6U3.03(k(;#]!s!j!]",xiu:"-7~-5c-5V-''-$/~|p@mfmPh2N~G09~9F8I4+*P*#(N",xu:"-7~-7Y-6Y-6!-49-0x-,F-,E-*Y-)T-)+-'p-$e-$Q-#7-!o-!W}7{Wy,x+v&uxspsArFhHeXckcKc:b(`g^YY4XMTKT@RbRZR!QcP{O^OOLGI9GfC|CtCiCOCKBw@5@4>?=t<>;+;):P9r998W8B433W2H0m+t*N*?&;%T",tang:"-7y-5+-4M-3l-3U-1v-.2-&.-${-#.|XzpyukdilaA^cW^V~OsJFH%F{F<@P/:f8U6y6Y6+525127+_#@",hui:"-7u-7#-2u-1{-+H-+.-'/-&j-$[-#=-!f-!U-!D~p~,~&}u}Fz]xztEsgr7q]onn?n>i*gmg7g5f6f4f3e,e*cDcCcVEQSQCP|PQO]KeIOI3GRF4EiEZEQDqBVB>B=B7@n?D>h>g=y;+:S9X897x796y6:5,5)3t3q3k2h0y0q+h*9)G(=(2$~$)",kuai:"-7u-6@-2M-/p-&f-!8}:|ez&y'jEgMdXUkRrO]Cq=y79.*+g(2",cui:"-7s-5?-3N-04-%I-%>y8lYlWkhdSbE`TV|IxH*GHAg<48P6a331g)p(b%I$L!d",che:"-7n-5`-4I-,%-'y-&*|?vln|nGene/]QY.XcVsV>V<7`3r3b3E0C",chen:"-7h-4_-3e-2'-#|~ZyWyAw]pGoBdRa>[aY]THS~QAP$L[K_K'J(HUG3D]@+@*2n05)l%P$?$$",xun:"-7g-6O-4.-,Q-,A-,)-,(-+5-'3-!k-!P~u|y{=yixYxAw#uHqKq9o`oOmEj@j&j#g=ebe>c]`uXUTfRcP(NqL_KbF`BvB@Au@Y>5=r=l8+7y6V583O2h1{1D130j0Y0Q.5+b*H(L&T",chi:"-7c-7M-6b-6P-5E-3@-,W-,K-+_-*]-)<-)3-))-(:-&W-$z-$I-#l-!g-!=|@|)yLw/vBs6n|fsf$eweve6cBc9`X`7_|_2]`[f[!ZvZ/W+TxTCSNNcMPM3G1ChC6C4BX@T?Y;:8g4~4;3U1K.O'A$Y$U$E$2#G",xuan:"-7b-2N-/.-)o-)'-'(-$Y-$Mz)wsv&sWrqr.p]f[cobMaQaI_I^nX_SyS'RAR,QeQ$Q#PNK@HxHwEf?#;I8d4M3x2e+L*s*)*&)B(Z'~%/#E#<",nu:"-7a-3r-,svjq?ilfed1Wo",bai:"-7`-6z-(1-&:hJ[?[>ZwYeX}WAUfUCTAMFLN,n'D#*#)",gu:"-7_-3T-2e-0F-)I-'s-'N-&<-&;-%G-#y-#@}gzfx#uhrUq@o&lXl=j5j4d*`~]_]9TSNaM.K-27-+8-(%|Nzsznv/v)t'Y'R$*#[",zhou:"-7W-6M-2X-0{-'|-'z-'Q-'5-%X-$i-!G~{v.t/pgjCiceIY%QnQLQ8)<3;[5U3G2o0D(K(8#9",ci:"-7T-7B-6m-47-17-/+-/'-'t-'r-%@|*q}j3h<`hN|MILHD&C??56Z*p*k'E'6%=!{",beng:"-7S-#w-#+{R{#zgyXw!lBkYX0>v)d)[',&k&j$a",ga:"-7Q-'M-#A-#/-!4wIwDoEo>o.RaOM+C",dian:"-7K-7:-3m-18-**~M|P{lyBxfw6v~t6t!kXj]jNjMh@ao^!YOTrTWT9I_GqG_FPF5B?-(7-%`ylybwYvit=nodgc2b:Y#WPQ?LSB{?U-72-66-4E-'L-&,-#!|lmtmsj;h0d6YTV4R%M7M&)e",ti:"-7;-5N-5'-4R-/!-.n-*;-%H-$y-$3~w~rw?smsPnmnYnVl2foeCe6bnbjb#b!aU^)ZHY*X]XGU>OaONL$JxJCCQB]=0;T8O*5)A'r",zhan:"-7:-4>-2y-*s-!IrQnamRl>l)kCkBk.j|d+b0^M^?^5W|SJSGS0RsMjLiL-&t-%H-$j{szSmDl/kIi3c}cPa`^IZbX:QwP!M2HsGUBcAK?I0*/}/n'_&#%q%j%i",gou:"-71-3p-0y-+z-)H-'p-%W|C{uwdwcuTs0mnfM[CX%VcN6M^Gm?q:925.C*o%2",kou:"-71-0f-.C-,g-)J-)DpCp8fId3]^[|VpTV9@",ning:"-70-6>-4a-29-0.-'H-!)r%q!p2p)p'p!ot[4UMM5F/E5?17J6k.<+a&i",yong:"-7*-5t-3M-,U-,T-'T-$t-$+-!:{Oz!yCxcrlkUg{gAe{ceb{bzapaC`w`n`:[6XTU}M4LaGQ@}>x=9:p947:5T/{/i&p&l%)#S#8",wa:"-7)-/n-,e-(/-'P-'&-&x-%h-%A-#y-#nu5tbt3sGnCije[ZaWUTq>.:;8h'V'D'>&A",ka:"-7&-*r-'O-'M-'4-$u{g",bao:"-7%-5h-21-/>-.e-.]-,!-+{-+s~ozPzOz@sBqBpcpMp$ohoee&d:[w[kPPP1P&M]614J2<0_.u.h*G",huai:"-7#-',|mx^xIe_dC_:^oGhDX<25z",ming:"-6x-0g-06-(|-'guEs&`aXxR@PhOFH<>0:7,8",hen:"-6s-&p-!3eac6[0.:$y",quan:"-6p-1H-/.-.#-,5-,#-%%}X}Q{4w5u:t;q[m?jRf`c0b_b%['Y`WKNxJ:I[H_GLFjD>?F>F:a5841/I/H/7.o.n.m.O)2&I%'",tiao:"-6o-%Xr#pWmjmWh4cRZfSQRdQjOLO'NYK.Fo",xing:"-6j-5.-1<-/U-&g|0{auft{t5qljAh`f*cxb>aZUYR/P4Nl>ZG<9;H9<8o6o6l5n5G1z0B,a+T'h",an:"-6W-5J-4<-2D-*P-*J-')-%e-$x{b{&z_sYpwn@n8mXm:hXg~ZnXNQ.PnL'L&A1>M.g*w$V",lu:"-6V-33-1C-.H-,N-,<-*q-*o-!N~q~_};|G|5yVyUxMtVmChGgZgFf9f8^7XzW)V)UzUAU/O{MpLeJ#G&FyEuDvDaARAM>sb._,A$C",jiong:"-69-3'-1.-1$-0}}z|K{;]~]}?M=J7e4t4I3c2T2S1W1.",tui:"-6.-6(-3&y'tmo$ftfodrY(F>24",nan:"-6+-*|-$r~'~#v=tzstrb^e[sXfPqN*M6H}:d29&a&?",xiao:"-6*-5v-5R-3a-.x-,d-'j-'1-&l-&P-$}-$1-#D-#?-#&-!|-!v~c~J~CuUtHqGpPpJoKlGh/fFcJ_iX;V:TPT/SoSnQVQ'P;MiMaLOK+DOCYCLBAB4>B===8M=5;9*7)`$V$O!r",guang:"-5~-2}-1h-'@{~uIhXhTgOZsVKL+>28)5/4b4_4^3s.d+Y*U",ku:"-5}-/3-&Q-$6~R}PzrhDh+gN]dZiZ5OPMgL!I%3N.>$9",jun:"-5{-2T-0q-(n-(G|u{NuHollq_;Z3U5TzQPKMJH@F=l6V3G1B*1&'!Q!K!J",zu:"-5w-5?-+1-+$-&S-%rlYlAd(S#M1Ix0'*e",hun:"-5s-4o}_t9t'o9dMaz`oYDR?Q~JYJRBf=u>=4:&9z828&+F*L(F&r",lia:"-5[-5>",pai:"-5Q-&sg9eP[NY?JU?p>+;j;8/t.w,q",biao:"-5O-36-2/yJtIryi%f!VfNhLjFzEG<.9C66511o0c,k#|",fei:"-5M-.m-+M-*4-(i-%8w%vZt@t?nXh8gpgPbH]xSdQxQ%P:OPNLLxJVH5FOF)Di?Wq>O>N;y8^6F3{/(,T+P*M#y#5!Y",song:"-4q-3I-0D-)'u8pulDk^kOgydYdAb`a3a$`D_MZ#XXW0NK%J`HyEF-#*-!K~Oz%x#s{sXs9s%quqqq_q%kcj[jWhCgDexdha/_AVwV_U0U&R]R.Q:PwO?MHKpK]J{HvHdFbDMDI=_;E:U:K9d9O8K8F6j6i6N6=6&5~5o5j5M5A2w2r2_1x1)0b*:)*(y(S'i'5'%#j#;!B!;",ruan:"-4[zJxQsiVWOUE0):'}",chun:"-4Y-&7sda^RPR(PlOONDIBGrFQE(=T<,:[9N8u/6)C",ruo:"-4S-)[sskPf]Z:YUI8;y3'0^",dang:"-4M-2P-1V-/k-!1}*{fx]swpkl6kdf:aAZUUsTpKiEYD5@|8:7E5D*;(J(6'?%}",huang:"-4@-1L-/w-$PzDz.xtw&s[pEl9jBi0e@clcQa_a#`dXTQgQfPBOEHbH7D{@9:x9i8)4:2c2.1J0X+w)((E#i!}!g!Z",duan:"-4+-.Uz+s`SFS[$XOVUU8U*TwR1Q&PYKrEy6E5K't'k'c",za:"-4$-+Z-'b-'X-'2-$c-!c~B~:~5i}]s[$NyKr?r?a",lou:"-4#-38-.}-$7-#ByMu4tRo{n[kjkEg_`5X)W'HaG#:O9&8~1i'2$5#o#n",sou:"-3z-0J-)Q-)N-#z-#R-#QgsghZ#YvWlW>W0V:U`UBJ/DgCn:#,5#s",yuan:"-3u-1n-1)-0h-.z-*3-*1-)y-(0-&^-$Y-!<}{}t}Z}R}N}M}D{t{_yawlv6v(sSs:s)qhpepH0ErDk@/P>#;L9A8M.|,&&B%y%n%m",bang:"-3n{^ypiNi5h~hme|Z?YrWvS2KEJTJSH@=j/m++",shan:"-3h-3)-2R-/F-/<-.a-.E-*~-$q-$F-#H}'{Gy+y*ulubr2nDj|i(f+]zZ;Y3XuXsWaVhV?UySvQ8NrL|LlIVFSEhCI@`7|7p7O5F4B2Z211~.4*b%U%1",que:"-3f-*_-*W{Pyty$lgbNa+`KX!T8T.JBH$@j4e0|)O#q!N",nuo:"-3Q-1w-$ftxa6_#_!ZLXnWoWbWLK0HJF2Am",can:"-3P-2F-)l-)k-)j-)i-$D-#H~:r(q3amah`W`V`U_[XsVqVhO_BtBg;/784z1!0L(9",lei:"-3O-24-1t-,J-)q-#1|(z0xOx?rrU|U;G'E]DyDxD/?$>I=+JO7F5&2>1#(](7#&#%",cao:"-3L-#GnGk@`v`k`^_DVAUqOgOfG:8x",ao:"-3H-/n-*&-#X-#W|H|4xnxkv}vyvwsDs2rZmxmakAjnga`O_@]I]![DVuUeTBM*K=?>9;7M741m1^0Z,!+~(Y",cou:"-3D-0:Hl;1",chuang:"-3B-/b-/K-/5-.s-.i-.L-$T-!dhvhMd=`|W7O|;z;+:t8(+1*c)o)j)=$R!D",sai:"-2V-#b-#)-!/yod%a2XaAxAb",tai:"-2B-0_-)=}e|Mw[wXwOvzqvqCdodQdB`e[pU]SpR]MeE>@f@D@C>{:=4G4F1$*f",lan:"-2?-1@-)}-%P-!'~3|hx`xXt(qgqaqUmwkwhgb)_8_'^p[5X/UXU(TmSaS_PpLbHXDDD2D1=^9L8i7K6W5`5W5=5<46121%0n0d0I0@0>($'j",meng:"-2;-0k-,Lwaw`qEo2hnh*_._+^qXtUaP)O9K$F;EAANAF:A6h,Z+]'/&X#B!#",qiong:"-28-*fr.pza]`!K}F(3(3%2L1}*))J(G's'f",lie:"-25-0N-/O-,z-,w-,`-'<-&G{D{CuDjaj=djZeZ_YiUEL;JMA{>_=p403f2A1$0a0[.x,h,V+k+[",teng:"-2%i+9]8r1e%6%&",long:"-2#-'J-&]~^|7|6xHxGo2n=k6j_j^g.e([9U.QmOxO8LgKDGYDU>t:g9T9%5w0N*Z'n#f",rang:"-1}-,$~Nx[xC^mU$5b0K+S'X",xiong:"-1m-1j-/q-+v-+p-&zwsdLc?Sy@;>42w2r2#2!",chong:"-1l-0Y-#L{*p`oflelde0dc`+_dXT2NB6[6G5|5u$P",rui:"-1g-1e-1`-)LxFas]0M~KVF.@G)'&t",ke:"-1f-/*-.w-,]-,R-+;-)>-'o-'0-$!|Dzqx4u#p^oUmomIkvknjqc4bra6U4U0!/N//*j%>$O",tu:"-1c-1]-0H-/o-(y-&3-%?}n}c}J}I}A}?zezZyvxipvnUlskikFh.gVeVc}bsZ.YYX@W2K?EL@R=C=::r7u(i$r$>",nei:"-1I-1*-&TtvA(=w::8Q7V631r1[*a)~)%(v(?&S&>&%%r$(#d",shou:"-13-)`-)V-%l-!o{ox)x&pxo[]v]uYITcTN,",mei:"-0I~j|vz>yRv#sks]sTs4r

-+b-+(-(_-(.-&h-#%{@wGuWs}s|rJrDlaWTV}V+NAMvKfIgGKFX9a7c,7&]&+%~",bie:"-/A-/;fGe2`#M'M!$!#I",pao:"-/>-+i-'^~o|2w=hA]$[P?.4J4H3d06.M'^%A!S",geng:"-/7-&A{TzHlrh=ZIOlK4IX=X2p&M",shua:"-//-%j",cuo:"-.y-.p-*5wukWkSh!ZKY&WuV4(o$j$'",kei:"-.woU",la:"-.v-%3-$n~L|8[RXFXEWnUEU2R`MOI6DT:T0['o$A",pou:"-.l-'_-&[{]twtO]+]&Z+YGJS/<",tuan:"-.I~!}~}K}HyPy&f7`>[}XIVmGLE;;.:m8t2[,F%v%p",zuan:"-.)XOTt",keng:"-,x-([|t|kvIZCXlVgBF/C",gao:"-,Z-(I-(>wRlpWjNHGxGwGdG>E~E3Dm,)!y!t",lang:"-,V-&J-$~{Jy[r{llgiSeOIOHO;KRHHG4Cp=[3Y,z*%(s",weng:"-,@-#oyxv{kfU!Pd9o'N'&",tao:"-+m-)E-'+-%DwPwMw*r}i/fl`j[oYBWXL,JkGtE?><=)'v",cen:"-)l-)k-)j-)i{Un#kH@?=1",shuang:"-)byOqeq^`NDB>t8R5w5^0&",po:"-)8-&M-#6~]|ZvztMoZmlmZg9W]TXR+O*E%?E>q>o>D;*:J8;6F3v,9*l!`",a:"-(s-'o-%O-$0",tun:"-(k-(7-%L-!`}}|snFhNdP_mRQPFOC@x=335",hang:"-([{dwSvIj)dGS8NML/@.",shun:"-(ZHnF?",ne:"-(R-(8-(%-&T]0%a",chuo:"-(Q-&@-%=~Hu!t~t.ssqVa|^2Z}UuCClMi@i$fDf@b1`Y_4XyW6TMMzJ$I:GOD{=#gKfVfSfC^P^N^>[zWQW!VySKMlIvGkFdEJ:)8{4[1s/|/z,f,.*{(p%m",pen:"-('-$E-$=-!6CN;'6}'Q!=",pin:"-&~~Yuatnrvq{[AZ{H]@_/c+!)r",ha:"-&wvz",yo:"-&`-%c-$B",o:"-&X-$a-!H-!%",n:"-&)-#a",huan:"-%v-$Z-$Y~G}D{_zWw@w2r.q[pYp0okm8l!h]bVaH_I^iYpXQUnU1KyK2GBD%CPCB>1=c<~;c8V7D734/3>2I.[.;,3+R*})9(1'b$d$:",ken:"-%V{qxjc*_CX~*I",chuai:"-%=XIW}Ch",pa:"-%/vLisihd.]oX|NC@r8608)P#!",se:"-%,-$,yogK_WY%X`W~J/J.Hl",nv:"vkc7OM@!",nuan:"vcPo;`:m2X2W",shuo:"v]a'WhT'S|OKGnCn>>470W+p",niu:"v?q=dKd0]S]![DN?@8@!4u/e/d.W",rao:"u2rA]PU?KkFJ",niang:"t|r&qb",shui:"t]iTZMYuA$A#@{=.=*",nve:"t)%S$%",nen:"sirarYc^",niao:"s!r+qsnwFq9x",kuan:"pBp#ooK)CoCfCd",cuan:"jPV'U*T~TwDtD7BU@o6E5K1S0<",te:"dsdr`R/F/9",zen:"d5VU",zei:"^H",den:"][]C",zhua:"],ZYV#ER0:09",shuan:"[&L^GL{let t=0,n=1;for(let a=e.length;a--;)t+=n*la.indexOf(e.charAt(a)),n*=91;return t},Tt=(e,t)=>{let n,a,i,s,w;for(n in e)if(e.hasOwnProperty(n))for(a=e[n].match(ia),i=0;i(yn("data-v-50c80b83"),e=e(),wn(),e),ga={key:0},pa={class:"container"},ha={class:"action-bar"},fa=["title"],va=["title"],ma=["title"],$a=["src"],ya={key:0,class:"icon",style:{cursor:"pointer"}},wa={key:2,"flex-placeholder":""},ka={key:3,class:"action-bar"},ba={key:0,class:"gen-info"},_a={class:"info-tags"},Oa={class:"info-tag"},za={class:"name"},xa=["title"],Ca={class:"name"},Ma=["title","onDblclick"],La={key:0,class:"tags-container"},Sa={style:{display:"inline-block",width:"32px"}},Ea=["onClick"],Ta=["onClick"],Fa={class:"lr-layout-control"},Aa={class:"ctrl-item"},Pa={class:"ctrl-item"},Da={class:"ctrl-item"},Ia=ve(()=>O("br",null,null,-1)),ja=ve(()=>O("h3",null,"Prompt",-1)),Wa=["innerHTML"],Ua=ve(()=>O("br",null,null,-1)),qa=ve(()=>O("h3",null,"Negative Prompt",-1)),Va=["innerHTML"],Na=ve(()=>O("br",null,null,-1)),Ba=ve(()=>O("h3",null,"Params",-1)),Xa={style:{"font-weight":"600","text-transform":"capitalize"}},Ha=["onDblclick"],Ja=["onDblclick"],Ya=["title"],Za=Lt({__name:"fullScreenContextMenu",props:{file:{},idx:{}},emits:["contextMenuClick"],setup(e,{emit:t}){const n=e;sn(o=>({"3eebcda7":c(v)?0:"46px","3e27f0da":c(l)+"px","37c6591e":`calc(100vw - ${c(l)}px)`}));const a=Ye(),i=un(),s=ie(),w=R(()=>i.tagMap.get(n.file.fullpath)??[]),z=ie(""),S=Je(),P=ie(""),V=R(()=>P.value.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")),W=R(()=>V.value.split(` -`)),T=R(()=>rt(V.value)),D=R(()=>{let o=rt(V.value);return delete o.prompt,delete o.negativePrompt,o});pe(()=>{var o;return(o=n==null?void 0:n.file)==null?void 0:o.fullpath},async o=>{o&&(S.tasks.forEach(r=>r.cancel()),S.pushAction(()=>Ne(o)).res.then(r=>{P.value=r}))},{immediate:!0});const M=we("iib@fullScreenContextMenu.prompt-tab","structedData"),g=ie(),h=ie(),L={left:100,top:100,width:512,height:384,expanded:!0},I=we("fullScreenContextMenu.vue-drag",L);I.value&&(I.value.left<0||I.value.top<0)&&(I.value={...L});const{isLeftRightLayout:E,lrLayoutInfoPanelWidth:l,lrMenuAlwaysOn:v}=na(),p=E;ta(s,g,h,{disbaled:p,...I.value,onDrag:Me(function(o,r){I.value={...I.value,left:o,top:r}},300),onResize:Me(function(o,r){I.value={...I.value,width:o,height:r}},300)});const N=ie(!1),{isOutside:X}=Ct(R(()=>!p.value||v.value?null:N.value?s.value:qe(document.querySelectorAll(".iib-tab-edge-trigger"))));pe(X,rn(o=>{N.value=!o},300));function j(o){return o.parentNode}function Z(o){let r=0;for(const G of o)/[\u4e00-\u9fa5]/.test(G)?r+=3:r+=1;return r}function Y(o){if(o.length===0)return!1;let r=0;for(const U of o){const b=Z(U);if(r+=b,b>50)return!1}return!(r/o.length>30)}function ae(o){if(!o)return"";const r="BREAK",G=o.replace(/>\s/g,"> ,").replace(/\sBREAK\s/g,","+r+",").split(/[\n,]+/).map(x=>x.trim()).filter(x=>x);if(!Y(G))return o.split(` -`).map(x=>x.trim()).filter(x=>x).map(x=>`

${x}

`).join("");const U=[];let b=!1;for(let x=0;xBREAK
');continue}const K=G[x];b||(b=K.includes("("));const se=["tag"];b&&se.push("has-parentheses"),K.length<32&&se.push("short-tag"),U.push(`${K}`),b&&(b=!K.includes(")"))}return U.join(a.showCommaInInfoPanel?",":" ")}he("load",o=>{const r=o.target;r.className==="ant-image-preview-img"&&(z.value=`${r.naturalWidth} x ${r.naturalHeight}`)},{capture:!0});const te=R(()=>{const o=[{name:A("fileSize"),val:n.file.size}];return z.value&&o.push({name:A("resolution"),val:z.value}),o}),be=()=>{const o="Negative prompt:",r=P.value.includes(o)?P.value.split(o)[0]:W.value[0]??"";de(Ae(r.trim()))},d=()=>document.body.requestFullscreen(),m=o=>{de(typeof o=="object"?JSON.stringify(o,null,4):o)},q=o=>{o.key.startsWith("Arrow")?(o.stopPropagation(),o.preventDefault(),document.dispatchEvent(new KeyboardEvent("keydown",o))):o.key==="Escape"&&document.fullscreenElement&&document.exitFullscreen()};he("dblclick",o=>{var r;((r=o.target)==null?void 0:r.className)==="ant-image-preview-img"&&ke()});const F=R(()=>p.value||I.value.expanded),me=we(Be+"contextShowFullPath",!1),$e=R(()=>me.value?n.file.fullpath:n.file.name),_e=we(Be+"tagA2ZClassify",!1),Ft=R(()=>{var G;const o=(G=a.conf)==null?void 0:G.all_custom_tags.map(U=>{var x,K;return{char:((x=U.display_name)==null?void 0:x[0])||((K=U.name)==null?void 0:K[0]),...U}}).reduce((U,b)=>{var K;let x="#";if(/[a-z]/i.test(b.char))x=b.char.toUpperCase();else if(/[\u4e00-\u9fa5]/.test(b.char))try{x=((K=/^\[?(\w)/.exec(da(b.char)+""))==null?void 0:K[1])??"#"}catch(se){console.log("err",se)}return x=x.toUpperCase(),U[x]||(U[x]=[]),U[x].push(b),U},{});return Object.entries(o??{}).sort((U,b)=>U[0].charCodeAt(0)-b[0].charCodeAt(0))}),Ee=()=>{ke(),t("contextMenuClick",{key:"tiktokView"},n.file,n.idx)};return(o,r)=>{var ot;const G=Mn,U=ge,b=gn,x=pn,K=hn,se=fn,At=ge,nt=Cn,Pt=xn,Dt=vn,at=mn,It=$n;return $(),_("div",{ref_key:"el",ref:s,class:Fe(["full-screen-menu",{"unset-size":!c(I).expanded,lr:c(p),"always-on":c(v),"mouse-in":N.value}]),onWheelCapture:r[13]||(r[13]=dt(()=>{},["stop"])),onKeydownCapture:q},[c(p)?($(),_("div",ga)):B("",!0),O("div",pa,[O("div",ha,[c(p)?B("",!0):($(),_("div",{key:0,ref_key:"dragHandle",ref:h,class:"icon",style:{cursor:"grab"},title:c(A)("dragToMovePanel")},[u(c(Un))],8,fa)),c(p)?B("",!0):($(),_("div",{key:1,class:"icon",style:{cursor:"pointer"},onClick:r[0]||(r[0]=f=>c(I).expanded=!c(I).expanded),title:c(A)("clickToToggleMaximizeMinimize")},[F.value?($(),oe(c(cn),{key:0})):($(),oe(c(dn),{key:1}))],8,va)),O("div",{style:{display:"flex","flex-direction":"column","align-items":"center",cursor:"grab"},class:"icon",title:c(A)("fullscreenview"),onClick:d},[O("img",{src:c(Kn),style:{width:"21px",height:"21px","padding-bottom":"2px"},alt:""},null,8,$a)],8,ma),u(G,{"get-popup-container":j},{overlay:k(()=>[u(_n,{file:o.file,idx:o.idx,"selected-tag":w.value,onContextMenuClick:r[1]||(r[1]=(f,H,ne)=>t("contextMenuClick",f,H,ne))},null,8,["file","idx","selected-tag"])]),default:k(()=>[c(I).expanded?B("",!0):($(),_("div",ya,[u(c(ct))]))]),_:1}),F.value?($(),_("div",wa)):B("",!0),F.value?($(),_("div",ka,[u(G,{trigger:["hover"],"get-popup-container":j},{overlay:k(()=>[u(se,{onClick:r[2]||(r[2]=f=>t("contextMenuClick",f,o.file,o.idx))},{default:k(()=>{var f;return[((f=c(a).conf)==null?void 0:f.launch_mode)!=="server"?($(),_(Q,{key:0},[u(b,{key:"send2txt2img"},{default:k(()=>[C(y(o.$t("sendToTxt2img")),1)]),_:1}),u(b,{key:"send2img2img"},{default:k(()=>[C(y(o.$t("sendToImg2img")),1)]),_:1}),u(b,{key:"send2inpaint"},{default:k(()=>[C(y(o.$t("sendToInpaint")),1)]),_:1}),u(b,{key:"send2extras"},{default:k(()=>[C(y(o.$t("sendToExtraFeatures")),1)]),_:1}),u(x,{key:"sendToThirdPartyExtension",title:o.$t("sendToThirdPartyExtension")},{default:k(()=>[u(b,{key:"send2controlnet-txt2img"},{default:k(()=>[C("ControlNet - "+y(o.$t("t2i")),1)]),_:1}),u(b,{key:"send2controlnet-img2img"},{default:k(()=>[C("ControlNet - "+y(o.$t("i2i")),1)]),_:1}),u(b,{key:"send2outpaint"},{default:k(()=>[C("openOutpaint")]),_:1})]),_:1},8,["title"])],64)):B("",!0),u(b,{key:"send2BatchDownload"},{default:k(()=>[C(y(o.$t("sendToBatchDownload")),1)]),_:1}),u(x,{key:"copy2target",title:o.$t("copyTo")},{default:k(()=>[($(!0),_(Q,null,ue(c(a).quickMovePaths,H=>($(),oe(b,{key:`copy-to-${H.dir}`},{default:k(()=>[C(y(H.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),u(x,{key:"move2target",title:o.$t("moveTo")},{default:k(()=>[($(!0),_(Q,null,ue(c(a).quickMovePaths,H=>($(),oe(b,{key:`move-to-${H.dir}`},{default:k(()=>[C(y(H.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),u(K),u(b,{key:"deleteFiles"},{default:k(()=>[C(y(o.$t("deleteSelected")),1)]),_:1}),u(b,{key:"previewInNewWindow"},{default:k(()=>[C(y(o.$t("previewInNewWindow")),1)]),_:1}),u(b,{key:"copyPreviewUrl"},{default:k(()=>[C(y(o.$t("copySourceFilePreviewLink")),1)]),_:1}),u(b,{key:"copyFilePath"},{default:k(()=>[C(y(o.$t("copyFilePath")),1)]),_:1}),u(K),u(b,{key:"tiktokView",onClick:Ee},{default:k(()=>[C(y(o.$t("tiktokView")),1)]),_:1})]}),_:1})]),default:k(()=>[u(U,null,{default:k(()=>[C(y(c(A)("openContextMenu")),1)]),_:1})]),_:1}),u(At,{onClick:r[3]||(r[3]=f=>t("contextMenuClick",{key:"download"},n.file,n.idx))},{default:k(()=>[C(y(o.$t("download")),1)]),_:1}),P.value?($(),oe(U,{key:0,onClick:r[4]||(r[4]=f=>c(de)(P.value))},{default:k(()=>[C(y(o.$t("copyPrompt")),1)]),_:1})):B("",!0),P.value?($(),oe(U,{key:1,onClick:be},{default:k(()=>[C(y(o.$t("copyPositivePrompt")),1)]),_:1})):B("",!0),u(U,{onClick:Ee,onTouchstart:dt(Ee,["prevent"]),type:"default"},{default:k(()=>[C(y(o.$t("tiktokView")),1)]),_:1},8,["onTouchstart"])])):B("",!0)]),F.value?($(),_("div",ba,[O("div",_a,[O("span",Oa,[O("span",za,y(o.$t("fileName")),1),O("span",{class:"value",title:$e.value,onDblclick:r[5]||(r[5]=f=>c(de)($e.value))},y($e.value),41,xa),O("span",{style:{margin:"0 8px",cursor:"pointer"},title:"Click to expand full path",onClick:r[6]||(r[6]=f=>me.value=!c(me))},[u(c(ct))])]),($(!0),_(Q,null,ue(te.value,f=>($(),_("span",{class:"info-tag",key:f.name},[O("span",Ca,y(f.name),1),O("span",{class:"value",title:f.val,onDblclick:H=>c(de)(f.val)},y(f.val),41,Ma)]))),128))]),(ot=c(a).conf)!=null&&ot.all_custom_tags?($(),_("div",La,[O("div",{class:"sort-tag-switch",onClick:r[7]||(r[7]=f=>_e.value=!c(_e))},[c(_e)?($(),oe(c(Tn),{key:1})):($(),oe(c(Gn),{key:0}))]),O("div",{class:"tag",onClick:r[8]||(r[8]=(...f)=>c(Ve)&&c(Ve)(...f)),style:Te({"--tag-color":"var(--zp-luminous)"})},"+ "+y(o.$t("add")),5),c(_e)?($(!0),_(Q,{key:0},ue(Ft.value,([f,H])=>($(),_("div",{key:f,class:"tag-alpha-item"},[O("h4",Sa,y(f)+" : ",1),O("div",null,[($(!0),_(Q,null,ue(H,ne=>($(),_("div",{class:Fe(["tag",{selected:w.value.some(lt=>lt.id===ne.id)}]),onClick:lt=>t("contextMenuClick",{key:`toggle-tag-${ne.id}`},o.file,o.idx),key:ne.id,style:Te({"--tag-color":c(i).getColor(ne)})},y(ne.name),15,Ea))),128))])]))),128)):($(!0),_(Q,{key:1},ue(c(a).conf.all_custom_tags,f=>($(),_("div",{class:Fe(["tag",{selected:w.value.some(H=>H.id===f.id)}]),onClick:H=>t("contextMenuClick",{key:`toggle-tag-${f.id}`},o.file,o.idx),key:f.id,style:Te({"--tag-color":c(i).getColor(f)})},y(f.name),15,Ta))),128))])):B("",!0),O("div",Fa,[O("div",Aa,[C(y(o.$t("experimentalLRLayout"))+": ",1),u(nt,{checked:c(p),"onUpdate:checked":r[9]||(r[9]=f=>ze(p)?p.value=f:null),size:"small"},null,8,["checked"])]),c(p)?($(),_(Q,{key:0},[O("div",Pa,[C(y(o.$t("width"))+": ",1),u(Pt,{value:c(l),"onUpdate:value":r[10]||(r[10]=f=>ze(l)?l.value=f:null),style:{width:"64px"},step:16,min:128,max:1024},null,8,["value"])]),u(Dt,{title:o.$t("alwaysOnTooltipInfo")},{default:k(()=>[O("div",Da,[C(y(o.$t("alwaysOn"))+": ",1),u(nt,{checked:c(v),"onUpdate:checked":r[11]||(r[11]=f=>ze(v)?v.value=f:null),size:"small"},null,8,["checked"])])]),_:1},8,["title"])],64)):B("",!0)]),u(It,{activeKey:c(M),"onUpdate:activeKey":r[12]||(r[12]=f=>ze(M)?M.value=f:null)},{default:k(()=>[u(at,{key:"structedData",tab:o.$t("structuredData")},{default:k(()=>[O("div",null,[T.value.prompt?($(),_(Q,{key:0},[Ia,ja,O("code",{innerHTML:ae(T.value.prompt??"")},null,8,Wa)],64)):B("",!0),T.value.negativePrompt?($(),_(Q,{key:1},[Ua,qa,O("code",{innerHTML:ae(T.value.negativePrompt??"")},null,8,Va)],64)):B("",!0)]),Object.keys(D.value).length?($(),_(Q,{key:0},[Na,Ba,O("table",null,[($(!0),_(Q,null,ue(D.value,(f,H)=>($(),_("tr",{key:H,class:"gen-info-frag"},[O("td",Xa,y(H),1),typeof f=="object"?($(),_("td",{key:0,style:{cursor:"pointer"},onDblclick:ne=>m(f)},[O("code",null,y(f),1)],40,Ha)):($(),_("td",{key:1,style:{cursor:"pointer"},onDblclick:ne=>m(c(Ae)(f))},y(c(Ae)(f)),41,Ja))]))),128))])],64)):B("",!0)]),_:1},8,["tab"]),u(at,{key:"sourceText",tab:o.$t("sourceText")},{default:k(()=>[O("code",null,y(P.value),1)]),_:1},8,["tab"])]),_:1},8,["activeKey"])])):B("",!0)]),c(I).expanded&&!c(p)?($(),_("div",{key:1,class:"mouse-sensor",ref_key:"resizeHandle",ref:g,title:c(A)("dragToResizePanel")},[u(c(Dn))],8,Ya)):B("",!0)],34)}}});const po=St(Za,[["__scopeId","data-v-50c80b83"]]),Ga={key:0,class:"float-panel"},Ka={key:0,class:"select-actions"},Qa={key:1},Ra=Lt({__name:"MultiSelectKeep",props:{show:{type:Boolean}},emits:["selectAll","reverseSelect","clearAllSelected"],setup(e,{emit:t}){const n=Ye(),a=()=>{t("clearAllSelected"),n.keepMultiSelect=!1},i=()=>{n.keepMultiSelect=!0};return(s,w)=>{const z=ge;return s.show?($(),_("div",Ga,[c(n).keepMultiSelect?($(),_("div",Ka,[u(z,{size:"small",onClick:w[0]||(w[0]=S=>t("selectAll"))},{default:k(()=>[C(y(s.$t("select-all")),1)]),_:1}),u(z,{size:"small",onClick:w[1]||(w[1]=S=>t("reverseSelect"))},{default:k(()=>[C(y(s.$t("rerverse-select")),1)]),_:1}),u(z,{size:"small",onClick:w[2]||(w[2]=S=>t("clearAllSelected"))},{default:k(()=>[C(y(s.$t("clear-all-selected")),1)]),_:1}),u(z,{size:"small",onClick:a},{default:k(()=>[C(y(s.$t("exit")),1)]),_:1})])):($(),_("div",Qa,[u(z,{size:"small",type:"primary",onClick:i},{default:k(()=>[C(y(s.$t("keep-multi-selected")),1)]),_:1})]))])):B("",!0)}}});const ho=St(Ra,[["__scopeId","data-v-b04c3508"]]);export{so as L,ho as M,uo as R,co as a,go as b,ro as c,po as f,ea as o,he as u}; +*/let jt=19968,ca=(40896-jt)/2,et="",Ee=",",da=(()=>{let e=[];for(let t=33;t<127;t++)t!=34&&t!=92&&t!=45&&e.push(String.fromCharCode(t));return e.join(et)})(),rt={a:{yi:"!]#R$!$q(3(p)[*2*g+6+d.C.q0[0w1L2<717l8B8E9?:8;V;[;e;{<)<+.>4??@~A`BbC:CGC^CiDMDjDkF!H/H;JaL?M.M2MoNCN|OgO|P$P)PBPyQ~R%R.S.T;Tk^l$lt?uJv$vMyE|R}a-!}-#&-#8-#L-#b-$Q-%?-+q-,6-,8",yu:"#V$l%S&9&I('(7(=)))m*#*$*B+2+F+v,0,b,i.W0.1F232L2a3(384>6P8n;';i;y<1>(>)>]@iB&X&m&s'2'X'd'f(9(c(i(j)@)l+'+M.).+1y1{2=3K4c6&6'6)606<6B6`9`9{:a`?`AgCLCuD%D2F2GyH&H1I;K~LkLuM&MYO0O3O9P8PbPcQqR5S2SCU0U~V%XYY&Z}[G^P`7cUc}dEeNgOj$j)l?m:n4p,sOuRv.y'{/|i}1~P-$B-%Y-)|-)}-*K-+G-+H-,m-.@-.M-/|-0y-2D-2c-4W-4`-4h-7a-7p-9c-9i",shang:")Y6V9cJvR8UqXJXa])asbQc,s,uSvz-#+-.;",xia:"#Y#w&,&;'''I)1.u/j7=:[<'B[ByCtL'NmNyQOR([0`(cLh[iRkVt/t_u4uezFzM|W|{~d-&)-*4-.}-0a-5;-8S",han:"#,.m/h:l

MFrGXJqNrOUPCPqPrQ|]@`+`2h1lBlZnXp*r;rWrkz9{4{B}x-#c-#y-$;-$l-$y-%Q-%n-(i-(x-)i-/!-3*-5B-9V",wan:"#=$0&o.]0F4@5X5b6*628u9pk@,JhR`b$b`knmtujz'z0}<-#+-'I-*Q-16-7m",san:"3T3q3w3x7~uJuwzA-'n-([-,s",ji:"#r%''l'y)3)d)o*Z+'+9+G+M+T+Z+^+g+x._.c/R090d1S1W2;43484J4R5C5w6)6C6`7f7s878H8t8w9J9X9Z9{;8;<;B;C=(=2>6?YA$B+CHD0D8DbE:EQF2I*I|JEJnKKL)L:LkLzMdN'N5N:NiQ6QyRrUWVcVnWPWQWtX6XEXYXuY(ZAZ|[/]O]e^F^J^U^~`)b#b0c*ckc}dee!e$e9e>eyf+fXfrg)hFhriMjZlrqmr)sRt%uov3vevw|@};}N}g~!~+~F~{-!&-!u-#N-$%-&a-'u-(,-*x-+]-,W-.?-.V-._-.d-.g-/+-0$-0H-1%-1/-10-1^-1o-2/-2@-3'-4)-4o-5>-5H-5U-6,-6J-7/-7P-9e-9g-9h-9i-9j-:l",bu:"0$192,FKJgT=UYZ^e+hhjmm8mFoGpGp}sjw]w{-'7-'E-/m-3#-4.-6=",fou:"4I:L:O:Q~1-3:",mian:"!G!d#4$U$W$]3Y5X6A6_6o9g9w@qB/CkG!H_Q;-!L-!M-!P-/_-7y-7z-8'-8,-8q-8r",gai:"):5=5LD,ErI!J1Z'_/`TaYaac!lnpcw[|O}1",chou:"!+#n$N+0/y0}2:4e5/6#9jB*B.GNLfUmZ+^3^5_4e%e4fWkan]nbo.o6oU}u~$~*-.X-/>",zhuan:"%H'S'V.K0k1B1H1r2?7Z+7+f,8.#.|0K0p2O>#DNE1P.ccd]eMlpt8y>-0&",ju:"!Z$L$w%R*W,c,l/e1~3&3J8#:t=#=`=k@FBGC0DlD}FeGAIaIkJbMrN[OVP`RDTlU|W>Y`[$^Z`Ua*ccc{dWd]dae#e@eFeff8fSg*ga@'@2@KA%C|DQO+O]O^PvR!REScU'UfZw]m`l`na'i[l_m;p-4F-6'-63-91",shi:"!E!Q!e#?$p%$&+'$([(](q*^.&/5/n0[1w204zQQR9VYW2W@W^X2XNYxY{ZI[:[<[v]X^l^{^}_p`DaDbmgqi8ixjdk!kNkpl(lkntoMo^ocoeofp5ppq%q&q*q4qbr=t9x/-&^-&_-&}-'<-'@-(*-(8-)!-)H-+,-/<-0?-0d-0o-0p-2:-2O-3+-38-57-6M-9C-9E",qiu:"*6*7+a0r3k4D5]6j>7CaCeF`HEJXMhNgNjONP;QMQ_RfSWUUX?XUXqXrajc$d'jpjskXl]n@o.oup:r?-#5-#6-$8-/'-/k-0W-0X-1,-2Z-4v-7&-9U-:Y-:Z-:]",bing:"!n)F*4+/,>.75@DsOcZ7l`puqar||>-!:-!q-#,-#G-''-'C-(D-/O",ye:"$>$E(0,a6g=;@?HfSb[]_]lUlfn(oip=rmtDtTtevTx?-!O-!R-$5-%N-'F-'e-(T-*o-4Y-61",cong:"$'&Y1>8==g=l=p=vDIE=I2JUK0LsRZZk]$a}a~sKtBuKu_-*)-*V-+Y",dong:"&&.r0b5D?7?C@JD|G;I#KwQ([&jV~^-)T-/=-0)-4g-5/-6T-9,",si:"'?(b)^)g)p*+.+>0KxL+NLP7PiQnReS&W_`tp1pvp{qTqnr8r`tIuzyB-&6-&R-&^-&c-&s-&{-(:-)L-)q-*8-+.-0.-5j-6`-9N-:o",cheng:"#0$,$P&W*O*[*w+A+{,O,v/l5[7#:`?}FQOoS(UKZV_#cHcJk#m$nhrxtkuxv@vWx=xB|2-!A-$h-'w-)o-*>-+B-/u",diu:"r2xL-&&",liang:"3A3D3{6K@0CRF{Q%Up[,_Oe1h!h2hCiBiHojss-!=-)h-.J-.O",you:"(r)O*I7o8W;L;f=5=M>VDKFoFsFwG/KaOOOSPSQLY8ZN_;`qh%hMjWjnk6kPlYmEn3n>ncodp~r3x&x<-),-.y-/1-1p-1z-7N-8P-9D",yan:"##%F%L&%&F&T&v(Z,j/u1?2$5t7V;!;h?<@@AsCVCYCZD3FmGpH.JlN_PVQAT$UxV9WUX/XkXmXnY?Z3[U^1^C^E_e_~`B`C`RbDbPc;g/g7kIm#mNmsn5nHnsnyoPoVo`x+z7zkzmzn{A{`{e|}}2}b-%'-%,-%B-%v-'0-(#-)~-*$-*F-*j-*s-+C-.4-.H-.Y-0V-3$-3*-3B-3n-5#-5G-5u-7K-7r-8T-8W-8_-8`-8a-8d-8j-9L-9Q-9w-:1-:N",sang:"'EVNts-%2-%{",gun:"#<&#'U6F6z9dJ>JpTFTwUu]4h:?B@}AbB3BwECHxJ1NwOrP'U9UPXM[X[hhLhmq`tetlu.xSyUzTzU{W}4-!S-!s-#F-#`-#j-%f-(A-*%-+t-.3-/K-/U-1u-3T-3z-6g",ya:"#B%C&{'I*{,a.g=UDEKqO;T1WEWGY.^[g=i!j4lUp=s=v7x;}f-3C-3c-4U-6O-6V-9o-:;",pan:"!&!>!?!H!o'L'x2A76=F>R?$AIH+m/V2T4{6b99>j@`BnEkK*O:OBP^R2RKSzTKTNTO[@e^f>ohparHtQv5wbyF-3_-9@",jie:"#S%@&{(.*d+=.G0e4J5,599D;k=(@/CfD,G#G`J[LzOFP&P:PTQ=SKSQSqT/TITPTlU4U7UPVQXOXSX}Z%ZWZh]/^K^~_5ckdve=j^qGtNtXz,|1}.-!m-!u-$U-%c-&v-+i-.l-/@-2&-4{-5$",feng:"!@%N'40m5v7R:3C$FdHnN.PFSaWI[R^c`?b.c5k'n+n;r[u5uXxs-!$-!4-&%-&J-&L-(w-3(-3,-3F-8)",guan:"!'$b$j$k(W)B,Y/f0E6:9&:]:gBVFqIEWSW{X+X.a?bifMh?kmsUu>w7zOzS{,{2}{-'K-(N-0q-1N-1j-2e-2z-6D-7A",kuang:"!Y!z$Y%1%r%w(G+}/O/z5'538V8vZ-8>",chuan:",40jA7BYB`BhBxEvale[hIkJp%wQ-5+",chan:"&6'W)K)q1N6D7$8*8A8[8_:6;xCODJIHKQQ2RGR_R{S1UeW!W`X3ZMZy]B^+^7_N_bfbi|n2n6o@rTr]uWw3xYz%ze{7{g-#Q-%D-%~-(%-(S-+Z",lin:"$B&['t0:393O5{8!S]SrU;VsD5E4GTO$WNYk`LdDdNgjozp?wr~~-!a-&.-.D-.`-/&-/0-1t-1v-1}-9=",dan:"!K%$%5)r,S0N1h4V8A=A=B=H=~>q@9ATAVH*JDOkPUTLV?VoXGX~ZK_'a|bBc3f{mHn&nKn~~t-$I-'G-'s-)*-)a-,C-3Z-8H-8b-8i",wei:"#o$M%}&0'#'D'M6/6p6r7+8y9f;6>n@gC+D!DOE+FCGBH)I&I(I4INJ]K$KJL7LdMDN0PwQ$QDQHR?T3T6V`WkX$Z)[#[^^*^4_I_^e;fefig@hbj>kg?:?k@N?#@!@D@E@nA3C!CWC}D*DFE'E,E]EpFFF|GKHKHjJXKsNSODOGOXOwPIPMQEQIQWTETsTvU.V(V6ViW+WKWMXpYS[C^H`Va4a{b4bXc(c7cRd=dZegh*hPhRiAiLlIm(m*mmnQowo|pFqZYZZ]U_6_9d9fYj6j~lWm)mep)rQrbrctvwkxc{y|U}6~?~C~`~m-!Z-*'-+R-/j-0j-3i-4/-4@-5,-5f-6j-6s-7)-9G-9W-9X",tuo:"%U%V&z0L2J4v?{@$F_H6MUTbT~Y'Yc^QdHdQnVq+r`x1{{|;|<-&d-(.-(z-({-)1-)J-)K-*:-*e-*p-+$-+3-.b-/%-/[-0b-3O-4,-6_-8}-9$-9?",zhe:"#'%+%E'P2f2|_@eB>CADvFAI0I>J:L]M:M~TgWHWfY/Ya[|[}^6_ngmi6k`kll*l9r!tdwhxRzv}!-!j-%=-&9-&T-'(-'=-*&-0u-1I-2f-3;-3]-5F-5Y-7+-9T-:%",zhi:"!7!t$s%=(J(i(k(s(y)2)I)Z*2*>*A*T*^*c+(+)+J+Y,G/k4Q4b5T5W5s6~7^7|9(98;(<0=E=Q=b=}>L>|?+?QA4^4g=0D{OPOZX]Yb[(]G]W^ng=o;t*xHzI{N~J-&t-/9-/a-1{-22-9]-9`",hu:"(1(~.j0Z1M3!3^545r757G?0AMCtCxD5C_{u-$*-'1-(A-1!-1d-2i",yue:"$S%!(a){0^0|242S2_373H4<8sAlM{O,O.ZaZc_>cid2dCdFfZgApDqBw2whw}zczd{[-,V-6:-6B-8Y-:^-:m",lao:"&)'n,71s3<5>9M~CXE%F$H(JWMaOQP%Yg^jgrh>mAqa-$^-(w-/(-1w",pang:"!o'A1+=/>R?$?=A/B|QmWsd@jf~6~|-0k-2g-:K-:M",guai:"0,;%",sheng:"!D!^...t7*7q859e=[=x?*E(KM]^aMb1q2t2|#|Y|u-4_-9B",hao:"*:.,25-%|-0i",mie:"!`(D1G1dJxL>SNS~W]vt-1e-3M",nie:"1&294(4,=G=|B)B0E!GDMlSX^=e)e?eAezforAs$sJu*vfw9wByVyY{&|c}(-%L-%x-:#",xi:"!>#6$3$d%/&(&g'J's(!)P)n*l+7,,,n313z434i5j6H7?7W81878g979U;V;n<2<5<6>c>d@>A6BABBB}FUG]HeI9IbIwJ+JVKzL2NdPjQoQqRYRqSiT!U)UzW9WFWiWlX7XfXjXlZH[K[m]5]F_@`.`/`W`_a(cCcGcfcwesf)fulGlplwm&m4m_n:oIokp2p7pbqLqMqvsYu+ufv&w6wSxJy,z[{5{b}9}?}P}U~#~2~q-!%-&?-'2-'`-'r-(1-(C-*C-*O-*{-.)-/x-0_-1+-1J-2X-2q-46-6*-8I-9O",xiang:"!;)*+50U5Q6Y8b9u:U;E;J<4APC{HGHvLTaU4UI`]a$a]bxdRjGl{m/q#qOrXu,x$x>y`-$a-$e-%c-%d-)B-+5-3J-3q-4(-7i",mao:"!M#i$i*:/66e:uqcsVx,y%-,B-,O-4|",mai:"?W?XF>K^LgS{aKaxj(l+~g~h-!'-5{-7t-7u",luan:";D?dAzA{L=NDW~o{r7w@-4'-6G-6h-:y",ru:"/M7F8G:1>AEgIYJ6KlLhQJSHU:VGW,inlEm`oSr+x_-%E-&!-1]-3)-3K-3x",xue:"$?,(A=C@E@IGLKStTnXd[p_[coe,hdibig~/-!_-#M-18-2k-6%-6^",sha:"%4&G052u4O8F8~<<WIYIuTJU!Zt`m`pgNlNlypHu7wcyZ~0-!d-.x",qian:"'K.(/~0A0t1'2*2D2R2p6+7[8J8q:G;h>b@vA~CnD(EIElF:I%IjK>KLNNO&O8P}VR[*[u]u_q`!`&gSh;i~kjk~p9pEpOq;q?r6sPtYukvqwPwgwtwvx+{x-#U-$z-*+-*/-*=-+U-,y-,z-0x-37-4M-6z-8G-8M",suo:"#*1Z1^4Z797U:?;cFaFbJ7P{VJcuk)tatju3u9xi-/b",gan:"!3%)*1*t.Y/x1*1}3%4s91>GCmE#T>Y^bJbTcAcTcti}nE-+e-.Q-1T-2w-3*-:i",gui:"!q#o$.$C%x%})0)s,E/?1K1T?NERJ;N%P/R*RpUgEi#lilxuyvlzY{P|M~#-#K-*;-.7-.:-.=-/S-1F-1U-2%-2r-34-:Y-:]",jue:"$Z$l$o%6,%525S8#9NA^D=KiKtNnO6RwRxU!WWWbX%X5X>XBXZXiY4Zj]N^f_}a0c[chd7h7x8D9V:4AQCyFOFPNxV}Zm]c_QazkFkHl.uqv!vF}*}/}G}H}w-#$-#r-+|-,/",gen:"CQEHdc",xie:"';(f*&3c4k5+595I5h6g6v7&8>8T92:B:M<3>l?T?V?ZA&LRLTM0Q7QKS+S@SBStTRV*V^W4XKXOXS[B[y^<_Z_mflfnl,lU-!i-!v-#1-#D-#h-$#-%c-/S-2%-9Z-9q-9t-9~-:b",zhai:"%X)3,92qP*Q,Znh5iGj+jM-.N",kang:"%<+U2v3tg1lJpgugwmz={L-17",da:"!W.u/(/S84;H=Xs]Q]fa`d0dhe3gvh_hfi;i?lvnkoHo]p#q]v*xW-'%-(B-*h-+;-/Q-1>-20-3|-5k-5s-78-:a",hai:"5L?Aj9l/lnnro<-'!-'~-)Z-)b-+>-+p",heng:"?J?mMZT9vc-3o-4$-6e",peng:"%c&'&S'+'Z+,.V1+1@5@8P>~AACgE%FdJRMkRiRjU3eSgbh:s9v{zL-$+-$0-):-*A-,X-,b-,q-4K-6y",mu:"!1#N%]+V7`7n:@?.C5DeF~G%O=e/qKqPx!~3~G-#9",ting:"/s5l%>&?qC)FnI7PWQ8ZJ[El=rUxKz`~K-!~-$g-%e-9F",qin:"$j$k*'*Q.d5c=>>MD1DAGZG^GkMRO8Q}RJS7TVWJWrZQc]pXpkriwix{}c-!]-$~-)f-+E-/c-33-4L",qing:"&/&Z'i046+60:ZDaHzQ#Wr[%]%_Agph+i7m;>t?fA!BuC,DrGWH=I'J{L4MmO^U+U,U6VrW5ZL[d]Rd8d_eKf@m3pxq5qFrVtow0wxw|x(yT-'4-'^-(E-(V-(d-(g-).-)[-*^-+)-+~-,$-/0-1=-1}-42-6k",lian:"'K+D2+2P2V6w7b8k94;s{M-#!",ren:"(o*,*e+#4A4U5)5y8x9$>?@AD)E}FGGDTUU2Y!ZC^I^Vg&gFi&p/p;pRqp-!W-![-#[-#w-&i-'#-(2-.^-3{",shen:"!U![$8$r$u%j)#)9,12e2g3T3U3q3w4l96:p:~>i>m?t@BFkHwH}JGK!LCPGPHUNX)Y1YHZ*[2^)_%_L_S_VfylPqRrj-$W-)W-.m-/z-0@-0|-1)-2N-4A-8b",ze:"#R#}$n(+*p/,0J1I=0BsKAS?Vz[(].a@b7b]c:jO-&t-6.-9s-:,",jin:"!#$j$k%M)8)G.U.m/J4W4`6L70:/B6F&F;GcGkJYM!TWW%WzXsTwGy2-!^-'m-(Y-)$-7D-88-::",pu:"$5*k+j0$8LBTBUFXGGGaH~IsIt[D]]_|bEfInprtupv=xbyqyu|[-/m",reng:"(_DGiu|z",zong:"&Y'h+?3P3]4$5z6E6Q6n6x7(7M7X7e7t9%9nz?!?MB'CwE5E7ENE`F4GHHuJbL;NsXHYOYP[I_caFa[bzb~cZcpd(h3hQiJmbp&pmsGtRtuy=yO-$s-$t-,I-/{-0r-2P-4e-9)-9f-9i-9u-:D",zai:"#^7HGHb+g|i9n^",ta:"(d)i2~VAZr]wdBe7etfFfOfpkdkiq+sBt]tex1{'{5{;{={R{o-!s-#*-#B-/?-0t-2d",xian:"!:!O#5$<&#(F(h)X*3+D/D0V2k3B4%4|5A5c5t6,6]7J7r8Z8c8q90:%;];d;h?&@oAnA~B;BvDSDwFzG,LOM'M*MpOKO_O}PJT+T0V_W:WRX,ZXZo[O]d`>awbKb^cYdgd}f;fhgBhHnfo'oPqvr#r$rFrqs0o334=4P4f5i8o8{;z*]+m.?/Q/i345D5N5`9PA@EjJPO1T,Z,cFj|ndq:qYqjxC-')-/L-2*",dai:"0,1n4x7%9AC?OMQ]TdW=Yd^xa7aLbqdff'gCgLg[i%jIk4p0~z-!0-)E-/>-3I-8N-8e",ling:"%d)D*M++.5/+4p6@9];K;U<.=KBqD[GiJJJmL%M|OiT(TcUjYVdLgZh/n8oWpts0x)zN|q~;~O~]~a~c-!2-$L-%`-)C-/$-05-2C-3L-6Y-7E-7q-9z-9{-:A-:T",chao:"!k,h,r2u6?9b;5J@mA+DTGMH!UlUqZfs&sWy+z'z(z0zh{1{a-#d-.0-02-1X-2H-2T-92-:d",sa:"8g?^HDK{LYY@fnpQuwwS}A-!c-!s-&,-&P-)&",fan:"%0(M/1/40i2A2d6R7i8$;o<[AIBcBfE0KNLPM>N!SOVqXva=bcfXo:-+g",wo:"#l&A,R,_6}>I@OAlB!G*HQLgP[Qbe:-(p-:4-:I-:L",jian:"!%#9#`$<$D$I&N&b','r'}(&(<(X+D.p/9/g0#0/0Q181k262I3_5U6Z788(899v:9$>S@fB4BoCICSCTETE~G-#O-#X-'A-'S-(7-(k-,h-0Y-0`-0h-1(-28-2h-37-40-4R-5@-71-7F-7I-7J-7W",fen:"#|%A*9./2x3=3r4S9';M;q;~ARD4IxKmO?O@TGY,`^`ff|hjnOpUvY}K~5-'W-'}-(c-(r-.w-1M-2Q-35-85-8n-9.-9:",bin:"%A8I::A)AiNc`X`cahailKvjya~l-$p-%G-%k-,'-,1-,E-,_-,p-.!",di:"!u#/%W')'.'{)<)_*U.v/*1=2c4+6c:);X;@WDXD_FMG9G_ICJMJrJwJ|M6Q+QVR-0>-69",fang:"!I!n(l4Y9*>TBjD;O!Y;^ed@lLp@siwn|,-,?-.v-1s-3E-51",pei:">Q?(JBSwUrUsauc2hyiPnBn{s5y7|%|f~M-)#",diao:"$#&a,C,k.B1]5FJML|NhOaXxZ8Zv_M`ro~p_r!r:s*s[vawUxExR}v~D-.c-//-0%-2L-2{-3&-4O-9>",dun:"!^?gD'G!O'O(R/RO`ahShWiNu6zlzqzw{<{D{Q{c~4-#?-#{-%(-'f-)(-)4-.r-0g-0z-2V-36-3G-9<",xin:"!=(F?zBID7FkLZSyVtY3Y-%T-%U-*[-,w-.G-.W-1_",tang:"$f'@)f0{3V3j3o;l=)@zA4J4LJQSR$RAcMc~eef&g+m]o=tiu)uTv'wDx[yWyd{1}:-#I-']-'h-5:-96",huo:"!V$S$^(*)>)S*Y*_*`+|,W10=$=4AuCJG.IhMTSI[g`0a:4<%<@?R?U@.AEANAhG{THVmd#uQ}Y-$|",che:"$;%I&?&@=JFjP@gFA}EKFRFcK:LmRBTDW6Y7Zz[Q[o^;_V`$arb;c`cad>dKeagKimjHmDo@pAt(|C|o~H-5T-7]-9l-9m-:=",xun:"!x$Q*p,^4;8MAjEnF:KLKSL[LaMcRzS%XwY#Y)Yt^R^T_+j%jajlkclsmzoTv`-%A-(}-)U-+%-1?-1H-24-5A",chi:"!]!y$).X.y/A0+02133,5W<#<$>?2?D@SE9E|GeO%OHORR;U/U0UkVMYFZ9Zq[t`8aRcBc^d+dfeGj@jBkKkfkrkyl7q7q^qusx~9-&l-(4-(|-+&-.R-3Y-4!-4r-4w-4y-5]-6Z-8(-8C-9k-9v-:<",xuan:"!m!x#d$['5)k0R5?7J7d7w9K-+4",bai:"+&.;3;3M51L^W3b:b_-#k",gu:"!/$J'B)A*~+P.z010?0u3g75:r:v;Q>K@(AfE)G>GhJ,LSOdOjSeXFYR^h`%a]bxgdgehYi,iXk,nYprpws]wwy.}h-%@-%W-'Y-(Q-+`-/;-0'-2I-3^-5?-6S-7%-9*-9+",ni:"!h#P*G2m73=i>$>}@pABA{DqLpOLP.Q!XXZt`~d`h.jhmCpnx3}L~X-(e-0,-2J-7`-:+",ban:"*E2s5!9;>PBgBkQ*QvVKd[iciipPqEwfzx|$-!h-$F-%Z-.n-35",zhou:"!+#U$x&y062.2@2C3+384:777o8p9:B>o?#B^F@GoI$LfY][a]y^r_4_Manc0gkg{h,i0inCqg~Q-);-)`-)t-*r-+[-0(-3~-6f",qu:"$L'o(}.2.F/@2U3?4o5#<1u?/AxDlG:HhKbM}O[OfOpQdRDRlSkSpT'T:U&WxX!X&X=YeYjZj^tcjcld%d*fqf}g2gWw-#)",ga:"g=onsfwH-.A",dian:"&p'v,j1iIiKRPXdXeVewq!x%|8~@-!E-%3-%4-%z-*g-8Q-:8",tian:"!:#;'1'H,j4w6D>v@:BRBXGvWmX9atnTr#rFsXx%xM{%{n-!>-!G-'$-3f-5J-5S-8:",bi:"#L#M'!(w)L*@*C+;.n.o/E/Y0(0)1/1<2r2y4M4m6>7Q8@8};7<,=a>a>r@lA[BlC|E*F.FJG~H:J*>1>2GdYf^ucScxorpC&CqD^FyHSK}Tjh$la-#&-$)-,Z-/`",zuo:"(|*S+!+n/,/p4*7{?'D{F^H`HaJ?Th[(nWp||7-&t",ti:"!g#e')'?)Z)|*v/8285f6|9Y9y:{DXF!KgLIUzV&V'[qd)d2eJemexf~g8jxk=kLo&rDt)xy-%$-%r-*2-+m-,0-,L-,]-,a-/^-0B-2U-4;-4w-4y-5L-5M-5i-6r",zhan:"$H&b.33*6=9oGQLMN2N`NaOeWyYQZ/]h]l^B`#cghUhgiSl0n|zK~V-%~-&*-&N-&e-'|-*b-*l-.Z-1S-2y-37-60-7=-8i-:h",he:"&c()*(0z2i3@4?8r-:`",she:"'y(`BJBKBLJuNpOgP(S5Y>^dagakc'cDg~{!{^-#h-)u-7l",die:"!g!t&w5M9GpB5C6D~PmQ`R@V,V]YU[7_WcbdOdXdreigojNz+-#1-0S-2R-3d",gou:"/01%2)3g6t:&DhO[U#VBWwX;YNY~_(`ob5bgk_pMqHwl}k-#A-#m",kou:"!P!Z#r$$,P.2/W1OD+K=KFp$-5K",ning:"$P=R>!DpLevm-,~-64",yong:"%p&>A]DcIPP=Yre2e]l@mJmio9rHuVyh}n}~-%*-%s-'x-/y-0w-15-2A-2o-5`",wa:"%K,),?,E,`=N@r@xOyTuW1lc-#W-#^-#t-8w",ka:"?8U@qV",bao:",<.~6h?,DgGYHcK`L4MJN^OJTeUdV4V5Vf`ib*d8q/w%x.zs~>-!6-&x-&|-(9-)/-+j-,M-/7-1~-3/-3A-6Q-9r-:B",huai:"=7N3N8VDVSeE-:f",ming:"!C!w#zEDJ'R,WuZ0m^n_q}xT-3.-6L",hen:"Y|-!y",quan:"$b%u/K0B5<6$7:9mEqI3NAP|SlXLZ#_)dkeIgzi=o5qxv%xO{#-#_-%M-&$-)V-*3-,e-0L-2^-9}",tiao:"!~(t),,J,g/!3/4.5F=S?PCdD^H0J@JMJNPnWdZ8Zv_McqdwjCr!rdtyxR-#%-,G-/o-1&-2;-9y-:C",xing:"!D#Z&$0Y0g6J@YApBFEuF7FhHrP9T#XVX_[_lMluo+pBqZqwrhwZx6|D|S-'V-(/-)p-+D-/5-0D",kan:"!N$=$g%?'^.QG&T%h8ho{4{q-%)-.+-:R-:X",lai:"#8#F/X0%2/2MG'H%MSW7Zqaob,c&c4k.mBsgxd-$q-$w-)y-0*-4B-4f-8%",kua:"50?>B~Z=d9dlq~-+s",gong:"'91*44474=8o;z>[OBXQXba6bZfzg$gtrG-!z-,T-:L-:Q-:W-:u",mi:"!s#p$A(w)')w*C1d2b2}3p407c;>;F?bClH{J#K'K/L}N#N6PaU*WZW[WcX1Z.[j[l_g_rjXo4oXoYo_r,z/-!K-66-7X-7Y-7j-82-9&",an:"!(!.;)?I@XEzGlHWHgJSUxZS[N_d`k`{r1s:x]zy}+~=-!w-!x-$1-(l-/E-4I-4u-6v-8c",lu:"!)#Q$_%|&L&d'])E)J*}+[+o071X1v2!2#2G2H3I6S8^9q:f?9A,AtBmBzCFCMCND.G@JcJeJtKcM[NSYXh[~aVb|d$dseCf#gxh^h|i/i>iTk5nwpis2sascu8uMumvGw&w+yr|A|t~x-%J-%_-)+-)r-*N-,3-.q-.t-00-1i-1r-1y-3w-4E-4P-6!-6>-6U-7;-7C-7M-7b-8l",mou:"!|7n:@Oq[[_Ue6t=-#9-3y-8!",cun:".N2nA>lS",lv:"$()(*r+~0`5Z5~6S7_7j9q:*@wA(A8A;HkM,NKV=VZm'rJw#xDz_{T-*u-+*-5a",zhen:"!X!b!c!}%Y'%)5)T)b+I.A0X264N4w5Y7D7L9,:2=I?%B9H5I5IWJ&LnTpUSWaYKZb^pa2afbWc%g^hZi4iqkOnNoxq$r~s`tOu$u%wJyS|0|_~L-)D-,o-1f-3@-6R-8d",ce:"/%/U/^/t0G1W36F/H3HPJA",chai:")&>HCjEJNzS9T[Xz`jp4wY",nong:")v*j+q8C?cAXL,V~]iioipoL-,{-9a",hou:"#c$t0q3Z@AGFyHCKyL2LtNBNMP{DoU1UbVTdPllnm-+o-/R-:p",jun:"&].=/`0<0CFlGCI1O/PeTXWhaeg?m1p^qfr&t'wj|Q}^}l-$j-'8-(J-)m-+F-/]-2?-43-44-47-7U-7^-7d-:Y-:]",zu:"(x*J+10H4}95GqHbIkYm^kd6eLtdu2u;yk|6-!f",hun:"!F#O#W#]F6I8JyXT[=_2hczo{d-'>-(L-.C-9J",su:"';+1+3+],X1U3.324X7K7U:?>,>/@{DWFwJsM+M]MiXWYE[r^o_lcyf(k$khksnZrR-':-*_-+L-/i-1@-5p-6~",pai:"0'1z1|IOhBjLtV",biao:"'c,!1D@3A,A1AoJoM=T@UoVa[3]#b?seuZw$ycz#-&&-&+-&5-&D-&E-&F-&H-&O-&W-&X-*~-+@-+W-,;-2j-7Q",fei:"%[//1!6M9aO>e>r>z>{@GDFGjH$KhP_PuRuUtZp_GaObsvEyP|g~T-!/-!H-!I-&Y-&[-&]-'H-(j-*!-*,-0+-2F-9;",bei:"&i&r)`0'3f>wA[DfJ9M8PAU'V;ZLZwa1bVgch@iDlbm5mQqWrPv[wd|=-!l-#,-#C-+k-4N-6x",dao:")=)H)x+B+K005F8hbdm?n~o,oJqQsMx#y8-$x",chui:"&U0D@8GPsFtny0|n-$u-:_",kong:"%.&V,/0@;gg,sA-#(-4[",juan:"!{#2#H5J5V7Z9S:|;=?w@7AaG[K3SfUM^&mTrZras6u0vHy5yXzt}^}l-#'-&k-'.-6m-:w",luo:"%T&!&='n/>0M2]5>8f9M:n;@@)@UAwF8H9HYJ5N9OrRHS6UvW~X'Z1dbf`g'kAl:uEw>y/yf}s-$f-('-)_-*P-*k-+=-+X-/K-4#-6)",song:"&P.@===yGOY0Z]^b_?jcu1-$@-%[-'[-)e-,c",leng:"#>&h++L@eD",ben:"/&<(DxRuaUblk/sIy&",cai:"#T677P8aGSK+U>a5b[dxeQob",ying:"!R$v&C&|(P)c+_2K2^6U7/8`9^:>:X:Y:c=?A:ASDzEAF7F9G0G1H@HAHBHZJKLqMwOmQ0QPQiR0S8SgVPWv[i]M]|adbHc@g:j/m2twv8vky?~_-##-$.-$i-%g-%o-%p-1V-3g-4q-5*-53-5o-5~-67-6C-74-7>",ruan:"&u(>6^U?sA7C~G3G}HRITJZQgSUb(hKn}o/sL|T-0#-0Q-4i-4~-6{",ruo:"0P1#DnI}mP-0e-0{-5<",dang:"!,#s%2'((2/[1f2&CDF3GbKuN(S)UCW&]b^A_kd&kEvWxB{9~A-8[",huang:"'w+e0f1q7O>=C1F#H|Q@RtSuYv[V[f_Xd,kWt3txu}yI},-$,-'P-*.-0T-1A-2]-5q-86-87",duan:"${'&.I1`2X6a:#IMK(QfRI]1a*g3kxu]yN|F~x-#J-+}-,*-5a",sou:"#v2BC;IQJ(L_M?Qum[o3t~uAyH-&:-&<-&S-'c-(R-*<",yuan:"!9!f)V.i0F6f7':.;m>CD3DYE?I?I_InLGLdO5PRPzQFQXQrT&TYUiUuV3VF[xa3bYh]iQj=k@kgl8lRnPphs'u(|^-%1-)9-*G-.o-30-3U-4V-5%-54-6K-6]-6}-8s-9!-90-95",rong:"+Q+S5E7@9C;^>FEFEfF5J/QhQwQxSDVEghthyb-)R",jiang:"(43u3|5P8:9L:F<>=.A2EaH^ILK.LAQjRM[w]=^W`6ngo>oF|H-#P-%5-12-2_",bang:"&<'A+%5_749B@uC8IcO!O*OvPt[s_olQlVt^y^-#3-,#",shan:"#:'m)K)q+W.s7g7}:D;p;r?pALATBaD&DtR}S,TCWjY%[b]r^ObFc?cVd^gGlAn#p!qtvBwRz4z5z;{@|P|X-'q-*J-+V-/l-1C-1D-2s-2y",que:"&5&E&g'6'7(1(N:P:RI]O6c}z}{*{l{p}a-4Q-6t",nuo:"+<+u3e3y4&5JiKWL.M4N*N+N7N@SPZ:^(^zhxnoqls?vPvvw:yz~<-!*-$O-$_-%7-%}-1Y-6<-9R",zao:",y,~1R3sC#LlMPOC]`d1f4fNk%ktoCwA",cao:"3m>9C=C[EwJ_R:VbV|n)uc-*D-94",ao:"!T'Y}I-*S-+S-0~-2b-5X-8{",cou:"@ThJiK",chuang:"'_,H,L,q{+{E",piao:"$+).1D7a:;_tmuuCuUye-#!-%;-%y-'i-(Z-,t-,u-1*-2m",zun:"8':^U5]Pk|qqv+-1B-2u-4n-5|",deng:"$7'q.M/H1pCCW|`:f9l>mxv6yx}E",tie:"=VH8OhaPbndXq'qzv>vRx'-&z-'Q-*i",seng:"-,v",zhuang:"3:3nF)F]UBUZ",min:"!B%9&`.}/<1l6O6d:,:wDiSSb'pqs7tEzEzZ{K{S-1$-2n-3P-8q-8r",sai:"2'@cb6c9-%#-0_-2X",tai:"0+27>h>yB8BeD]GeLjdIl[nSpfw^-&/-)E-+7-/6-2$",lan:"17212Q4/8K8i9x;+I2F7I@sAHM9N?R1Z@[`l1~u-)S-*B-*v-0s-97",long:"!p$a%n&=(R(S,u.!.6/;1*162N=P>'?6E'[,A6;9l;1;;-&@-&C-&U-'b-(W-)M-)c-*@-*d-+T-.9-0m-5=-5_-7.-76-7[",shou:"6.9h@yC2uA-(_-:s",ran:"7v>ZDZIFOEOYTST`Tz-,A-,K",gang:"%.&q/{639!:N:W:x>Ep+s)ttwe",gua:"506}:z;%>xU^|cnedr#rFxM-&'-&1-*9-3k-6c",zui:"#G)C+15&8d;$KjRdXHi]nInqo!s$s8",qia:"%{'I?1HyU4dUnU-!{-+z",mei:"!L!_#)#a({)]+X0h3p;I;T?S?r@PE&FfI@QGTZdMg0mOnlrKtUtZyMyQ~N-#^-.>-.F-5(-7(-8V-8h",zhun:"+$,56(>UT8YAZ{_Pj.",du:"#K#b*f.T.^1,>DCsFBR&SZSmUyWqZd^$^D_E`3b%bNc)mMo(sDs|v}yL{!{^-!Y-#V-#s-#u-*E-,,-8]-8k",kai:"II`7gysvtbt{vCxGxvy@z<{({U-&;",hua:"%;&K'B3S8/BWD9D:GgIKK[MzR#XKZ&Ze[4[>]A]o_&`0p(p)rbsdunxN-*]-+<-5m-8=",bie:"FTNFObRmVuf6-19-2l-8|-:[",pao:"%e(@(O,!?|H>M=TeTfV>dDdTgfq/x.-!N-!o-7Q-7S-7|",geng:"56575d6m7,9Q;j;uAbArG?HYM3PfQ4Q[SRi_i`l6v|z$-#0-,k-0F",pou:"0$UO",tuan:"1H4'V8a%u<-5V-6#",zuan:"1B2Y808N8U8e:Kb3fjftq)vxw?w~",keng:"%t&3&RZOr>t1uOxg|&",gao:"#R#g)4)6)e*m+N+O/v0~3i7E:5;O;TA'B,GILrMHZ[_:m+ryu#xny]-#o-'_-,4-,5-5R-5v-93",lang:"&7*n/dC(F{IXJ.JHPOQlZEg%lzl~m.rLu&xzz^{]-)h",weng:"#q:b;}=rJ0L(Qstg-56-7,-9_",tao:")?58617A7N9W9kG|PoUhX{Yn[{^MdwhXjPjenzs+|r-!k-!t-#@-#l-#|-&w-'d-'y-)P-)x-9/",nao:"%z&q'*?a@&@ZAkP6R~YZ]Ju|x@zJ{O-.'",zang:";S?_AmAyB$I,K@M#abambLbUb}rC-)A-++-,.",suan:"(z.b/m0;1BI^nn",nian:"':*5*P1Y3*C/K6evf5f[h=iCiS-/4-0;-1x-2K-4%-8B",shuai:"7>:4RNTH",mang:"!5!6&<&D.ZCvEXEiG4G5M_OvRaSAlDp.rsx:-)g",rou:"*!2w3X>3?l@aHdQC]tekhEt$-#2-#f-*7-0R-4t",cen:"+W.m1A",shuang:"(V7;CPuh}z~b-*M-*y-+^-5c-6A-7B",po:"%g%i/70I3'7i<,IlK,jLn%n[o1oKotq9uswMwz|=-$K-%a-)7-,N-.E",a:"@@s@x}|:",tun:"AYAeC~OlVL`G`IgJ~Z-&h-(0-.j-1q-8J",hang:".k/T5*9HBiDHOAT#UAa9j3lJ-$C-%]-.i",shun:"!x$&$1$9BZKo-$:-%S-,g",ne:"!vY6^]",chuo:"'j0^6?8&9bd!e'e`Q`b`va/hpj9k3l/lsn9tCvSyJy{{:{r}i}{-*|-,|-/n-0A-0K-2>-3?-4+-7<",ken:"&#>8>Y>fUFV$`S`wsh-:?-:E",chuai:"A0ACeb",pa:"/bm|roxk-.6-1K",nin:"?[",kun:"#7&H);*s+*5oGEPpUEUJUgV.`wo%sCy*z]zj{Y-)w-,<-,=-,D-0/-2G-4^-5'-6w",qun:"0<;_;`UVU^e.k&-7U",ri:"TMp/p;pd-)%-+(",lve:"+4rgrlxr",zhui:"&U((.h66729r:'@C@|[!b>c6j_o#s>sQvdy1})}Y-)s-+J-4Z",sao:"$O7m8<:A:HAdR4-&<-*#-*I-+Q-,:-0l-1R-2a",en:"J!",zou:"0&6GG=[)_CcNcOlem@mcn.|h-*H-+1-/w-06-2E-83-:.-:7-:n",nv:"2h=TSvSxp8wW",nuan:"-'M",shuo:"$m&+'$0cIvZaZc_>qttmv~x*",niu:"4H9.FxpTwq-!`",rao:"+i8)9FF,KdVvk}}B-'v-(>",niang:"nuoRoZ",shui:"#I)7*q*z@1U[ZaZcZg_>_KzG",nve:"&ONJ",niao:"@%E>K1T^UGVO-2{-6H",kuan:",s,tAqw(-,&-,2",cuan:",',Q,s,t,z1)1[fLfsrZw;yv",te:"?vRgr{xe",zen:"]V_y",zei:"S;a_bv-0M-1Q-2+",zhua:"2(AU-,Y",shuan:"5<@]z3{?",zhuai:"#1dmi'",nou:";v=,tfv;",shai:"/Z121J1e2[[K",sen:"Ve",run:"$1AOz@zQ{F",ei:"ZH_@",gei:"5C9J",miu:"7n:@]+_w",neng:"?LR'",fiao:"WL",shei:"Zg",zhei:"j:",nun:"-84"},m:{yi:"-:~-:<-:;-:4-:3-:#-:!-9~-9T-92-8u-8R-8N-8I-8+-8(-7O-7M-74-6l-6c-6L-5z-5)-40-2U-2Q-2>-11-0o-/_-..-,o-,B-,3-+q-+[-+<-)X-(o-(5-'w-'k-'=-'#-&6-$'-!?~=}E}1|x{Zz|zzxix6x.x%wKw,v%uPs_rurorEr8r)pppdpXojoioVnxn_,^g]|]{]`]/[!Z=Y5XVVTTgT_T7T1SxSsR~RyR;QwQ0Q!PDP6NbN^N,MZMSLXLIL6L$J9I}IUIIHMG?EaEHE4D!CwCFBkBTBEB9B5@2?Y?K?I>K>H>'=a=R;m:~:48c8!7,5g4q3&2}2Y1j1f1`1M1/1'0t.O.K,_,,*x*f(c'G&.&&%b%Y%G%$$b$6$/#x#T!9",ding:"-:}-8q-)?-%!vipfkGiydzY2Ik6u+B&^&[%_",zheng:"-:}-9O-7L-0#{1{,yjuvsRm*lNlIi;eheZe8e4e3d/`x_v]3[+ZSY8Y2XlVFTYT#Q1C@A!4W3w07.),]%*#C",kao:"-:|n{k][#TbL>>R3p/,",qiao:"-:|-:(-6A-5v-4=-3(-2[-.@-,2-$H-$5-!q-!=y/y$xkx4rSm+m!k]k%j:iSi(hqbvaT_wVuV6V$T%KgGaF^FKFGEpDSBCBBB;8<2b1C1>.}#e",yu:"-:|-:p-9^-9P-9J-9H-80-7t-75-6'-5g-5b-5H-4U-3F-2l-20-1F-+K-)O-)+-(J-%a-$p-$K-$9-!7}]}W}5{7zizNzEvyvwv9v3tytjtetcsqsos@rsq|pyp+p%oQn6m%l8kyklk8jfgvguf%eGdWbtb(aLaKa:`1_1^:]e]d]KZOZ!YmXiTDS`SUS7RpQyNvLAKsJKJJJ;IAH|HmHVDVD:D*D#D!CrC[CDC,B*@K=Q<><<<1;h;_:v9G908=7M7I7A535#2{2R1b1:1(0;/q.(.&,1+G+9+7)n)h)F))(+&*%!$M$D$=#V!A!0",qi:"-:{-:r-9{-9E-9;-99-82-8$-5f-5(-3D-2{-1:-0G-.j-(Y-(A-(.-'v-'C-&%-%m-%I-%F-%E-%:-$D-#N-!Z-!B}$zvyHwbw;w1u~t[tFn;n3n$m~l^kkiBg/dpdTcKbJ4GyGJEW8l1T",xia:"-:y-:s-9u-6I-5e-3w-+T-*+-(v-'m-%n-!!}({Mwtwpm/logkeB_3YST)P~M-1A-/j-/i-*P-*J-(^-&C-&9-$k}[{Xtrrbp,n8lJl%dqbm_c_L]cZ(VLV%T]R_R^QRQQPOK9IJCH@l@^@?=k=Z=?y>]=x<`;t;(9.9(857&6{6d5m3D/;.j+?(>(!&8%{%t%4$X$,#H#>#'!w",bu:"-:q-7F-,M-*w-*t-(d-'K-&D{B{?{6zPtOm#izh'gfd,bi[rY}Y{YfQHM,C>C;C:'=",fou:"-:q-(cvCBj4H",mian:"-:o-42-1d-0w-,S-,H-$`tktQsZqpq#aDNWJ^E=D~@p?|;k;,7G/o",gai:"-:n-9w-6e-+u-+t|'uYm@dy^AW%T`QYNaHZGNGM:M8|'{&6!,",chou:"-:m-:l-8m-5_-4=-2A-(m~{t/r!iKhld$b3aS_%[_Y%W~N?N=LJJkI|E?B_0h/O.s.p&3&!%l#v!m",zhuan:"-:k-7o-3G-3+-2y-.I-)n-%+~EzRyPreq;<`,E%g#(",ju:"-:j-:?-9m-7n-62-5`-5S-4x-4j-2l-19-0%-.Z-.:-,.-+n-)H-'d-$|{/ztx_uct_tNt$o{nvnqnOnMmqmil`jYj9j7g+e%d:-(h-(c-%5-!.-!,~|~X}2|L{2xhvCs7*6e4n2x.Q.G,n)Q'(%k%h%@$p#R!U",shi:"-:h-:g-9q-9l-9N-9M-8t-8_-7R-6k-6]-1X-0m-,^-,:-+_-+6-++-*>-);-()-'{-',-%.-#t-#7-!W-!>{>z|y{xn=}:{:s:W:5:'9v7C7?6n4=4%28.3.+.#,0)$&3$}",qiu:"-:f-:^-8m-6#-)u-)9-&+~*|FyTsQl4j2j1cFc&]rWkO%KIHeF8BpAn@s@b?J=o;^:l:k:j2D/T.k+D*'([!P!(",bing:"-:e-:W-8h-8b-6u-5B-4T-3Y-1;-0a-0[{mp1ngnZhbhah&cm[vY,W5R0QpN/MQLQLLJnJbGXE:@~4E)r%,",ye:"-:d-9z-9.-9&-4e-2_-0U-)7-(u-'%-$W-#,-!]{:zIxqxdwgoVm$jxjw[hZzZ!YyY;X:X6UhUcUUUSURQUPxP@P?P,OmOkMYMXIQHsHpCXBh>i-,u-,G-,/-'I|/{)y&u^tXr*mSm>lKl?eNc3_H^LZhXL^>J=,7[6?1e=_=G<8:?7f7d6/05/f*6*2)c%x!'",diu:"-:_-:[",liang:"-:]-:Y-9)-5x-5[-5>-5%-1G-0B-&J-%y-%7-$Ly2bWY7Q*KJIwG%~n}bvRuAq=pZo8o6m1lyh[hZh(d]d$c|cqbY`,^xXkTaS4OVM;LAKGK=H{GFD}DJ@8@(?V?>=g;C:b976B/j/i/O.b.D,?,>+Z+Q&g&d%O%!",yan:"-:X-9d-5]-4]-4O-3;-1u-1Z-1Y-.a-.[-+:-*O-*F-*/-*$-){-)z-'%-&=-&2-%'-$N-$G-!L~~~a~Q~5{GzAydy7xLx@wMw>vPv>uFu@titfrgr?r9qwqfqWpKmhlEl'kuktk0jUjKjJjIjGgM-9<-9:-7m-5K-0W-.$-*H-*G-*A-*?-(s-(H-&n-&'-%;}L}@}9{j{5zbxTuBu3t%q2n,lVlUhKh?[`[ZZZY:XLN'KlIsIFA0A,}>k:c9s84684l0$/w&C&/&,!*",zhong:"-:P-8A-83-7x-4Z-0j-/C-$Tz8ysx$vMvHs^o)i)eqe0dddYS`MKC2@=?G4w2k.T$F!>",jie:"-:N-8i-8<-5$-4~-4W-4!-3j-2]-/@-/?-/)-,r-,a-*j-*i-(e-&c-%d-%H-$m-$8-#q~zzKz7vevOuit>sasVsCs(qSpIoJnpnln*m|lCkvkbjrjqjgjbhihIeEbr^S^;]_[,YZY+X{XwX?W_UmUOUJS9RINXNJL0KxKoI~I1HqHgHfH8EOB,>j>;:z9b882?/'.6+0)H)8&K&J%g%]%M%##D!~",feng:"-:M-8:-5L-4N-2Y-0]-0&-0!-/{-/y-%p{Rz9z5w}w9v7odoYl}l|l5W4MkKPI.E[?m?h=S;Y;#:R8e5Z4i3V3*2g1h/1,O)u%C$B",guan:"-:L-58-1=-0l-*vphb@b?af`LXqW*SRJ+G*D(B2>wRWQkP#L)?N>=0X.X.U",chuan:"-:K-7o-3G-2t-.K-$]}Tz3jFjDPMIRIDCbA?@i,H+<)7",chan:"-:J-91-2y-2R-1~-1/-/:-.k-.J-.*-*~-%$-$F-!n~P~@xBszr>q3l>kJkCkBjXh{hpgWdu^r^lXsX+W;VqVhU#S9RYJsJXDEB#=v:^967o7n71655d5B2V1I,#&v&u",lin:"-:I-9U-2g-0e-00-0/-)v-(l-%PxDlbk,gIgHc=bob)_=_6[MVGS?Q+PGN!FIEmEDQ>L#JuJfJ3J,IoGcDh@j=|=h.h)e)N",zhu:"-:G-:B-9]-7d-7G-7?-6Z-.&-,t-,n-#T-!z~4|=xpx3qVq!ploNnWnIl*i>[[[WT&StS;OqO1O0O.N>M#LzLFGWFmF,DhDbD^D0BH?&>Q;b7t7Z6s5x5>4V4A3y2^2@1+0x0?,K*K%B$J",ba:"-:F-8l-7`-1E-)^-)@-(b-&M-&I|_{[x>wCv0mumIj,fq]o]I]6]#[GZ)O+M'D,5?4R0+.m+@%N#/#!",dan:"-:D-8~-7{-7H-2r-2J-/V-,,-+G-*~-*{-'f-&2-%C-%B-$v-$F-!m-!b~[vTsjiofTfOfEb$aga>_q_P]4[VXuV@V?UjRiM/BeBSA*@)>rc>C=n=$;S;N;0:N:08?837i6R6G5|4]4>4$2]2O2F1]0u02/$.r,[,P,I*~)h);'f&H%!$N#X#U",jing:"-:A-9C-9+-9'-5r-5%-3A-2O-1N-0K-0C-/9-.~-,y-,k-,[|i|g|cyIvQt:t8t+pojAh|fdfZeeeWb/___NUoT+S&S%Q:Q3PIP0KZJpEvBsBn@I@H>m>%=><87]6#,r,'(^(B(<%($u",li:"-:@-6_-5u-5k-5Z-3s-2&-1z-08-/Q-/=-.o-.G-.'-.%-,l-,&-*L-*I-*:-*.-*!-)|-)Z-)X-(z-(2-&U-&0-%g-$C~g~`~A~>|`yrxEu+tat#rjqYq,nAmkm5m.lzjag@b]bXbRbB`l^&]q]gWYU@U3TsTlSpP_P>P%O&NmN^MqMSLnLcLYLUK!JoJdJMG1ECDuDjD_D8D.C/C+?k?[?Z=Y=U=/:/8z7@6C6$5H0a0U/>/=/#.z,~,u*V*$)z(t(_'x'u'l'W%R%F$l#P#A!Y",pie:"-:>rVV]V[PHAD8>",fu:"-:=-9c-8[-8#-7z-73-5y-5m-5j-5U-46-3v-0d-/|-/J-.R-+h-(=-(6-'[-'S-&E-!s|<|!{]wvwWvVvRuru'tDt,sbr5qJq/pmp3oWmgmFi~ifi7hzh;fwfkeje?c{ct^w]l]J]&]%[Y[QZ+YfV7S}SLS)ORN+M]MGM)M'L1KWJ2IYIPHKA:>~>Y=W-8%-6;-5|-4k-2k-2:-1q-.T-,|-,C-+y-+/-*V-(U-(T-(J-(?-(+-&)-%K-#v}4|^zLykxvvxv4u%tjthsurTownkn9n+lmkzk_j6hFgQfudbd`d@c'b[bZbKat_]^[]e]d]]Z4WGTTS7RoROQENvNtNoM&K#FLCVC=B3@[@Z@S?{>T>*=V;^:,874(3C322*1w/V/A+3*4*3(|(P')$h",tuo:"-:6-8X-77-6h-6.-'a-'G-%[-%$|Sz;v8sNrRmck'gzet]i]`[H[F[EZMYuV1NgN^MTM8ITI+GbFBF0AvA_@d?`?_?^-)C-(W-'v-'8|||{|T|:z~z{yFy@x$v%uNtsrGp&m7l0j+iridiahyh5h3ggf5eYeKe4e3dmdUcU`6`*_$^{^E]Y]F]E[u[HZtZpZ]Y{XvWpWVW2V{VvVtUKUJU>TjSMRwRgQ`Q/NOMyMcM2LqLhL6K~K7JjIuI]I*H+GHF_D|DnCAC6BiAJ@t@O@N?v?T?3>V>34`1_/9,x,^(R'w'[&3%c%;%7${$z$k$E",zha:"-:0-48-.N-.=-*C-(w-'X-'?-&K-$j-$O-$Aw/pNd6]s[m[XZdX4WIW#O2M7M1M0LvLlI?H4Fv;X:67u5#4@2N/p&d%.!M!H",hu:"-:/-:'-9j-9F-5E-0Z-+U-+L-'h-'W-%n-%Z-$_-$4-$1-#>-#2~k}v|;x1x0x,uGt4sEr]r[oxm[iphxfxfgdFd*d)cGa{^V^6^4^3^/^.^,^']y]9[xWWW$SXRFR-'$-&N-%z-#p-!}uSr`ljk/cY_f_eYtVZO:L=G5F!=O='8%7a3{/^./*<$f#c",yin:"-:+-7}-6^-0t-0;-*c-(j-(V-%o-$d-!T-!+~l~+~$}`}$|&{w{YzXz:w_u=t0t&p:n}lnlLlfya@`i`B_u_t_0SMO[L:KKEkE@E1DKCwC_BYBGA5>l>d>U<5;~:}:i9}9V6^6]4).],|,j*I(U$7#k#_#:",ping:"-:*-5i-0]-/z-/s-'u|Qz1u/ngnZmTi[iJi4heh&`0_zMfEU?6>6=A[KMbLw",sheng:"-:%-:$-4H-.X-.Q-,?-+0-(9}=x{x7u*k}_VS[RGQJQIOeMuIyG~E{BzBF?%;k;@:q7G2u/M.N*h)i&y&s&`!'",hao:"-:!-65-3k-2)-)6-'j-&_-#k-!t-!Y-!#~xxRvacOblRDR'QBPePaPWP7J!A~Ao=]-'6-&/-%]-$X-$:-!p-![~T~8y?xWwnw'tgs;rCr@nsncn`nRnHkgk9jpj`jZiqiOeceOe9djd_dEcscgcZcKc/bqbeb8ay`r`p_s_r^V^6^4^3]_]O]HW%R:QKQ9Q6PEOzNON)MdLZKSIdIGG{GUFkFRE|EjCzCuCmCMCJA4@e>X>S=f<[;i:+9h9)8p8/8,7N3e3R3K343&2Y2+2)2%1q1P1O1N0}0P/E/?/*.{.t.#+p*r)|(#'h$1!k",xiang:"-9x-9,-9(-6}-3*-1}-,4-,$-*0-(x-&r-%L~Ww~uXk5j)h7gqe'abQXP5LWH^F1DH;!8:*E'g'T",shu:"-9s-61-5g-55-54-1|-1F-)Y-'3yNyGu[tGq4oNoCnWnIg}gxdWchcgcIbt^X].Z.Z#Y>WBU9T'S|PvPtP*OhO1O0O.N[NBMtL`JtFuFYEpBuBKAaA`?c&=L/3,E,B*n*d&f%0$8",mao:"-9k-1,-1(-0|-0z-*dzLwksLmOkzi?a=_?^(S/QvPrN4M@I'B!AcAW?9;F/Y/#,J)E#$",mai:"-9i-7I-,{-,*-*}-#${Kx5",luan:"-9h-9Y-9V-*^}C}Bvmu0qXq:q$m)jOZ[TvOuL2D69K5J59#4#3",ru:"-9f-6K-2C-1K-(N-#{-!$vkv[s7qyq)jciX]kZgUTP+NzL(E0@W>7;Q9u6b+^",xue:"-9e-.x-(Q-!9|Bxbq>q+mmmMjzf=ckT/SlKvFc?!>u9j7>5y1&.B%L%<",sha:"-9b-4c-3?-2H-/,-.t-*+-%t-%^-%H-%4-$R-$0iCgkZEZDW$<%81806O5S4B2Z/J/B/2+%!l",suo:"-9_-9=-3]-&8-%x-$&-#j-#gu&s(as^$ZEZDW:PjKaJz:E9y+|)w)v)!(]",gan:"-9Z-8S-7J-5&-0=-/u-'c|Ro'o%o#o!hfh_dqa5U~T]T6R_NuMDKLH6FNEd@??;<:8f7_7/55+;*w'#%?!T",gui:"-9X-6q-3{-/(-/&-.7-.5-+Q-+J-+I-+F-*%}3{zv2u;s?rhrIp|k$jpj`iLhLh,gmf;cMVxVVTiThRCQ2O%M9L.KeIeI`GTGAG_k_Z^b]7Z`Y~Y9V^V;TnSgKTF7F6D[CvAG@:?!5P2|1d1>0S0G000/+z+M+)+'*](n(G%L$3",liao:"-9R-2|-!rrLovomo[>90%*F",chu:"-9K-5N-3d-3R-2K-2!-0$-/m-/Y-/I-,t-*)-!o{$x!s>n5hjgXcj`g_SWxW$VoTNS=NEIjI&HoHQF|E}EsESE#DsDdCzCG?@9r9q6x4N/+*+(,&;",kui:"-9I-3{-/4-+I-+F-$U-$;-!xwow4s/rBo*mQjVjHb]a.a,_y^BXgQdPyI2I0E&BV:S7x2l.q!/",yun:"-9G-7r-3q-1p-+}-+x-(0-&^-$^}xwEvsvEqOb}aca4a)`c]2[yRNQTP}MwHWF@BmBaA&A%@0=3=!:!7W2h2:202(2$1b.Y+(&P",sui:"-9A-5#-&F-#U{3wytvr1nwn4kpRqEWC1C0Ab=H9[7+6z5}2C1g0~(/'p",gen:"-9@-9?-&pX=X'L7",xie:"-9=-9!-7[-4J-4A-4/-39-1{-0s-0c-,w-,+-+'-+!-*k-*Z-)7-$(-!C~e{ry_wrw8w1u)sOq]opnenVnNm$jrgJeFcT`z`p_BZ~ZWZ8X9WnWMV*UiUFT}SWRePXMZLIK@JwI,HOH?H/FlC]?K>p>A;P9h7B695{5!4Q4P3b3E2,0w0s0O,C+k+e)8",zhai:"-9;-6B-4f-4*-3E-*K-*C-&c~zw{p{os[u[2YxW/UwU>SiSfH#EL#t",tou:"-98-4'-4&{$wNv'sqs@aK]*T0SQ",wang:"-97-8v-87-1JvYo7o1o0o/eoeiefe[dldJa}]>RTQ(OEODO=N1JD@J6;+E",kang:"-96-8)-+X}|rmkKg|dG`8]f](G=8_4d.a",da:"-95-.N-+f-'f-'R-&m-#~-!J{hxrw[v*d'ag_q]nWZVJ@f?}:<4Y0p&@&4$#",jiao:"-94-6n-6D-2q-2j-2I-.B-.6-,6-)B-(<-$H-#M-#K-#?-#(-!^-!=~IuUu1r=r6qcm+m(k1k%k!e.e+cJbl_~_i_KZjZTZ5X&W9VlVCV(ToTJT?T,SwSuSgSSQbPgP2LOIpG!>!:l:k9Y8w8<7b5[5C443,2b1>1*.9+l*X(5#e!v!^!V",hai:"-93-'V-'0-$#-#h~ey]vOq;pL[!A3=N3[,C",heng:"-90-&B-%QuJcXcLbaVKL/FiF&<|42*B",peng:"-90-5,-3J-.F-+o-!~zgyqyYfUe|cyc+`%[tZ?Z6YkXpWvW4OTKCJLIlIWGGFn?6t}sxk~hVhJh)gBg?g;dzZT8T.O)O(NfN^MrMTMSM&KuIRAh?`?^&D$i",men:"-8{-8G-53d8bcbCaz_9_&]VYgS^PZIh@>3=1,+((W",ren:"-8z-8y-8s-8U-8F-88-/d-/cx;vSu`n:n2d|dwdv]XO,NiLPLMK6J7/]",shen:"-8t-7V-6i-6/-5d-1Q-)l-)k-)j-)i-(V-'i-&}z^u|u>ttsys.qmp_pHorn7lui(fp`t`b]b]4WPTFR4P9P3M:J7J(IHHRA9@+=D<0n:(9U7C5[!e",jin:"-8o-8j-8d-7}-6<-35-2^-2=-01-,y-,k-,[-*X-*'-%o-!F~y{Fzkz6yE=q=M:I9$6~6g3h2M0i*Y)y)K(z(d(@(*",pu:"-8n-3$-+k-!S}^}O}<{BzPy(]p[rY{V0UvTeTdQ;PiPPP&O*M,FZE_AS=`:17k6T614r3a+v(C$m",reng:"-8g]m",zong:"-8f-5:-4y-43-3KzFpikxkrkNeJcdaraVY^XXX(W&Q|O>MxJQIKG28L8D8#3+1n1c0{,b,R%E#w",fo:"-8e-8;-73|IJl",lun:"-8c-7i-6S-4u}l}Y{.t*lSlRb9[{YMJa?j<6:3",cang:"-8a-89-7h-5;-3e-07-+OkeDW<];o:Y9g9_8a7;/G+J(!&Y&7",zai:"-8`-3V-2G-1!-&v}8pOl.]j]>L3>f;>:.4|4{3~&Y&7",ta:"-8^-6E-3^-#~-!&~Kz$yyy6vep}lc[HZXW`V&HCG}EqA[?}u.t`tZs~r~rOrNr9q`pUo;o:nBmylxlhjthhgCfhf+dI_a_X_R_'ZPYQXsWnWiVhVXVSU6U'QlQNPKNFMhGiFFEtDRC~ArA@>S=E=7:]:C7Q6*574*0l.=,s,G+f+c+U+O*|*s*T*,'3$c#b#Z",cha:"-8X-6Q-4D-/,-.t-)e-$A-$$~s{yvbu?o|m}kqj3]a]OZ7Z.XZX5WJW1NsM0LvK?I?GjEB@k,<%s",hong:"-8W-)w-).-(X-(K-(;-&{-%}-$)~i{kvXu6pqpjn=j[fvfBa*``XeVNQ[@E?y?<>@=b=S;J;B:R8J7U5(3|31+>+4'T",tong:"-8V-7/-6R-4Z-2h-,/-(}-&|-#Z}o|/mNm>m3h:f(c%`P`)Z1Q]PwwuqtKqdmdmVlQjhekYffd9]bDaxT:RBQtPcIiATX7s5L",fan:"-8E-0)-0(-0'-,1-+R-)a-!hy%v_tDr;r:iwhwdi_h]l[ARvRtNpMLKXJrJAG,FD@w@g?4955t5_3n2E15.l.[(A&O&/&,!.",miao:"-8D-,m-)v-$?vDscrPh>gtgSX^NP<#;A+K",yang:"-8C-7<-6{-3[-15-,f-,@-*g-'Z|J{xwTukswmrl6l3e`d4cEaA`m^}]T[lXRUz>`8N6A4y4D4.2B+6*O)4%Q$|$@#F",ang:"-8C-*gn.RLQoN0!5",wo:"-8?-4s-4L-*l-(/-'&-%q-$atCtBsfi8^TZYYbYSXKV#SRN8I>@1=#YqXmXjX7WmV!UGU'R{PpO_MoM(LEK3JgIfIJICI)HEG]FhFCEKE2DLC&BMBLA]>a>$OYOSN.K&J*J)F)A>@66}5i4v391=16+{+.",bin:"-86-3S-2EpAe}W?UNShJnImGXE:B^BO@r9I6q6Q6M6,+.(j((",di:"-85-7@-5a-4F-3:-*D-'}-&t-&$-%R-%&-#O-!(}0|h|d|@{Q{L{8zMyFy;x|w?tqsmrimUkIjoi`hBg:fofjeld#`7]g[g[=YFX]XGW2TLT!R[NfN(MrM3KAK:JCHiG7AI=g<};T9f9=3F/K.V+=*5'1%c##",fang:"-84-4}-+^|r{Qzcv5er^%TZS:S(RER6N/@<@'8*4c1@/!+m",wen:"-8,-/X-(M-(C-(&-%Jy`vNf)dfde]:X.WRSmQsKNHWH)C$B`@>;z;R:*4s+1*8(}(&$;$.",xin:"-8*-7f-5d-5G-!3-!0~%vSCR9N@N%D$C^4a3$",ai:"-8&-2W-09-)h-'!-&q-&5-%Y-$'-#]-#E-!;{SzIyfxUtgtUrxr'kaa9_7_,ZNYaT&T$QqP^P.CxClB.:%9t6U3.03(k(;#]!s!j!]",xiu:"-7~-5c-5V-''-$/~|p@mfmPh2N~G09~9F8I4+*P*#(N",xu:"-7~-7Y-6Y-6!-49-0x-,F-,E-*Y-)T-)+-'p-$e-$Q-#7-!o-!W}7{Wy,x+v&uxspsArFhHeXckcKc:b(`g^YY4XMTKT@RbRZR!QcP{O^OOLGI9GfC|CtCiCOCKBw@5@4>?=t<>;+;):P9r998W8B433W2H0m+t*N*?&;%T",tang:"-7y-5+-4M-3l-3U-1v-.2-&.-${-#.|XzpyukdilaA^cW^V~OsJFH%F{F<@P/:f8U6y6Y6+525127+_#@",hui:"-7u-7#-2u-1{-+H-+.-'/-&j-$[-#=-!f-!U-!D~p~,~&}u}Fz]xztEsgr7q]onn?n>i*gmg7g5f6f4f3e,e*cDcCcVEQSQCP|PQO]KeIOI3GRF4EiEZEQDqBVB>B=B7@n?D>h>g=y;+:S9X897x796y6:5,5)3t3q3k2h0y0q+h*9)G(=(2$~$)",kuai:"-7u-6@-2M-/p-&f-!8}:|ez&y'jEgMdXUkRrO]Cq=y79.*+g(2",cui:"-7s-5?-3N-04-%I-%>y8lYlWkhdSbE`TV|IxH*GHAg<48P6a331g)p(b%I$L!d",che:"-7n-5`-4I-,%-'y-&*|?vln|nGene/]QY.XcVsV>V<7`3r3b3E0C",chen:"-7h-4_-3e-2'-#|~ZyWyAw]pGoBdRa>[aY]THS~QAP$L[K_K'J(HUG3D]@+@*2n05)l%P$?$$",xun:"-7g-6O-4.-,Q-,A-,)-,(-+5-'3-!k-!P~u|y{=yixYxAw#uHqKq9o`oOmEj@j&j#g=ebe>c]`uXUTfRcP(NqL_KbF`BvB@Au@Y>5=r=l8+7y6V583O2h1{1D130j0Y0Q.5+b*H(L&T",chi:"-7c-7M-6b-6P-5E-3@-,W-,K-+_-*]-)<-)3-))-(:-&W-$z-$I-#l-!g-!=|@|)yLw/vBs6n|fsf$eweve6cBc9`X`7_|_2]`[f[!ZvZ/W+TxTCSNNcMPM3G1ChC6C4BX@T?Y;:8g4~4;3U1K.O'A$Y$U$E$2#G",xuan:"-7b-2N-/.-)o-)'-'(-$Y-$Mz)wsv&sWrqr.p]f[cobMaQaI_I^nX_SyS'RAR,QeQ$Q#PNK@HxHwEf?#;I8d4M3x2e+L*s*)*&)B(Z'~%/#E#<",nu:"-7a-3r-,svjq?ilfed1Wo",bai:"-7`-6z-(1-&:hJ[?[>ZwYeX}WAUfUCTAMFLN,n'D#*#)",gu:"-7_-3T-2e-0F-)I-'s-'N-&<-&;-%G-#y-#@}gzfx#uhrUq@o&lXl=j5j4d*`~]_]9TSNaM.K-27-+8-(%|Nzsznv/v)t'Y'R$*#[",zhou:"-7W-6M-2X-0{-'|-'z-'Q-'5-%X-$i-!G~{v.t/pgjCiceIY%QnQLQ8)<3;[5U3G2o0D(K(8#9",ci:"-7T-7B-6m-47-17-/+-/'-'t-'r-%@|*q}j3h<`hN|MILHD&C??56Z*p*k'E'6%=!{",beng:"-7S-#w-#+{R{#zgyXw!lBkYX0>v)d)[',&k&j$a",ga:"-7Q-'M-#A-#/-!4wIwDoEo>o.RaOM+C",dian:"-7K-7:-3m-18-**~M|P{lyBxfw6v~t6t!kXj]jNjMh@ao^!YOTrTWT9I_GqG_FPF5B?-(7-%`ylybwYvit=nodgc2b:Y#WPQ?LSB{?U-72-66-4E-'L-&,-#!|lmtmsj;h0d6YTV4R%M7M&)e",ti:"-7;-5N-5'-4R-/!-.n-*;-%H-$y-$3~w~rw?smsPnmnYnVl2foeCe6bnbjb#b!aU^)ZHY*X]XGU>OaONL$JxJCCQB]=0;T8O*5)A'r",zhan:"-7:-4>-2y-*s-!IrQnamRl>l)kCkBk.j|d+b0^M^?^5W|SJSGS0RsMjLiL-&t-%H-$j{szSmDl/kIi3c}cPa`^IZbX:QwP!M2HsGUBcAK?I0*/}/n'_&#%q%j%i",gou:"-71-3p-0y-+z-)H-'p-%W|C{uwdwcuTs0mnfM[CX%VcN6M^Gm?q:925.C*o%2",kou:"-71-0f-.C-,g-)J-)DpCp8fId3]^[|VpTV9@",ning:"-70-6>-4a-29-0.-'H-!)r%q!p2p)p'p!ot[4UMM5F/E5?17J6k.<+a&i",yong:"-7*-5t-3M-,U-,T-'T-$t-$+-!:{Oz!yCxcrlkUg{gAe{ceb{bzapaC`w`n`:[6XTU}M4LaGQ@}>x=9:p947:5T/{/i&p&l%)#S#8",wa:"-7)-/n-,e-(/-'P-'&-&x-%h-%A-#y-#nu5tbt3sGnCije[ZaWUTq>.:;8h'V'D'>&A",ka:"-7&-*r-'O-'M-'4-$u{g",bao:"-7%-5h-21-/>-.e-.]-,!-+{-+s~ozPzOz@sBqBpcpMp$ohoee&d:[w[kPPP1P&M]614J2<0_.u.h*G",huai:"-7#-',|mx^xIe_dC_:^oGhDX<25z",ming:"-6x-0g-06-(|-'guEs&`aXxR@PhOFH<>0:7,8",hen:"-6s-&p-!3eac6[0.:$y",quan:"-6p-1H-/.-.#-,5-,#-%%}X}Q{4w5u:t;q[m?jRf`c0b_b%['Y`WKNxJ:I[H_GLFjD>?F>F:a5841/I/H/7.o.n.m.O)2&I%'",tiao:"-6o-%Xr#pWmjmWh4cRZfSQRdQjOLO'NYK.Fo",xing:"-6j-5.-1<-/U-&g|0{auft{t5qljAh`f*cxb>aZUYR/P4Nl>ZG<9;H9<8o6o6l5n5G1z0B,a+T'h",an:"-6W-5J-4<-2D-*P-*J-')-%e-$x{b{&z_sYpwn@n8mXm:hXg~ZnXNQ.PnL'L&A1>M.g*w$V",lu:"-6V-33-1C-.H-,N-,<-*q-*o-!N~q~_};|G|5yVyUxMtVmChGgZgFf9f8^7XzW)V)UzUAU/O{MpLeJ#G&FyEuDvDaARAM>sb._,A$C",jiong:"-69-3'-1.-1$-0}}z|K{;]~]}?M=J7e4t4I3c2T2S1W1.",tui:"-6.-6(-3&y'tmo$ftfodrY(F>24",nan:"-6+-*|-$r~'~#v=tzstrb^e[sXfPqN*M6H}:d29&a&?",xiao:"-6*-5v-5R-3a-.x-,d-'j-'1-&l-&P-$}-$1-#D-#?-#&-!|-!v~c~J~CuUtHqGpPpJoKlGh/fFcJ_iX;V:TPT/SoSnQVQ'P;MiMaLOK+DOCYCLBAB4>B===8M=5;9*7)`$V$O!r",guang:"-5~-2}-1h-'@{~uIhXhTgOZsVKL+>28)5/4b4_4^3s.d+Y*U",ku:"-5}-/3-&Q-$6~R}PzrhDh+gN]dZiZ5OPMgL!I%3N.>$9",jun:"-5{-2T-0q-(n-(G|u{NuHollq_;Z3U5TzQPKMJH@F=l6V3G1B*1&'!Q!K!J",zu:"-5w-5?-+1-+$-&S-%rlYlAd(S#M1Ix0'*e",hun:"-5s-4o}_t9t'o9dMaz`oYDR?Q~JYJRBf=u>=4:&9z828&+F*L(F&r",lia:"-5[-5>",pai:"-5Q-&sg9eP[NY?JU?p>+;j;8/t.w,q",biao:"-5O-36-2/yJtIryi%f!VfNhLjFzEG<.9C66511o0c,k#|",fei:"-5M-.m-+M-*4-(i-%8w%vZt@t?nXh8gpgPbH]xSdQxQ%P:OPNLLxJVH5FOF)Di?Wq>O>N;y8^6F3{/(,T+P*M#y#5!Y",song:"-4q-3I-0D-)'u8pulDk^kOgydYdAb`a3a$`D_MZ#XXW0NK%J`HyEF-#*-!K~Oz%x#s{sXs9s%quqqq_q%kcj[jWhCgDexdha/_AVwV_U0U&R]R.Q:PwO?MHKpK]J{HvHdFbDMDI=_;E:U:K9d9O8K8F6j6i6N6=6&5~5o5j5M5A2w2r2_1x1)0b*:)*(y(S'i'5'%#j#;!B!;",ruan:"-4[zJxQsiVWOUE0):'}",chun:"-4Y-&7sda^RPR(PlOONDIBGrFQE(=T<,:[9N8u/6)C",ruo:"-4S-)[sskPf]Z:YUI8;y3'0^",dang:"-4M-2P-1V-/k-!1}*{fx]swpkl6kdf:aAZUUsTpKiEYD5@|8:7E5D*;(J(6'?%}",huang:"-4@-1L-/w-$PzDz.xtw&s[pEl9jBi0e@clcQa_a#`dXTQgQfPBOEHbH7D{@9:x9i8)4:2c2.1J0X+w)((E#i!}!g!Z",duan:"-4+-.Uz+s`SFS[$XOVUU8U*TwR1Q&PYKrEy6E5K't'k'c",za:"-4$-+Z-'b-'X-'2-$c-!c~B~:~5i}]s[$NyKr?r?a",lou:"-4#-38-.}-$7-#ByMu4tRo{n[kjkEg_`5X)W'HaG#:O9&8~1i'2$5#o#n",sou:"-3z-0J-)Q-)N-#z-#R-#QgsghZ#YvWlW>W0V:U`UBJ/DgCn:#,5#s",yuan:"-3u-1n-1)-0h-.z-*3-*1-)y-(0-&^-$Y-!<}{}t}Z}R}N}M}D{t{_yawlv6v(sSs:s)qhpepH0ErDk@/P>#;L9A8M.|,&&B%y%n%m",bang:"-3n{^ypiNi5h~hme|Z?YrWvS2KEJTJSH@=j/m++",shan:"-3h-3)-2R-/F-/<-.a-.E-*~-$q-$F-#H}'{Gy+y*ulubr2nDj|i(f+]zZ;Y3XuXsWaVhV?UySvQ8NrL|LlIVFSEhCI@`7|7p7O5F4B2Z211~.4*b%U%1",que:"-3f-*_-*W{Pyty$lgbNa+`KX!T8T.JBH$@j4e0|)O#q!N",nuo:"-3Q-1w-$ftxa6_#_!ZLXnWoWbWLK0HJF2Am",can:"-3P-2F-)l-)k-)j-)i-$D-#H~:r(q3amah`W`V`U_[XsVqVhO_BtBg;/784z1!0L(9",lei:"-3O-24-1t-,J-)q-#1|(z0xOx?rrU|U;G'E]DyDxD/?$>I=+JO7F5&2>1#(](7#&#%",cao:"-3L-#GnGk@`v`k`^_DVAUqOgOfG:8x",ao:"-3H-/n-*&-#X-#W|H|4xnxkv}vyvwsDs2rZmxmakAjnga`O_@]I]![DVuUeTBM*K=?>9;7M741m1^0Z,!+~(Y",cou:"-3D-0:Hl;1",chuang:"-3B-/b-/K-/5-.s-.i-.L-$T-!dhvhMd=`|W7O|;z;+:t8(+1*c)o)j)=$R!D",sai:"-2V-#b-#)-!/yod%a2XaAxAb",tai:"-2B-0_-)=}e|Mw[wXwOvzqvqCdodQdB`e[pU]SpR]MeE>@f@D@C>{:=4G4F1$*f",lan:"-2?-1@-)}-%P-!'~3|hx`xXt(qgqaqUmwkwhgb)_8_'^p[5X/UXU(TmSaS_PpLbHXDDD2D1=^9L8i7K6W5`5W5=5<46121%0n0d0I0@0>($'j",meng:"-2;-0k-,Lwaw`qEo2hnh*_._+^qXtUaP)O9K$F;EAANAF:A6h,Z+]'/&X#B!#",qiong:"-28-*fr.pza]`!K}F(3(3%2L1}*))J(G's'f",lie:"-25-0N-/O-,z-,w-,`-'<-&G{D{CuDjaj=djZeZ_YiUEL;JMA{>_=p403f2A1$0a0[.x,h,V+k+[",teng:"-2%i+9]8r1e%6%&",long:"-2#-'J-&]~^|7|6xHxGo2n=k6j_j^g.e([9U.QmOxO8LgKDGYDU>t:g9T9%5w0N*Z'n#f",rang:"-1}-,$~Nx[xC^mU$5b0K+S'X",xiong:"-1m-1j-/q-+v-+p-&zwsdLc?Sy@;>42w2r2#2!",chong:"-1l-0Y-#L{*p`oflelde0dc`+_dXT2NB6[6G5|5u$P",rui:"-1g-1e-1`-)LxFas]0M~KVF.@G)'&t",ke:"-1f-/*-.w-,]-,R-+;-)>-'o-'0-$!|Dzqx4u#p^oUmomIkvknjqc4bra6U4U0!/N//*j%>$O",tu:"-1c-1]-0H-/o-(y-&3-%?}n}c}J}I}A}?zezZyvxipvnUlskikFh.gVeVc}bsZ.YYX@W2K?EL@R=C=::r7u(i$r$>",nei:"-1I-1*-&TtvA(=w::8Q7V631r1[*a)~)%(v(?&S&>&%%r$(#d",shou:"-13-)`-)V-%l-!o{ox)x&pxo[]v]uYITcTN,",mei:"-0I~j|vz>yRv#sks]sTs4r

-+b-+(-(_-(.-&h-#%{@wGuWs}s|rJrDlaWTV}V+NAMvKfIgGKFX9a7c,7&]&+%~",bie:"-/A-/;fGe2`#M'M!$!#I",pao:"-/>-+i-'^~o|2w=hA]$[P?.4J4H3d06.M'^%A!S",geng:"-/7-&A{TzHlrh=ZIOlK4IX=X2p&M",shua:"-//-%j",cuo:"-.y-.p-*5wukWkSh!ZKY&WuV4(o$j$'",kei:"-.woU",la:"-.v-%3-$n~L|8[RXFXEWnUEU2R`MOI6DT:T0['o$A",pou:"-.l-'_-&[{]twtO]+]&Z+YGJS/<",tuan:"-.I~!}~}K}HyPy&f7`>[}XIVmGLE;;.:m8t2[,F%v%p",zuan:"-.)XOTt",keng:"-,x-([|t|kvIZCXlVgBF/C",gao:"-,Z-(I-(>wRlpWjNHGxGwGdG>E~E3Dm,)!y!t",lang:"-,V-&J-$~{Jy[r{llgiSeOIOHO;KRHHG4Cp=[3Y,z*%(s",weng:"-,@-#oyxv{kfU!Pd9o'N'&",tao:"-+m-)E-'+-%DwPwMw*r}i/fl`j[oYBWXL,JkGtE?><=)'v",cen:"-)l-)k-)j-)i{Un#kH@?=1",shuang:"-)byOqeq^`NDB>t8R5w5^0&",po:"-)8-&M-#6~]|ZvztMoZmlmZg9W]TXR+O*E%?E>q>o>D;*:J8;6F3v,9*l!`",a:"-(s-'o-%O-$0",tun:"-(k-(7-%L-!`}}|snFhNdP_mRQPFOC@x=335",hang:"-([{dwSvIj)dGS8NML/@.",shun:"-(ZHnF?",ne:"-(R-(8-(%-&T]0%a",chuo:"-(Q-&@-%=~Hu!t~t.ssqVa|^2Z}UuCClMi@i$fDf@b1`Y_4XyW6TMMzJ$I:GOD{=#gKfVfSfC^P^N^>[zWQW!VySKMlIvGkFdEJ:)8{4[1s/|/z,f,.*{(p%m",pen:"-('-$E-$=-!6CN;'6}'Q!=",pin:"-&~~Yuatnrvq{[AZ{H]@_/c+!)r",ha:"-&wvz",yo:"-&`-%c-$B",o:"-&X-$a-!H-!%",n:"-&)-#a",huan:"-%v-$Z-$Y~G}D{_zWw@w2r.q[pYp0okm8l!h]bVaH_I^iYpXQUnU1KyK2GBD%CPCB>1=c<~;c8V7D734/3>2I.[.;,3+R*})9(1'b$d$:",ken:"-%V{qxjc*_CX~*I",chuai:"-%=XIW}Ch",pa:"-%/vLisihd.]oX|NC@r8608)P#!",se:"-%,-$,yogK_WY%X`W~J/J.Hl",nv:"vkc7OM@!",nuan:"vcPo;`:m2X2W",shuo:"v]a'WhT'S|OKGnCn>>470W+p",niu:"v?q=dKd0]S]![DN?@8@!4u/e/d.W",rao:"u2rA]PU?KkFJ",niang:"t|r&qb",shui:"t]iTZMYuA$A#@{=.=*",nve:"t)%S$%",nen:"sirarYc^",niao:"s!r+qsnwFq9x",kuan:"pBp#ooK)CoCfCd",cuan:"jPV'U*T~TwDtD7BU@o6E5K1S0<",te:"dsdr`R/F/9",zen:"d5VU",zei:"^H",den:"][]C",zhua:"],ZYV#ER0:09",shuan:"[&L^GL{let t=0,n=1;for(let a=e.length;a--;)t+=n*da.indexOf(e.charAt(a)),n*=91;return t},Wt=(e,t)=>{let n,a,s,i,w;for(n in e)if(e.hasOwnProperty(n))for(a=e[n].match(ga),s=0;s(zn("data-v-c7e0b9b7"),e=e(),xn(),e),ya={key:0},$a={class:"container"},wa={class:"action-bar"},_a=["title"],ba=["title"],ka=["title"],Oa=["src"],za={key:0,class:"icon",style:{cursor:"pointer"}},xa={key:2,"flex-placeholder":""},Ca={key:3,class:"action-bar"},Ma={key:0,class:"gen-info"},Ta={class:"info-tags"},La={class:"info-tag"},Sa={class:"name"},Ea=["title"],Aa={class:"name"},Fa=["title","onDblclick"],Ia={key:0,class:"tags-container"},Pa={style:{display:"inline-block",width:"32px"}},Da=["onClick"],ja=["onClick"],Wa={class:"lr-layout-control"},Ua={class:"ctrl-item"},qa={class:"ctrl-item"},Va={class:"ctrl-item"},Na=re(()=>k("br",null,null,-1)),Ba=re(()=>k("h3",null,"Prompt",-1)),Xa=["innerHTML"],Ha=re(()=>k("br",null,null,-1)),Ja=re(()=>k("h3",null,"Negative Prompt",-1)),Ya=["innerHTML"],Za=re(()=>k("br",null,null,-1)),Ga=re(()=>k("h3",null,"Params",-1)),Ka={style:{"font-weight":"600","text-transform":"capitalize"}},Qa=["onDblclick"],Ra=["onDblclick"],eo=re(()=>k("br",null,null,-1)),to=re(()=>k("h3",null,"Extra Meta Info",-1)),no={class:"extra-meta-table"},ao={style:{"font-weight":"600","text-transform":"capitalize"}},oo=["onDblclick"],lo={class:"extra-meta-value"},so=["title"],io=Pt({__name:"fullScreenContextMenu",props:{file:{},idx:{}},emits:["contextMenuClick"],setup(e,{emit:t}){const n=e;gn(o=>({b7cd59ce:c($)?0:"46px","0e09e1cc":c(y)+"px","62228ae0":`calc(100vw - ${c(y)}px)`}));const a=nt(),s=pn(),i=ie(),w=ee(()=>s.tagMap.get(n.file.fullpath)??[]),T=ie(""),A=tt(),I=ie(""),V=ee(()=>I.value.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")),W=ee(()=>V.value.split(` +`)),L=ee(()=>We(V.value)),P=ee(()=>{let o=We(V.value);return delete o.prompt,delete o.negativePrompt,delete o.extraJsonMetaInfo,o}),S=ee(()=>We(I.value).extraJsonMetaInfo);ye(()=>{var o;return(o=n==null?void 0:n.file)==null?void 0:o.fullpath},async o=>{o&&(A.tasks.forEach(r=>r.cancel()),A.pushAction(()=>Ke(o)).res.then(r=>{I.value=r}))},{immediate:!0});const p=ke("iib@fullScreenContextMenu.prompt-tab","structedData"),f=ie(),E=ie(),te={left:100,top:100,width:512,height:384,expanded:!0},m=ke("fullScreenContextMenu.vue-drag",te);m.value&&(m.value.left<0||m.value.top<0)&&(m.value={...te});const{isLeftRightLayout:l,lrLayoutInfoPanelWidth:y,lrMenuAlwaysOn:$}=ua(),F=l;ia(i,f,E,{disbaled:F,...m.value,onDrag:Ae(function(o,r){m.value={...m.value,left:o,top:r}},300),onResize:Ae(function(o,r){m.value={...m.value,width:o,height:r}},300)});const H=ie(!1),{isOutside:U}=Ft(ee(()=>!F.value||$.value?null:H.value?i.value:Ze(document.querySelectorAll(".iib-tab-edge-trigger"))));ye(U,hn(o=>{H.value=!o},300));function G(o){return o.parentNode}function K(o){let r=0;for(const J of o)/[\u4e00-\u9fa5]/.test(J)?r+=3:r+=1;return r}function ce(o){if(o.length===0)return!1;let r=0;for(const j of o){const O=K(j);if(r+=O,O>50)return!1}return!(r/o.length>30)}function ne(o){if(!o)return"";const r="BREAK",J=o.replace(/>\s/g,"> ,").replace(/\sBREAK\s/g,","+r+",").split(/[\n,]+/).map(C=>C.trim()).filter(C=>C);if(!ce(J))return o.split(` +`).map(C=>C.trim()).filter(C=>C).map(C=>`

${C}

`).join("");const j=[];let O=!1;for(let C=0;CBREAK
');continue}const Y=J[C];O||(O=Y.includes("("));const le=["tag"];O&&le.push("has-parentheses"),Y.length<32&&le.push("short-tag"),j.push(`${Y}`),O&&(O=!Y.includes(")"))}return j.join(a.showCommaInInfoPanel?",":" ")}$e("load",o=>{const r=o.target;r.className==="ant-image-preview-img"&&(T.value=`${r.naturalWidth} x ${r.naturalHeight}`)},{capture:!0});const ze=ee(()=>{const o=[{name:x("fileSize"),val:n.file.size}];return T.value&&o.push({name:x("resolution"),val:T.value}),o}),d=()=>{const o="Negative prompt:",r=I.value.includes(o)?I.value.split(o)[0]:W.value[0]??"";pe(Ve(r.trim()))},_=()=>document.body.requestFullscreen(),q=o=>{pe(typeof o=="object"?JSON.stringify(o,null,4):o)},D=o=>{o.key.startsWith("Arrow")?(o.stopPropagation(),o.preventDefault(),document.dispatchEvent(new KeyboardEvent("keydown",o))):o.key==="Escape"&&document.fullscreenElement&&document.exitFullscreen()};$e("dblclick",o=>{var r;((r=o.target)==null?void 0:r.className)==="ant-image-preview-img"&&Oe()});const he=ee(()=>F.value||m.value.expanded),_e=ke(Qe+"contextShowFullPath",!1),Pe=ee(()=>_e.value?n.file.fullpath:n.file.name),xe=ke(Qe+"tagA2ZClassify",!1),Ut=ee(()=>{var J;const o=(J=a.conf)==null?void 0:J.all_custom_tags.map(j=>{var C,Y;return{char:((C=j.display_name)==null?void 0:C[0])||((Y=j.name)==null?void 0:Y[0]),...j}}).reduce((j,O)=>{var Y;let C="#";if(/[a-z]/i.test(O.char))C=O.char.toUpperCase();else if(/[\u4e00-\u9fa5]/.test(O.char))try{C=((Y=/^\[?(\w)/.exec(va(O.char)+""))==null?void 0:Y[1])??"#"}catch(le){console.log("err",le)}return C=C.toUpperCase(),j[C]||(j[C]=[]),j[C].push(O),j},{});return Object.entries(o??{}).sort((j,O)=>j[0].charCodeAt(0)-O[0].charCodeAt(0))}),De=()=>{Oe(),t("contextMenuClick",{key:"tiktokView"},n.file,n.idx)},je=ie(!1),qt=async()=>{var o,r;if(!L.value.prompt){Q.warning(x("aiAnalyzeTagsNoPrompt"));return}if(!((r=(o=a.conf)==null?void 0:o.all_custom_tags)!=null&&r.length)){Q.warning(x("aiAnalyzeTagsNoCustomTags"));return}je.value=!0;try{const J=L.value.prompt,O=`You are a professional AI assistant responsible for analyzing Stable Diffusion prompts and categorizing them into appropriate tags. + +Your task is: +1. Analyze the given prompt +2. Find all relevant tags from the provided tag list +3. Return only the matching tag names, separated by commas +4. If no tags match, return an empty string +5. Tag matching should be based on semantic similarity and thematic relevance + +Available tags: ${a.conf.all_custom_tags.map(N=>N.name).join(", ")} + +Please return only tag names, do not include any other content.`,Y=(await vn({messages:[{role:"system",content:O},{role:"user",content:`Please analyze this prompt and return matching tags: ${J}`}],temperature:.3,max_tokens:200})).choices[0].message.content.trim();if(!Y){Q.info(x("aiAnalyzeTagsNoMatchedTags"));return}const le=Y.split(",").map(N=>N.trim()).filter(N=>N),Ce=a.conf.all_custom_tags.filter(N=>le.some(me=>N.name.toLowerCase()===me.toLowerCase()||N.name.toLowerCase().includes(me.toLowerCase())||me.toLowerCase().includes(N.name.toLowerCase()))),Me=new Set(w.value.map(N=>N.id)),fe=Ce.filter(N=>!Me.has(N.id));if(fe.length===0){Ce.length>0?Q.info(x("aiAnalyzeTagsAllTagsAlreadyAdded")):Q.info(x("aiAnalyzeTagsNoValidTags"));return}for(const N of fe)t("contextMenuClick",{key:`toggle-tag-${N.id}`},n.file,n.idx);Q.success(x("aiAnalyzeTagsSuccess",[fe.length.toString(),fe.map(N=>N.name).join(", ")]))}catch(J){console.error("AI分析标签失败:",J),Q.error(x("aiAnalyzeTagsFailed"))}finally{je.value=!1}};return(o,r)=>{var ct,dt,gt;const J=Fn,j=ve,O=yn,C=$n,Y=wn,le=_n,Ce=ve,Me=An,fe=En,N=bn,me=kn,Vt=On;return h(),z("div",{ref_key:"el",ref:i,class:qe(["full-screen-menu",{"unset-size":!c(m).expanded,lr:c(F),"always-on":c($),"mouse-in":H.value}]),onWheelCapture:r[13]||(r[13]=yt(()=>{},["stop"])),onKeydownCapture:D},[c(F)?(h(),z("div",ya)):X("",!0),k("div",$a,[k("div",wa,[c(F)?X("",!0):(h(),z("div",{key:0,ref_key:"dragHandle",ref:E,class:"icon",style:{cursor:"grab"},title:c(x)("dragToMovePanel")},[u(c(Hn))],8,_a)),c(F)?X("",!0):(h(),z("div",{key:1,class:"icon",style:{cursor:"pointer"},onClick:r[0]||(r[0]=g=>c(m).expanded=!c(m).expanded),title:c(x)("clickToToggleMaximizeMinimize")},[he.value?(h(),se(c(fn),{key:0})):(h(),se(c(mn),{key:1}))],8,ba)),k("div",{style:{display:"flex","flex-direction":"column","align-items":"center",cursor:"grab"},class:"icon",title:c(x)("fullscreenview"),onClick:_},[k("img",{src:c(aa),style:{width:"21px",height:"21px","padding-bottom":"2px"},alt:""},null,8,Oa)],8,ka),u(J,{"get-popup-container":G},{overlay:b(()=>[u(Tn,{file:o.file,idx:o.idx,"selected-tag":w.value,onContextMenuClick:r[1]||(r[1]=(g,B,oe)=>t("contextMenuClick",g,B,oe))},null,8,["file","idx","selected-tag"])]),default:b(()=>[c(m).expanded?X("",!0):(h(),z("div",za,[u(c(vt))]))]),_:1}),he.value?(h(),z("div",xa)):X("",!0),he.value?(h(),z("div",Ca,[u(J,{trigger:["hover"],"get-popup-container":G},{overlay:b(()=>[u(le,{onClick:r[2]||(r[2]=g=>t("contextMenuClick",g,o.file,o.idx))},{default:b(()=>{var g;return[((g=c(a).conf)==null?void 0:g.launch_mode)!=="server"?(h(),z(R,{key:0},[u(O,{key:"send2txt2img"},{default:b(()=>[M(v(o.$t("sendToTxt2img")),1)]),_:1}),u(O,{key:"send2img2img"},{default:b(()=>[M(v(o.$t("sendToImg2img")),1)]),_:1}),u(O,{key:"send2inpaint"},{default:b(()=>[M(v(o.$t("sendToInpaint")),1)]),_:1}),u(O,{key:"send2extras"},{default:b(()=>[M(v(o.$t("sendToExtraFeatures")),1)]),_:1}),u(C,{key:"sendToThirdPartyExtension",title:o.$t("sendToThirdPartyExtension")},{default:b(()=>[u(O,{key:"send2controlnet-txt2img"},{default:b(()=>[M("ControlNet - "+v(o.$t("t2i")),1)]),_:1}),u(O,{key:"send2controlnet-img2img"},{default:b(()=>[M("ControlNet - "+v(o.$t("i2i")),1)]),_:1}),u(O,{key:"send2outpaint"},{default:b(()=>[M("openOutpaint")]),_:1})]),_:1},8,["title"])],64)):X("",!0),u(O,{key:"send2BatchDownload"},{default:b(()=>[M(v(o.$t("sendToBatchDownload")),1)]),_:1}),u(C,{key:"copy2target",title:o.$t("copyTo")},{default:b(()=>[(h(!0),z(R,null,ue(c(a).quickMovePaths,B=>(h(),se(O,{key:`copy-to-${B.dir}`},{default:b(()=>[M(v(B.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),u(C,{key:"move2target",title:o.$t("moveTo")},{default:b(()=>[(h(!0),z(R,null,ue(c(a).quickMovePaths,B=>(h(),se(O,{key:`move-to-${B.dir}`},{default:b(()=>[M(v(B.zh),1)]),_:2},1024))),128))]),_:1},8,["title"]),u(Y),u(O,{key:"deleteFiles"},{default:b(()=>[M(v(o.$t("deleteSelected")),1)]),_:1}),u(O,{key:"previewInNewWindow"},{default:b(()=>[M(v(o.$t("previewInNewWindow")),1)]),_:1}),u(O,{key:"copyPreviewUrl"},{default:b(()=>[M(v(o.$t("copySourceFilePreviewLink")),1)]),_:1}),u(O,{key:"copyFilePath"},{default:b(()=>[M(v(o.$t("copyFilePath")),1)]),_:1}),u(Y),u(O,{key:"tiktokView",onClick:De},{default:b(()=>[M(v(o.$t("tiktokView")),1)]),_:1})]}),_:1})]),default:b(()=>[u(j,null,{default:b(()=>[M(v(c(x)("openContextMenu")),1)]),_:1})]),_:1}),u(Ce,{onClick:r[3]||(r[3]=g=>t("contextMenuClick",{key:"download"},n.file,n.idx))},{default:b(()=>[M(v(o.$t("download")),1)]),_:1}),I.value?(h(),se(j,{key:0,onClick:r[4]||(r[4]=g=>c(pe)(I.value))},{default:b(()=>[M(v(o.$t("copyPrompt")),1)]),_:1})):X("",!0),I.value?(h(),se(j,{key:1,onClick:d},{default:b(()=>[M(v(o.$t("copyPositivePrompt")),1)]),_:1})):X("",!0),I.value&&((dt=(ct=c(a).conf)==null?void 0:ct.all_custom_tags)!=null&&dt.length)?(h(),se(j,{key:2,onClick:qt,type:"primary",loading:je.value},{default:b(()=>[M(v(o.$t("aiAnalyzeTags")),1)]),_:1},8,["loading"])):X("",!0),u(j,{onClick:De,onTouchstart:yt(De,["prevent"]),type:"default"},{default:b(()=>[M(v(o.$t("tiktokView")),1)]),_:1},8,["onTouchstart"])])):X("",!0)]),he.value?(h(),z("div",Ma,[k("div",Ta,[k("span",La,[k("span",Sa,v(o.$t("fileName")),1),k("span",{class:"value",title:Pe.value,onDblclick:r[5]||(r[5]=g=>c(pe)(Pe.value))},v(Pe.value),41,Ea),k("span",{style:{margin:"0 8px",cursor:"pointer"},title:"Click to expand full path",onClick:r[6]||(r[6]=g=>_e.value=!c(_e))},[u(c(vt))])]),(h(!0),z(R,null,ue(ze.value,g=>(h(),z("span",{class:"info-tag",key:g.name},[k("span",Aa,v(g.name),1),k("span",{class:"value",title:g.val,onDblclick:B=>c(pe)(g.val)},v(g.val),41,Fa)]))),128))]),(gt=c(a).conf)!=null&>.all_custom_tags?(h(),z("div",Ia,[k("div",{class:"sort-tag-switch",onClick:r[7]||(r[7]=g=>xe.value=!c(xe))},[c(xe)?(h(),se(c(jn),{key:1})):(h(),se(c(na),{key:0}))]),k("div",{class:"tag",onClick:r[8]||(r[8]=(...g)=>c(Ge)&&c(Ge)(...g)),style:Ue({"--tag-color":"var(--zp-luminous)"})},"+ "+v(o.$t("add")),5),c(xe)?(h(!0),z(R,{key:0},ue(Ut.value,([g,B])=>(h(),z("div",{key:g,class:"tag-alpha-item"},[k("h4",Pa,v(g)+" : ",1),k("div",null,[(h(!0),z(R,null,ue(B,oe=>(h(),z("div",{class:qe(["tag",{selected:w.value.some(pt=>pt.id===oe.id)}]),onClick:pt=>t("contextMenuClick",{key:`toggle-tag-${oe.id}`},o.file,o.idx),key:oe.id,style:Ue({"--tag-color":c(s).getColor(oe)})},v(oe.name),15,Da))),128))])]))),128)):(h(!0),z(R,{key:1},ue(c(a).conf.all_custom_tags,g=>(h(),z("div",{class:qe(["tag",{selected:w.value.some(B=>B.id===g.id)}]),onClick:B=>t("contextMenuClick",{key:`toggle-tag-${g.id}`},o.file,o.idx),key:g.id,style:Ue({"--tag-color":c(s).getColor(g)})},v(g.name),15,ja))),128))])):X("",!0),k("div",Wa,[k("div",Ua,[M(v(o.$t("experimentalLRLayout"))+": ",1),u(Me,{checked:c(F),"onUpdate:checked":r[9]||(r[9]=g=>Le(F)?F.value=g:null),size:"small"},null,8,["checked"])]),c(F)?(h(),z(R,{key:0},[k("div",qa,[M(v(o.$t("width"))+": ",1),u(fe,{value:c(y),"onUpdate:value":r[10]||(r[10]=g=>Le(y)?y.value=g:null),style:{width:"64px"},step:16,min:128,max:1024},null,8,["value"])]),u(N,{title:o.$t("alwaysOnTooltipInfo")},{default:b(()=>[k("div",Va,[M(v(o.$t("alwaysOn"))+": ",1),u(Me,{checked:c($),"onUpdate:checked":r[11]||(r[11]=g=>Le($)?$.value=g:null),size:"small"},null,8,["checked"])])]),_:1},8,["title"])],64)):X("",!0)]),u(Vt,{activeKey:c(p),"onUpdate:activeKey":r[12]||(r[12]=g=>Le(p)?p.value=g:null)},{default:b(()=>[u(me,{key:"structedData",tab:o.$t("structuredData")},{default:b(()=>[k("div",null,[L.value.prompt?(h(),z(R,{key:0},[Na,Ba,k("code",{innerHTML:ne(L.value.prompt??"")},null,8,Xa)],64)):X("",!0),L.value.negativePrompt?(h(),z(R,{key:1},[Ha,Ja,k("code",{innerHTML:ne(L.value.negativePrompt??"")},null,8,Ya)],64)):X("",!0)]),Object.keys(P.value).length?(h(),z(R,{key:0},[Za,Ga,k("table",null,[(h(!0),z(R,null,ue(P.value,(g,B)=>(h(),z("tr",{key:B,class:"gen-info-frag"},[k("td",Ka,v(B),1),typeof g=="object"?(h(),z("td",{key:0,style:{cursor:"pointer"},onDblclick:oe=>q(g)},[k("code",null,v(g),1)],40,Qa)):(h(),z("td",{key:1,style:{cursor:"pointer"},onDblclick:oe=>q(c(Ve)(g))},v(c(Ve)(g)),41,Ra))]))),128))])],64)):X("",!0),S.value&&Object.keys(S.value).length?(h(),z(R,{key:1},[eo,to,k("table",no,[(h(!0),z(R,null,ue(S.value,(g,B)=>(h(),z("tr",{key:B,class:"gen-info-frag"},[k("td",ao,v(B),1),k("td",{style:{cursor:"pointer"},onDblclick:oe=>q(g)},[k("code",lo,v(typeof g=="string"?g:JSON.stringify(g,null,2)),1)],40,oo)]))),128))])],64)):X("",!0)]),_:1},8,["tab"]),u(me,{key:"sourceText",tab:o.$t("sourceText")},{default:b(()=>[k("code",null,v(I.value),1)]),_:1},8,["tab"])]),_:1},8,["activeKey"])])):X("",!0)]),c(m).expanded&&!c(F)?(h(),z("div",{key:1,class:"mouse-sensor",ref_key:"resizeHandle",ref:f,title:c(x)("dragToResizePanel")},[u(c(Vn))],8,so)):X("",!0)],34)}}});const zo=Dt(io,[["__scopeId","data-v-c7e0b9b7"]]),uo={key:0,class:"float-panel"},ro={key:0,class:"select-actions"},co={key:1},go=Pt({__name:"MultiSelectKeep",props:{show:{type:Boolean}},emits:["selectAll","reverseSelect","clearAllSelected"],setup(e,{emit:t}){const n=nt(),a=()=>{t("clearAllSelected"),n.keepMultiSelect=!1},s=()=>{n.keepMultiSelect=!0};return(i,w)=>{const T=ve;return i.show?(h(),z("div",uo,[c(n).keepMultiSelect?(h(),z("div",ro,[u(T,{size:"small",onClick:w[0]||(w[0]=A=>t("selectAll"))},{default:b(()=>[M(v(i.$t("select-all")),1)]),_:1}),u(T,{size:"small",onClick:w[1]||(w[1]=A=>t("reverseSelect"))},{default:b(()=>[M(v(i.$t("rerverse-select")),1)]),_:1}),u(T,{size:"small",onClick:w[2]||(w[2]=A=>t("clearAllSelected"))},{default:b(()=>[M(v(i.$t("clear-all-selected")),1)]),_:1}),u(T,{size:"small",onClick:a},{default:b(()=>[M(v(i.$t("exit")),1)]),_:1})])):(h(),z("div",co,[u(T,{size:"small",type:"primary",onClick:s},{default:b(()=>[M(v(i.$t("keep-multi-selected")),1)]),_:1})]))])):X("",!0)}}});const xo=Dt(go,[["__scopeId","data-v-b04c3508"]]);export{wo as L,xo as M,_o as R,ko as a,Oo as b,bo as c,zo as f,sa as o,$e as u}; diff --git a/vue/dist/assets/MultiSelectKeep-ad15bb9c.css b/vue/dist/assets/MultiSelectKeep-ad15bb9c.css new file mode 100644 index 0000000..4c19abf --- /dev/null +++ b/vue/dist/assets/MultiSelectKeep-ad15bb9c.css @@ -0,0 +1 @@ +.full-screen-menu[data-v-c7e0b9b7]{position:fixed;z-index:9999;background:var(--zp-primary-background);padding:8px 16px;box-shadow:0 0 4px var(--zp-secondary);border-radius:4px}.full-screen-menu .tags-container[data-v-c7e0b9b7]{margin:4px 0}.full-screen-menu .tags-container .tag[data-v-c7e0b9b7]{margin-right:4px;margin-bottom:4px;padding:2px 16px;border-radius:4px;display:inline-block;cursor:pointer;font-weight:700;transition:.5s all ease;border:2px solid var(--tag-color);color:var(--tag-color);background:var(--zp-primary-background);user-select:none}.full-screen-menu .tags-container .tag.selected[data-v-c7e0b9b7]{background:var(--tag-color);color:#fff}.full-screen-menu .container[data-v-c7e0b9b7]{height:100%;display:flex;overflow:hidden;flex-direction:column}.full-screen-menu .gen-info[data-v-c7e0b9b7]{flex:1;word-break:break-all;white-space:pre-line;overflow:auto;z-index:1;padding-top:4px;position:relative}.full-screen-menu .gen-info code[data-v-c7e0b9b7]{font-size:.9em;display:block;padding:4px;background:var(--zp-primary-background);border-radius:4px;margin-right:20px;white-space:pre-wrap;word-break:break-word;line-height:1.78em}.full-screen-menu .gen-info code[data-v-c7e0b9b7] .natural-text{margin:.5em 0;line-height:1.6em;text-align:justify;color:var(--zp-primary)}.full-screen-menu .gen-info code[data-v-c7e0b9b7] .short-tag{word-break:break-all;white-space:nowrap}.full-screen-menu .gen-info code[data-v-c7e0b9b7] span.tag{background:var(--zp-secondary-variant-background);color:var(--zp-primary);padding:2px 4px;border-radius:6px;margin-right:6px;margin-top:4px;line-height:1.3em;display:inline-block}.full-screen-menu .gen-info code[data-v-c7e0b9b7] .has-parentheses.tag{background:rgba(255,100,100,.14)}.full-screen-menu .gen-info code[data-v-c7e0b9b7] span.tag:hover{background:rgba(120,0,0,.15)}.full-screen-menu .gen-info table[data-v-c7e0b9b7]{font-size:1em;border-radius:4px;border-collapse:separate;margin-bottom:3em}.full-screen-menu .gen-info table tr td[data-v-c7e0b9b7]:first-child{white-space:nowrap;vertical-align:top}.full-screen-menu .gen-info table.extra-meta-table .extra-meta-value[data-v-c7e0b9b7]{display:block;max-height:200px;overflow:auto;white-space:pre-wrap;word-break:break-word;font-size:.85em;background:var(--zp-secondary-variant-background);padding:8px;border-radius:4px}.full-screen-menu .gen-info table td[data-v-c7e0b9b7]{padding-right:14px;padding-left:4px;border-bottom:1px solid var(--zp-secondary);border-collapse:collapse}.full-screen-menu .gen-info .info-tags .info-tag[data-v-c7e0b9b7]{display:inline-block;overflow:hidden;border-radius:4px;margin-right:8px;border:2px solid var(--zp-primary)}.full-screen-menu .gen-info .info-tags .name[data-v-c7e0b9b7]{background-color:var(--zp-primary);color:var(--zp-primary-background);padding:4px;border-bottom-right-radius:4px}.full-screen-menu .gen-info .info-tags .value[data-v-c7e0b9b7]{padding:4px}.full-screen-menu.unset-size[data-v-c7e0b9b7]{width:unset!important;height:unset!important}.full-screen-menu .mouse-sensor[data-v-c7e0b9b7]{position:absolute;bottom:0;right:0;transform:rotate(90deg);cursor:se-resize;z-index:1;background:var(--zp-primary-background);border-radius:2px}.full-screen-menu .mouse-sensor>*[data-v-c7e0b9b7]{font-size:18px;padding:4px}.full-screen-menu .action-bar[data-v-c7e0b9b7]{display:flex;align-items:center;user-select:none;gap:4px}.full-screen-menu .action-bar .icon[data-v-c7e0b9b7]{font-size:1.5em;padding:2px 4px;border-radius:4px}.full-screen-menu .action-bar .icon[data-v-c7e0b9b7]:hover{background:var(--zp-secondary-variant-background)}.full-screen-menu .action-bar>*[data-v-c7e0b9b7]{flex-wrap:wrap}.full-screen-menu.lr[data-v-c7e0b9b7]{top:var(--b7cd59ce)!important;right:0!important;bottom:0!important;left:100vw!important;height:unset!important;width:var(--0e09e1cc)!important;transition:left ease .3s}.full-screen-menu.lr.always-on[data-v-c7e0b9b7],.full-screen-menu.lr.mouse-in[data-v-c7e0b9b7]{left:var(--62228ae0)!important}.tag-alpha-item[data-v-c7e0b9b7]{display:flex;margin-top:4px}.tag-alpha-item h4[data-v-c7e0b9b7]{width:32px;flex-shrink:0}.sort-tag-switch[data-v-c7e0b9b7]{display:inline-block;padding-right:16px;padding-left:8px;cursor:pointer;user-select:none}.sort-tag-switch span[data-v-c7e0b9b7]{transition:all ease .3s;transform:scale(1.2)}.sort-tag-switch:hover span[data-v-c7e0b9b7]{transform:scale(1.3)}.lr-layout-control[data-v-c7e0b9b7]{display:flex;align-items:center;gap:16px;padding:4px 8px;flex-wrap:wrap;border-radius:2px;border-left:3px solid var(--zp-luminous);background-color:var(--zp-secondary-background)}.lr-layout-control .ctrl-item[data-v-c7e0b9b7]{display:flex;align-items:center;gap:4px;flex-wrap:nowrap}.select-actions[data-v-b04c3508]>:not(:last-child){margin-right:4px}.float-panel[data-v-b04c3508]{position:absolute;bottom:32px;right:32px;background:var(--zp-primary-background);border-radius:4px;z-index:1000;padding:8px;box-shadow:0 0 4px var(--zp-secondary)} diff --git a/vue/dist/assets/SubstrSearch-5ba855fa.js b/vue/dist/assets/SubstrSearch-5ba855fa.js deleted file mode 100644 index b5cc69f..0000000 --- a/vue/dist/assets/SubstrSearch-5ba855fa.js +++ /dev/null @@ -1 +0,0 @@ -import{c as a,A as Fe,d as Ue,c8 as Be,r as b,o as Ee,cc as te,m as He,C as Pe,az as je,z as Ge,B as Ke,E as ae,cd as Le,a1 as qe,U as f,V as U,a3 as t,a4 as e,W as d,X as o,Y as i,a2 as y,$ as k,a5 as B,co as Ne,ag as O,a6 as le,L as Je,af as We,Z as Qe,T as se,aj as Xe,cp as Ye,ah as Ze,ak as ne,ch as et,ai as tt,aP as at,aQ as lt,cq as st,cj as nt,a0 as it}from"./index-5ed9cd5a.js";import{S as ot}from"./index-20b432d5.js";/* empty css */import"./index-eec830e6.js";import{c as rt,d as dt,F as ut}from"./FileItem-2ecfe4d5.js";import{M as ct,o as pt,L as ft,R as vt,f as mt}from"./MultiSelectKeep-68ce9bb5.js";import{c as gt,u as _t}from"./hook-d4530521.js";import{f as M,H as ie,_ as ht,a as yt}from"./searchHistory-4bd924a9.js";import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-47577760.js";/* empty css */import"./_isIterateeCall-cd370691.js";import"./index-7cbf21fe.js";import"./shortcut-bf073698.js";import"./Checkbox-bbe5a1a5.js";import"./index-4e015155.js";import"./useGenInfoDiff-b31dce1f.js";var kt={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M952 474H829.8C812.5 327.6 696.4 211.5 550 194.2V72c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v122.2C327.6 211.5 211.5 327.6 194.2 474H72c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h122.2C211.5 696.4 327.6 812.5 474 829.8V952c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V829.8C696.4 812.5 812.5 696.4 829.8 550H952c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zM512 756c-134.8 0-244-109.2-244-244s109.2-244 244-244 244 109.2 244 244-109.2 244-244 244z"}},{tag:"path",attrs:{d:"M512 392c-32.1 0-62.1 12.4-84.8 35.2-22.7 22.7-35.2 52.7-35.2 84.8s12.5 62.1 35.2 84.8C449.9 619.4 480 632 512 632s62.1-12.5 84.8-35.2C619.4 574.1 632 544 632 512s-12.5-62.1-35.2-84.8A118.57 118.57 0 00512 392z"}}]},name:"aim",theme:"outlined"};const bt=kt;function oe(u){for(var c=1;c(at("data-v-e1bd92bd"),u=u(),lt(),u),xt={style:{"padding-right":"16px"}},It=H(()=>d("div",null,null,-1)),$t=["title"],At=["src"],Rt={class:"search-bar"},Ot={class:"form-name"},Mt={class:"search-bar last actions"},Tt={class:"hint"},zt={key:0,style:{margin:"64px 16px 32px",padding:"8px",background:"var(--zp-secondary-variant-background)","border-radius":"16px"}},Vt={style:{margin:"16px 32px 16px"}},Dt={style:{"padding-right":"16px"}},Ft=H(()=>d("div",null,null,-1)),Ut=H(()=>d("div",{style:{padding:"16px 0 512px"}},null,-1)),Bt={key:2,class:"preview-switch"},Et=Ue({__name:"SubstrSearch",props:{tabIdx:{},paneIdx:{},searchScope:{}},setup(u){const c=u,g=Be(),p=b(!1),_=b(""),$=b(!1),S=b(c.searchScope??""),C=b(!1),P=b(0),x=b("all"),T=gt(l=>{const s={cursor:l,regexp:p.value?_.value:"",surstr:p.value?"":_.value,path_only:$.value,folder_paths:(S.value??"").split(/,|\n/).map(r=>r.trim()).filter(r=>r),media_type:x.value};return st(s)}),{queue:w,images:v,onContextMenuClickU:j,stackViewEl:re,previewIdx:I,previewing:G,onPreviewVisibleChange:de,previewImgMove:K,canPreview:L,itemSize:q,gridItems:ue,showGenInfo:A,imageGenInfo:N,q:ce,multiSelectedIdxs:z,onFileItemClick:pe,scroller:J,showMenuIdx:V,onFileDragStart:fe,onFileDragEnd:ve,cellWidth:me,onScroll:W,saveAllFileAsJson:ge,saveLoadedFileAsJson:_e,props:he,changeIndchecked:ye,seedChangeChecked:ke,getGenDiff:be,getGenDiffWatchDep:we}=_t(T),m=b();Ee(async()=>{m.value=await te(),m.value.img_count&&m.value.expired&&await Q(),c.searchScope&&await R()}),He(()=>c,async l=>{he.value=l},{deep:!0,immediate:!0});const Q=Pe(()=>w.pushAction(async()=>(await nt(),m.value=await te(),g.tagMap.clear(),m.value)).res),X=l=>{_.value=l.substr,S.value=l.folder_paths_str,p.value=l.isRegex,x.value=l.mediaType||"all",C.value=!1,R()},R=async()=>{P.value++,M.value.add({substr:_.value,folder_paths_str:S.value,isRegex:p.value,mediaType:x.value}),await T.reset({refetch:!0}),await je(),W(),J.value.scrollToItem(0),v.value.length||Ge.info(Ke("fuzzy-search-noResults"))};ae("returnToIIB",async()=>{const l=await w.pushAction(Le).res;m.value.expired=l.expired}),ae("searchIndexExpired",()=>m.value&&(m.value.expired=!0));const Se=()=>{p.value=!p.value},Ce=qe(),{onClearAllSelected:xe,onSelectAll:Ie,onReverseSelect:$e}=rt();return(l,s)=>{const r=ht,h=yt,Ae=se,Re=Xe,D=Ye,Oe=Ze,Y=ne,Me=et,F=ne,Te=tt,ze=se,Ve=ot;return f(),U(Qe,null,[a(Ae,{visible:C.value,"onUpdate:visible":s[0]||(s[0]=n=>C.value=n),width:"70vw","mask-closable":"",onOk:s[1]||(s[1]=n=>C.value=!1)},{default:t(()=>[a(ie,{records:e(M),onReuseRecord:X},{default:t(({record:n})=>[d("div",xt,[a(h,null,{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("historyRecordsSubstr"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.substr),1)]),_:2},1024)]),_:2},1024),n.folder_paths_str?(f(),y(h,{key:0},{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("searchScope"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.folder_paths_str),1)]),_:2},1024)]),_:2},1024)):k("",!0),a(h,null,{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("historyRecordsisRegex"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.isRegex),1)]),_:2},1024)]),_:2},1024),n.mediaType?(f(),y(h,{key:1},{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("mediaType"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.mediaType),1)]),_:2},1024)]),_:2},1024)):k("",!0),a(h,null,{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("time"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.time),1)]),_:2},1024)]),_:2},1024),It])]),_:1},8,["records"])]),_:1},8,["visible"]),d("div",{class:"container",ref_key:"stackViewEl",ref:re},[a(ct,{show:!!e(z).length||e(Ce).keepMultiSelect,onClearAllSelected:e(xe),onSelectAll:e(Ie),onReverseSelect:e($e)},null,8,["show","onClearAllSelected","onSelectAll","onReverseSelect"]),d("div",{class:"search-bar",onKeydown:s[7]||(s[7]=B(()=>{},["stop"]))},[a(Re,{value:_.value,"onUpdate:value":s[2]||(s[2]=n=>_.value=n),placeholder:l.$t("fuzzy-search-placeholder")+" "+l.$t("regexSearchEnabledHint"),disabled:!e(w).isIdle,onKeydown:Ne(R,["enter"]),"allow-clear":""},null,8,["value","placeholder","disabled","onKeydown"]),a(Oe,{value:x.value,"onUpdate:value":s[3]||(s[3]=n=>x.value=n),style:{width:"100px",margin:"0 4px"},disabled:!e(w).isIdle},{default:t(()=>[a(D,{value:"all"},{default:t(()=>[o(i(l.$t("all")),1)]),_:1}),a(D,{value:"image"},{default:t(()=>[o(i(l.$t("image")),1)]),_:1}),a(D,{value:"video"},{default:t(()=>[o(i(l.$t("video")),1)]),_:1})]),_:1},8,["value","disabled"]),d("div",{class:O(["regex-icon",{selected:$.value}]),onKeydown:s[4]||(s[4]=B(()=>{},["stop"])),onClick:s[5]||(s[5]=n=>$.value=!$.value),title:l.$t("pathOnly")},[a(e(St))],42,$t),d("div",{class:O(["regex-icon",{selected:p.value}]),onKeydown:s[6]||(s[6]=B(()=>{},["stop"])),onClick:Se,title:"Use Regular Expression"},[d("img",{src:e(Ct)},null,8,At)],34),m.value&&(m.value.expired||!m.value.img_count)?(f(),y(Y,{key:0,onClick:e(Q),loading:!e(w).isIdle,type:"primary"},{default:t(()=>[o(i(m.value.img_count===0?l.$t("generateIndexHint"):l.$t("UpdateIndex")),1)]),_:1},8,["onClick","loading"])):(f(),y(Y,{key:1,type:"primary",onClick:R,loading:!e(w).isIdle||e(T).loading},{default:t(()=>[o(i(l.$t("search")),1)]),_:1},8,["loading"]))],32),d("div",Rt,[d("div",Ot,i(l.$t("searchScope")),1),a(Me,{"auto-size":{maxRows:8},value:S.value,"onUpdate:value":s[8]||(s[8]=n=>S.value=n),placeholder:l.$t("specifiedSearchFolder")},null,8,["value","placeholder"])]),d("div",Mt,[e(v).length?(f(),y(F,{key:0,onClick:e(_e)},{default:t(()=>[o(i(l.$t("saveLoadedImageAsJson")),1)]),_:1},8,["onClick"])):k("",!0),e(v).length?(f(),y(F,{key:1,onClick:e(ge)},{default:t(()=>[o(i(l.$t("saveAllAsJson")),1)]),_:1},8,["onClick"])):k("",!0),a(F,{onClick:s[9]||(s[9]=n=>C.value=!0)},{default:t(()=>[o(i(l.$t("history")),1)]),_:1})]),a(Ve,{size:"large",spinning:!e(w).isIdle},{default:t(()=>[a(ze,{visible:e(A),"onUpdate:visible":s[11]||(s[11]=n=>le(A)?A.value=n:null),width:"70vw","mask-closable":"",onOk:s[12]||(s[12]=n=>A.value=!1)},{cancelText:t(()=>[]),default:t(()=>[a(Te,{active:"",loading:!e(ce).isIdle},{default:t(()=>[d("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:s[10]||(s[10]=n=>e(Je)(e(N)))},[d("div",Tt,i(l.$t("doubleClickToCopy")),1),o(" "+i(e(N)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),P.value===0&&!e(v).length&&e(M).getRecords().length?(f(),U("div",zt,[d("h2",Vt,i(l.$t("restoreFromHistory")),1),a(ie,{records:e(M),onReuseRecord:X},{default:t(({record:n})=>[d("div",Dt,[a(h,null,{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("historyRecordsSubstr"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.substr),1)]),_:2},1024)]),_:2},1024),n.folder_paths_str?(f(),y(h,{key:0},{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("searchScope"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.folder_paths_str),1)]),_:2},1024)]),_:2},1024)):k("",!0),a(h,null,{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("historyRecordsisRegex"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.isRegex),1)]),_:2},1024)]),_:2},1024),n.mediaType?(f(),y(h,{key:1},{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("mediaType"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.mediaType),1)]),_:2},1024)]),_:2},1024)):k("",!0),a(h,null,{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("time"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.time),1)]),_:2},1024)]),_:2},1024),Ft])]),_:1},8,["records"])])):k("",!0),e(v)?(f(),y(e(dt),{key:1,ref_key:"scroller",ref:J,class:"file-list",items:e(v),"item-size":e(q).first,"key-field":"fullpath","item-secondary-size":e(q).second,gridItems:e(ue),onScroll:e(W)},{after:t(()=>[Ut]),default:t(({item:n,index:Z})=>[a(ut,{idx:Z,file:n,"show-menu-idx":e(V),"onUpdate:showMenuIdx":s[13]||(s[13]=ee=>le(V)?V.value=ee:null),onFileItemClick:e(pe),"full-screen-preview-image-url":e(v)[e(I)]?e(We)(e(v)[e(I)]):"","cell-width":e(me),selected:e(z).includes(Z),onContextMenuClick:e(j),onDragstart:e(fe),onDragend:e(ve),onTiktokView:(ee,De)=>e(pt)(e(v),De),"enable-change-indicator":e(ye),"seed-change-checked":e(ke),"get-gen-diff":e(be),"get-gen-diff-watch-dep":e(we),"is-selected-mutil-files":e(z).length>1,onPreviewVisibleChange:e(de)},null,8,["idx","file","show-menu-idx","onFileItemClick","full-screen-preview-image-url","cell-width","selected","onContextMenuClick","onDragstart","onDragend","onTiktokView","enable-change-indicator","seed-change-checked","get-gen-diff","get-gen-diff-watch-dep","is-selected-mutil-files","onPreviewVisibleChange"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"])):k("",!0),e(G)?(f(),U("div",Bt,[a(e(ft),{onClick:s[14]||(s[14]=n=>e(K)("prev")),class:O({disable:!e(L)("prev")})},null,8,["class"]),a(e(vt),{onClick:s[15]||(s[15]=n=>e(K)("next")),class:O({disable:!e(L)("next")})},null,8,["class"])])):k("",!0)]),_:1},8,["spinning"]),e(G)&&e(v)&&e(v)[e(I)]?(f(),y(mt,{key:0,file:e(v)[e(I)],idx:e(I),onContextMenuClick:e(j)},null,8,["file","idx","onContextMenuClick"])):k("",!0)],512)],64)}}});const aa=it(Et,[["__scopeId","data-v-e1bd92bd"]]);export{aa as default}; diff --git a/vue/dist/assets/SubstrSearch-8c409c5f.js b/vue/dist/assets/SubstrSearch-8c409c5f.js new file mode 100644 index 0000000..fa835b5 --- /dev/null +++ b/vue/dist/assets/SubstrSearch-8c409c5f.js @@ -0,0 +1 @@ +import{c as a,A as Fe,d as Ue,c9 as Be,r as b,o as Ee,cd as te,m as He,C as Pe,az as Ge,z as Ke,B as Le,E as ae,ce as je,a1 as qe,U as f,V as U,a3 as t,a4 as e,W as d,X as o,Y as i,a2 as y,$ as k,a5 as B,cp as Ne,ag as O,a6 as le,L as Je,af as We,Z as Qe,T as se,aj as Xe,cq as Ye,ah as Ze,ak as ne,ci as et,ai as tt,aP as at,aQ as lt,cr as st,ck as nt,a0 as it}from"./index-8b1d4076.js";import{S as ot}from"./index-2ee82e1b.js";/* empty css *//* empty css */import"./index-53d59921.js";import{c as rt,d as dt,F as ut}from"./FileItem-5c27aa5d.js";import{M as ct,o as pt,L as ft,R as vt,f as mt}from"./MultiSelectKeep-4ce030ff.js";import{c as gt,u as _t}from"./hook-3db965e4.js";import{f as M,H as ie,_ as ht,a as yt}from"./searchHistory-5b9c42df.js";import"./numInput.vue_vue_type_style_index_0_scoped_55978858_lang-26786c56.js";/* empty css */import"./index-fd0b9b75.js";import"./_isIterateeCall-4f946453.js";import"./index-404f2353.js";import"./index-133a27d3.js";import"./shortcut-d7b854eb.js";import"./Checkbox-8b8e8d31.js";import"./index-19cfb514.js";import"./useGenInfoDiff-068a10f2.js";var kt={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"defs",attrs:{},children:[{tag:"style",attrs:{}}]},{tag:"path",attrs:{d:"M952 474H829.8C812.5 327.6 696.4 211.5 550 194.2V72c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v122.2C327.6 211.5 211.5 327.6 194.2 474H72c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h122.2C211.5 696.4 327.6 812.5 474 829.8V952c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V829.8C696.4 812.5 812.5 696.4 829.8 550H952c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zM512 756c-134.8 0-244-109.2-244-244s109.2-244 244-244 244 109.2 244 244-109.2 244-244 244z"}},{tag:"path",attrs:{d:"M512 392c-32.1 0-62.1 12.4-84.8 35.2-22.7 22.7-35.2 52.7-35.2 84.8s12.5 62.1 35.2 84.8C449.9 619.4 480 632 512 632s62.1-12.5 84.8-35.2C619.4 574.1 632 544 632 512s-12.5-62.1-35.2-84.8A118.57 118.57 0 00512 392z"}}]},name:"aim",theme:"outlined"};const bt=kt;function oe(u){for(var c=1;c(at("data-v-e1bd92bd"),u=u(),lt(),u),xt={style:{"padding-right":"16px"}},It=H(()=>d("div",null,null,-1)),$t=["title"],At=["src"],Rt={class:"search-bar"},Ot={class:"form-name"},Mt={class:"search-bar last actions"},Tt={class:"hint"},zt={key:0,style:{margin:"64px 16px 32px",padding:"8px",background:"var(--zp-secondary-variant-background)","border-radius":"16px"}},Vt={style:{margin:"16px 32px 16px"}},Dt={style:{"padding-right":"16px"}},Ft=H(()=>d("div",null,null,-1)),Ut=H(()=>d("div",{style:{padding:"16px 0 512px"}},null,-1)),Bt={key:2,class:"preview-switch"},Et=Ue({__name:"SubstrSearch",props:{tabIdx:{},paneIdx:{},searchScope:{}},setup(u){const c=u,g=Be(),p=b(!1),_=b(""),$=b(!1),S=b(c.searchScope??""),C=b(!1),P=b(0),x=b("all"),T=gt(l=>{const s={cursor:l,regexp:p.value?_.value:"",surstr:p.value?"":_.value,path_only:$.value,folder_paths:(S.value??"").split(/,|\n/).map(r=>r.trim()).filter(r=>r),media_type:x.value};return st(s)}),{queue:w,images:v,onContextMenuClickU:G,stackViewEl:re,previewIdx:I,previewing:K,onPreviewVisibleChange:de,previewImgMove:L,canPreview:j,itemSize:q,gridItems:ue,showGenInfo:A,imageGenInfo:N,q:ce,multiSelectedIdxs:z,onFileItemClick:pe,scroller:J,showMenuIdx:V,onFileDragStart:fe,onFileDragEnd:ve,cellWidth:me,onScroll:W,saveAllFileAsJson:ge,saveLoadedFileAsJson:_e,props:he,changeIndchecked:ye,seedChangeChecked:ke,getGenDiff:be,getGenDiffWatchDep:we}=_t(T),m=b();Ee(async()=>{m.value=await te(),m.value.img_count&&m.value.expired&&await Q(),c.searchScope&&await R()}),He(()=>c,async l=>{he.value=l},{deep:!0,immediate:!0});const Q=Pe(()=>w.pushAction(async()=>(await nt(),m.value=await te(),g.tagMap.clear(),m.value)).res),X=l=>{_.value=l.substr,S.value=l.folder_paths_str,p.value=l.isRegex,x.value=l.mediaType||"all",C.value=!1,R()},R=async()=>{P.value++,M.value.add({substr:_.value,folder_paths_str:S.value,isRegex:p.value,mediaType:x.value}),await T.reset({refetch:!0}),await Ge(),W(),J.value.scrollToItem(0),v.value.length||Ke.info(Le("fuzzy-search-noResults"))};ae("returnToIIB",async()=>{const l=await w.pushAction(je).res;m.value.expired=l.expired}),ae("searchIndexExpired",()=>m.value&&(m.value.expired=!0));const Se=()=>{p.value=!p.value},Ce=qe(),{onClearAllSelected:xe,onSelectAll:Ie,onReverseSelect:$e}=rt();return(l,s)=>{const r=ht,h=yt,Ae=se,Re=Xe,D=Ye,Oe=Ze,Y=ne,Me=et,F=ne,Te=tt,ze=se,Ve=ot;return f(),U(Qe,null,[a(Ae,{visible:C.value,"onUpdate:visible":s[0]||(s[0]=n=>C.value=n),width:"70vw","mask-closable":"",onOk:s[1]||(s[1]=n=>C.value=!1)},{default:t(()=>[a(ie,{records:e(M),onReuseRecord:X},{default:t(({record:n})=>[d("div",xt,[a(h,null,{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("historyRecordsSubstr"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.substr),1)]),_:2},1024)]),_:2},1024),n.folder_paths_str?(f(),y(h,{key:0},{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("searchScope"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.folder_paths_str),1)]),_:2},1024)]),_:2},1024)):k("",!0),a(h,null,{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("historyRecordsisRegex"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.isRegex),1)]),_:2},1024)]),_:2},1024),n.mediaType?(f(),y(h,{key:1},{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("mediaType"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.mediaType),1)]),_:2},1024)]),_:2},1024)):k("",!0),a(h,null,{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("time"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.time),1)]),_:2},1024)]),_:2},1024),It])]),_:1},8,["records"])]),_:1},8,["visible"]),d("div",{class:"container",ref_key:"stackViewEl",ref:re},[a(ct,{show:!!e(z).length||e(Ce).keepMultiSelect,onClearAllSelected:e(xe),onSelectAll:e(Ie),onReverseSelect:e($e)},null,8,["show","onClearAllSelected","onSelectAll","onReverseSelect"]),d("div",{class:"search-bar",onKeydown:s[7]||(s[7]=B(()=>{},["stop"]))},[a(Re,{value:_.value,"onUpdate:value":s[2]||(s[2]=n=>_.value=n),placeholder:l.$t("fuzzy-search-placeholder")+" "+l.$t("regexSearchEnabledHint"),disabled:!e(w).isIdle,onKeydown:Ne(R,["enter"]),"allow-clear":""},null,8,["value","placeholder","disabled","onKeydown"]),a(Oe,{value:x.value,"onUpdate:value":s[3]||(s[3]=n=>x.value=n),style:{width:"100px",margin:"0 4px"},disabled:!e(w).isIdle},{default:t(()=>[a(D,{value:"all"},{default:t(()=>[o(i(l.$t("all")),1)]),_:1}),a(D,{value:"image"},{default:t(()=>[o(i(l.$t("image")),1)]),_:1}),a(D,{value:"video"},{default:t(()=>[o(i(l.$t("video")),1)]),_:1})]),_:1},8,["value","disabled"]),d("div",{class:O(["regex-icon",{selected:$.value}]),onKeydown:s[4]||(s[4]=B(()=>{},["stop"])),onClick:s[5]||(s[5]=n=>$.value=!$.value),title:l.$t("pathOnly")},[a(e(St))],42,$t),d("div",{class:O(["regex-icon",{selected:p.value}]),onKeydown:s[6]||(s[6]=B(()=>{},["stop"])),onClick:Se,title:"Use Regular Expression"},[d("img",{src:e(Ct)},null,8,At)],34),m.value&&(m.value.expired||!m.value.img_count)?(f(),y(Y,{key:0,onClick:e(Q),loading:!e(w).isIdle,type:"primary"},{default:t(()=>[o(i(m.value.img_count===0?l.$t("generateIndexHint"):l.$t("UpdateIndex")),1)]),_:1},8,["onClick","loading"])):(f(),y(Y,{key:1,type:"primary",onClick:R,loading:!e(w).isIdle||e(T).loading},{default:t(()=>[o(i(l.$t("search")),1)]),_:1},8,["loading"]))],32),d("div",Rt,[d("div",Ot,i(l.$t("searchScope")),1),a(Me,{"auto-size":{maxRows:8},value:S.value,"onUpdate:value":s[8]||(s[8]=n=>S.value=n),placeholder:l.$t("specifiedSearchFolder")},null,8,["value","placeholder"])]),d("div",Mt,[e(v).length?(f(),y(F,{key:0,onClick:e(_e)},{default:t(()=>[o(i(l.$t("saveLoadedImageAsJson")),1)]),_:1},8,["onClick"])):k("",!0),e(v).length?(f(),y(F,{key:1,onClick:e(ge)},{default:t(()=>[o(i(l.$t("saveAllAsJson")),1)]),_:1},8,["onClick"])):k("",!0),a(F,{onClick:s[9]||(s[9]=n=>C.value=!0)},{default:t(()=>[o(i(l.$t("history")),1)]),_:1})]),a(Ve,{size:"large",spinning:!e(w).isIdle},{default:t(()=>[a(ze,{visible:e(A),"onUpdate:visible":s[11]||(s[11]=n=>le(A)?A.value=n:null),width:"70vw","mask-closable":"",onOk:s[12]||(s[12]=n=>A.value=!1)},{cancelText:t(()=>[]),default:t(()=>[a(Te,{active:"",loading:!e(ce).isIdle},{default:t(()=>[d("div",{style:{width:"100%","word-break":"break-all","white-space":"pre-line","max-height":"70vh",overflow:"auto"},onDblclick:s[10]||(s[10]=n=>e(Je)(e(N)))},[d("div",Tt,i(l.$t("doubleClickToCopy")),1),o(" "+i(e(N)),1)],32)]),_:1},8,["loading"])]),_:1},8,["visible"]),P.value===0&&!e(v).length&&e(M).getRecords().length?(f(),U("div",zt,[d("h2",Vt,i(l.$t("restoreFromHistory")),1),a(ie,{records:e(M),onReuseRecord:X},{default:t(({record:n})=>[d("div",Dt,[a(h,null,{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("historyRecordsSubstr"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.substr),1)]),_:2},1024)]),_:2},1024),n.folder_paths_str?(f(),y(h,{key:0},{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("searchScope"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.folder_paths_str),1)]),_:2},1024)]),_:2},1024)):k("",!0),a(h,null,{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("historyRecordsisRegex"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.isRegex),1)]),_:2},1024)]),_:2},1024),n.mediaType?(f(),y(h,{key:1},{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("mediaType"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.mediaType),1)]),_:2},1024)]),_:2},1024)):k("",!0),a(h,null,{default:t(()=>[a(r,{span:4},{default:t(()=>[o(i(l.$t("time"))+":",1)]),_:1}),a(r,{span:20},{default:t(()=>[o(i(n.time),1)]),_:2},1024)]),_:2},1024),Ft])]),_:1},8,["records"])])):k("",!0),e(v)?(f(),y(e(dt),{key:1,ref_key:"scroller",ref:J,class:"file-list",items:e(v),"item-size":e(q).first,"key-field":"fullpath","item-secondary-size":e(q).second,gridItems:e(ue),onScroll:e(W)},{after:t(()=>[Ut]),default:t(({item:n,index:Z})=>[a(ut,{idx:Z,file:n,"show-menu-idx":e(V),"onUpdate:showMenuIdx":s[13]||(s[13]=ee=>le(V)?V.value=ee:null),onFileItemClick:e(pe),"full-screen-preview-image-url":e(v)[e(I)]?e(We)(e(v)[e(I)]):"","cell-width":e(me),selected:e(z).includes(Z),onContextMenuClick:e(G),onDragstart:e(fe),onDragend:e(ve),onTiktokView:(ee,De)=>e(pt)(e(v),De),"enable-change-indicator":e(ye),"seed-change-checked":e(ke),"get-gen-diff":e(be),"get-gen-diff-watch-dep":e(we),"is-selected-mutil-files":e(z).length>1,onPreviewVisibleChange:e(de)},null,8,["idx","file","show-menu-idx","onFileItemClick","full-screen-preview-image-url","cell-width","selected","onContextMenuClick","onDragstart","onDragend","onTiktokView","enable-change-indicator","seed-change-checked","get-gen-diff","get-gen-diff-watch-dep","is-selected-mutil-files","onPreviewVisibleChange"])]),_:1},8,["items","item-size","item-secondary-size","gridItems","onScroll"])):k("",!0),e(K)?(f(),U("div",Bt,[a(e(ft),{onClick:s[14]||(s[14]=n=>e(L)("prev")),class:O({disable:!e(j)("prev")})},null,8,["class"]),a(e(vt),{onClick:s[15]||(s[15]=n=>e(L)("next")),class:O({disable:!e(j)("next")})},null,8,["class"])])):k("",!0)]),_:1},8,["spinning"]),e(K)&&e(v)&&e(v)[e(I)]?(f(),y(mt,{key:0,file:e(v)[e(I)],idx:e(I),onContextMenuClick:e(G)},null,8,["file","idx","onContextMenuClick"])):k("",!0)],512)],64)}}});const na=it(Et,[["__scopeId","data-v-e1bd92bd"]]);export{na as default}; diff --git a/vue/dist/assets/TagSearch-83d6f07d.js b/vue/dist/assets/TagSearch-e890b1cd.js similarity index 65% rename from vue/dist/assets/TagSearch-83d6f07d.js rename to vue/dist/assets/TagSearch-e890b1cd.js index 4a52827..3cc58eb 100644 --- a/vue/dist/assets/TagSearch-83d6f07d.js +++ b/vue/dist/assets/TagSearch-e890b1cd.js @@ -1,4 +1,4 @@ -import{P as Ze,ay as Xi,d as se,bC as Lo,b9 as Ji,r as W,bF as Zi,m as Qe,u as Do,G as J,an as yn,h as he,c as P,a as Gt,bG as Qi,b as el,f as tl,bH as nl,ap as ha,bI as rl,b0 as al,i as ol,bh as il,bJ as ll,at as en,au as mn,as as sl,A as ul,b3 as cl,b1 as dl,bK as pr,b2 as fl,bL as pl,bM as No,bx as vl,bN as Vo,bO as hl,bP as gl,bQ as yl,bR as ml,bS as bl,bv as Cl,bT as ga,bU as Fo,bV as _l,bW as xl,bX as wl,am as Te,bY as jt,az as Ko,bZ as fe,b_ as Sl,J as $r,av as Wo,b$ as kl,c0 as We,o as zo,U as A,V as L,W as S,ag as le,a7 as ce,Z as $e,a8 as lt,$ as K,c1 as Al,X as ae,Y as z,ax as Ol,c2 as $l,c3 as El,c4 as ne,a2 as G,a3 as q,c5 as ya,c6 as ma,aG as vr,c7 as Rl,aP as dt,aQ as ft,c8 as Uo,a5 as bn,a4 as xe,c9 as Tl,ca as Ml,a0 as Go,a1 as Pl,cb as Il,n as jl,y as Hl,R as Bl,cc as ba,t as Ll,E as Ca,C as Dl,cd as Nl,ac as Un,aM as Vl,ce as Fl,z as _a,B as Gn,T as xa,cf as Kl,cg as Wl,ak as wa,ch as zl,aj as Ul,ci as Gl,cj as ql}from"./index-5ed9cd5a.js";import{S as Yl}from"./index-20b432d5.js";/* empty css */import"./index-eec830e6.js";import{t as Sa,_ as Xl,a as Jl,H as Zl}from"./searchHistory-4bd924a9.js";import{b as Ql,i as es}from"./isArrayLikeObject-4bd49127.js";import{i as ts}from"./_isIterateeCall-cd370691.js";var ns=function(){return{prefixCls:String,activeKey:{type:[Array,Number,String]},defaultActiveKey:{type:[Array,Number,String]},accordion:{type:Boolean,default:void 0},destroyInactivePanel:{type:Boolean,default:void 0},bordered:{type:Boolean,default:void 0},expandIcon:Function,openAnimation:Ze.object,expandIconPosition:Ze.oneOf(Xi("left","right")),collapsible:{type:String},ghost:{type:Boolean,default:void 0},onChange:Function,"onUpdate:activeKey":Function}},qo=function(){return{openAnimation:Ze.object,prefixCls:String,header:Ze.any,headerClass:String,showArrow:{type:Boolean,default:void 0},isActive:{type:Boolean,default:void 0},destroyInactivePanel:{type:Boolean,default:void 0},disabled:{type:Boolean,default:void 0},accordion:{type:Boolean,default:void 0},forceRender:{type:Boolean,default:void 0},expandIcon:Function,extra:Ze.any,panelKey:Ze.oneOfType([Ze.string,Ze.number]),collapsible:{type:String},role:String,onItemClick:{type:Function}}};function ka(e){var t=e;if(!Array.isArray(t)){var n=el(t);t=n==="number"||n==="string"?[t]:[]}return t.map(function(r){return String(r)})}const qt=se({compatConfig:{MODE:3},name:"ACollapse",inheritAttrs:!1,props:Lo(ns(),{accordion:!1,destroyInactivePanel:!1,bordered:!0,openAnimation:Ji("ant-motion-collapse",!1),expandIconPosition:"left"}),slots:["expandIcon"],setup:function(t,n){var r=n.attrs,a=n.slots,o=n.emit,s=W(ka(Zi([t.activeKey,t.defaultActiveKey])));Qe(function(){return t.activeKey},function(){s.value=ka(t.activeKey)},{deep:!0});var i=Do("collapse",t),l=i.prefixCls,c=i.direction,u=J(function(){var g=t.expandIconPosition;return g!==void 0?g:c.value==="rtl"?"right":"left"}),d=function(p){var C=t.expandIcon,_=C===void 0?a.expandIcon:C,w=_?_(p):P(rl,{rotate:p.isActive?90:void 0},null);return P("div",null,[al(Array.isArray(_)?w[0]:w)?ha(w,{class:"".concat(l.value,"-arrow")},!1):w])},v=function(p){t.activeKey===void 0&&(s.value=p);var C=t.accordion?p[0]:p;o("update:activeKey",C),o("change",C)},f=function(p){var C=s.value;if(t.accordion)C=C[0]===p?[]:[p];else{C=ol(C);var _=C.indexOf(p),w=_>-1;w?C.splice(_,1):C.push(p)}v(C)},m=function(p,C){var _,w,$;if(!nl(p)){var O=s.value,M=t.accordion,D=t.destroyInactivePanel,j=t.collapsible,F=t.openAnimation,b=String((_=p.key)!==null&&_!==void 0?_:C),R=p.props||{},T=R.header,H=T===void 0?(w=p.children)===null||w===void 0||($=w.header)===null||$===void 0?void 0:$.call(w):T,N=R.headerClass,U=R.collapsible,h=R.disabled,x=!1;M?x=O[0]===b:x=O.indexOf(b)>-1;var E=U??j;(h||h==="")&&(E="disabled");var V={key:b,panelKey:b,header:H,headerClass:N,isActive:x,prefixCls:l.value,destroyInactivePanel:D,openAnimation:F,accordion:M,onItemClick:E==="disabled"?null:f,expandIcon:d,collapsible:E};return ha(p,V)}},y=function(){var p;return tl((p=a.default)===null||p===void 0?void 0:p.call(a)).map(m)};return function(){var g,p=t.accordion,C=t.bordered,_=t.ghost,w=yn((g={},he(g,l.value,!0),he(g,"".concat(l.value,"-borderless"),!C),he(g,"".concat(l.value,"-icon-position-").concat(u.value),!0),he(g,"".concat(l.value,"-rtl"),c.value==="rtl"),he(g,"".concat(l.value,"-ghost"),!!_),he(g,r.class,!!r.class),g));return P("div",Gt(Gt({class:w},Qi(r)),{},{style:r.style,role:p?"tablist":null}),[y()])}}}),rs=se({compatConfig:{MODE:3},name:"PanelContent",props:qo(),setup:function(t,n){var r=n.slots,a=W(!1);return il(function(){(t.isActive||t.forceRender)&&(a.value=!0)}),function(){var o,s;if(!a.value)return null;var i=t.prefixCls,l=t.isActive,c=t.role;return P("div",{ref:W,class:yn("".concat(i,"-content"),(o={},he(o,"".concat(i,"-content-active"),l),he(o,"".concat(i,"-content-inactive"),!l),o)),role:c},[P("div",{class:"".concat(i,"-content-box")},[(s=r.default)===null||s===void 0?void 0:s.call(r)])])}}}),Cn=se({compatConfig:{MODE:3},name:"ACollapsePanel",inheritAttrs:!1,props:Lo(qo(),{showArrow:!0,isActive:!1,onItemClick:function(){},headerClass:"",forceRender:!1}),slots:["expandIcon","extra","header"],setup:function(t,n){var r=n.slots,a=n.emit,o=n.attrs;ll(t.disabled===void 0,"Collapse.Panel",'`disabled` is deprecated. Please use `collapsible="disabled"` instead.');var s=Do("collapse",t),i=s.prefixCls,l=function(){a("itemClick",t.panelKey)},c=function(d){(d.key==="Enter"||d.keyCode===13||d.which===13)&&l()};return function(){var u,d,v,f,m=t.header,y=m===void 0?(u=r.header)===null||u===void 0?void 0:u.call(r):m,g=t.headerClass,p=t.isActive,C=t.showArrow,_=t.destroyInactivePanel,w=t.accordion,$=t.forceRender,O=t.openAnimation,M=t.expandIcon,D=M===void 0?r.expandIcon:M,j=t.extra,F=j===void 0?(d=r.extra)===null||d===void 0?void 0:d.call(r):j,b=t.collapsible,R=b==="disabled",T=i.value,H=yn("".concat(T,"-header"),(v={},he(v,g,g),he(v,"".concat(T,"-header-collapsible-only"),b==="header"),v)),N=yn((f={},he(f,"".concat(T,"-item"),!0),he(f,"".concat(T,"-item-active"),p),he(f,"".concat(T,"-item-disabled"),R),he(f,"".concat(T,"-no-arrow"),!C),he(f,"".concat(o.class),!!o.class),f)),U=P("i",{class:"arrow"},null);C&&typeof D=="function"&&(U=D(t));var h=en(P(rs,{prefixCls:T,isActive:p,forceRender:$,role:w?"tabpanel":null},{default:r.default}),[[mn,p]]),x=Gt({appear:!1,css:!1},O);return P("div",Gt(Gt({},o),{},{class:N}),[P("div",{class:H,onClick:function(){return b!=="header"&&l()},role:w?"tab":"button",tabindex:R?-1:0,"aria-expanded":p,onKeypress:c},[C&&U,b==="header"?P("span",{onClick:l,class:"".concat(T,"-header-text")},[y]):y,F&&P("div",{class:"".concat(T,"-extra")},[F])]),P(sl,x,{default:function(){return[!_||p?h:null]}})])}}});qt.Panel=Cn;qt.install=function(e){return e.component(qt.name,qt),e.component(Cn.name,Cn),e};var as={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M869 487.8L491.2 159.9c-2.9-2.5-6.6-3.9-10.5-3.9h-88.5c-7.4 0-10.8 9.2-5.2 14l350.2 304H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h585.1L386.9 854c-5.6 4.9-2.2 14 5.2 14h91.5c1.9 0 3.8-.7 5.2-2L869 536.2a32.07 32.07 0 000-48.4z"}}]},name:"arrow-right",theme:"outlined"};const os=as;function Aa(e){for(var t=1;t1?n[a-1]:void 0,s=a>2?n[2]:void 0;for(o=e.length>3&&typeof o=="function"?(a--,o):void 0,s&&ts(n[0],n[1],s)&&(o=a<3?void 0:o,a=1),t=Object(t);++r=0,o=!n&&a&&(t==="hex"||t==="hex6"||t==="hex3"||t==="hex4"||t==="hex8"||t==="name");return o?t==="name"&&this._a===0?this.toName():this.toRgbString():(t==="rgb"&&(r=this.toRgbString()),t==="prgb"&&(r=this.toPercentageRgbString()),(t==="hex"||t==="hex6")&&(r=this.toHexString()),t==="hex3"&&(r=this.toHexString(!0)),t==="hex4"&&(r=this.toHex8String(!0)),t==="hex8"&&(r=this.toHex8String()),t==="name"&&(r=this.toName()),t==="hsl"&&(r=this.toHslString()),t==="hsv"&&(r=this.toHsvString()),r||this.toHexString())},clone:function(){return k(this.toString())},_applyModification:function(t,n){var r=t.apply(null,[this].concat([].slice.call(n)));return this._r=r._r,this._g=r._g,this._b=r._b,this.setAlpha(r._a),this},lighten:function(){return this._applyModification(js,arguments)},brighten:function(){return this._applyModification(Hs,arguments)},darken:function(){return this._applyModification(Bs,arguments)},desaturate:function(){return this._applyModification(Ms,arguments)},saturate:function(){return this._applyModification(Ps,arguments)},greyscale:function(){return this._applyModification(Is,arguments)},spin:function(){return this._applyModification(Ls,arguments)},_applyCombination:function(t,n){return t.apply(null,[this].concat([].slice.call(n)))},analogous:function(){return this._applyCombination(Vs,arguments)},complement:function(){return this._applyCombination(Ds,arguments)},monochromatic:function(){return this._applyCombination(Fs,arguments)},splitcomplement:function(){return this._applyCombination(Ns,arguments)},triad:function(){return this._applyCombination(Ta,[3])},tetrad:function(){return this._applyCombination(Ta,[4])}};k.fromRatio=function(e,t){if(_n(e)=="object"){var n={};for(var r in e)e.hasOwnProperty(r)&&(r==="a"?n[r]=e[r]:n[r]=zt(e[r]));e=n}return k(e,t)};function Os(e){var t={r:0,g:0,b:0},n=1,r=null,a=null,o=null,s=!1,i=!1;return typeof e=="string"&&(e=Gs(e)),_n(e)=="object"&&(Fe(e.r)&&Fe(e.g)&&Fe(e.b)?(t=$s(e.r,e.g,e.b),s=!0,i=String(e.r).substr(-1)==="%"?"prgb":"rgb"):Fe(e.h)&&Fe(e.s)&&Fe(e.v)?(r=zt(e.s),a=zt(e.v),t=Rs(e.h,r,a),s=!0,i="hsv"):Fe(e.h)&&Fe(e.s)&&Fe(e.l)&&(r=zt(e.s),o=zt(e.l),t=Es(e.h,r,o),s=!0,i="hsl"),e.hasOwnProperty("a")&&(n=e.a)),n=Jo(n),{ok:s,format:e.format||i,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}function $s(e,t,n){return{r:X(e,255)*255,g:X(t,255)*255,b:X(n,255)*255}}function Oa(e,t,n){e=X(e,255),t=X(t,255),n=X(n,255);var r=Math.max(e,t,n),a=Math.min(e,t,n),o,s,i=(r+a)/2;if(r==a)o=s=0;else{var l=r-a;switch(s=i>.5?l/(2-r-a):l/(r+a),r){case e:o=(t-n)/l+(t1&&(d-=1),d<1/6?c+(u-c)*6*d:d<1/2?u:d<2/3?c+(u-c)*(2/3-d)*6:c}if(t===0)r=a=o=n;else{var i=n<.5?n*(1+t):n+t-n*t,l=2*n-i;r=s(l,i,e+1/3),a=s(l,i,e),o=s(l,i,e-1/3)}return{r:r*255,g:a*255,b:o*255}}function $a(e,t,n){e=X(e,255),t=X(t,255),n=X(n,255);var r=Math.max(e,t,n),a=Math.min(e,t,n),o,s,i=r,l=r-a;if(s=r===0?0:l/r,r==a)o=0;else{switch(r){case e:o=(t-n)/l+(t>1)+720)%360;--t;)r.h=(r.h+a)%360,o.push(k(r));return o}function Fs(e,t){t=t||6;for(var n=k(e).toHsv(),r=n.h,a=n.s,o=n.v,s=[],i=1/t;t--;)s.push(k({h:r,s:a,v:o})),o=(o+i)%1;return s}k.mix=function(e,t,n){n=n===0?0:n||50;var r=k(e).toRgb(),a=k(t).toRgb(),o=n/100,s={r:(a.r-r.r)*o+r.r,g:(a.g-r.g)*o+r.g,b:(a.b-r.b)*o+r.b,a:(a.a-r.a)*o+r.a};return k(s)};k.readability=function(e,t){var n=k(e),r=k(t);return(Math.max(n.getLuminance(),r.getLuminance())+.05)/(Math.min(n.getLuminance(),r.getLuminance())+.05)};k.isReadable=function(e,t,n){var r=k.readability(e,t),a,o;switch(o=!1,a=qs(n),a.level+a.size){case"AAsmall":case"AAAlarge":o=r>=4.5;break;case"AAlarge":o=r>=3;break;case"AAAsmall":o=r>=7;break}return o};k.mostReadable=function(e,t,n){var r=null,a=0,o,s,i,l;n=n||{},s=n.includeFallbackColors,i=n.level,l=n.size;for(var c=0;ca&&(a=o,r=k(t[c]));return k.isReadable(e,r,{level:i,size:l})||!s?r:(n.includeFallbackColors=!1,k.mostReadable(e,["#fff","#000"],n))};var yr=k.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},Ks=k.hexNames=Ws(yr);function Ws(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[e[n]]=n);return t}function Jo(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function X(e,t){zs(e)&&(e="100%");var n=Us(e);return e=Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(e*t,10)/100),Math.abs(e-t)<1e-6?1:e%t/parseFloat(t)}function jn(e){return Math.min(1,Math.max(0,e))}function _e(e){return parseInt(e,16)}function zs(e){return typeof e=="string"&&e.indexOf(".")!=-1&&parseFloat(e)===1}function Us(e){return typeof e=="string"&&e.indexOf("%")!=-1}function He(e){return e.length==1?"0"+e:""+e}function zt(e){return e<=1&&(e=e*100+"%"),e}function Zo(e){return Math.round(parseFloat(e)*255).toString(16)}function Ma(e){return _e(e)/255}var je=function(){var e="[-\\+]?\\d+%?",t="[-\\+]?\\d*\\.\\d+%?",n="(?:"+t+")|(?:"+e+")",r="[\\s|\\(]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")\\s*\\)?",a="[\\s|\\(]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")\\s*\\)?";return{CSS_UNIT:new RegExp(n),rgb:new RegExp("rgb"+r),rgba:new RegExp("rgba"+a),hsl:new RegExp("hsl"+r),hsla:new RegExp("hsla"+a),hsv:new RegExp("hsv"+r),hsva:new RegExp("hsva"+a),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}}();function Fe(e){return!!je.CSS_UNIT.exec(e)}function Gs(e){e=e.replace(ks,"").replace(As,"").toLowerCase();var t=!1;if(yr[e])e=yr[e],t=!0;else if(e=="transparent")return{r:0,g:0,b:0,a:0,format:"name"};var n;return(n=je.rgb.exec(e))?{r:n[1],g:n[2],b:n[3]}:(n=je.rgba.exec(e))?{r:n[1],g:n[2],b:n[3],a:n[4]}:(n=je.hsl.exec(e))?{h:n[1],s:n[2],l:n[3]}:(n=je.hsla.exec(e))?{h:n[1],s:n[2],l:n[3],a:n[4]}:(n=je.hsv.exec(e))?{h:n[1],s:n[2],v:n[3]}:(n=je.hsva.exec(e))?{h:n[1],s:n[2],v:n[3],a:n[4]}:(n=je.hex8.exec(e))?{r:_e(n[1]),g:_e(n[2]),b:_e(n[3]),a:Ma(n[4]),format:t?"name":"hex8"}:(n=je.hex6.exec(e))?{r:_e(n[1]),g:_e(n[2]),b:_e(n[3]),format:t?"name":"hex"}:(n=je.hex4.exec(e))?{r:_e(n[1]+""+n[1]),g:_e(n[2]+""+n[2]),b:_e(n[3]+""+n[3]),a:Ma(n[4]+""+n[4]),format:t?"name":"hex8"}:(n=je.hex3.exec(e))?{r:_e(n[1]+""+n[1]),g:_e(n[2]+""+n[2]),b:_e(n[3]+""+n[3]),format:t?"name":"hex"}:!1}function qs(e){var t,n;return e=e||{level:"AA",size:"small"},t=(e.level||"AA").toUpperCase(),n=(e.size||"small").toLowerCase(),t!=="AA"&&t!=="AAA"&&(t="AA"),n!=="small"&&n!=="large"&&(n="small"),{level:t,size:n}}var pt=pt||{};pt.stringify=function(){var e={"visit_linear-gradient":function(t){return e.visit_gradient(t)},"visit_repeating-linear-gradient":function(t){return e.visit_gradient(t)},"visit_radial-gradient":function(t){return e.visit_gradient(t)},"visit_repeating-radial-gradient":function(t){return e.visit_gradient(t)},visit_gradient:function(t){var n=e.visit(t.orientation);return n&&(n+=", "),t.type+"("+n+e.visit(t.colorStops)+")"},visit_shape:function(t){var n=t.value,r=e.visit(t.at),a=e.visit(t.style);return a&&(n+=" "+a),r&&(n+=" at "+r),n},"visit_default-radial":function(t){var n="",r=e.visit(t.at);return r&&(n+=r),n},"visit_extent-keyword":function(t){var n=t.value,r=e.visit(t.at);return r&&(n+=" at "+r),n},"visit_position-keyword":function(t){return t.value},visit_position:function(t){return e.visit(t.value.x)+" "+e.visit(t.value.y)},"visit_%":function(t){return t.value+"%"},visit_em:function(t){return t.value+"em"},visit_px:function(t){return t.value+"px"},visit_literal:function(t){return e.visit_color(t.value,t)},visit_hex:function(t){return e.visit_color("#"+t.value,t)},visit_rgb:function(t){return e.visit_color("rgb("+t.value.join(", ")+")",t)},visit_rgba:function(t){return e.visit_color("rgba("+t.value.join(", ")+")",t)},visit_color:function(t,n){var r=t,a=e.visit(n.length);return a&&(r+=" "+a),r},visit_angular:function(t){return t.value+"deg"},visit_directional:function(t){return"to "+t.value},visit_array:function(t){var n="",r=t.length;return t.forEach(function(a,o){n+=e.visit(a),o0&&n("Invalid input not EOF"),h}function a(){return _(o)}function o(){return s("linear-gradient",e.linearGradient,l)||s("repeating-linear-gradient",e.repeatingLinearGradient,l)||s("radial-gradient",e.radialGradient,d)||s("repeating-radial-gradient",e.repeatingRadialGradient,d)}function s(h,x,E){return i(x,function(V){var ue=E();return ue&&(N(e.comma)||n("Missing comma before color stops")),{type:h,orientation:ue,colorStops:_(w)}})}function i(h,x){var E=N(h);if(E){N(e.startCall)||n("Missing (");var V=x(E);return N(e.endCall)||n("Missing )"),V}}function l(){return c()||u()}function c(){return H("directional",e.sideOrCorner,1)}function u(){return H("angular",e.angleValue,1)}function d(){var h,x=v(),E;return x&&(h=[],h.push(x),E=t,N(e.comma)&&(x=v(),x?h.push(x):t=E)),h}function v(){var h=f()||m();if(h)h.at=g();else{var x=y();if(x){h=x;var E=g();E&&(h.at=E)}else{var V=p();V&&(h={type:"default-radial",at:V})}}return h}function f(){var h=H("shape",/^(circle)/i,0);return h&&(h.style=T()||y()),h}function m(){var h=H("shape",/^(ellipse)/i,0);return h&&(h.style=b()||y()),h}function y(){return H("extent-keyword",e.extentKeywords,1)}function g(){if(H("position",/^at/,0)){var h=p();return h||n("Missing positioning value"),h}}function p(){var h=C();if(h.x||h.y)return{type:"position",value:h}}function C(){return{x:b(),y:b()}}function _(h){var x=h(),E=[];if(x)for(E.push(x);N(e.comma);)x=h(),x?E.push(x):n("One extra comma");return E}function w(){var h=$();return h||n("Expected color definition"),h.length=b(),h}function $(){return M()||j()||D()||O()}function O(){return H("literal",e.literalColor,0)}function M(){return H("hex",e.hexColor,1)}function D(){return i(e.rgbColor,function(){return{type:"rgb",value:_(F)}})}function j(){return i(e.rgbaColor,function(){return{type:"rgba",value:_(F)}})}function F(){return N(e.number)[1]}function b(){return H("%",e.percentageValue,1)||R()||T()}function R(){return H("position-keyword",e.positionKeywords,1)}function T(){return H("px",e.pixelValue,1)||H("em",e.emValue,1)}function H(h,x,E){var V=N(x);if(V)return{type:h,value:V[E]}}function N(h){var x,E;return E=/^[\n\r\t\s]+/.exec(t),E&&U(E[0].length),x=h.exec(t),x&&U(x[0].length),x}function U(h){t=t.substr(h)}return function(h){return t=h.toString(),r()}}();var Ys=pt.parse,Xs=pt.stringify,me="top",Me="bottom",Pe="right",be="left",Rr="auto",on=[me,Me,Pe,be],kt="start",tn="end",Js="clippingParents",Qo="viewport",Vt="popper",Zs="reference",Pa=on.reduce(function(e,t){return e.concat([t+"-"+kt,t+"-"+tn])},[]),ei=[].concat(on,[Rr]).reduce(function(e,t){return e.concat([t,t+"-"+kt,t+"-"+tn])},[]),Qs="beforeRead",eu="read",tu="afterRead",nu="beforeMain",ru="main",au="afterMain",ou="beforeWrite",iu="write",lu="afterWrite",su=[Qs,eu,tu,nu,ru,au,ou,iu,lu];function Ne(e){return e?(e.nodeName||"").toLowerCase():null}function Se(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function st(e){var t=Se(e).Element;return e instanceof t||e instanceof Element}function Ee(e){var t=Se(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function Tr(e){if(typeof ShadowRoot>"u")return!1;var t=Se(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}function uu(e){var t=e.state;Object.keys(t.elements).forEach(function(n){var r=t.styles[n]||{},a=t.attributes[n]||{},o=t.elements[n];!Ee(o)||!Ne(o)||(Object.assign(o.style,r),Object.keys(a).forEach(function(s){var i=a[s];i===!1?o.removeAttribute(s):o.setAttribute(s,i===!0?"":i)}))})}function cu(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(r){var a=t.elements[r],o=t.attributes[r]||{},s=Object.keys(t.styles.hasOwnProperty(r)?t.styles[r]:n[r]),i=s.reduce(function(l,c){return l[c]="",l},{});!Ee(a)||!Ne(a)||(Object.assign(a.style,i),Object.keys(o).forEach(function(l){a.removeAttribute(l)}))})}}const du={name:"applyStyles",enabled:!0,phase:"write",fn:uu,effect:cu,requires:["computeStyles"]};function Le(e){return e.split("-")[0]}var it=Math.max,xn=Math.min,At=Math.round;function mr(){var e=navigator.userAgentData;return e!=null&&e.brands&&Array.isArray(e.brands)?e.brands.map(function(t){return t.brand+"/"+t.version}).join(" "):navigator.userAgent}function ti(){return!/^((?!chrome|android).)*safari/i.test(mr())}function Ot(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!1);var r=e.getBoundingClientRect(),a=1,o=1;t&&Ee(e)&&(a=e.offsetWidth>0&&At(r.width)/e.offsetWidth||1,o=e.offsetHeight>0&&At(r.height)/e.offsetHeight||1);var s=st(e)?Se(e):window,i=s.visualViewport,l=!ti()&&n,c=(r.left+(l&&i?i.offsetLeft:0))/a,u=(r.top+(l&&i?i.offsetTop:0))/o,d=r.width/a,v=r.height/o;return{width:d,height:v,top:u,right:c+d,bottom:u+v,left:c,x:c,y:u}}function Mr(e){var t=Ot(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function ni(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&Tr(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function Ue(e){return Se(e).getComputedStyle(e)}function fu(e){return["table","td","th"].indexOf(Ne(e))>=0}function rt(e){return((st(e)?e.ownerDocument:e.document)||window.document).documentElement}function Hn(e){return Ne(e)==="html"?e:e.assignedSlot||e.parentNode||(Tr(e)?e.host:null)||rt(e)}function Ia(e){return!Ee(e)||Ue(e).position==="fixed"?null:e.offsetParent}function pu(e){var t=/firefox/i.test(mr()),n=/Trident/i.test(mr());if(n&&Ee(e)){var r=Ue(e);if(r.position==="fixed")return null}var a=Hn(e);for(Tr(a)&&(a=a.host);Ee(a)&&["html","body"].indexOf(Ne(a))<0;){var o=Ue(a);if(o.transform!=="none"||o.perspective!=="none"||o.contain==="paint"||["transform","perspective"].indexOf(o.willChange)!==-1||t&&o.willChange==="filter"||t&&o.filter&&o.filter!=="none")return a;a=a.parentNode}return null}function ln(e){for(var t=Se(e),n=Ia(e);n&&fu(n)&&Ue(n).position==="static";)n=Ia(n);return n&&(Ne(n)==="html"||Ne(n)==="body"&&Ue(n).position==="static")?t:n||pu(e)||t}function Pr(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function Yt(e,t,n){return it(e,xn(t,n))}function vu(e,t,n){var r=Yt(e,t,n);return r>n?n:r}function ri(){return{top:0,right:0,bottom:0,left:0}}function ai(e){return Object.assign({},ri(),e)}function oi(e,t){return t.reduce(function(n,r){return n[r]=e,n},{})}var hu=function(t,n){return t=typeof t=="function"?t(Object.assign({},n.rects,{placement:n.placement})):t,ai(typeof t!="number"?t:oi(t,on))};function gu(e){var t,n=e.state,r=e.name,a=e.options,o=n.elements.arrow,s=n.modifiersData.popperOffsets,i=Le(n.placement),l=Pr(i),c=[be,Pe].indexOf(i)>=0,u=c?"height":"width";if(!(!o||!s)){var d=hu(a.padding,n),v=Mr(o),f=l==="y"?me:be,m=l==="y"?Me:Pe,y=n.rects.reference[u]+n.rects.reference[l]-s[l]-n.rects.popper[u],g=s[l]-n.rects.reference[l],p=ln(o),C=p?l==="y"?p.clientHeight||0:p.clientWidth||0:0,_=y/2-g/2,w=d[f],$=C-v[u]-d[m],O=C/2-v[u]/2+_,M=Yt(w,O,$),D=l;n.modifiersData[r]=(t={},t[D]=M,t.centerOffset=M-O,t)}}function yu(e){var t=e.state,n=e.options,r=n.element,a=r===void 0?"[data-popper-arrow]":r;a!=null&&(typeof a=="string"&&(a=t.elements.popper.querySelector(a),!a)||ni(t.elements.popper,a)&&(t.elements.arrow=a))}const mu={name:"arrow",enabled:!0,phase:"main",fn:gu,effect:yu,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function $t(e){return e.split("-")[1]}var bu={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Cu(e,t){var n=e.x,r=e.y,a=t.devicePixelRatio||1;return{x:At(n*a)/a||0,y:At(r*a)/a||0}}function ja(e){var t,n=e.popper,r=e.popperRect,a=e.placement,o=e.variation,s=e.offsets,i=e.position,l=e.gpuAcceleration,c=e.adaptive,u=e.roundOffsets,d=e.isFixed,v=s.x,f=v===void 0?0:v,m=s.y,y=m===void 0?0:m,g=typeof u=="function"?u({x:f,y}):{x:f,y};f=g.x,y=g.y;var p=s.hasOwnProperty("x"),C=s.hasOwnProperty("y"),_=be,w=me,$=window;if(c){var O=ln(n),M="clientHeight",D="clientWidth";if(O===Se(n)&&(O=rt(n),Ue(O).position!=="static"&&i==="absolute"&&(M="scrollHeight",D="scrollWidth")),O=O,a===me||(a===be||a===Pe)&&o===tn){w=Me;var j=d&&O===$&&$.visualViewport?$.visualViewport.height:O[M];y-=j-r.height,y*=l?1:-1}if(a===be||(a===me||a===Me)&&o===tn){_=Pe;var F=d&&O===$&&$.visualViewport?$.visualViewport.width:O[D];f-=F-r.width,f*=l?1:-1}}var b=Object.assign({position:i},c&&bu),R=u===!0?Cu({x:f,y},Se(n)):{x:f,y};if(f=R.x,y=R.y,l){var T;return Object.assign({},b,(T={},T[w]=C?"0":"",T[_]=p?"0":"",T.transform=($.devicePixelRatio||1)<=1?"translate("+f+"px, "+y+"px)":"translate3d("+f+"px, "+y+"px, 0)",T))}return Object.assign({},b,(t={},t[w]=C?y+"px":"",t[_]=p?f+"px":"",t.transform="",t))}function _u(e){var t=e.state,n=e.options,r=n.gpuAcceleration,a=r===void 0?!0:r,o=n.adaptive,s=o===void 0?!0:o,i=n.roundOffsets,l=i===void 0?!0:i,c={placement:Le(t.placement),variation:$t(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:a,isFixed:t.options.strategy==="fixed"};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,ja(Object.assign({},c,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:s,roundOffsets:l})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,ja(Object.assign({},c,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}const xu={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:_u,data:{}};var dn={passive:!0};function wu(e){var t=e.state,n=e.instance,r=e.options,a=r.scroll,o=a===void 0?!0:a,s=r.resize,i=s===void 0?!0:s,l=Se(t.elements.popper),c=[].concat(t.scrollParents.reference,t.scrollParents.popper);return o&&c.forEach(function(u){u.addEventListener("scroll",n.update,dn)}),i&&l.addEventListener("resize",n.update,dn),function(){o&&c.forEach(function(u){u.removeEventListener("scroll",n.update,dn)}),i&&l.removeEventListener("resize",n.update,dn)}}const Su={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:wu,data:{}};var ku={left:"right",right:"left",bottom:"top",top:"bottom"};function hn(e){return e.replace(/left|right|bottom|top/g,function(t){return ku[t]})}var Au={start:"end",end:"start"};function Ha(e){return e.replace(/start|end/g,function(t){return Au[t]})}function Ir(e){var t=Se(e),n=t.pageXOffset,r=t.pageYOffset;return{scrollLeft:n,scrollTop:r}}function jr(e){return Ot(rt(e)).left+Ir(e).scrollLeft}function Ou(e,t){var n=Se(e),r=rt(e),a=n.visualViewport,o=r.clientWidth,s=r.clientHeight,i=0,l=0;if(a){o=a.width,s=a.height;var c=ti();(c||!c&&t==="fixed")&&(i=a.offsetLeft,l=a.offsetTop)}return{width:o,height:s,x:i+jr(e),y:l}}function $u(e){var t,n=rt(e),r=Ir(e),a=(t=e.ownerDocument)==null?void 0:t.body,o=it(n.scrollWidth,n.clientWidth,a?a.scrollWidth:0,a?a.clientWidth:0),s=it(n.scrollHeight,n.clientHeight,a?a.scrollHeight:0,a?a.clientHeight:0),i=-r.scrollLeft+jr(e),l=-r.scrollTop;return Ue(a||n).direction==="rtl"&&(i+=it(n.clientWidth,a?a.clientWidth:0)-o),{width:o,height:s,x:i,y:l}}function Hr(e){var t=Ue(e),n=t.overflow,r=t.overflowX,a=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+a+r)}function ii(e){return["html","body","#document"].indexOf(Ne(e))>=0?e.ownerDocument.body:Ee(e)&&Hr(e)?e:ii(Hn(e))}function Xt(e,t){var n;t===void 0&&(t=[]);var r=ii(e),a=r===((n=e.ownerDocument)==null?void 0:n.body),o=Se(r),s=a?[o].concat(o.visualViewport||[],Hr(r)?r:[]):r,i=t.concat(s);return a?i:i.concat(Xt(Hn(s)))}function br(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function Eu(e,t){var n=Ot(e,!1,t==="fixed");return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}function Ba(e,t,n){return t===Qo?br(Ou(e,n)):st(t)?Eu(t,n):br($u(rt(e)))}function Ru(e){var t=Xt(Hn(e)),n=["absolute","fixed"].indexOf(Ue(e).position)>=0,r=n&&Ee(e)?ln(e):e;return st(r)?t.filter(function(a){return st(a)&&ni(a,r)&&Ne(a)!=="body"}):[]}function Tu(e,t,n,r){var a=t==="clippingParents"?Ru(e):[].concat(t),o=[].concat(a,[n]),s=o[0],i=o.reduce(function(l,c){var u=Ba(e,c,r);return l.top=it(u.top,l.top),l.right=xn(u.right,l.right),l.bottom=xn(u.bottom,l.bottom),l.left=it(u.left,l.left),l},Ba(e,s,r));return i.width=i.right-i.left,i.height=i.bottom-i.top,i.x=i.left,i.y=i.top,i}function li(e){var t=e.reference,n=e.element,r=e.placement,a=r?Le(r):null,o=r?$t(r):null,s=t.x+t.width/2-n.width/2,i=t.y+t.height/2-n.height/2,l;switch(a){case me:l={x:s,y:t.y-n.height};break;case Me:l={x:s,y:t.y+t.height};break;case Pe:l={x:t.x+t.width,y:i};break;case be:l={x:t.x-n.width,y:i};break;default:l={x:t.x,y:t.y}}var c=a?Pr(a):null;if(c!=null){var u=c==="y"?"height":"width";switch(o){case kt:l[c]=l[c]-(t[u]/2-n[u]/2);break;case tn:l[c]=l[c]+(t[u]/2-n[u]/2);break}}return l}function nn(e,t){t===void 0&&(t={});var n=t,r=n.placement,a=r===void 0?e.placement:r,o=n.strategy,s=o===void 0?e.strategy:o,i=n.boundary,l=i===void 0?Js:i,c=n.rootBoundary,u=c===void 0?Qo:c,d=n.elementContext,v=d===void 0?Vt:d,f=n.altBoundary,m=f===void 0?!1:f,y=n.padding,g=y===void 0?0:y,p=ai(typeof g!="number"?g:oi(g,on)),C=v===Vt?Zs:Vt,_=e.rects.popper,w=e.elements[m?C:v],$=Tu(st(w)?w:w.contextElement||rt(e.elements.popper),l,u,s),O=Ot(e.elements.reference),M=li({reference:O,element:_,strategy:"absolute",placement:a}),D=br(Object.assign({},_,M)),j=v===Vt?D:O,F={top:$.top-j.top+p.top,bottom:j.bottom-$.bottom+p.bottom,left:$.left-j.left+p.left,right:j.right-$.right+p.right},b=e.modifiersData.offset;if(v===Vt&&b){var R=b[a];Object.keys(F).forEach(function(T){var H=[Pe,Me].indexOf(T)>=0?1:-1,N=[me,Me].indexOf(T)>=0?"y":"x";F[T]+=R[N]*H})}return F}function Mu(e,t){t===void 0&&(t={});var n=t,r=n.placement,a=n.boundary,o=n.rootBoundary,s=n.padding,i=n.flipVariations,l=n.allowedAutoPlacements,c=l===void 0?ei:l,u=$t(r),d=u?i?Pa:Pa.filter(function(m){return $t(m)===u}):on,v=d.filter(function(m){return c.indexOf(m)>=0});v.length===0&&(v=d);var f=v.reduce(function(m,y){return m[y]=nn(e,{placement:y,boundary:a,rootBoundary:o,padding:s})[Le(y)],m},{});return Object.keys(f).sort(function(m,y){return f[m]-f[y]})}function Pu(e){if(Le(e)===Rr)return[];var t=hn(e);return[Ha(e),t,Ha(t)]}function Iu(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var a=n.mainAxis,o=a===void 0?!0:a,s=n.altAxis,i=s===void 0?!0:s,l=n.fallbackPlacements,c=n.padding,u=n.boundary,d=n.rootBoundary,v=n.altBoundary,f=n.flipVariations,m=f===void 0?!0:f,y=n.allowedAutoPlacements,g=t.options.placement,p=Le(g),C=p===g,_=l||(C||!m?[hn(g)]:Pu(g)),w=[g].concat(_).reduce(function(Be,Ce){return Be.concat(Le(Ce)===Rr?Mu(t,{placement:Ce,boundary:u,rootBoundary:d,padding:c,flipVariations:m,allowedAutoPlacements:y}):Ce)},[]),$=t.rects.reference,O=t.rects.popper,M=new Map,D=!0,j=w[0],F=0;F=0,N=H?"width":"height",U=nn(t,{placement:b,boundary:u,rootBoundary:d,altBoundary:v,padding:c}),h=H?T?Pe:be:T?Me:me;$[N]>O[N]&&(h=hn(h));var x=hn(h),E=[];if(o&&E.push(U[R]<=0),i&&E.push(U[h]<=0,U[x]<=0),E.every(function(Be){return Be})){j=b,D=!1;break}M.set(b,E)}if(D)for(var V=m?3:1,ue=function(Ce){var Ye=w.find(function(yt){var Ve=M.get(yt);if(Ve)return Ve.slice(0,Ce).every(function(Dt){return Dt})});if(Ye)return j=Ye,"break"},Ae=V;Ae>0;Ae--){var ye=ue(Ae);if(ye==="break")break}t.placement!==j&&(t.modifiersData[r]._skip=!0,t.placement=j,t.reset=!0)}}const ju={name:"flip",enabled:!0,phase:"main",fn:Iu,requiresIfExists:["offset"],data:{_skip:!1}};function La(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Da(e){return[me,Pe,Me,be].some(function(t){return e[t]>=0})}function Hu(e){var t=e.state,n=e.name,r=t.rects.reference,a=t.rects.popper,o=t.modifiersData.preventOverflow,s=nn(t,{elementContext:"reference"}),i=nn(t,{altBoundary:!0}),l=La(s,r),c=La(i,a,o),u=Da(l),d=Da(c);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}const Bu={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:Hu};function Lu(e,t,n){var r=Le(e),a=[be,me].indexOf(r)>=0?-1:1,o=typeof n=="function"?n(Object.assign({},t,{placement:e})):n,s=o[0],i=o[1];return s=s||0,i=(i||0)*a,[be,Pe].indexOf(r)>=0?{x:i,y:s}:{x:s,y:i}}function Du(e){var t=e.state,n=e.options,r=e.name,a=n.offset,o=a===void 0?[0,0]:a,s=ei.reduce(function(u,d){return u[d]=Lu(d,t.rects,o),u},{}),i=s[t.placement],l=i.x,c=i.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=s}const Nu={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:Du};function Vu(e){var t=e.state,n=e.name;t.modifiersData[n]=li({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})}const Fu={name:"popperOffsets",enabled:!0,phase:"read",fn:Vu,data:{}};function Ku(e){return e==="x"?"y":"x"}function Wu(e){var t=e.state,n=e.options,r=e.name,a=n.mainAxis,o=a===void 0?!0:a,s=n.altAxis,i=s===void 0?!1:s,l=n.boundary,c=n.rootBoundary,u=n.altBoundary,d=n.padding,v=n.tether,f=v===void 0?!0:v,m=n.tetherOffset,y=m===void 0?0:m,g=nn(t,{boundary:l,rootBoundary:c,padding:d,altBoundary:u}),p=Le(t.placement),C=$t(t.placement),_=!C,w=Pr(p),$=Ku(w),O=t.modifiersData.popperOffsets,M=t.rects.reference,D=t.rects.popper,j=typeof y=="function"?y(Object.assign({},t.rects,{placement:t.placement})):y,F=typeof j=="number"?{mainAxis:j,altAxis:j}:Object.assign({mainAxis:0,altAxis:0},j),b=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,R={x:0,y:0};if(O){if(o){var T,H=w==="y"?me:be,N=w==="y"?Me:Pe,U=w==="y"?"height":"width",h=O[w],x=h+g[H],E=h-g[N],V=f?-D[U]/2:0,ue=C===kt?M[U]:D[U],Ae=C===kt?-D[U]:-M[U],ye=t.elements.arrow,Be=f&&ye?Mr(ye):{width:0,height:0},Ce=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:ri(),Ye=Ce[H],yt=Ce[N],Ve=Yt(0,M[U],Be[U]),Dt=_?M[U]/2-V-Ve-Ye-F.mainAxis:ue-Ve-Ye-F.mainAxis,Kn=_?-M[U]/2+V+Ve+yt+F.mainAxis:Ae+Ve+yt+F.mainAxis,B=t.elements.arrow&&ln(t.elements.arrow),Nt=B?w==="y"?B.clientTop||0:B.clientLeft||0:0,ee=(T=b==null?void 0:b[w])!=null?T:0,Wn=h+Dt-ee-Nt,Xe=h+Kn-ee,la=Yt(f?xn(x,Wn):x,h,f?it(E,Xe):E);O[w]=la,R[w]=la-h}if(i){var sa,qi=w==="x"?me:be,Yi=w==="x"?Me:Pe,at=O[$],cn=$==="y"?"height":"width",ua=at+g[qi],ca=at-g[Yi],zn=[me,be].indexOf(p)!==-1,da=(sa=b==null?void 0:b[$])!=null?sa:0,fa=zn?ua:at-M[cn]-D[cn]-da+F.altAxis,pa=zn?at+M[cn]+D[cn]-da-F.altAxis:ca,va=f&&zn?vu(fa,at,pa):Yt(f?fa:ua,at,f?pa:ca);O[$]=va,R[$]=va-at}t.modifiersData[r]=R}}const zu={name:"preventOverflow",enabled:!0,phase:"main",fn:Wu,requiresIfExists:["offset"]};function Uu(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function Gu(e){return e===Se(e)||!Ee(e)?Ir(e):Uu(e)}function qu(e){var t=e.getBoundingClientRect(),n=At(t.width)/e.offsetWidth||1,r=At(t.height)/e.offsetHeight||1;return n!==1||r!==1}function Yu(e,t,n){n===void 0&&(n=!1);var r=Ee(t),a=Ee(t)&&qu(t),o=rt(t),s=Ot(e,a,n),i={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(r||!r&&!n)&&((Ne(t)!=="body"||Hr(o))&&(i=Gu(t)),Ee(t)?(l=Ot(t,!0),l.x+=t.clientLeft,l.y+=t.clientTop):o&&(l.x=jr(o))),{x:s.left+i.scrollLeft-l.x,y:s.top+i.scrollTop-l.y,width:s.width,height:s.height}}function Xu(e){var t=new Map,n=new Set,r=[];e.forEach(function(o){t.set(o.name,o)});function a(o){n.add(o.name);var s=[].concat(o.requires||[],o.requiresIfExists||[]);s.forEach(function(i){if(!n.has(i)){var l=t.get(i);l&&a(l)}}),r.push(o)}return e.forEach(function(o){n.has(o.name)||a(o)}),r}function Ju(e){var t=Xu(e);return su.reduce(function(n,r){return n.concat(t.filter(function(a){return a.phase===r}))},[])}function Zu(e){var t;return function(){return t||(t=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})})),t}}function Qu(e){var t=e.reduce(function(n,r){var a=n[r.name];return n[r.name]=a?Object.assign({},a,r,{options:Object.assign({},a.options,r.options),data:Object.assign({},a.data,r.data)}):r,n},{});return Object.keys(t).map(function(n){return t[n]})}var Na={placement:"bottom",modifiers:[],strategy:"absolute"};function Va(){for(var e=arguments.length,t=new Array(e),n=0;n-1;w?C.splice(_,1):C.push(p)}v(C)},m=function(p,C){var _,w,$;if(!nl(p)){var O=s.value,M=t.accordion,D=t.destroyInactivePanel,j=t.collapsible,F=t.openAnimation,b=String((_=p.key)!==null&&_!==void 0?_:C),R=p.props||{},T=R.header,H=T===void 0?(w=p.children)===null||w===void 0||($=w.header)===null||$===void 0?void 0:$.call(w):T,N=R.headerClass,U=R.collapsible,h=R.disabled,x=!1;M?x=O[0]===b:x=O.indexOf(b)>-1;var E=U??j;(h||h==="")&&(E="disabled");var V={key:b,panelKey:b,header:H,headerClass:N,isActive:x,prefixCls:l.value,destroyInactivePanel:D,openAnimation:F,accordion:M,onItemClick:E==="disabled"?null:f,expandIcon:d,collapsible:E};return ha(p,V)}},y=function(){var p;return tl((p=a.default)===null||p===void 0?void 0:p.call(a)).map(m)};return function(){var g,p=t.accordion,C=t.bordered,_=t.ghost,w=yn((g={},he(g,l.value,!0),he(g,"".concat(l.value,"-borderless"),!C),he(g,"".concat(l.value,"-icon-position-").concat(u.value),!0),he(g,"".concat(l.value,"-rtl"),c.value==="rtl"),he(g,"".concat(l.value,"-ghost"),!!_),he(g,r.class,!!r.class),g));return P("div",Gt(Gt({class:w},Qi(r)),{},{style:r.style,role:p?"tablist":null}),[y()])}}}),rs=se({compatConfig:{MODE:3},name:"PanelContent",props:qo(),setup:function(t,n){var r=n.slots,a=W(!1);return il(function(){(t.isActive||t.forceRender)&&(a.value=!0)}),function(){var o,s;if(!a.value)return null;var i=t.prefixCls,l=t.isActive,c=t.role;return P("div",{ref:W,class:yn("".concat(i,"-content"),(o={},he(o,"".concat(i,"-content-active"),l),he(o,"".concat(i,"-content-inactive"),!l),o)),role:c},[P("div",{class:"".concat(i,"-content-box")},[(s=r.default)===null||s===void 0?void 0:s.call(r)])])}}}),Cn=se({compatConfig:{MODE:3},name:"ACollapsePanel",inheritAttrs:!1,props:Lo(qo(),{showArrow:!0,isActive:!1,onItemClick:function(){},headerClass:"",forceRender:!1}),slots:["expandIcon","extra","header"],setup:function(t,n){var r=n.slots,a=n.emit,o=n.attrs;ll(t.disabled===void 0,"Collapse.Panel",'`disabled` is deprecated. Please use `collapsible="disabled"` instead.');var s=Do("collapse",t),i=s.prefixCls,l=function(){a("itemClick",t.panelKey)},c=function(d){(d.key==="Enter"||d.keyCode===13||d.which===13)&&l()};return function(){var u,d,v,f,m=t.header,y=m===void 0?(u=r.header)===null||u===void 0?void 0:u.call(r):m,g=t.headerClass,p=t.isActive,C=t.showArrow,_=t.destroyInactivePanel,w=t.accordion,$=t.forceRender,O=t.openAnimation,M=t.expandIcon,D=M===void 0?r.expandIcon:M,j=t.extra,F=j===void 0?(d=r.extra)===null||d===void 0?void 0:d.call(r):j,b=t.collapsible,R=b==="disabled",T=i.value,H=yn("".concat(T,"-header"),(v={},he(v,g,g),he(v,"".concat(T,"-header-collapsible-only"),b==="header"),v)),N=yn((f={},he(f,"".concat(T,"-item"),!0),he(f,"".concat(T,"-item-active"),p),he(f,"".concat(T,"-item-disabled"),R),he(f,"".concat(T,"-no-arrow"),!C),he(f,"".concat(o.class),!!o.class),f)),U=P("i",{class:"arrow"},null);C&&typeof D=="function"&&(U=D(t));var h=en(P(rs,{prefixCls:T,isActive:p,forceRender:$,role:w?"tabpanel":null},{default:r.default}),[[mn,p]]),x=Gt({appear:!1,css:!1},O);return P("div",Gt(Gt({},o),{},{class:N}),[P("div",{class:H,onClick:function(){return b!=="header"&&l()},role:w?"tab":"button",tabindex:R?-1:0,"aria-expanded":p,onKeypress:c},[C&&U,b==="header"?P("span",{onClick:l,class:"".concat(T,"-header-text")},[y]):y,F&&P("div",{class:"".concat(T,"-extra")},[F])]),P(sl,x,{default:function(){return[!_||p?h:null]}})])}}});qt.Panel=Cn;qt.install=function(e){return e.component(qt.name,qt),e.component(Cn.name,Cn),e};var as={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M869 487.8L491.2 159.9c-2.9-2.5-6.6-3.9-10.5-3.9h-88.5c-7.4 0-10.8 9.2-5.2 14l350.2 304H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h585.1L386.9 854c-5.6 4.9-2.2 14 5.2 14h91.5c1.9 0 3.8-.7 5.2-2L869 536.2a32.07 32.07 0 000-48.4z"}}]},name:"arrow-right",theme:"outlined"};const os=as;function Aa(e){for(var t=1;t1?n[a-1]:void 0,s=a>2?n[2]:void 0;for(o=e.length>3&&typeof o=="function"?(a--,o):void 0,s&&ts(n[0],n[1],s)&&(o=a<3?void 0:o,a=1),t=Object(t);++r=0,o=!n&&a&&(t==="hex"||t==="hex6"||t==="hex3"||t==="hex4"||t==="hex8"||t==="name");return o?t==="name"&&this._a===0?this.toName():this.toRgbString():(t==="rgb"&&(r=this.toRgbString()),t==="prgb"&&(r=this.toPercentageRgbString()),(t==="hex"||t==="hex6")&&(r=this.toHexString()),t==="hex3"&&(r=this.toHexString(!0)),t==="hex4"&&(r=this.toHex8String(!0)),t==="hex8"&&(r=this.toHex8String()),t==="name"&&(r=this.toName()),t==="hsl"&&(r=this.toHslString()),t==="hsv"&&(r=this.toHsvString()),r||this.toHexString())},clone:function(){return k(this.toString())},_applyModification:function(t,n){var r=t.apply(null,[this].concat([].slice.call(n)));return this._r=r._r,this._g=r._g,this._b=r._b,this.setAlpha(r._a),this},lighten:function(){return this._applyModification(js,arguments)},brighten:function(){return this._applyModification(Hs,arguments)},darken:function(){return this._applyModification(Bs,arguments)},desaturate:function(){return this._applyModification(Ms,arguments)},saturate:function(){return this._applyModification(Ps,arguments)},greyscale:function(){return this._applyModification(Is,arguments)},spin:function(){return this._applyModification(Ls,arguments)},_applyCombination:function(t,n){return t.apply(null,[this].concat([].slice.call(n)))},analogous:function(){return this._applyCombination(Vs,arguments)},complement:function(){return this._applyCombination(Ds,arguments)},monochromatic:function(){return this._applyCombination(Fs,arguments)},splitcomplement:function(){return this._applyCombination(Ns,arguments)},triad:function(){return this._applyCombination(Ta,[3])},tetrad:function(){return this._applyCombination(Ta,[4])}};k.fromRatio=function(e,t){if(_n(e)=="object"){var n={};for(var r in e)e.hasOwnProperty(r)&&(r==="a"?n[r]=e[r]:n[r]=zt(e[r]));e=n}return k(e,t)};function Os(e){var t={r:0,g:0,b:0},n=1,r=null,a=null,o=null,s=!1,i=!1;return typeof e=="string"&&(e=Gs(e)),_n(e)=="object"&&(Fe(e.r)&&Fe(e.g)&&Fe(e.b)?(t=$s(e.r,e.g,e.b),s=!0,i=String(e.r).substr(-1)==="%"?"prgb":"rgb"):Fe(e.h)&&Fe(e.s)&&Fe(e.v)?(r=zt(e.s),a=zt(e.v),t=Rs(e.h,r,a),s=!0,i="hsv"):Fe(e.h)&&Fe(e.s)&&Fe(e.l)&&(r=zt(e.s),o=zt(e.l),t=Es(e.h,r,o),s=!0,i="hsl"),e.hasOwnProperty("a")&&(n=e.a)),n=Jo(n),{ok:s,format:e.format||i,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}function $s(e,t,n){return{r:X(e,255)*255,g:X(t,255)*255,b:X(n,255)*255}}function Oa(e,t,n){e=X(e,255),t=X(t,255),n=X(n,255);var r=Math.max(e,t,n),a=Math.min(e,t,n),o,s,i=(r+a)/2;if(r==a)o=s=0;else{var l=r-a;switch(s=i>.5?l/(2-r-a):l/(r+a),r){case e:o=(t-n)/l+(t1&&(d-=1),d<1/6?c+(u-c)*6*d:d<1/2?u:d<2/3?c+(u-c)*(2/3-d)*6:c}if(t===0)r=a=o=n;else{var i=n<.5?n*(1+t):n+t-n*t,l=2*n-i;r=s(l,i,e+1/3),a=s(l,i,e),o=s(l,i,e-1/3)}return{r:r*255,g:a*255,b:o*255}}function $a(e,t,n){e=X(e,255),t=X(t,255),n=X(n,255);var r=Math.max(e,t,n),a=Math.min(e,t,n),o,s,i=r,l=r-a;if(s=r===0?0:l/r,r==a)o=0;else{switch(r){case e:o=(t-n)/l+(t>1)+720)%360;--t;)r.h=(r.h+a)%360,o.push(k(r));return o}function Fs(e,t){t=t||6;for(var n=k(e).toHsv(),r=n.h,a=n.s,o=n.v,s=[],i=1/t;t--;)s.push(k({h:r,s:a,v:o})),o=(o+i)%1;return s}k.mix=function(e,t,n){n=n===0?0:n||50;var r=k(e).toRgb(),a=k(t).toRgb(),o=n/100,s={r:(a.r-r.r)*o+r.r,g:(a.g-r.g)*o+r.g,b:(a.b-r.b)*o+r.b,a:(a.a-r.a)*o+r.a};return k(s)};k.readability=function(e,t){var n=k(e),r=k(t);return(Math.max(n.getLuminance(),r.getLuminance())+.05)/(Math.min(n.getLuminance(),r.getLuminance())+.05)};k.isReadable=function(e,t,n){var r=k.readability(e,t),a,o;switch(o=!1,a=qs(n),a.level+a.size){case"AAsmall":case"AAAlarge":o=r>=4.5;break;case"AAlarge":o=r>=3;break;case"AAAsmall":o=r>=7;break}return o};k.mostReadable=function(e,t,n){var r=null,a=0,o,s,i,l;n=n||{},s=n.includeFallbackColors,i=n.level,l=n.size;for(var c=0;ca&&(a=o,r=k(t[c]));return k.isReadable(e,r,{level:i,size:l})||!s?r:(n.includeFallbackColors=!1,k.mostReadable(e,["#fff","#000"],n))};var yr=k.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},Ks=k.hexNames=Ws(yr);function Ws(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[e[n]]=n);return t}function Jo(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function X(e,t){zs(e)&&(e="100%");var n=Us(e);return e=Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(e*t,10)/100),Math.abs(e-t)<1e-6?1:e%t/parseFloat(t)}function jn(e){return Math.min(1,Math.max(0,e))}function _e(e){return parseInt(e,16)}function zs(e){return typeof e=="string"&&e.indexOf(".")!=-1&&parseFloat(e)===1}function Us(e){return typeof e=="string"&&e.indexOf("%")!=-1}function He(e){return e.length==1?"0"+e:""+e}function zt(e){return e<=1&&(e=e*100+"%"),e}function Zo(e){return Math.round(parseFloat(e)*255).toString(16)}function Ma(e){return _e(e)/255}var je=function(){var e="[-\\+]?\\d+%?",t="[-\\+]?\\d*\\.\\d+%?",n="(?:"+t+")|(?:"+e+")",r="[\\s|\\(]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")\\s*\\)?",a="[\\s|\\(]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")[,|\\s]+("+n+")\\s*\\)?";return{CSS_UNIT:new RegExp(n),rgb:new RegExp("rgb"+r),rgba:new RegExp("rgba"+a),hsl:new RegExp("hsl"+r),hsla:new RegExp("hsla"+a),hsv:new RegExp("hsv"+r),hsva:new RegExp("hsva"+a),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}}();function Fe(e){return!!je.CSS_UNIT.exec(e)}function Gs(e){e=e.replace(ks,"").replace(As,"").toLowerCase();var t=!1;if(yr[e])e=yr[e],t=!0;else if(e=="transparent")return{r:0,g:0,b:0,a:0,format:"name"};var n;return(n=je.rgb.exec(e))?{r:n[1],g:n[2],b:n[3]}:(n=je.rgba.exec(e))?{r:n[1],g:n[2],b:n[3],a:n[4]}:(n=je.hsl.exec(e))?{h:n[1],s:n[2],l:n[3]}:(n=je.hsla.exec(e))?{h:n[1],s:n[2],l:n[3],a:n[4]}:(n=je.hsv.exec(e))?{h:n[1],s:n[2],v:n[3]}:(n=je.hsva.exec(e))?{h:n[1],s:n[2],v:n[3],a:n[4]}:(n=je.hex8.exec(e))?{r:_e(n[1]),g:_e(n[2]),b:_e(n[3]),a:Ma(n[4]),format:t?"name":"hex8"}:(n=je.hex6.exec(e))?{r:_e(n[1]),g:_e(n[2]),b:_e(n[3]),format:t?"name":"hex"}:(n=je.hex4.exec(e))?{r:_e(n[1]+""+n[1]),g:_e(n[2]+""+n[2]),b:_e(n[3]+""+n[3]),a:Ma(n[4]+""+n[4]),format:t?"name":"hex8"}:(n=je.hex3.exec(e))?{r:_e(n[1]+""+n[1]),g:_e(n[2]+""+n[2]),b:_e(n[3]+""+n[3]),format:t?"name":"hex"}:!1}function qs(e){var t,n;return e=e||{level:"AA",size:"small"},t=(e.level||"AA").toUpperCase(),n=(e.size||"small").toLowerCase(),t!=="AA"&&t!=="AAA"&&(t="AA"),n!=="small"&&n!=="large"&&(n="small"),{level:t,size:n}}var pt=pt||{};pt.stringify=function(){var e={"visit_linear-gradient":function(t){return e.visit_gradient(t)},"visit_repeating-linear-gradient":function(t){return e.visit_gradient(t)},"visit_radial-gradient":function(t){return e.visit_gradient(t)},"visit_repeating-radial-gradient":function(t){return e.visit_gradient(t)},visit_gradient:function(t){var n=e.visit(t.orientation);return n&&(n+=", "),t.type+"("+n+e.visit(t.colorStops)+")"},visit_shape:function(t){var n=t.value,r=e.visit(t.at),a=e.visit(t.style);return a&&(n+=" "+a),r&&(n+=" at "+r),n},"visit_default-radial":function(t){var n="",r=e.visit(t.at);return r&&(n+=r),n},"visit_extent-keyword":function(t){var n=t.value,r=e.visit(t.at);return r&&(n+=" at "+r),n},"visit_position-keyword":function(t){return t.value},visit_position:function(t){return e.visit(t.value.x)+" "+e.visit(t.value.y)},"visit_%":function(t){return t.value+"%"},visit_em:function(t){return t.value+"em"},visit_px:function(t){return t.value+"px"},visit_literal:function(t){return e.visit_color(t.value,t)},visit_hex:function(t){return e.visit_color("#"+t.value,t)},visit_rgb:function(t){return e.visit_color("rgb("+t.value.join(", ")+")",t)},visit_rgba:function(t){return e.visit_color("rgba("+t.value.join(", ")+")",t)},visit_color:function(t,n){var r=t,a=e.visit(n.length);return a&&(r+=" "+a),r},visit_angular:function(t){return t.value+"deg"},visit_directional:function(t){return"to "+t.value},visit_array:function(t){var n="",r=t.length;return t.forEach(function(a,o){n+=e.visit(a),o0&&n("Invalid input not EOF"),h}function a(){return _(o)}function o(){return s("linear-gradient",e.linearGradient,l)||s("repeating-linear-gradient",e.repeatingLinearGradient,l)||s("radial-gradient",e.radialGradient,d)||s("repeating-radial-gradient",e.repeatingRadialGradient,d)}function s(h,x,E){return i(x,function(V){var ue=E();return ue&&(N(e.comma)||n("Missing comma before color stops")),{type:h,orientation:ue,colorStops:_(w)}})}function i(h,x){var E=N(h);if(E){N(e.startCall)||n("Missing (");var V=x(E);return N(e.endCall)||n("Missing )"),V}}function l(){return c()||u()}function c(){return H("directional",e.sideOrCorner,1)}function u(){return H("angular",e.angleValue,1)}function d(){var h,x=v(),E;return x&&(h=[],h.push(x),E=t,N(e.comma)&&(x=v(),x?h.push(x):t=E)),h}function v(){var h=f()||m();if(h)h.at=g();else{var x=y();if(x){h=x;var E=g();E&&(h.at=E)}else{var V=p();V&&(h={type:"default-radial",at:V})}}return h}function f(){var h=H("shape",/^(circle)/i,0);return h&&(h.style=T()||y()),h}function m(){var h=H("shape",/^(ellipse)/i,0);return h&&(h.style=b()||y()),h}function y(){return H("extent-keyword",e.extentKeywords,1)}function g(){if(H("position",/^at/,0)){var h=p();return h||n("Missing positioning value"),h}}function p(){var h=C();if(h.x||h.y)return{type:"position",value:h}}function C(){return{x:b(),y:b()}}function _(h){var x=h(),E=[];if(x)for(E.push(x);N(e.comma);)x=h(),x?E.push(x):n("One extra comma");return E}function w(){var h=$();return h||n("Expected color definition"),h.length=b(),h}function $(){return M()||j()||D()||O()}function O(){return H("literal",e.literalColor,0)}function M(){return H("hex",e.hexColor,1)}function D(){return i(e.rgbColor,function(){return{type:"rgb",value:_(F)}})}function j(){return i(e.rgbaColor,function(){return{type:"rgba",value:_(F)}})}function F(){return N(e.number)[1]}function b(){return H("%",e.percentageValue,1)||R()||T()}function R(){return H("position-keyword",e.positionKeywords,1)}function T(){return H("px",e.pixelValue,1)||H("em",e.emValue,1)}function H(h,x,E){var V=N(x);if(V)return{type:h,value:V[E]}}function N(h){var x,E;return E=/^[\n\r\t\s]+/.exec(t),E&&U(E[0].length),x=h.exec(t),x&&U(x[0].length),x}function U(h){t=t.substr(h)}return function(h){return t=h.toString(),r()}}();var Ys=pt.parse,Xs=pt.stringify,me="top",Me="bottom",Pe="right",be="left",Rr="auto",on=[me,Me,Pe,be],kt="start",tn="end",Js="clippingParents",Qo="viewport",Vt="popper",Zs="reference",Pa=on.reduce(function(e,t){return e.concat([t+"-"+kt,t+"-"+tn])},[]),ei=[].concat(on,[Rr]).reduce(function(e,t){return e.concat([t,t+"-"+kt,t+"-"+tn])},[]),Qs="beforeRead",eu="read",tu="afterRead",nu="beforeMain",ru="main",au="afterMain",ou="beforeWrite",iu="write",lu="afterWrite",su=[Qs,eu,tu,nu,ru,au,ou,iu,lu];function Ne(e){return e?(e.nodeName||"").toLowerCase():null}function Se(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function st(e){var t=Se(e).Element;return e instanceof t||e instanceof Element}function Ee(e){var t=Se(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function Tr(e){if(typeof ShadowRoot>"u")return!1;var t=Se(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}function uu(e){var t=e.state;Object.keys(t.elements).forEach(function(n){var r=t.styles[n]||{},a=t.attributes[n]||{},o=t.elements[n];!Ee(o)||!Ne(o)||(Object.assign(o.style,r),Object.keys(a).forEach(function(s){var i=a[s];i===!1?o.removeAttribute(s):o.setAttribute(s,i===!0?"":i)}))})}function cu(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(r){var a=t.elements[r],o=t.attributes[r]||{},s=Object.keys(t.styles.hasOwnProperty(r)?t.styles[r]:n[r]),i=s.reduce(function(l,c){return l[c]="",l},{});!Ee(a)||!Ne(a)||(Object.assign(a.style,i),Object.keys(o).forEach(function(l){a.removeAttribute(l)}))})}}const du={name:"applyStyles",enabled:!0,phase:"write",fn:uu,effect:cu,requires:["computeStyles"]};function Le(e){return e.split("-")[0]}var it=Math.max,xn=Math.min,At=Math.round;function mr(){var e=navigator.userAgentData;return e!=null&&e.brands&&Array.isArray(e.brands)?e.brands.map(function(t){return t.brand+"/"+t.version}).join(" "):navigator.userAgent}function ti(){return!/^((?!chrome|android).)*safari/i.test(mr())}function Ot(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!1);var r=e.getBoundingClientRect(),a=1,o=1;t&&Ee(e)&&(a=e.offsetWidth>0&&At(r.width)/e.offsetWidth||1,o=e.offsetHeight>0&&At(r.height)/e.offsetHeight||1);var s=st(e)?Se(e):window,i=s.visualViewport,l=!ti()&&n,c=(r.left+(l&&i?i.offsetLeft:0))/a,u=(r.top+(l&&i?i.offsetTop:0))/o,d=r.width/a,v=r.height/o;return{width:d,height:v,top:u,right:c+d,bottom:u+v,left:c,x:c,y:u}}function Mr(e){var t=Ot(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function ni(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&Tr(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function Ue(e){return Se(e).getComputedStyle(e)}function fu(e){return["table","td","th"].indexOf(Ne(e))>=0}function rt(e){return((st(e)?e.ownerDocument:e.document)||window.document).documentElement}function Hn(e){return Ne(e)==="html"?e:e.assignedSlot||e.parentNode||(Tr(e)?e.host:null)||rt(e)}function Ia(e){return!Ee(e)||Ue(e).position==="fixed"?null:e.offsetParent}function pu(e){var t=/firefox/i.test(mr()),n=/Trident/i.test(mr());if(n&&Ee(e)){var r=Ue(e);if(r.position==="fixed")return null}var a=Hn(e);for(Tr(a)&&(a=a.host);Ee(a)&&["html","body"].indexOf(Ne(a))<0;){var o=Ue(a);if(o.transform!=="none"||o.perspective!=="none"||o.contain==="paint"||["transform","perspective"].indexOf(o.willChange)!==-1||t&&o.willChange==="filter"||t&&o.filter&&o.filter!=="none")return a;a=a.parentNode}return null}function ln(e){for(var t=Se(e),n=Ia(e);n&&fu(n)&&Ue(n).position==="static";)n=Ia(n);return n&&(Ne(n)==="html"||Ne(n)==="body"&&Ue(n).position==="static")?t:n||pu(e)||t}function Pr(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function Yt(e,t,n){return it(e,xn(t,n))}function vu(e,t,n){var r=Yt(e,t,n);return r>n?n:r}function ri(){return{top:0,right:0,bottom:0,left:0}}function ai(e){return Object.assign({},ri(),e)}function oi(e,t){return t.reduce(function(n,r){return n[r]=e,n},{})}var hu=function(t,n){return t=typeof t=="function"?t(Object.assign({},n.rects,{placement:n.placement})):t,ai(typeof t!="number"?t:oi(t,on))};function gu(e){var t,n=e.state,r=e.name,a=e.options,o=n.elements.arrow,s=n.modifiersData.popperOffsets,i=Le(n.placement),l=Pr(i),c=[be,Pe].indexOf(i)>=0,u=c?"height":"width";if(!(!o||!s)){var d=hu(a.padding,n),v=Mr(o),f=l==="y"?me:be,m=l==="y"?Me:Pe,y=n.rects.reference[u]+n.rects.reference[l]-s[l]-n.rects.popper[u],g=s[l]-n.rects.reference[l],p=ln(o),C=p?l==="y"?p.clientHeight||0:p.clientWidth||0:0,_=y/2-g/2,w=d[f],$=C-v[u]-d[m],O=C/2-v[u]/2+_,M=Yt(w,O,$),D=l;n.modifiersData[r]=(t={},t[D]=M,t.centerOffset=M-O,t)}}function yu(e){var t=e.state,n=e.options,r=n.element,a=r===void 0?"[data-popper-arrow]":r;a!=null&&(typeof a=="string"&&(a=t.elements.popper.querySelector(a),!a)||ni(t.elements.popper,a)&&(t.elements.arrow=a))}const mu={name:"arrow",enabled:!0,phase:"main",fn:gu,effect:yu,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function $t(e){return e.split("-")[1]}var bu={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Cu(e,t){var n=e.x,r=e.y,a=t.devicePixelRatio||1;return{x:At(n*a)/a||0,y:At(r*a)/a||0}}function ja(e){var t,n=e.popper,r=e.popperRect,a=e.placement,o=e.variation,s=e.offsets,i=e.position,l=e.gpuAcceleration,c=e.adaptive,u=e.roundOffsets,d=e.isFixed,v=s.x,f=v===void 0?0:v,m=s.y,y=m===void 0?0:m,g=typeof u=="function"?u({x:f,y}):{x:f,y};f=g.x,y=g.y;var p=s.hasOwnProperty("x"),C=s.hasOwnProperty("y"),_=be,w=me,$=window;if(c){var O=ln(n),M="clientHeight",D="clientWidth";if(O===Se(n)&&(O=rt(n),Ue(O).position!=="static"&&i==="absolute"&&(M="scrollHeight",D="scrollWidth")),O=O,a===me||(a===be||a===Pe)&&o===tn){w=Me;var j=d&&O===$&&$.visualViewport?$.visualViewport.height:O[M];y-=j-r.height,y*=l?1:-1}if(a===be||(a===me||a===Me)&&o===tn){_=Pe;var F=d&&O===$&&$.visualViewport?$.visualViewport.width:O[D];f-=F-r.width,f*=l?1:-1}}var b=Object.assign({position:i},c&&bu),R=u===!0?Cu({x:f,y},Se(n)):{x:f,y};if(f=R.x,y=R.y,l){var T;return Object.assign({},b,(T={},T[w]=C?"0":"",T[_]=p?"0":"",T.transform=($.devicePixelRatio||1)<=1?"translate("+f+"px, "+y+"px)":"translate3d("+f+"px, "+y+"px, 0)",T))}return Object.assign({},b,(t={},t[w]=C?y+"px":"",t[_]=p?f+"px":"",t.transform="",t))}function _u(e){var t=e.state,n=e.options,r=n.gpuAcceleration,a=r===void 0?!0:r,o=n.adaptive,s=o===void 0?!0:o,i=n.roundOffsets,l=i===void 0?!0:i,c={placement:Le(t.placement),variation:$t(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:a,isFixed:t.options.strategy==="fixed"};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,ja(Object.assign({},c,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:s,roundOffsets:l})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,ja(Object.assign({},c,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}const xu={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:_u,data:{}};var dn={passive:!0};function wu(e){var t=e.state,n=e.instance,r=e.options,a=r.scroll,o=a===void 0?!0:a,s=r.resize,i=s===void 0?!0:s,l=Se(t.elements.popper),c=[].concat(t.scrollParents.reference,t.scrollParents.popper);return o&&c.forEach(function(u){u.addEventListener("scroll",n.update,dn)}),i&&l.addEventListener("resize",n.update,dn),function(){o&&c.forEach(function(u){u.removeEventListener("scroll",n.update,dn)}),i&&l.removeEventListener("resize",n.update,dn)}}const Su={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:wu,data:{}};var ku={left:"right",right:"left",bottom:"top",top:"bottom"};function hn(e){return e.replace(/left|right|bottom|top/g,function(t){return ku[t]})}var Au={start:"end",end:"start"};function Ha(e){return e.replace(/start|end/g,function(t){return Au[t]})}function Ir(e){var t=Se(e),n=t.pageXOffset,r=t.pageYOffset;return{scrollLeft:n,scrollTop:r}}function jr(e){return Ot(rt(e)).left+Ir(e).scrollLeft}function Ou(e,t){var n=Se(e),r=rt(e),a=n.visualViewport,o=r.clientWidth,s=r.clientHeight,i=0,l=0;if(a){o=a.width,s=a.height;var c=ti();(c||!c&&t==="fixed")&&(i=a.offsetLeft,l=a.offsetTop)}return{width:o,height:s,x:i+jr(e),y:l}}function $u(e){var t,n=rt(e),r=Ir(e),a=(t=e.ownerDocument)==null?void 0:t.body,o=it(n.scrollWidth,n.clientWidth,a?a.scrollWidth:0,a?a.clientWidth:0),s=it(n.scrollHeight,n.clientHeight,a?a.scrollHeight:0,a?a.clientHeight:0),i=-r.scrollLeft+jr(e),l=-r.scrollTop;return Ue(a||n).direction==="rtl"&&(i+=it(n.clientWidth,a?a.clientWidth:0)-o),{width:o,height:s,x:i,y:l}}function Hr(e){var t=Ue(e),n=t.overflow,r=t.overflowX,a=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+a+r)}function ii(e){return["html","body","#document"].indexOf(Ne(e))>=0?e.ownerDocument.body:Ee(e)&&Hr(e)?e:ii(Hn(e))}function Xt(e,t){var n;t===void 0&&(t=[]);var r=ii(e),a=r===((n=e.ownerDocument)==null?void 0:n.body),o=Se(r),s=a?[o].concat(o.visualViewport||[],Hr(r)?r:[]):r,i=t.concat(s);return a?i:i.concat(Xt(Hn(s)))}function br(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function Eu(e,t){var n=Ot(e,!1,t==="fixed");return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}function Ba(e,t,n){return t===Qo?br(Ou(e,n)):st(t)?Eu(t,n):br($u(rt(e)))}function Ru(e){var t=Xt(Hn(e)),n=["absolute","fixed"].indexOf(Ue(e).position)>=0,r=n&&Ee(e)?ln(e):e;return st(r)?t.filter(function(a){return st(a)&&ni(a,r)&&Ne(a)!=="body"}):[]}function Tu(e,t,n,r){var a=t==="clippingParents"?Ru(e):[].concat(t),o=[].concat(a,[n]),s=o[0],i=o.reduce(function(l,c){var u=Ba(e,c,r);return l.top=it(u.top,l.top),l.right=xn(u.right,l.right),l.bottom=xn(u.bottom,l.bottom),l.left=it(u.left,l.left),l},Ba(e,s,r));return i.width=i.right-i.left,i.height=i.bottom-i.top,i.x=i.left,i.y=i.top,i}function li(e){var t=e.reference,n=e.element,r=e.placement,a=r?Le(r):null,o=r?$t(r):null,s=t.x+t.width/2-n.width/2,i=t.y+t.height/2-n.height/2,l;switch(a){case me:l={x:s,y:t.y-n.height};break;case Me:l={x:s,y:t.y+t.height};break;case Pe:l={x:t.x+t.width,y:i};break;case be:l={x:t.x-n.width,y:i};break;default:l={x:t.x,y:t.y}}var c=a?Pr(a):null;if(c!=null){var u=c==="y"?"height":"width";switch(o){case kt:l[c]=l[c]-(t[u]/2-n[u]/2);break;case tn:l[c]=l[c]+(t[u]/2-n[u]/2);break}}return l}function nn(e,t){t===void 0&&(t={});var n=t,r=n.placement,a=r===void 0?e.placement:r,o=n.strategy,s=o===void 0?e.strategy:o,i=n.boundary,l=i===void 0?Js:i,c=n.rootBoundary,u=c===void 0?Qo:c,d=n.elementContext,v=d===void 0?Vt:d,f=n.altBoundary,m=f===void 0?!1:f,y=n.padding,g=y===void 0?0:y,p=ai(typeof g!="number"?g:oi(g,on)),C=v===Vt?Zs:Vt,_=e.rects.popper,w=e.elements[m?C:v],$=Tu(st(w)?w:w.contextElement||rt(e.elements.popper),l,u,s),O=Ot(e.elements.reference),M=li({reference:O,element:_,strategy:"absolute",placement:a}),D=br(Object.assign({},_,M)),j=v===Vt?D:O,F={top:$.top-j.top+p.top,bottom:j.bottom-$.bottom+p.bottom,left:$.left-j.left+p.left,right:j.right-$.right+p.right},b=e.modifiersData.offset;if(v===Vt&&b){var R=b[a];Object.keys(F).forEach(function(T){var H=[Pe,Me].indexOf(T)>=0?1:-1,N=[me,Me].indexOf(T)>=0?"y":"x";F[T]+=R[N]*H})}return F}function Mu(e,t){t===void 0&&(t={});var n=t,r=n.placement,a=n.boundary,o=n.rootBoundary,s=n.padding,i=n.flipVariations,l=n.allowedAutoPlacements,c=l===void 0?ei:l,u=$t(r),d=u?i?Pa:Pa.filter(function(m){return $t(m)===u}):on,v=d.filter(function(m){return c.indexOf(m)>=0});v.length===0&&(v=d);var f=v.reduce(function(m,y){return m[y]=nn(e,{placement:y,boundary:a,rootBoundary:o,padding:s})[Le(y)],m},{});return Object.keys(f).sort(function(m,y){return f[m]-f[y]})}function Pu(e){if(Le(e)===Rr)return[];var t=hn(e);return[Ha(e),t,Ha(t)]}function Iu(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var a=n.mainAxis,o=a===void 0?!0:a,s=n.altAxis,i=s===void 0?!0:s,l=n.fallbackPlacements,c=n.padding,u=n.boundary,d=n.rootBoundary,v=n.altBoundary,f=n.flipVariations,m=f===void 0?!0:f,y=n.allowedAutoPlacements,g=t.options.placement,p=Le(g),C=p===g,_=l||(C||!m?[hn(g)]:Pu(g)),w=[g].concat(_).reduce(function(Be,Ce){return Be.concat(Le(Ce)===Rr?Mu(t,{placement:Ce,boundary:u,rootBoundary:d,padding:c,flipVariations:m,allowedAutoPlacements:y}):Ce)},[]),$=t.rects.reference,O=t.rects.popper,M=new Map,D=!0,j=w[0],F=0;F=0,N=H?"width":"height",U=nn(t,{placement:b,boundary:u,rootBoundary:d,altBoundary:v,padding:c}),h=H?T?Pe:be:T?Me:me;$[N]>O[N]&&(h=hn(h));var x=hn(h),E=[];if(o&&E.push(U[R]<=0),i&&E.push(U[h]<=0,U[x]<=0),E.every(function(Be){return Be})){j=b,D=!1;break}M.set(b,E)}if(D)for(var V=m?3:1,ue=function(Ce){var Ye=w.find(function(yt){var Ve=M.get(yt);if(Ve)return Ve.slice(0,Ce).every(function(Dt){return Dt})});if(Ye)return j=Ye,"break"},Ae=V;Ae>0;Ae--){var ye=ue(Ae);if(ye==="break")break}t.placement!==j&&(t.modifiersData[r]._skip=!0,t.placement=j,t.reset=!0)}}const ju={name:"flip",enabled:!0,phase:"main",fn:Iu,requiresIfExists:["offset"],data:{_skip:!1}};function La(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Da(e){return[me,Pe,Me,be].some(function(t){return e[t]>=0})}function Hu(e){var t=e.state,n=e.name,r=t.rects.reference,a=t.rects.popper,o=t.modifiersData.preventOverflow,s=nn(t,{elementContext:"reference"}),i=nn(t,{altBoundary:!0}),l=La(s,r),c=La(i,a,o),u=Da(l),d=Da(c);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}const Bu={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:Hu};function Lu(e,t,n){var r=Le(e),a=[be,me].indexOf(r)>=0?-1:1,o=typeof n=="function"?n(Object.assign({},t,{placement:e})):n,s=o[0],i=o[1];return s=s||0,i=(i||0)*a,[be,Pe].indexOf(r)>=0?{x:i,y:s}:{x:s,y:i}}function Du(e){var t=e.state,n=e.options,r=e.name,a=n.offset,o=a===void 0?[0,0]:a,s=ei.reduce(function(u,d){return u[d]=Lu(d,t.rects,o),u},{}),i=s[t.placement],l=i.x,c=i.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=s}const Nu={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:Du};function Vu(e){var t=e.state,n=e.name;t.modifiersData[n]=li({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})}const Fu={name:"popperOffsets",enabled:!0,phase:"read",fn:Vu,data:{}};function Ku(e){return e==="x"?"y":"x"}function Wu(e){var t=e.state,n=e.options,r=e.name,a=n.mainAxis,o=a===void 0?!0:a,s=n.altAxis,i=s===void 0?!1:s,l=n.boundary,c=n.rootBoundary,u=n.altBoundary,d=n.padding,v=n.tether,f=v===void 0?!0:v,m=n.tetherOffset,y=m===void 0?0:m,g=nn(t,{boundary:l,rootBoundary:c,padding:d,altBoundary:u}),p=Le(t.placement),C=$t(t.placement),_=!C,w=Pr(p),$=Ku(w),O=t.modifiersData.popperOffsets,M=t.rects.reference,D=t.rects.popper,j=typeof y=="function"?y(Object.assign({},t.rects,{placement:t.placement})):y,F=typeof j=="number"?{mainAxis:j,altAxis:j}:Object.assign({mainAxis:0,altAxis:0},j),b=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,R={x:0,y:0};if(O){if(o){var T,H=w==="y"?me:be,N=w==="y"?Me:Pe,U=w==="y"?"height":"width",h=O[w],x=h+g[H],E=h-g[N],V=f?-D[U]/2:0,ue=C===kt?M[U]:D[U],Ae=C===kt?-D[U]:-M[U],ye=t.elements.arrow,Be=f&&ye?Mr(ye):{width:0,height:0},Ce=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:ri(),Ye=Ce[H],yt=Ce[N],Ve=Yt(0,M[U],Be[U]),Dt=_?M[U]/2-V-Ve-Ye-F.mainAxis:ue-Ve-Ye-F.mainAxis,Kn=_?-M[U]/2+V+Ve+yt+F.mainAxis:Ae+Ve+yt+F.mainAxis,B=t.elements.arrow&&ln(t.elements.arrow),Nt=B?w==="y"?B.clientTop||0:B.clientLeft||0:0,ee=(T=b==null?void 0:b[w])!=null?T:0,Wn=h+Dt-ee-Nt,Xe=h+Kn-ee,la=Yt(f?xn(x,Wn):x,h,f?it(E,Xe):E);O[w]=la,R[w]=la-h}if(i){var sa,qi=w==="x"?me:be,Yi=w==="x"?Me:Pe,at=O[$],cn=$==="y"?"height":"width",ua=at+g[qi],ca=at-g[Yi],zn=[me,be].indexOf(p)!==-1,da=(sa=b==null?void 0:b[$])!=null?sa:0,fa=zn?ua:at-M[cn]-D[cn]-da+F.altAxis,pa=zn?at+M[cn]+D[cn]-da-F.altAxis:ca,va=f&&zn?vu(fa,at,pa):Yt(f?fa:ua,at,f?pa:ca);O[$]=va,R[$]=va-at}t.modifiersData[r]=R}}const zu={name:"preventOverflow",enabled:!0,phase:"main",fn:Wu,requiresIfExists:["offset"]};function Uu(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function Gu(e){return e===Se(e)||!Ee(e)?Ir(e):Uu(e)}function qu(e){var t=e.getBoundingClientRect(),n=At(t.width)/e.offsetWidth||1,r=At(t.height)/e.offsetHeight||1;return n!==1||r!==1}function Yu(e,t,n){n===void 0&&(n=!1);var r=Ee(t),a=Ee(t)&&qu(t),o=rt(t),s=Ot(e,a,n),i={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(r||!r&&!n)&&((Ne(t)!=="body"||Hr(o))&&(i=Gu(t)),Ee(t)?(l=Ot(t,!0),l.x+=t.clientLeft,l.y+=t.clientTop):o&&(l.x=jr(o))),{x:s.left+i.scrollLeft-l.x,y:s.top+i.scrollTop-l.y,width:s.width,height:s.height}}function Xu(e){var t=new Map,n=new Set,r=[];e.forEach(function(o){t.set(o.name,o)});function a(o){n.add(o.name);var s=[].concat(o.requires||[],o.requiresIfExists||[]);s.forEach(function(i){if(!n.has(i)){var l=t.get(i);l&&a(l)}}),r.push(o)}return e.forEach(function(o){n.has(o.name)||a(o)}),r}function Ju(e){var t=Xu(e);return su.reduce(function(n,r){return n.concat(t.filter(function(a){return a.phase===r}))},[])}function Zu(e){var t;return function(){return t||(t=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})})),t}}function Qu(e){var t=e.reduce(function(n,r){var a=n[r.name];return n[r.name]=a?Object.assign({},a,r,{options:Object.assign({},a.options,r.options),data:Object.assign({},a.data,r.data)}):r,n},{});return Object.keys(t).map(function(n){return t[n]})}var Na={placement:"bottom",modifiers:[],strategy:"absolute"};function Va(){for(var e=arguments.length,t=new Array(e),n=0;n * * Copyright (c) 2014-2017, Jon Schlinkert. @@ -12,4 +12,4 @@ ${Bn(n)}`),r}})}function xc(e){return we("instanceOf",{type:e})}function wc(e){r ${Bn(n)}`),r}})}function Sc(e){const t=Object.keys(e),n=t.filter(a=>{var o;return!((o=e[a])===null||o===void 0||!o.required)}),r=we("shape",{type:Object,validator(a){if(!ut(a))return!1;const o=Object.keys(a);if(n.length>0&&n.some(s=>o.indexOf(s)===-1)){const s=n.filter(i=>o.indexOf(i)===-1);return pe(s.length===1?`shape - required property "${s[0]}" is not defined.`:`shape - required properties "${s.join('", "')}" are not defined.`),!1}return o.every(s=>{if(t.indexOf(s)===-1)return this._vueTypes_isLoose===!0||(pe(`shape - shape definition does not include a "${s}" property. Allowed keys: "${t.join('", "')}".`),!1);const i=vt(e[s],a[s],!0);return typeof i=="string"&&pe(`shape - "${s}" property validation error: ${Bn(i)}`),i===!0})}});return Object.defineProperty(r,"_vueTypes_isLoose",{writable:!0,value:!1}),Object.defineProperty(r,"loose",{get(){return this._vueTypes_isLoose=!0,this}}),r}const kc=["name","validate","getter"],Ac=(()=>{var e;return(e=class{static get any(){return uc()}static get func(){return cc().def(this.defaults.func)}static get bool(){return dc().def(this.defaults.bool)}static get string(){return fc().def(this.defaults.string)}static get number(){return pc().def(this.defaults.number)}static get array(){return vc().def(this.defaults.array)}static get object(){return hc().def(this.defaults.object)}static get integer(){return gc().def(this.defaults.integer)}static get symbol(){return yc()}static get nullable(){return{type:null}}static extend(t){if(Rt(t))return t.forEach(l=>this.extend(l)),this;const{name:n,validate:r=!1,getter:a=!1}=t,o=si(t,kc);if(Et(this,n))throw new TypeError(`[VueTypes error]: Type "${n}" already defined`);const{type:s}=o;if(wn(s))return delete o.type,Object.defineProperty(this,n,a?{get:()=>Wa(n,s,o)}:{value(...l){const c=Wa(n,s,o);return c.validator&&(c.validator=c.validator.bind(c,...l)),c}});let i;return i=a?{get(){const l=Object.assign({},o);return r?De(n,l):we(n,l)},enumerable:!0}:{value(...l){const c=Object.assign({},o);let u;return u=r?De(n,c):we(n,c),c.validator&&(u.validator=c.validator.bind(u,...l)),u},enumerable:!0},Object.defineProperty(this,n,i)}}).defaults={},e.sensibleDefaults=void 0,e.config=ac,e.custom=mc,e.oneOf=bc,e.instanceOf=xc,e.oneOfType=Cc,e.arrayOf=_c,e.objectOf=wc,e.shape=Sc,e.utils={validate:(t,n)=>vt(n,t,!0)===!0,toType:(t,n,r=!1)=>r?De(t,n):we(t,n)},e})();function Oc(e={func:()=>{},bool:!0,string:"",number:0,array:()=>[],object:()=>({}),integer:0}){var t;return(t=class extends Ac{static get sensibleDefaults(){return Jt({},this.defaults)}static set sensibleDefaults(n){this.defaults=n!==!1?Jt({},n!==!0?n:e):{}}}).defaults=Jt({},e),t}let I=class extends Oc(){};var za=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Lr(e){var t={exports:{}};return e(t,t.exports),t.exports}var fn=function(e){return e&&e.Math==Math&&e},oe=fn(typeof globalThis=="object"&&globalThis)||fn(typeof window=="object"&&window)||fn(typeof self=="object"&&self)||fn(typeof za=="object"&&za)||function(){return this}()||Function("return this")(),Y=function(e){try{return!!e()}catch{return!0}},Oe=!Y(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!=7}),Ua={}.propertyIsEnumerable,Ga=Object.getOwnPropertyDescriptor,$c={f:Ga&&!Ua.call({1:2},1)?function(e){var t=Ga(this,e);return!!t&&t.enumerable}:Ua},Ln=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},Ec={}.toString,ze=function(e){return Ec.call(e).slice(8,-1)},Rc="".split,Dn=Y(function(){return!Object("z").propertyIsEnumerable(0)})?function(e){return ze(e)=="String"?Rc.call(e,""):Object(e)}:Object,et=function(e){if(e==null)throw TypeError("Can't call method on "+e);return e},Ht=function(e){return Dn(et(e))},ie=function(e){return typeof e=="object"?e!==null:typeof e=="function"},Dr=function(e,t){if(!ie(e))return e;var n,r;if(t&&typeof(n=e.toString)=="function"&&!ie(r=n.call(e))||typeof(n=e.valueOf)=="function"&&!ie(r=n.call(e))||!t&&typeof(n=e.toString)=="function"&&!ie(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},Tc={}.hasOwnProperty,re=function(e,t){return Tc.call(e,t)},Cr=oe.document,Mc=ie(Cr)&&ie(Cr.createElement),pi=function(e){return Mc?Cr.createElement(e):{}},vi=!Oe&&!Y(function(){return Object.defineProperty(pi("div"),"a",{get:function(){return 7}}).a!=7}),qa=Object.getOwnPropertyDescriptor,Nr={f:Oe?qa:function(e,t){if(e=Ht(e),t=Dr(t,!0),vi)try{return qa(e,t)}catch{}if(re(e,t))return Ln(!$c.f.call(e,t),e[t])}},ge=function(e){if(!ie(e))throw TypeError(String(e)+" is not an object");return e},Ya=Object.defineProperty,Ge={f:Oe?Ya:function(e,t,n){if(ge(e),t=Dr(t,!0),ge(n),vi)try{return Ya(e,t,n)}catch{}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},Re=Oe?function(e,t,n){return Ge.f(e,t,Ln(1,n))}:function(e,t,n){return e[t]=n,e},Vr=function(e,t){try{Re(oe,e,t)}catch{oe[e]=t}return t},ct=oe["__core-js_shared__"]||Vr("__core-js_shared__",{}),Pc=Function.toString;typeof ct.inspectSource!="function"&&(ct.inspectSource=function(e){return Pc.call(e)});var Sn,Zt,kn,hi=ct.inspectSource,Xa=oe.WeakMap,Ic=typeof Xa=="function"&&/native code/.test(hi(Xa)),gi=Lr(function(e){(e.exports=function(t,n){return ct[t]||(ct[t]=n!==void 0?n:{})})("versions",[]).push({version:"3.8.3",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})}),jc=0,Hc=Math.random(),Fr=function(e){return"Symbol("+String(e===void 0?"":e)+")_"+(++jc+Hc).toString(36)},Ja=gi("keys"),Kr=function(e){return Ja[e]||(Ja[e]=Fr(e))},Nn={},Bc=oe.WeakMap;if(Ic){var mt=ct.state||(ct.state=new Bc),Lc=mt.get,Dc=mt.has,Nc=mt.set;Sn=function(e,t){return t.facade=e,Nc.call(mt,e,t),t},Zt=function(e){return Lc.call(mt,e)||{}},kn=function(e){return Dc.call(mt,e)}}else{var Ft=Kr("state");Nn[Ft]=!0,Sn=function(e,t){return t.facade=e,Re(e,Ft,t),t},Zt=function(e){return re(e,Ft)?e[Ft]:{}},kn=function(e){return re(e,Ft)}}var tt={set:Sn,get:Zt,has:kn,enforce:function(e){return kn(e)?Zt(e):Sn(e,{})},getterFor:function(e){return function(t){var n;if(!ie(t)||(n=Zt(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},nt=Lr(function(e){var t=tt.get,n=tt.enforce,r=String(String).split("String");(e.exports=function(a,o,s,i){var l,c=!!i&&!!i.unsafe,u=!!i&&!!i.enumerable,d=!!i&&!!i.noTargetGet;typeof s=="function"&&(typeof o!="string"||re(s,"name")||Re(s,"name",o),(l=n(s)).source||(l.source=r.join(typeof o=="string"?o:""))),a!==oe?(c?!d&&a[o]&&(u=!0):delete a[o],u?a[o]=s:Re(a,o,s)):u?a[o]=s:Vr(o,s)})(Function.prototype,"toString",function(){return typeof this=="function"&&t(this).source||hi(this)})}),qn=oe,Za=function(e){return typeof e=="function"?e:void 0},Vn=function(e,t){return arguments.length<2?Za(qn[e])||Za(oe[e]):qn[e]&&qn[e][t]||oe[e]&&oe[e][t]},Vc=Math.ceil,Fc=Math.floor,Bt=function(e){return isNaN(e=+e)?0:(e>0?Fc:Vc)(e)},Kc=Math.min,ke=function(e){return e>0?Kc(Bt(e),9007199254740991):0},Wc=Math.max,zc=Math.min,An=function(e,t){var n=Bt(e);return n<0?Wc(n+t,0):zc(n,t)},Qa=function(e){return function(t,n,r){var a,o=Ht(t),s=ke(o.length),i=An(r,s);if(e&&n!=n){for(;s>i;)if((a=o[i++])!=a)return!0}else for(;s>i;i++)if((e||i in o)&&o[i]===n)return e||i||0;return!e&&-1}},yi={includes:Qa(!0),indexOf:Qa(!1)},Uc=yi.indexOf,mi=function(e,t){var n,r=Ht(e),a=0,o=[];for(n in r)!re(Nn,n)&&re(r,n)&&o.push(n);for(;t.length>a;)re(r,n=t[a++])&&(~Uc(o,n)||o.push(n));return o},On=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Gc=On.concat("length","prototype"),qc={f:Object.getOwnPropertyNames||function(e){return mi(e,Gc)}},Yc={f:Object.getOwnPropertySymbols},Xc=Vn("Reflect","ownKeys")||function(e){var t=qc.f(ge(e)),n=Yc.f;return n?t.concat(n(e)):t},Jc=function(e,t){for(var n=Xc(t),r=Ge.f,a=Nr.f,o=0;o1?arguments[1]:void 0)}});(function(){function e(){ht(this,e)}return gt(e,null,[{key:"isInBrowser",value:function(){return typeof window<"u"}},{key:"isServer",value:function(){return typeof window>"u"}},{key:"getUA",value:function(){return e.isInBrowser()?window.navigator.userAgent.toLowerCase():""}},{key:"isMobile",value:function(){return/Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(navigator.appVersion)}},{key:"isOpera",value:function(){return navigator.userAgent.indexOf("Opera")!==-1}},{key:"isIE",value:function(){var t=e.getUA();return t!==""&&t.indexOf("msie")>0}},{key:"isIE9",value:function(){var t=e.getUA();return t!==""&&t.indexOf("msie 9.0")>0}},{key:"isEdge",value:function(){var t=e.getUA();return t!==""&&t.indexOf("edge/")>0}},{key:"isChrome",value:function(){var t=e.getUA();return t!==""&&/chrome\/\d+/.test(t)&&!e.isEdge()}},{key:"isPhantomJS",value:function(){var t=e.getUA();return t!==""&&/phantomjs/.test(t)}},{key:"isFirefox",value:function(){var t=e.getUA();return t!==""&&/firefox/.test(t)}}]),e})();var sd=[].join,ud=Dn!=Object,cd=Wr("join",",");ve({target:"Array",proto:!0,forced:ud||!cd},{join:function(e){return sd.call(Ht(this),e===void 0?",":e)}});var bt,$n,qe=function(e){return Object(et(e))},Mt=Array.isArray||function(e){return ze(e)=="Array"},Ci=!!Object.getOwnPropertySymbols&&!Y(function(){return!String(Symbol())}),dd=Ci&&!Symbol.sham&&typeof Symbol.iterator=="symbol",pn=gi("wks"),Qt=oe.Symbol,fd=dd?Qt:Qt&&Qt.withoutSetter||Fr,Q=function(e){return re(pn,e)||(Ci&&re(Qt,e)?pn[e]=Qt[e]:pn[e]=fd("Symbol."+e)),pn[e]},pd=Q("species"),Fn=function(e,t){var n;return Mt(e)&&(typeof(n=e.constructor)!="function"||n!==Array&&!Mt(n.prototype)?ie(n)&&(n=n[pd])===null&&(n=void 0):n=void 0),new(n===void 0?Array:n)(t===0?0:t)},Pt=function(e,t,n){var r=Dr(t);r in e?Ge.f(e,r,Ln(0,n)):e[r]=n},Xn=Vn("navigator","userAgent")||"",ro=oe.process,ao=ro&&ro.versions,oo=ao&&ao.v8;oo?$n=(bt=oo.split("."))[0]+bt[1]:Xn&&(!(bt=Xn.match(/Edge\/(\d+)/))||bt[1]>=74)&&(bt=Xn.match(/Chrome\/(\d+)/))&&($n=bt[1]);var En=$n&&+$n,vd=Q("species"),zr=function(e){return En>=51||!Y(function(){var t=[];return(t.constructor={})[vd]=function(){return{foo:1}},t[e](Boolean).foo!==1})},hd=zr("splice"),gd=Lt("splice",{ACCESSORS:!0,0:0,1:2}),yd=Math.max,md=Math.min;ve({target:"Array",proto:!0,forced:!hd||!gd},{splice:function(e,t){var n,r,a,o,s,i,l=qe(this),c=ke(l.length),u=An(e,c),d=arguments.length;if(d===0?n=r=0:d===1?(n=0,r=c-u):(n=d-2,r=md(yd(Bt(t),0),c-u)),c+n-r>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(a=Fn(l,r),o=0;oc-r+n;o--)delete l[o-1]}else if(n>r)for(o=c-r;o>u;o--)i=o+n-1,(s=o+r-1)in l?l[i]=l[s]:delete l[i];for(o=0;o0&&(!o.multiline||o.multiline&&e[o.lastIndex-1]!==` `)&&(l="(?: "+l+")",u=" "+u,c++),n=new RegExp("^(?:"+l+")",i)),er&&(n=new RegExp("^"+l+"$(?!\\s)",i)),Qn&&(t=o.lastIndex),r=Rn.call(s?n:o,u),s?r?(r.input=r.input.slice(c),r[0]=r[0].slice(c),r.index=o.lastIndex,o.lastIndex+=r[0].length):o.lastIndex=0:Qn&&r&&(o.lastIndex=o.global?r.index+r[0].length:t),er&&r&&r.length>1&&xd.call(r[0],n,function(){for(a=1;a")!=="7"}),uo="a".replace(/./,"$0")==="$0",co=Q("replace"),fo=!!/./[co]&&/./[co]("a","$0")==="",Od=!Y(function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return n.length!==2||n[0]!=="a"||n[1]!=="b"}),Oi=function(e,t,n,r){var a=Q(e),o=!Y(function(){var d={};return d[a]=function(){return 7},""[e](d)!=7}),s=o&&!Y(function(){var d=!1,v=/a/;return e==="split"&&((v={}).constructor={},v.constructor[kd]=function(){return v},v.flags="",v[a]=/./[a]),v.exec=function(){return d=!0,null},v[a](""),!d});if(!o||!s||e==="replace"&&(!Ad||!uo||fo)||e==="split"&&!Od){var i=/./[a],l=n(a,""[e],function(d,v,f,m,y){return v.exec===rn?o&&!y?{done:!0,value:i.call(v,f,m)}:{done:!0,value:d.call(f,v,m)}:{done:!1}},{REPLACE_KEEPS_$0:uo,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:fo}),c=l[0],u=l[1];nt(String.prototype,e,c),nt(RegExp.prototype,a,t==2?function(d,v){return u.call(d,this,v)}:function(d){return u.call(d,this)})}r&&Re(RegExp.prototype[a],"sham",!0)},$d=Q("match"),$i=function(e){var t;return ie(e)&&((t=e[$d])!==void 0?!!t:ze(e)=="RegExp")},Gr=function(e){if(typeof e!="function")throw TypeError(String(e)+" is not a function");return e},Ed=Q("species"),po=function(e){return function(t,n){var r,a,o=String(et(t)),s=Bt(n),i=o.length;return s<0||s>=i?e?"":void 0:(r=o.charCodeAt(s))<55296||r>56319||s+1===i||(a=o.charCodeAt(s+1))<56320||a>57343?e?o.charAt(s):r:e?o.slice(s,s+2):a-56320+(r-55296<<10)+65536}},Ei={codeAt:po(!1),charAt:po(!0)},Rd=Ei.charAt,Ri=function(e,t,n){return t+(n?Rd(e,t).length:1)},xr=function(e,t){var n=e.exec;if(typeof n=="function"){var r=n.call(e,t);if(typeof r!="object")throw TypeError("RegExp exec method returned something other than an Object or null");return r}if(ze(e)!=="RegExp")throw TypeError("RegExp#exec called on incompatible receiver");return rn.call(e,t)},Td=[].push,Md=Math.min,Ct=!Y(function(){return!RegExp(4294967295,"y")});Oi("split",2,function(e,t,n){var r;return r="abbc".split(/(b)*/)[1]=="c"||"test".split(/(?:)/,-1).length!=4||"ab".split(/(?:ab)*/).length!=2||".".split(/(.?)(.?)/).length!=4||".".split(/()()/).length>1||"".split(/.?/).length?function(a,o){var s=String(et(this)),i=o===void 0?4294967295:o>>>0;if(i===0)return[];if(a===void 0)return[s];if(!$i(a))return t.call(s,a,i);for(var l,c,u,d=[],v=(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.unicode?"u":"")+(a.sticky?"y":""),f=0,m=new RegExp(a.source,v+"g");(l=rn.call(m,s))&&!((c=m.lastIndex)>f&&(d.push(s.slice(f,l.index)),l.length>1&&l.index=i));)m.lastIndex===l.index&&m.lastIndex++;return f===s.length?!u&&m.test("")||d.push(""):d.push(s.slice(f)),d.length>i?d.slice(0,i):d}:"0".split(void 0,0).length?function(a,o){return a===void 0&&o===0?[]:t.call(this,a,o)}:t,[function(a,o){var s=et(this),i=a==null?void 0:a[e];return i!==void 0?i.call(a,s,o):r.call(String(s),a,o)},function(a,o){var s=n(r,a,this,o,r!==t);if(s.done)return s.value;var i=ge(a),l=String(this),c=function(w,$){var O,M=ge(w).constructor;return M===void 0||(O=ge(M)[Ed])==null?$:Gr(O)}(i,RegExp),u=i.unicode,d=(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.unicode?"u":"")+(Ct?"y":"g"),v=new c(Ct?i:"^(?:"+i.source+")",d),f=o===void 0?4294967295:o>>>0;if(f===0)return[];if(l.length===0)return xr(v,l)===null?[l]:[];for(var m=0,y=0,g=[];y1?arguments[1]:void 0,t.length)),r=String(e);return vo?vo.call(t,r,n):t.slice(n,n+r.length)===r}});var _t=function(e){return typeof e=="string"},xt=function(e){return e!==null&&Mi(e)==="object"},an=function(){function e(){ht(this,e)}return gt(e,null,[{key:"isWindow",value:function(t){return t===window}},{key:"addEventListener",value:function(t,n,r){var a=arguments.length>3&&arguments[3]!==void 0&&arguments[3];t&&n&&r&&t.addEventListener(n,r,a)}},{key:"removeEventListener",value:function(t,n,r){var a=arguments.length>3&&arguments[3]!==void 0&&arguments[3];t&&n&&r&&t.removeEventListener(n,r,a)}},{key:"triggerDragEvent",value:function(t,n){var r=!1,a=function(s){var i;(i=n.drag)===null||i===void 0||i.call(n,s)},o=function s(i){var l;e.removeEventListener(document,"mousemove",a),e.removeEventListener(document,"mouseup",s),document.onselectstart=null,document.ondragstart=null,r=!1,(l=n.end)===null||l===void 0||l.call(n,i)};e.addEventListener(t,"mousedown",function(s){var i;r||(document.onselectstart=function(){return!1},document.ondragstart=function(){return!1},e.addEventListener(document,"mousemove",a),e.addEventListener(document,"mouseup",o),r=!0,(i=n.start)===null||i===void 0||i.call(n,s))})}},{key:"getBoundingClientRect",value:function(t){return t&&xt(t)&&t.nodeType===1?t.getBoundingClientRect():null}},{key:"hasClass",value:function(t,n){return!!(t&&xt(t)&&_t(n)&&t.nodeType===1)&&t.classList.contains(n.trim())}},{key:"addClass",value:function(t,n){if(t&&xt(t)&&_t(n)&&t.nodeType===1&&(n=n.trim(),!e.hasClass(t,n))){var r=t.className;t.className=r?r+" "+n:n}}},{key:"removeClass",value:function(t,n){if(t&&xt(t)&&_t(n)&&t.nodeType===1&&typeof t.className=="string"){n=n.trim();for(var r=t.className.trim().split(" "),a=r.length-1;a>=0;a--)r[a]=r[a].trim(),r[a]&&r[a]!==n||r.splice(a,1);t.className=r.join(" ")}}},{key:"toggleClass",value:function(t,n,r){t&&xt(t)&&_t(n)&&t.nodeType===1&&t.classList.toggle(n,r)}},{key:"replaceClass",value:function(t,n,r){t&&xt(t)&&_t(n)&&_t(r)&&t.nodeType===1&&(n=n.trim(),r=r.trim(),e.removeClass(t,n),e.addClass(t,r))}},{key:"getScrollTop",value:function(t){var n="scrollTop"in t?t.scrollTop:t.pageYOffset;return Math.max(n,0)}},{key:"setScrollTop",value:function(t,n){"scrollTop"in t?t.scrollTop=n:t.scrollTo(t.scrollX,n)}},{key:"getRootScrollTop",value:function(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0}},{key:"setRootScrollTop",value:function(t){e.setScrollTop(window,t),e.setScrollTop(document.body,t)}},{key:"getElementTop",value:function(t,n){if(e.isWindow(t))return 0;var r=n?e.getScrollTop(n):e.getRootScrollTop();return t.getBoundingClientRect().top+r}},{key:"getVisibleHeight",value:function(t){return e.isWindow(t)?t.innerHeight:t.getBoundingClientRect().height}},{key:"isHidden",value:function(t){if(!t)return!1;var n=window.getComputedStyle(t),r=n.display==="none",a=t.offsetParent===null&&n.position!=="fixed";return r||a}},{key:"triggerEvent",value:function(t,n){if("createEvent"in document){var r=document.createEvent("HTMLEvents");r.initEvent(n,!1,!0),t.dispatchEvent(r)}}},{key:"calcAngle",value:function(t,n){var r=t.getBoundingClientRect(),a=r.left+r.width/2,o=r.top+r.height/2,s=Math.abs(a-n.clientX),i=Math.abs(o-n.clientY),l=i/Math.sqrt(Math.pow(s,2)+Math.pow(i,2)),c=Math.acos(l),u=Math.floor(180/(Math.PI/c));return n.clientX>a&&n.clientY>o&&(u=180-u),n.clientX==a&&n.clientY>o&&(u=180),n.clientX>a&&n.clientY==o&&(u=90),n.clientXo&&(u=180+u),n.clientX1?r-1:0),o=1;o]*>)/g,Jd=/\$([$&'`]|\d\d?)/g,Zd=function(e,t,n,r,a,o){var s=n+e.length,i=r.length,l=Jd;return a!==void 0&&(a=qe(a),l=Xd),Yd.call(o,l,function(c,u){var d;switch(u.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(s);case"<":d=a[u.slice(1,-1)];break;default:var v=+u;if(v===0)return c;if(v>i){var f=qd(v/10);return f===0?c:f<=i?r[f-1]===void 0?u.charAt(1):r[f-1]+u.charAt(1):c}d=r[v-1]}return d===void 0?"":d})},Qd=Math.max,ef=Math.min;Oi("replace",2,function(e,t,n,r){var a=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,o=r.REPLACE_KEEPS_$0,s=a?"$":"$0";return[function(i,l){var c=et(this),u=i==null?void 0:i[e];return u!==void 0?u.call(i,c,l):t.call(String(c),i,l)},function(i,l){if(!a&&o||typeof l=="string"&&l.indexOf(s)===-1){var c=n(t,i,this,l);if(c.done)return c.value}var u=ge(i),d=String(this),v=typeof l=="function";v||(l=String(l));var f=u.global;if(f){var m=u.unicode;u.lastIndex=0}for(var y=[];;){var g=xr(u,d);if(g===null||(y.push(g),!f))break;String(g[0])===""&&(u.lastIndex=Ri(d,ke(u.lastIndex),m))}for(var p,C="",_=0,w=0;w=_&&(C+=d.slice(_,O)+b,_=O+$.length)}return C+d.slice(_)}]});(function(){function e(){ht(this,e)}return gt(e,null,[{key:"camelize",value:function(t){return t.replace(/-(\w)/g,function(n,r){return r?r.toUpperCase():""})}},{key:"capitalize",value:function(t){return t.charAt(0).toUpperCase()+t.slice(1)}}]),e})();(function(){function e(){ht(this,e)}return gt(e,null,[{key:"_clone",value:function(){}}]),e})();var Pi=Q("isConcatSpreadable"),tf=En>=51||!Y(function(){var e=[];return e[Pi]=!1,e.concat()[0]!==e}),nf=zr("concat"),rf=function(e){if(!ie(e))return!1;var t=e[Pi];return t!==void 0?!!t:Mt(e)};ve({target:"Array",proto:!0,forced:!tf||!nf},{concat:function(e){var t,n,r,a,o,s=qe(this),i=Fn(s,0),l=0;for(t=-1,r=arguments.length;t9007199254740991)throw TypeError("Maximum allowed index exceeded");for(n=0;n=9007199254740991)throw TypeError("Maximum allowed index exceeded");Pt(i,l++,o)}return i.length=l,i}});var rr,un=function(e,t,n){if(Gr(e),t===void 0)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(r){return e.call(t,r)};case 2:return function(r,a){return e.call(t,r,a)};case 3:return function(r,a,o){return e.call(t,r,a,o)}}return function(){return e.apply(t,arguments)}},ho=[].push,Je=function(e){var t=e==1,n=e==2,r=e==3,a=e==4,o=e==6,s=e==7,i=e==5||o;return function(l,c,u,d){for(var v,f,m=qe(l),y=Dn(m),g=un(c,u,3),p=ke(y.length),C=0,_=d||Fn,w=t?_(l,p):n||s?_(l,0):void 0;p>C;C++)if((i||C in y)&&(f=g(v=y[C],C,m),e))if(t)w[C]=f;else if(f)switch(e){case 3:return!0;case 5:return v;case 6:return C;case 2:ho.call(w,v)}else switch(e){case 4:return!1;case 7:ho.call(w,v)}return o?-1:r||a?a:w}},Ii={forEach:Je(0),map:Je(1),filter:Je(2),some:Je(3),every:Je(4),find:Je(5),findIndex:Je(6),filterOut:Je(7)},af=Oe?Object.defineProperties:function(e,t){ge(e);for(var n,r=qr(t),a=r.length,o=0;a>o;)Ge.f(e,n=r[o++],t[n]);return e},of=Vn("document","documentElement"),ji=Kr("IE_PROTO"),ar=function(){},go=function(e){return" - + + diff --git a/vue/src/api/db.ts b/vue/src/api/db.ts index 8691ccd..a1d08c3 100644 --- a/vue/src/api/db.ts +++ b/vue/src/api/db.ts @@ -161,4 +161,151 @@ export interface RenameFileParams { export const renameFile = async (data: RenameFileParams) => { const resp = await axiosInst.value.post('/db/rename', data) return resp.data as Promise<{ new_path:string }> +} + +// ===== Natural language topic clustering ===== +export interface BuildIibOutputEmbeddingsReq { + folder?: string + model?: string + force?: boolean + batch_size?: number + max_chars?: number +} + +export interface BuildIibOutputEmbeddingsResp { + folder: string + count: number + updated: number + skipped: number + model: string +} + +export const buildIibOutputEmbeddings = async (req: BuildIibOutputEmbeddingsReq) => { + const resp = await axiosInst.value.post('/db/build_iib_output_embeddings', req) + return resp.data as BuildIibOutputEmbeddingsResp +} + +export interface ClusterIibOutputReq { + folder?: string + folder_paths?: string[] + model?: string + force_embed?: boolean + threshold?: number + batch_size?: number + max_chars?: number + min_cluster_size?: number + lang?: string + // advanced (backend-supported; optional) + force_title?: boolean + use_title_cache?: boolean + assign_noise_threshold?: number +} + +export interface ClusterIibOutputResp { + folder: string + model: string + threshold: number + min_cluster_size: number + count: number + clusters: Array<{ + id: string + title: string + size: number + paths: string[] + sample_prompt: string + }> + noise: string[] +} + +// ===== Async clustering job (progress polling) ===== +export interface ClusterIibOutputJobStartResp { + job_id: string +} + +export interface ClusterIibOutputJobStatusResp { + job_id: string + status: 'queued' | 'running' | 'done' | 'error' + stage?: string + folders?: string[] + progress?: { + // embedding totals + scanned?: number + to_embed?: number + embedded_done?: number + updated?: number + skipped?: number + folder?: string + // clustering + items_total?: number + items_done?: number + // titling + clusters_total?: number + clusters_done?: number + } + error?: string + result?: ClusterIibOutputResp +} + +export const startClusterIibOutputJob = async (req: ClusterIibOutputReq) => { + const resp = await axiosInst.value.post('/db/cluster_iib_output_job_start', req) + return resp.data as ClusterIibOutputJobStartResp +} + +export const getClusterIibOutputJobStatus = async (job_id: string) => { + const resp = await axiosInst.value.get('/db/cluster_iib_output_job_status', { params: { job_id } }) + return resp.data as ClusterIibOutputJobStatusResp +} + +export interface ClusterIibOutputCachedResp { + cache_key: string + cache_hit: boolean + cached_at?: string + stale: boolean + stale_reason?: { + folders_changed?: boolean + reason?: string + path?: string + stored?: string + current?: string + embeddings_changed?: boolean + embeddings_count?: number + embeddings_max_updated_at?: string + } + result?: ClusterIibOutputResp | null +} + +export const getClusterIibOutputCached = async (req: ClusterIibOutputReq) => { + const resp = await axiosInst.value.post('/db/cluster_iib_output_cached', req) + return resp.data as ClusterIibOutputCachedResp +} + +// ===== Natural language prompt query (RAG-like retrieval) ===== +export interface PromptSearchReq { + query: string + folder?: string + folder_paths?: string[] + model?: string + top_k?: number + min_score?: number + ensure_embed?: boolean + max_chars?: number +} + +export interface PromptSearchResp { + query: string + folder: string + model: string + count: number + top_k: number + results: Array<{ + id: number + path: string + score: number + sample_prompt: string + }> +} + +export const searchIibOutputByPrompt = async (req: PromptSearchReq) => { + const resp = await axiosInst.value.post('/db/search_iib_output_by_prompt', req, { timeout: Infinity }) + return resp.data as PromptSearchResp } \ No newline at end of file diff --git a/vue/src/api/files.ts b/vue/src/api/files.ts index 917891b..5673973 100644 --- a/vue/src/api/files.ts +++ b/vue/src/api/files.ts @@ -30,7 +30,7 @@ export const getTargetFolderFiles = async (folder_path: string) => { export const deleteFiles = async (file_paths: string[]) => { const resp = await axiosInst.value.post('/delete_files', { file_paths }) - return resp.data as { files: FileNodeInfo[] } + return resp.data as { ok: true } } export const moveFiles = async ( diff --git a/vue/src/api/index.ts b/vue/src/api/index.ts index 8ce7a38..0e5d516 100644 --- a/vue/src/api/index.ts +++ b/vue/src/api/index.ts @@ -69,7 +69,7 @@ const addInterceptor = (axiosInst: AxiosInstance) => { (resp) => resp, async (err) => { if (isAxiosError(err)) { - if (err.response?.status === 401) { + if (err.response?.status === 401 && err.response?.data?.detail?.type === 'secret_verification_failed') { const key = await promptServerKeyOnce() if (!key) { // user cancelled; leave the request rejected as-is @@ -154,6 +154,15 @@ export const getGlobalSetting = async () => { return data } +/** + * 获取后端原始 global_setting(包含 app_fe_setting),不受 isSync() 影响。 + * 仅在确实需要使用后端 KV(GlobalSetting 表)做持久化时使用。 + */ +export const getGlobalSettingRaw = async () => { + const resp = await axiosInst.value.get('/global_setting') + return resp.data as GlobalConf +} + export const getVersion = async () => { const resp = await axiosInst.value.get('/version') return resp.data as { hash?: string, tag?: string } @@ -207,6 +216,14 @@ export const setAppFeSetting = async (name: keyof GlobalConf['app_fe_setting'], await axiosInst.value.post('/app_fe_setting', { name, value: JSON.stringify(setting) }) } +/** + * 强制写入后端 app_fe_setting KV,不依赖 isSync()。 + * 用于需要“后端持久化”的少量功能开关/配置(例如 TopicSearch 的向量化范围)。 + */ +export const setAppFeSettingForce = async (name: string, setting: Record) => { + await axiosInst.value.post('/app_fe_setting', { name, value: JSON.stringify(setting) }) +} + export const removeAppFeSetting = async (name: keyof GlobalConf['app_fe_setting']) => { if (!isSync()) return await axiosInst.value.delete('/app_fe_setting', { data: { name } }) @@ -214,4 +231,39 @@ export const removeAppFeSetting = async (name: keyof GlobalConf['app_fe_setting' export const setTargetFrameAsCover = async (body: { path: string, base64_img: string, updated_time: string }) => { await axiosInst.value.post('/set_target_frame_as_video_cover', body) +} + +// AI 相关 API +export interface AIChatMessage { + role: 'user' | 'assistant' | 'system' + content: string +} + +export interface AIChatRequest { + messages: AIChatMessage[] + temperature?: number + max_tokens?: number + stream?: boolean +} + +export interface AIChatResponse { + id: string + object: string + created: number + model: string + choices: Array<{ + index: number + message: AIChatMessage + finish_reason: string + }> + usage: { + prompt_tokens: number + completion_tokens: number + total_tokens: number + } +} + +export const aiChat = async (req: AIChatRequest) => { + const resp = await axiosInst.value.post('/ai-chat', req) + return resp.data as AIChatResponse } \ No newline at end of file diff --git a/vue/src/i18n/de.ts b/vue/src/i18n/de.ts index 95502e0..143e1e0 100644 --- a/vue/src/i18n/de.ts +++ b/vue/src/i18n/de.ts @@ -20,6 +20,53 @@ export const de: Partial = { exclude: 'Ausschliessen', showTiktokNavigator: 'Navigationsschaltflächen anzeigen', showTiktokNavigatorDesc: 'Zeigen Sie die Navigationstasten (Pfeile nach oben/unten) in der TikTok-Ansicht an', + + // ===== Topic Search (Experimental) ===== + topicSearchExperimental: 'Natürliche Sprach-Kategorisierung & Suche (Experimentell)', + topicSearchTitleExperimental: 'Natürliche Sprach-Kategorisierung & Suche (Experimentell)', + topicSearchScope: 'Bereich', + topicSearchNeedScope: 'Bitte zuerst einen Bereich (Ordner) auswählen', + topicSearchQueryPlaceholder: 'Geben Sie einen Satz ein, um ähnliche Bilder zu finden (RAG-ähnliche Suche)', + topicSearchOpenResults: 'Ergebnisse öffnen', + topicSearchThreshold: 'Schwelle', + topicSearchMinClusterSize: 'Min. Cluster', + topicSearchEmptyNoScope: 'Bitte zuerst einen Bereich auswählen, dann aktualisieren/kategorisieren', + topicSearchEmptyNoTopics: 'Noch keine Themen (versuchen Sie „Min. Cluster“ zu verringern oder „Schwelle“ anzupassen)', + topicSearchChooseScope: 'Bereich auswählen', + topicSearchRefreshAndCluster: 'Aktualisieren/Kategorisieren', + topicSearchScopeModalTitle: 'Vektorisierungsbereich auswählen (Ordner)', + topicSearchScopeTip: 'Standardmäßig ist kein Bereich aktiviert. Sie müssen Ordner auswählen, um zu kategorisieren/suchen. Bereich stammt aus QuickMovePaths.', + topicSearchSavingToBackend: 'Wird im Backend gespeichert...', + topicSearchScopePlaceholder: 'Ordner auswählen (Mehrfachauswahl)', + topicSearchRecallMsg: '{0} / {1} abgerufen (TopK={2})', + topicSearchCacheStale: 'Zwischengespeichertes Ergebnis wird angezeigt (Update verfügbar)', + topicSearchCacheStaleDesc: 'Ordner im ausgewählten Bereich könnten geändert worden sein. Der Cache könnte veraltet sein. Klicken Sie auf „Update“, um Themen neu zu erzeugen (Index wird zuerst aktualisiert).', + topicSearchCacheUpdate: 'Cache aktualisieren', + + topicSearchGuideTitle: 'Schnellstart (Experimentell)', + topicSearchGuideStep1: 'Wählen Sie die Ordner (Bereich) zur Analyse aus (Mehrfachauswahl)', + topicSearchGuideStep2: 'Klicken Sie auf „Aktualisieren", um Themenkarten zu erzeugen (inkrementelle Vektorisierung)', + topicSearchGuideStep3: 'Geben Sie einen Satz ein, um zu suchen; ähnliche Bilder werden abgerufen und die Ergebnisse geöffnet', + topicSearchGuideAdvantage1: 'Automatische Gruppierung nach semantischer Ähnlichkeit: KI entdeckt automatisch ähnliche Themen ohne manuelle Kategorisierung', + topicSearchGuideAdvantage2: 'Natürliche Sprachsemantiksuche: Schnelles Finden verwandter Bilder mit einem Satz, ähnlich der RAG-Suche', + topicSearchGuideEmptyReasonNoScope: 'Leer, weil: kein Bereich ausgewählt (standardmäßig deaktiviert). Klicken Sie auf „Bereich“, um Ordner zu wählen.', + topicSearchGuideEmptyReasonNoTopics: 'Leer, weil: für diesen Bereich noch keine Themen erzeugt wurden (Aktualisieren oder Min. Cluster/Schwelle senken).', + topicSearchRequirementsTitle: 'Voraussetzungen', + topicSearchRequirementsOpenai: 'Erforderlich: OPENAI_BASE_URL und OPENAI_API_KEY (Backend-Umgebungsvariablen)', + topicSearchRequirementsDepsPython: 'Erforderlich: Python-Abhängigkeiten numpy und hnswlib (ohne sie ist die Funktion deaktiviert)', + topicSearchRequirementsDepsDesktop: 'Desktop-App: Abhängigkeiten sind enthalten (numpy/hnswlib müssen nicht installiert werden)', + topicSearchRequirementsInstallCmd: 'Installation: pip install numpy hnswlib', + topicSearchJobFailed: 'Job fehlgeschlagen', + topicSearchJobStage: 'Phase', + topicSearchJobQueued: 'Job in Warteschlange…', + topicSearchJobStageEmbedding: 'Vektorisierung…', + topicSearchJobStageClustering: 'Clustering…', + topicSearchJobStageTitling: 'Titel werden erzeugt…', + topicSearchJobStageDone: 'Fertig', + topicSearchJobStageError: 'Fehler', + topicSearchJobEmbeddingDesc: '{0}/{1} vektorisiert (gescannt {2}); aktuell: {3}', + topicSearchJobClusteringDesc: 'Clustering {0}/{1}', + topicSearchJobTitlingDesc: 'Titel {0}/{1}', 'auto.refreshed': 'Automatische Aktualisierung erfolgreich durchgeführt!', copied: 'In die Zwischenablage kopiert!', 'index.expired': 'Index abgelaufen, automatische Aktualisierung wird durchgeführt', @@ -81,6 +128,7 @@ export const de: Partial = { 'Fehler beim Senden des Bildes. Bitte kontaktieren Sie den Entwickler mit der Fehlermeldung aus der Konsole.', confirmDelete: 'Sind Sie sicher, dass Sie dies löschen möchten?', deleteSuccess: 'Erfolgreich gelöscht', + moveToTrashSuccess: 'In den Papierkorb verschoben', doubleClickToCopy: 'Doppelklick zum Kopieren', root: 'Root', drive: ' Laufwerk', @@ -148,5 +196,13 @@ export const de: Partial = { sortByDate: 'Nach Datum sortieren', fileTypeFilter: 'Dateityp-Filter', allFiles: 'Alle Dateien', - audio: 'Audio' + audio: 'Audio', + aiAnalyzeTags: 'KI-Tags analysieren', + aiAnalyzeTagsNoPrompt: 'Kein Prompt gefunden', + aiAnalyzeTagsNoCustomTags: 'Keine benutzerdefinierten Tags verfügbar', + aiAnalyzeTagsNoMatchedTags: 'KI hat keine passenden Tags gefunden', + aiAnalyzeTagsNoValidTags: 'Keine gültigen passenden Tags gefunden', + aiAnalyzeTagsAllTagsAlreadyAdded: 'Alle passenden Tags wurden bereits zum Bild hinzugefügt', + aiAnalyzeTagsSuccess: '{0} Tags hinzugefügt: {1}', + aiAnalyzeTagsFailed: 'KI-Tag-Analyse fehlgeschlagen, bitte Konfiguration überprüfen' } diff --git a/vue/src/i18n/en.ts b/vue/src/i18n/en.ts index ec5f82e..b350c42 100644 --- a/vue/src/i18n/en.ts +++ b/vue/src/i18n/en.ts @@ -20,6 +20,53 @@ export const en: IIBI18nMap = { clearCacheIfNotTakeEffect: 'If the changes do not take effect, try clearing the page cache', showTiktokNavigator: 'Show Navigation Buttons', showTiktokNavigatorDesc: 'Show the navigation buttons (up/down arrows) in TikTok view', + + // ===== Topic Search (Experimental) ===== + topicSearchExperimental: 'Natural Language Categorization & Search (Experimental)', + topicSearchTitleExperimental: 'Natural Language Categorization & Search (Experimental)', + topicSearchScope: 'Scope', + topicSearchNeedScope: 'Please select a scope folder first', + topicSearchQueryPlaceholder: 'Type a sentence to retrieve similar images (RAG-like retrieval)', + topicSearchOpenResults: 'Open results', + topicSearchThreshold: 'Threshold', + topicSearchMinClusterSize: 'Min cluster', + topicSearchEmptyNoScope: 'Please select a scope, then refresh/categorize', + topicSearchEmptyNoTopics: 'No topics yet (try lowering “Min cluster” or adjusting “Threshold”)', + topicSearchChooseScope: 'Select scope', + topicSearchRefreshAndCluster: 'Refresh/Categorize', + topicSearchScopeModalTitle: 'Select vectorization scope (folders)', + topicSearchScopeTip: 'No scope is enabled by default. You must select folders to categorize/search. Scope comes from QuickMovePaths.', + topicSearchSavingToBackend: 'Saving to backend...', + topicSearchScopePlaceholder: 'Select folders (multi-select)', + topicSearchRecallMsg: 'Retrieved {0} / {1} (TopK={2})', + topicSearchCacheStale: 'Showing cached result (update available)', + topicSearchCacheStaleDesc: 'Folders in the selected scope may have changed. The cache may be stale. Click Update to regenerate topics (will update index first).', + topicSearchCacheUpdate: 'Update cache', + + topicSearchGuideTitle: 'Quick Start (Experimental)', + topicSearchGuideStep1: 'Select the scope folders to analyze (multi-select)', + topicSearchGuideStep2: 'Click Refresh to generate topic cards (incremental vectorization)', + topicSearchGuideStep3: 'Type a sentence to search; it will retrieve similar images and open the result page', + topicSearchGuideAdvantage1: 'Auto-grouping by semantic similarity: AI automatically discovers similar themes without manual categorization', + topicSearchGuideAdvantage2: 'Natural language semantic search: Quickly find related images with a sentence, similar to RAG retrieval', + topicSearchGuideEmptyReasonNoScope: 'Empty because: no scope selected (disabled by default). Click “Scope” to choose folders.', + topicSearchGuideEmptyReasonNoTopics: 'Empty because: no topics generated yet for this scope (try Refresh or lower Min cluster/Threshold).', + topicSearchRequirementsTitle: 'Requirements', + topicSearchRequirementsOpenai: 'Required: OPENAI_BASE_URL and OPENAI_API_KEY (backend environment variables)', + topicSearchRequirementsDepsPython: 'Required: Python deps numpy and hnswlib (feature is disabled if missing)', + topicSearchRequirementsDepsDesktop: 'Desktop app: deps are bundled (no need to install numpy/hnswlib)', + topicSearchRequirementsInstallCmd: 'Install: pip install numpy hnswlib', + topicSearchJobFailed: 'Job failed', + topicSearchJobStage: 'Stage', + topicSearchJobQueued: 'Job queued…', + topicSearchJobStageEmbedding: 'Embedding…', + topicSearchJobStageClustering: 'Clustering…', + topicSearchJobStageTitling: 'Generating titles…', + topicSearchJobStageDone: 'Done', + topicSearchJobStageError: 'Error', + topicSearchJobEmbeddingDesc: 'Embedded {0}/{1} (scanned {2}); current: {3}', + topicSearchJobClusteringDesc: 'Clustering {0}/{1}', + topicSearchJobTitlingDesc: 'Titling {0}/{1}', success: 'Success', setCurrFrameAsVideoPoster: 'Set Current Frame as Video Cover', sync: 'Sync', @@ -269,6 +316,7 @@ You can specify which snapshot to restore to when starting IIB in the global set 'Failed to send image. Please contact the developer with the error message from the console.', confirmDelete: 'Are you sure you want to delete?', deleteSuccess: 'Deleted successfully', + moveToTrashSuccess: 'Moved to trash', doubleClickToCopy: 'Double-click to copy', root: 'Root', drive: ' drive', @@ -384,5 +432,13 @@ You can specify which snapshot to restore to when starting IIB in the global set 'autoTag.fields.seed': 'Seed', 'autoTag.operators.contains': 'Contains', 'autoTag.operators.equals': 'Equals', - 'autoTag.operators.regex': 'Regex' + 'autoTag.operators.regex': 'Regex', + aiAnalyzeTags: 'AI Analyze Tags', + aiAnalyzeTagsNoPrompt: 'No prompt found', + aiAnalyzeTagsNoCustomTags: 'No custom tags available', + aiAnalyzeTagsNoMatchedTags: 'AI found no matching tags', + aiAnalyzeTagsNoValidTags: 'No valid matching tags found', + aiAnalyzeTagsAllTagsAlreadyAdded: 'All matched tags have already been added to the image', + aiAnalyzeTagsSuccess: 'Added {0} tags: {1}', + aiAnalyzeTagsFailed: 'AI tag analysis failed, please check configuration' } diff --git a/vue/src/i18n/zh-hans.ts b/vue/src/i18n/zh-hans.ts index b93c565..b016de2 100644 --- a/vue/src/i18n/zh-hans.ts +++ b/vue/src/i18n/zh-hans.ts @@ -18,6 +18,53 @@ export const zhHans = { clearCacheIfNotTakeEffect: '如果更改没有生效,请尝试清理页面缓存', showTiktokNavigator: '显示导航按钮', showTiktokNavigatorDesc: '在 TikTok 视图中显示导航按钮(上/下箭头)', + + // ===== Topic Search (Experimental) ===== + topicSearchExperimental: '自然语言分类&搜索(实验性)', + topicSearchTitleExperimental: '自然语言分类 & 搜索(实验性)', + topicSearchScope: '范围', + topicSearchNeedScope: '请先选择向量化范围(文件夹)', + topicSearchQueryPlaceholder: '输入一句话,召回相似图片(RAG 召回)', + topicSearchOpenResults: '打开结果', + topicSearchThreshold: '阈值', + topicSearchMinClusterSize: '最小组', + topicSearchEmptyNoScope: '请先选择范围,然后刷新/归类', + topicSearchEmptyNoTopics: '暂无主题结果(可尝试降低“最小组”或调整“阈值”)', + topicSearchChooseScope: '选择范围', + topicSearchRefreshAndCluster: '刷新/归类', + topicSearchScopeModalTitle: '选择向量化范围(文件夹)', + topicSearchScopeTip: '默认不启用任何范围;必须选择后才能归类/搜索。范围来源于 QuickMovePaths。', + topicSearchSavingToBackend: '正在保存到后端...', + topicSearchScopePlaceholder: '选择文件夹(可多选)', + topicSearchRecallMsg: '召回 {0} / {1}(TopK={2})', + topicSearchCacheStale: '已显示缓存结果(可更新)', + topicSearchCacheStaleDesc: '检测到范围内文件夹可能有变更,缓存可能已过期。可点击更新重新生成主题(会先更新索引)。', + topicSearchCacheUpdate: '更新缓存', + + topicSearchGuideTitle: '快速上手(实验性)', + topicSearchGuideStep1: '选择要分析的文件夹范围(可多选)', + topicSearchGuideStep2: '点击刷新,生成主题卡片(会增量向量化)', + topicSearchGuideStep3: '输入一句话搜索,会召回相似图片并打开结果页', + topicSearchGuideAdvantage1: '基于语义相似度自动分组:AI自动发现相似主题,无需手动分类', + topicSearchGuideAdvantage2: '自然语言语义检索:用一句话快速找到相关图片,类似RAG检索', + topicSearchGuideEmptyReasonNoScope: '当前为空:未选择范围(已默认关闭),请先点“范围”选择文件夹', + topicSearchGuideEmptyReasonNoTopics: '当前为空:该范围内还未生成主题(可点刷新,或调低最小组/阈值)', + topicSearchRequirementsTitle: '使用前置条件', + topicSearchRequirementsOpenai: '必须配置:OPENAI_BASE_URL、OPENAI_API_KEY(后端环境变量)', + topicSearchRequirementsDepsPython: '必须安装:Python 依赖 numpy、hnswlib(缺少则功能不可用)', + topicSearchRequirementsDepsDesktop: '桌面客户端:已内置依赖(无需手动安装 numpy/hnswlib)', + topicSearchRequirementsInstallCmd: '安装命令:pip install numpy hnswlib', + topicSearchJobFailed: '任务失败', + topicSearchJobStage: '阶段', + topicSearchJobQueued: '已提交任务,准备开始…', + topicSearchJobStageEmbedding: '向量化中(Embedding)', + topicSearchJobStageClustering: '归类中(Clustering)', + topicSearchJobStageTitling: '生成标题中(LLM)', + topicSearchJobStageDone: '完成', + topicSearchJobStageError: '失败', + topicSearchJobEmbeddingDesc: '已向量化 {0}/{1}(扫描 {2});当前:{3}', + topicSearchJobClusteringDesc: '正在归类 {0}/{1}', + topicSearchJobTitlingDesc: '正在生成标题 {0}/{1}', success: '成功', setCurrFrameAsVideoPoster: '设置当前帧为视频封面', sync: '同步', @@ -128,6 +175,7 @@ export const zhHans = { sendImageFailed: '发送图像失败,请携带console的错误消息找开发者', confirmDelete: '确认删除?', deleteSuccess: '删除成功', + moveToTrashSuccess: '已移动到回收站', doubleClickToCopy: '双击复制', root: '根', drive: '盘', @@ -362,5 +410,13 @@ export const zhHans = { 'autoTag.fields.seed': 'Seed', 'autoTag.operators.contains': '包含 (Contains)', 'autoTag.operators.equals': '等于 (Equals)', - 'autoTag.operators.regex': '正则 (Regex)' + 'autoTag.operators.regex': '正则 (Regex)', + aiAnalyzeTags: 'AI分析标签', + aiAnalyzeTagsNoPrompt: '没有找到提示词', + aiAnalyzeTagsNoCustomTags: '没有自定义标签', + aiAnalyzeTagsNoMatchedTags: 'AI没有找到匹配的标签', + aiAnalyzeTagsNoValidTags: '没有找到有效的匹配标签', + aiAnalyzeTagsAllTagsAlreadyAdded: '所有匹配的标签已经添加到图像上了', + aiAnalyzeTagsSuccess: '已添加 {0} 个标签:{1}', + aiAnalyzeTagsFailed: 'AI分析标签失败,请检查配置' } diff --git a/vue/src/i18n/zh-hant.ts b/vue/src/i18n/zh-hant.ts index 79cd604..aa14e3c 100644 --- a/vue/src/i18n/zh-hant.ts +++ b/vue/src/i18n/zh-hant.ts @@ -20,6 +20,53 @@ export const zhHant: Partial = { addNewCustomTag: '添加新的自定義標籤', showTiktokNavigator: '顯示導航按鈕', showTiktokNavigatorDesc: '在 TikTok 視圖中顯示導航按鈕(上/下箭頭)', + + // ===== Topic Search (Experimental) ===== + topicSearchExperimental: '自然語言分類&搜尋(實驗性)', + topicSearchTitleExperimental: '自然語言分類 & 搜尋(實驗性)', + topicSearchScope: '範圍', + topicSearchNeedScope: '請先選擇向量化範圍(資料夾)', + topicSearchQueryPlaceholder: '輸入一句話,召回相似圖片(RAG 召回)', + topicSearchOpenResults: '打開結果', + topicSearchThreshold: '閾值', + topicSearchMinClusterSize: '最小組', + topicSearchEmptyNoScope: '請先選擇範圍,然後刷新/歸類', + topicSearchEmptyNoTopics: '暫無主題結果(可嘗試降低「最小組」或調整「閾值」)', + topicSearchChooseScope: '選擇範圍', + topicSearchRefreshAndCluster: '刷新/歸類', + topicSearchScopeModalTitle: '選擇向量化範圍(資料夾)', + topicSearchScopeTip: '預設不啟用任何範圍;必須選擇後才能歸類/搜尋。範圍來源於 QuickMovePaths。', + topicSearchSavingToBackend: '正在保存到後端...', + topicSearchScopePlaceholder: '選擇資料夾(可多選)', + topicSearchRecallMsg: '召回 {0} / {1}(TopK={2})', + topicSearchCacheStale: '已顯示快取結果(可更新)', + topicSearchCacheStaleDesc: '偵測到範圍內資料夾可能有變更,快取可能已過期。可點擊更新重新生成主題(會先更新索引)。', + topicSearchCacheUpdate: '更新快取', + + topicSearchGuideTitle: '快速上手(實驗性)', + topicSearchGuideStep1: '選擇要分析的資料夾範圍(可多選)', + topicSearchGuideStep2: '點擊刷新,生成主題卡片(會增量向量化)', + topicSearchGuideStep3: '輸入一句話搜尋,召回相似圖片並打開結果頁', + topicSearchGuideAdvantage1: '基於語義相似度自動分組:AI自動發現相似主題,無需手動分類', + topicSearchGuideAdvantage2: '自然語言語義檢索:用一句話快速找到相關圖片,類似RAG檢索', + topicSearchGuideEmptyReasonNoScope: '目前為空:尚未選擇範圍(預設關閉),請先點「範圍」選擇資料夾', + topicSearchGuideEmptyReasonNoTopics: '目前為空:此範圍尚未生成主題(可點刷新,或調低最小組/閾值)', + topicSearchRequirementsTitle: '使用前置條件', + topicSearchRequirementsOpenai: '必須配置:OPENAI_BASE_URL、OPENAI_API_KEY(後端環境變數)', + topicSearchRequirementsDepsPython: '必須安裝:Python 依賴 numpy、hnswlib(缺少則功能不可用)', + topicSearchRequirementsDepsDesktop: '桌面客戶端:已內建依賴(無需手動安裝 numpy/hnswlib)', + topicSearchRequirementsInstallCmd: '安裝命令:pip install numpy hnswlib', + topicSearchJobFailed: '任務失敗', + topicSearchJobStage: '階段', + topicSearchJobQueued: '已提交任務,準備開始…', + topicSearchJobStageEmbedding: '向量化中(Embedding)', + topicSearchJobStageClustering: '歸類中(Clustering)', + topicSearchJobStageTitling: '生成標題中(LLM)', + topicSearchJobStageDone: '完成', + topicSearchJobStageError: '失敗', + topicSearchJobEmbeddingDesc: '已向量化 {0}/{1}(掃描 {2});目前:{3}', + topicSearchJobClusteringDesc: '正在歸類 {0}/{1}', + topicSearchJobTitlingDesc: '正在生成標題 {0}/{1}', clearCacheIfNotTakeEffect: '如果更改沒有生效,請嘗試清理頁面緩存', success: '成功', setCurrFrameAsVideoPoster: '設置當前幀為視頻封面', @@ -134,6 +181,7 @@ export const zhHant: Partial = { sendImageFailed: '發送圖像失敗,請攜帶console的錯誤訊息找開發者', confirmDelete: '確認刪除?', deleteSuccess: '刪除成功', + moveToTrashSuccess: '已移動到回收站', doubleClickToCopy: '雙擊複製', promptcompare: 'Compare Prompts', root: '根', @@ -366,5 +414,13 @@ export const zhHant: Partial = { 'autoTag.fields.seed': 'Seed', 'autoTag.operators.contains': '包含 (Contains)', 'autoTag.operators.equals': '等於 (Equals)', - 'autoTag.operators.regex': '正則 (Regex)' + 'autoTag.operators.regex': '正則 (Regex)', + aiAnalyzeTags: 'AI分析標籤', + aiAnalyzeTagsNoPrompt: '沒有找到提示詞', + aiAnalyzeTagsNoCustomTags: '沒有自定義標籤', + aiAnalyzeTagsNoMatchedTags: 'AI沒有找到匹配的標籤', + aiAnalyzeTagsNoValidTags: '沒有找到有效的匹配標籤', + aiAnalyzeTagsAllTagsAlreadyAdded: '所有匹配的標籤已經添加到圖像上了', + aiAnalyzeTagsSuccess: '已添加 {0} 個標籤:{1}', + aiAnalyzeTagsFailed: 'AI分析標籤失敗,請檢查配置' } diff --git a/vue/src/page/SplitViewTab/SplitViewTab.vue b/vue/src/page/SplitViewTab/SplitViewTab.vue index b161fd7..9f8f244 100644 --- a/vue/src/page/SplitViewTab/SplitViewTab.vue +++ b/vue/src/page/SplitViewTab/SplitViewTab.vue @@ -21,8 +21,12 @@ const compMap: Record> 'tag-search-matched-image-grid': defineAsyncComponent( () => import('@/page/TagSearch/MatchedImageGrid.vue') ), + 'topic-search-matched-image-grid': defineAsyncComponent( + () => import('@/page/TopicSearch/MatchedImageGrid.vue') + ), 'tag-search': defineAsyncComponent(() => import('@/page/TagSearch/TagSearch.vue')), 'fuzzy-search': defineAsyncComponent(() => import('@/page/TagSearch/SubstrSearch.vue')), + 'topic-search': defineAsyncComponent(() => import('@/page/TopicSearch/TopicSearch.vue')), 'img-sli': defineAsyncComponent(() => import('@/page/ImgSli/ImgSliPagePane.vue')), 'batch-download': defineAsyncComponent(() => import('@/page/batchDownload/batchDownload.vue')), 'grid-view': defineAsyncComponent(() => import('@/page/gridView/gridView.vue')), diff --git a/vue/src/page/SplitViewTab/emptyStartup.vue b/vue/src/page/SplitViewTab/emptyStartup.vue index 2f071b7..cdcb385 100644 --- a/vue/src/page/SplitViewTab/emptyStartup.vue +++ b/vue/src/page/SplitViewTab/emptyStartup.vue @@ -40,6 +40,7 @@ const compCnMap: Partial> = { local: t('local'), 'tag-search': t('imgSearch'), 'fuzzy-search': t('fuzzy-search'), + 'topic-search': t('topicSearchExperimental'), 'batch-download': t('batchDownload') + ' / ' + t('archive'), 'workspace-snapshot': t('WorkspaceSnapshot'), 'random-image': t('randomImage'), @@ -51,6 +52,7 @@ const createPane = (type: TabPane['type'], path?: string, mode?: FileTransModeIn switch (type) { case 'grid-view': case 'tag-search-matched-image-grid': + case 'topic-search-matched-image-grid': case 'img-sli': return case 'global-setting': @@ -58,6 +60,7 @@ const createPane = (type: TabPane['type'], path?: string, mode?: FileTransModeIn case 'batch-download': case 'workspace-snapshot': case 'fuzzy-search': + case 'topic-search': case 'random-image': case 'empty': pane = { type, name: compCnMap[type]!, key: Date.now() + uniqueId() } diff --git a/vue/src/page/TopicSearch/MatchedImageGrid.vue b/vue/src/page/TopicSearch/MatchedImageGrid.vue new file mode 100644 index 0000000..b81331e --- /dev/null +++ b/vue/src/page/TopicSearch/MatchedImageGrid.vue @@ -0,0 +1,264 @@ + + +